メインコンテンツへスキップ

JavaScriptからスマートコントラクトを呼び出す

トランザクションフロントエンドJavaScriptweb3.js
初級
jdourlens
EthereumDev(opens in a new tab)
2020年4月19日
5 分の読書 minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

このチュートリアルでは、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]
45
46const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"
すべて表示
コピー

今回は、完全なERC20 ABIではなく、簡略化してbalanceOftransfer関数だけを残しました。ERC20 ABIの完全版はこちら(opens in a new tab)でご覧いただけます。

次に、スマートコントラクトをインスタンス化する必要があります。

1const web3 = new Web3("http://localhost:8545")
2
3const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)
コピー

次の2つのアドレスも設定します:

  • 送金先アドレス
  • アンロック済みの送金元アドレス
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
コピー

次のパートでは、両方のアドレスが保有している現在のトークンの量を取得するためにbalanceOf関数を呼び出します。

Call: スマートコントラクトから値を読み込む

最初の例では、トランザクションを送信することなく、「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 return
5 }
6 console.log("残高は: ", res)
7})
コピー

ERC20のDAIには18桁の0があり、正しい数値を得るためには18桁の0を削除する必要があります。 Javascriptは大きな数値を扱えないため、uint256は文字列で返されます。 JavaScriptで大きな数字を扱う方法がご不明の場合、JavaScriptで大きな数字を扱うbignumber.jsのチュートリアルをご覧ください。(opens in a new tab)

send: スマートコントラクト関数にトランザクションを送信する

2番目の例では、DAIスマートコントラクトのtransfer関数を呼び出し、2番目のアドレスに10DAIを送信します。 このtransfer関数では、受取人のアドレスと送金するトークン数の2つのパラメータが必要です。

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("エラーが発生しました。", err)
6 return
7 }
8 console.log("トランザクションのハッシュ: " + res)
9 })
すべて表示
コピー

また、call関数は、ブロックチェーンに組み込まれるトランザクションのハッシュを返します。 イーサリアムではトランザクションハッシュを予測できるため、トランザクションが実行される前にハッシュを取得することができます(ここでハッシュの計算方法を学びます(opens in a new tab))。

関数はブロックチェーンにトランザクションを送るだけなので、マイニングされてブロックチェーンに組み込まれるまで結果は分かりません。 次のチュートリアルでは、ハッシュ(opens in a new tab)を使用してブロックチェーンでトランザクションが実行されるのを待つ方法を学びます。

最終編集者: @sekisanchi(opens in a new tab), 2024年4月1日

このチュートリアルは役に立ちましたか?