2-intro-of-iost/Smart-contract
スマートコントラクトはブロック内でトランザクションを受け取って実行し、内部の変数を更新し、不可逆な証明を生成します。IOSTは一般的なABIインターフェースやプラグアンドプレイによる多言語サポートを実装し、合意した結果を生成できます。これにより、ブロックチェーンのユーザビリティは大幅に改善しています。
ABIインターフェース
IOSTのスマートコントラクトはABIを通して、ネットワークを利用できます。
ABIは名前、パラメータ型などを含むJSONで定義されます。サポートされる基本型はstring
、number
、bool
です。
より複雑なデータ構造はJSON文字列にすることで使うことができます。スマートコントラクト内で関数を呼び出す時には、ABIのパラメータ型に厳密に従わなければなりません。さもなければ、実行は停止し、トランザクション手数料が発生します。
// example luckybet.js.abi
{
"lang": "javascript",
"version": "1.0.0",
"abi": [
{
"name": "bet",
"args": [
"string",
"number",
"number",
"number"
]
}
]
}
すべてのトランザクションは複数のアクションを含み、それぞれのアクションはABIへの呼び出しになります。トランザクションは二重支払い攻撃を回避するために、すべて厳密にチェーン上で順序づけされます。
type Action struct {
Contract string
ActionName string
Data string // A JSON Array of args
}
スマートコントラクト内では、BlockChain.call()`を使って、ABIインターフェースを呼び出すことにより戻り値を取得できます。システムはコールスタックをログに記録し、二重支払いできないようにします。
多言語サポート
IOSTは多言語でスマートコントラクトが使えます。現在はV8エンジンによるJavaScriptと、ハイパフォーマンスなトランザクションを処理するためのGo言語ネイティブVMモジュールが使えます。
IOSTのスマートコントラクトエンジンは、モニター、VM、ホストの3つの部分で構成されています。モニターはABIコールを正しいVMに伝えるための全体を管理するコントロールユニットです。VMはスマートコントラクトを実行するための仮想マシンです。ホストは、実行環境をパックし、コントラクトが正しいコンテキストで実行されるようにするものです。
スマートコントラクト認証システム
トランザクションはマルチシグ(複数署名)をサポートします。そのためには、コントラクト内で、RequireAuth()
を使って、現在のコンテキストが特定のIDの署名を持っているかどうかをチェックします。スマートコントラクト間の呼び出しは署名の認証を引き継ぎます。例えば、A.a
が B.b
を呼び出す場合、ユーザーからのB.b
への認証がA.a
を呼び出す時に暗黙的に行われます。
スマートコントラクトは、コールスタックをチェックできるので、「誰がこのABIを起動したか?」を知ることができます。これにより、呼び出し元を限定した操作やそれぞれ違う操作を実行することができます。
スマートコントラクトには、アップグレードや削除という特殊な権限があり、can_update()
とcan_destroy()
を使って実装できます。
呼び出しの結果
実行後、スマートコントラクトは、ブロック内にTxReceipt
を生成し、合意を求めます。RPCを使って、オンチェーンtランザクションのTxReceiptsを追跡することができます。