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

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), Invalid DateTime

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