ビットコインのトランザクションは、標準的なトランザクションであり、どのアカウントからどのアカウントにどのぐらい送金する かを記録するだけであり、仮想通貨を目指すビットコインの場合これで十分でした。 イーサリアムの場合は、分散アプリケーションのプラットフォーム を目指して設計されたので、スマートコントラクト作成やスマートコントラクト間のやり取りの為、特別なトランザクションが存在しています。
- コントラクトを登録するトランザクション
- コントラクトの関数を呼び出すトランザクション
標準トランザクションを含めて、各トランザクションに渡すパラメータをまとめました。
トランザクションタイプ毎のパラメータ内容
| パラメータ | 標準トランザクション | コントラクト登録するトランザクション | コントラクトの関数を呼び出すトランザクション |
|---|---|---|---|
| from | 送金するアカウントのアドレス | コントラクトを登録するアカウントのアドレス | 呼び出す元のアドレス |
| to | 送金の宛先アカウントのアドレス | 空 | 呼び出し先コントラクトのアドレス |
| value | 送金の金額 | 空 | 空 |
| data | 空 | コントラクトがコンパイル済みのバイト配列 | 呼び出し先の関数に必要な情報 |
- 3つのタイプとも、
gas / gas price / nonceパラメータがありますが、違いがないので、上記のテーブルに書いてないgas はそのトランザクションの処理の中、各処理ステップ毎に払う手数料の合計値以上である必要があることは既に把握できました。コントラクトの関数を呼び出す場合気をつけないといけないのは、たとえコントラクトAの関数Xを呼び出すだけでも、中の処理で更に呼び出したコントラクトBの関数Y、コントラクトCの関数Zなど、最初の呼び出しを起点として、一連の呼び出しに必要なgasは全部合計されるので、その最終的な合計値の分の手数料を払わないと行けないこと。同じく途中までgasが足りなくなったら、一連の呼び出すは全部取り戻され、変更がブロックチェーンに適用されないこと。
dataパラメータは、まさに標準トランザクション以外のトランザクションのためのパラメータなので、標準のトランザクションの場合は空です- コントラクトを登録するトランザクションの場合は、
toは空(システムというか、ブロックチェーンプラットフォーム宛みたいな感じ)valueは空dataは事前にコントラクトのソースをコンパイルし、できたバイト配列をここに格納する
- コントラクトの関数を呼び出すトランザクションの場合は
toは呼び出す先のコントラクトのアドレスvalueは空dataは、呼び出す関数に必要な、パラメータのデータ型と値をエンコードした内容(詳細は参考記事の2番目を参照ください)