solidity以太坊インテリジェント契約言語(三)
2953 ワード
ABI(Contract Application Binary Interface)詳細
ABIは、一般的なrpcプロトコルと同様に、動作関数署名、パラメータ符号化、戻り結果符号化などを定義する、チェーン外部からチェーンを呼び出す、または契約間の相互呼び出しを含む、太坊契約間で相互に呼び出されるメッセージフォーマットである.
1、関数
ABIプロトコルを使用する場合は、コンパイル時にタイプを知っておく必要があり、ダイナミックタイプコンパイルはサポートされていません.また、プロトコルは、コンパイル中に別の契約のインタフェース定義を知っていると仮定し、プロトコルはコンテンツタイプを明確に定義していないことを返す.
関数セレクタ:1つの関数を呼び出す場合、最初の4バイトは関数を呼び出す署名を指定し、計算は関数署名の
パラメータ符号化:関数署名が4バイトを占有するため、パラメータ符号化は5バイト目から開始します.
符号化方式:動的内容と固定サイズタイプを区別し、動的内容タイプは以下の通りである. bytes string T[]不定長配列 T[k]定長配列 初回以外は固定サイズ世代のタイプです.固定サイズのタイプは、現在のブロックに元の位置で格納され、動的タイプのデータは独立して他のデータブロックに格納されます.
2、Eventsイベント
Eventsは、イーサー坊ログ/イベントリスニングメカニズムの抽象的なものです.ログエンティティには、契約アドレス、最大4つのマスターtopic、および任意の長さのバイナリデータの内容が含まれます.EventsはABI関数に依存して解析され,ログエンティティはカスタムデータ構造として扱われる.
イベントにはイベント名とパラメータがあり、インデックスが必要と不要の2つのシリーズに分けられます.インデックスが必要なのは、最大3つを超えず、イベント署名のhashとともにログエンティティのtopicを構成します.インデックスを必要としないコンテンツは、イベントのバイト配列コンテンツを構成します.
ログエンティティで使用されるABIの説明は次のとおりです.address、契約先住所、以太坊内部提供 topics[0], topics[n], data,
3、JSON形式
JSON形式の契約インタフェースは、次のように記述できます.name:関数の名前
typeフィールドは省略できますが、デフォルト値function、payable、constantは省略できます.デフォルトはfalseです.コンストラクタ関数とロールバック関数は、nameまたはoutputsがなく、ロールバック関数もinputsがありません.
イベントのjson記述は非常に似ています. 詳細は以下を参照してください.https://solidity.readthedocs.io/en/develop/abi-spec.html?highlight=abi
ABIは、一般的なrpcプロトコルと同様に、動作関数署名、パラメータ符号化、戻り結果符号化などを定義する、チェーン外部からチェーンを呼び出す、または契約間の相互呼び出しを含む、太坊契約間で相互に呼び出されるメッセージフォーマットである.
1、関数
ABIプロトコルを使用する場合は、コンパイル時にタイプを知っておく必要があり、ダイナミックタイプコンパイルはサポートされていません.また、プロトコルは、コンパイル中に別の契約のインタフェース定義を知っていると仮定し、プロトコルはコンテンツタイプを明確に定義していないことを返す.
関数セレクタ:1つの関数を呼び出す場合、最初の4バイトは関数を呼び出す署名を指定し、計算は関数署名の
keccak256
のハッシュを使用して4バイトをとる.e.g.: bytes4(keccak256("fuc(uint32,bool)"))
パラメータ符号化:関数署名が4バイトを占有するため、パラメータ符号化は5バイト目から開始します.
符号化方式:動的内容と固定サイズタイプを区別し、動的内容タイプは以下の通りである.
2、Eventsイベント
Eventsは、イーサー坊ログ/イベントリスニングメカニズムの抽象的なものです.ログエンティティには、契約アドレス、最大4つのマスターtopic、および任意の長さのバイナリデータの内容が含まれます.EventsはABI関数に依存して解析され,ログエンティティはカスタムデータ構造として扱われる.
イベントにはイベント名とパラメータがあり、インデックスが必要と不要の2つのシリーズに分けられます.インデックスが必要なのは、最大3つを超えず、イベント署名のhashとともにログエンティティのtopicを構成します.インデックスを必要としないコンテンツは、イベントのバイト配列コンテンツを構成します.
ログエンティティで使用されるABIの説明は次のとおりです.
keccak(EVENT_NAME+"("+EVENT_ARGS.map(canonical_type_of).join(",")+")")
,そのうちcanonical_type_of
は戻り関数の正規型(Canonical form)であり、例えばuint indexed foo
は戻りuint256
である.イベント自体が匿名で定義されている場合、Topic[0]
自動生成されません.EVENT_INDEXED_ARGS[n-1]
のうちEVENT_INDEXED_ARGS
インデックスに指定するイベントパラメータを示す.abi_serialise(EVENT_NON_INDEXED_ARGS)
ABIプロトコルを用いてシーケンス化されたインデックスに指定されていない他のパラメータ.abi_serialise()
ABIシーケンス関数であり、一連の関数定義のタイプ値を返す.3、JSON形式
JSON形式の契約インタフェースは、次のように記述できます.
type
:取値ありfunction
、constructor
、fallback
(名前のないデフォルト関数)inputs
:一連の対象であり、各対象は下記の属性を含む:name
:パラメータ名type
:パラメータの (Canonical Type)
.outputs
:一連の類似inputs
の対象は、戻り値がない場合は省略可能constant
:true
ブロックチェーンの状態を変更しないことを関数宣言する.payable
:true
表示関数が受信可能ether
そうでなければ表示できません.typeフィールドは省略できますが、デフォルト値function、payable、constantは省略できます.デフォルトはfalseです.コンストラクタ関数とロールバック関数は、nameまたはoutputsがなく、ロールバック関数もinputsがありません.
イベントのjson記述は非常に似ています.
type
:いずれも"event"
name
:事件名inputs
:一連の入力パラメータであり、各パラメータには以下のものが含まれる.name
:パラメータ名type
:パラメータタイプcomponents
: used for tuple types (more below). indexed
:ログのtopicであればtrue、そうでなければfalseanonymous
:true
事件が匿名であることを示す