solidity以太坊インテリジェント契約言語(三)


ABI(Contract Application Binary Interface)詳細
ABIは、一般的なrpcプロトコルと同様に、動作関数署名、パラメータ符号化、戻り結果符号化などを定義する、チェーン外部からチェーンを呼び出す、または契約間の相互呼び出しを含む、太坊契約間で相互に呼び出されるメッセージフォーマットである.
1、関数
ABIプロトコルを使用する場合は、コンパイル時にタイプを知っておく必要があり、ダイナミックタイプコンパイルはサポートされていません.また、プロトコルは、コンパイル中に別の契約のインタフェース定義を知っていると仮定し、プロトコルはコンテンツタイプを明確に定義していないことを返す.
関数セレクタ:1つの関数を呼び出す場合、最初の4バイトは関数を呼び出す署名を指定し、計算は関数署名のkeccak256のハッシュを使用して4バイトをとる.e.g.:
bytes4(keccak256("fuc(uint32,bool)"))

パラメータ符号化:関数署名が4バイトを占有するため、パラメータ符号化は5バイト目から開始します.
符号化方式:動的内容と固定サイズタイプを区別し、動的内容タイプは以下の通りである.
  • bytes
  • string
  • T[]不定長配列
  • T[k]定長配列
  • 初回以外は固定サイズ世代のタイプです.固定サイズのタイプは、現在のブロックに元の位置で格納され、動的タイプのデータは独立して他のデータブロックに格納されます.
    2、Eventsイベント
    Eventsは、イーサー坊ログ/イベントリスニングメカニズムの抽象的なものです.ログエンティティには、契約アドレス、最大4つのマスターtopic、および任意の長さのバイナリデータの内容が含まれます.EventsはABI関数に依存して解析され,ログエンティティはカスタムデータ構造として扱われる.
    イベントにはイベント名とパラメータがあり、インデックスが必要と不要の2つのシリーズに分けられます.インデックスが必要なのは、最大3つを超えず、イベント署名のhashとともにログエンティティのtopicを構成します.インデックスを必要としないコンテンツは、イベントのバイト配列コンテンツを構成します.
    ログエンティティで使用されるABIの説明は次のとおりです.
  • address、契約先住所、以太坊内部提供
  • topics[0],keccak(EVENT_NAME+"("+EVENT_ARGS.map(canonical_type_of).join(",")+")"),そのうちcanonical_type_ofは戻り関数の正規型(Canonical form)であり、例えばuint indexed fooは戻りuint256である.イベント自体が匿名で定義されている場合、Topic[0]自動生成されません.
  • topics[n],EVENT_INDEXED_ARGS[n-1]のうちEVENT_INDEXED_ARGSインデックスに指定するイベントパラメータを示す.
  • data,abi_serialise(EVENT_NON_INDEXED_ARGS)ABIプロトコルを用いてシーケンス化されたインデックスに指定されていない他のパラメータ.abi_serialise()ABIシーケンス関数であり、一連の関数定義のタイプ値を返す.

  • 3、JSON形式
    JSON形式の契約インタフェースは、次のように記述できます.
  • type:取値ありfunctionconstructorfallback(名前のないデフォルト関数)
  • name:関数の名前
  • 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、そうでなければfalse
  • anonymous:true事件が匿名であることを示す
  • 詳細は以下を参照してください.https://solidity.readthedocs.io/en/develop/abi-spec.html?highlight=abi