sendTransactionとcall

概要

solidityの関数を呼び出しにはsendTransactioncallの2パターンがあります。今回はsendTransactioncallの違いと使い分けについて取り上げたいと思います。

sendTransactionとcallの違い

sendTransaction

web3.eth.sendTransaction({
    from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe',
    to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe',
    value: '1000000000000000'
})
.then(function(receipt){
    ...
});

sendTransactionブロックチェーンネットワークにトランザクションをブロードキャストする関数の呼び出し方です。つまりデータはマイナーによってマイニングされ、そのデータが有効な場合はブロックチェーンに記録され公開されます。

この呼び出しはブロックチェーンの状態を変更するので、Etherを消費します。マイナーがトランザクションをブロックに含めない可能性があるので、非同期で行われます。 そのためトランザクションの即時の戻り値は、常にトランザクションのハッシュになります。 関数へのトランザクションの戻り値を取得するにはeventを使用します。

関数にpureviewが付与されていない場合は、ブロックチェーンの状態を変更する操作なのでsendTransactionで呼び出します。

call

web3.eth.call({
    to: "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", 
    data: "0xc6888fa10000000000000000000000000000000000000000000000000000000000000003"
})
.then(console.log);

callブロックチェーンネットワークにトランザクションをブロードキャストしない関数の呼び出し方です。つまりデータはマイナーによってマイニングされないので、ブロックチェーンには記録されません。

この呼び出しは読み取り専用の操作でなので、Etherを消費しません。 関数は実行され結果が返ってきますが、実行後はすべての状態が破棄されます。callは同期であり、コントラクト関数の戻り値はすぐに返されます。

関数にpureviewが付与されている場合は、呼び出し専用の操作なのでcallで呼び出します。

sendTransactionとcallの使い分け

はじめにcallを使い次にsendTransactionで呼び出すことをお薦めします。

sendTransactionはEtherを使用するのでcallを使って下調べをする必要があります。sendTransactionを使用した場合に例外が発生する可能性が あるので、事前にcallを使ってsendTransactionに 問題があるかデバッグすることが出来ます。