JavaScriptからスマートコントラクトを呼び出す
このチュートリアルでは、JavaScriptからスマートコントラクト関数を呼び出す方法を見ていきます。 最初はスマートコントラクトの状態(ERC20保有者の残高など)を読み取り、次にトークンの送金を行うことでブロックチェーンの状態を変更します。 すでにブロックチェーンとやり取りするためのJS環境の設定に精通している必要があります。
今回の例では、DAIトークンを使います。テストのために、ganache-cliを使ってブロックチェーンをフォークし、すでに大量のDAIを持っているアドレスのロックを解除します。
ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81スマートコントラクトとやり取りするには、そのアドレスとABIが必要です。
1const ERC20TransferABI = [2 {3 constant: false,4 inputs: [5 {6 name: "_to",7 type: "address",8 },9 {10 name: "_value",11 type: "uint256",12 },13 ],14 name: "transfer",15 outputs: [16 {17 name: "",18 type: "bool",19 },20 ],21 payable: false,22 stateMutability: "nonpayable",23 type: "function",24 },25 {26 constant: true,27 inputs: [28 {29 name: "_owner",30 type: "address",31 },32 ],33 name: "balanceOf",34 outputs: [35 {36 name: "balance",37 type: "uint256",38 },39 ],40 payable: false,41 stateMutability: "view",42 type: "function",43 },44]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"すべて表示このプロジェクトでは、完全なERC20 ABIからbalanceOf関数とtransfer関数のみを残しました。完全なERC20のABIはこちら (opens in a new tab)で確認できます。
次に、スマートコントラクトをインスタンス化する必要があります。
1const web3 = new Web3("http://localhost:8545")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)また、2つのアドレスを設定します。
- 送金先のアドレス
- ロック解除済みの送金元アドレス:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"次のパートでは、balanceOf関数を呼び出して、両方のアドレスが保有している現在のトークン量を取得します。
コール:スマートコントラクトからの値の読み取り
最初の例では、「constant」メソッドを呼び出し、トランザクションを送信することなく、EVMでスマートコントラクトメソッドを実行します。 そのために、アドレスのERC20残高を読み取ります。 ERC20トークンに関する記事をお読みください
ABIを提供してインスタンス化されたスマートコントラクトのメソッドには、yourContract.methods.methodnameのようにアクセスできます。 call関数を使用することで、関数を実行した結果を受け取ることができます。
1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {2 if (err) {3 console.log("エラーが発生しました", err)4 return5 }6 console.log("残高は: ", res)7})DAI ERC20は18桁の小数位を持つことを覚えておいてください。これは、正しい量を得るには、値から18個のゼロを削除する必要があることを意味します。 JavaScriptは大きな数値を扱えないため、uint256は文字列として返されます。 JSで大きな数値を扱う方法がわからない場合は、bignumber.jsに関するチュートリアル (opens in a new tab)をご覧ください。
センド:スマートコントラクト関数へのトランザクションの送信
2番目の例では、DAIスマートコントラクトのtransfer関数を呼び出して、2つ目のアドレスに10 DAIを送信します。 transfer関数は2つのパラメータを受け取ります。送金先のアドレスと送金するトークンの量です。
1daiToken.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("エラーが発生しました", err)6 return7 }8 console.log("トランザクションのハッシュ: " + res)9 })すべて表示send関数は、ブロックチェーンにマイニングされるトランザクションのハッシュを返します。 イーサリアムでは、トランザクションハッシュは予測可能です。そのため、トランザクションが実行される前にハッシュを取得できます(ハッシュの計算方法はこちら (opens in a new tab)をご覧ください)。
この関数はトランザクションをブロックチェーンに送信するだけなので、それがマイニングされブロックチェーンに含まれるまでは結果を確認できません。 次のチュートリアルでは、ハッシュを使って、トランザクションがブロックチェーン上で実行されるのを待つ方法 (opens in a new tab)を学びます。
最終更新: 2025年10月21日