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

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

トランザクション
フロントエンド
JavaScript
web3.js
初級
jdourlens
2020年4月19日
5 分の読書

このチュートリアルでは、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からbalanceOf関数とtransfer関数のみを残しました。完全な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関数を呼び出して、両方のアドレスが保有している現在のトークン量を取得します。

コール:スマートコントラクトからの値の読み取り

最初の例では、「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})

DAI ERC20は18桁の小数位を持つことを覚えておいてください。これは、正しい量を得るには、値から18個のゼロを削除する必要があることを意味します。 JavaScriptは大きな数値を扱えないため、uint256は文字列として返されます。 JSで大きな数値を扱う方法がわからない場合は、bignumber.jsに関するチュートリアル (opens in a new tab)をご覧ください。

センド:スマートコントラクト関数へのトランザクションの送信

2番目の例では、DAIスマートコントラクトのtransfer関数を呼び出して、2つ目のアドレスに10 DAIを送信します。 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 })
すべて表示

send関数は、ブロックチェーンにマイニングされるトランザクションのハッシュを返します。 イーサリアムでは、トランザクションハッシュは予測可能です。そのため、トランザクションが実行される前にハッシュを取得できます(ハッシュの計算方法はこちら (opens in a new tab)をご覧ください)。

この関数はトランザクションをブロックチェーンに送信するだけなので、それがマイニングされブロックチェーンに含まれるまでは結果を確認できません。 次のチュートリアルでは、ハッシュを使って、トランザクションがブロックチェーン上で実行されるのを待つ方法 (opens in a new tab)を学びます。

最終更新: 2025年10月21日

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