見出し画像

Ethereum入門 (7) - Truffle

「Truffle」の使い方をまとめました。

・Truffle v5.5.25
・Node.js v16.16.0
・npm v8.15.0

前回

1. Truffle

「Truffle」は、Ethereumアプリケーション開発のためのフレームワークです。スマートコントラクトのコンパイル、テスト、デプロイ、マイグレーションなどの機能を提供します。

2. プロジェクトの作成

プロジェクトの作成手順は、次のとおりです。

(1) Node.jsのインストール。

(2) 「Truffle」のインストール。

$ npm install -g truffle

(3) プロジェクトフォルダの作成。

$ mkdir MetaCoin
$ cd MetaCoin

(4) テンプレート「metacoin」のプロジェクトの作成。
「metacoin」は、コインを送受信できるコントラクトのテンプレートです。

$ truffle unbox metacoin
Starting unbox...
=================

✓ Preparing to download box
✓ Downloading
✓ Cleaning up temporary files
✓ Setting up box

Unbox successful, sweet!

Commands:

  Compile contracts: truffle compile
  Migrate contracts: truffle migrate
  Test contracts:    truffle test

プロジェクトを作成するコマンドは、次のとおりです。

$ truffle init
新規のTruffleプロジェクトの作成。

$ truffle unbox <box-name>
任意のテンプレートのプロジェクトの作成。

3. プロジェクトのフォルダ構成

プロジェクトのフォルダ構成は、次のとおりです。

・contracts : プログラムを配置。
 ・MetaCoin.sol : スマートコントラクトのsolファイル。
 ・ConvertLib.sol : MainCoin.solから参照されるsolファイル。
・LICENSE
: ライセンスファイル。
・migrations
: マイグレーションファイルを配置。
 ・1_deploy_contracts.js
 : マイグレーション用のjsファイル。
・test
: テストコードを配置。
 ・metacoin.js
 : テスト用のjsファイル。
 ・TestMetaCoin.sol
 : テスト用のjsファイル。
・truffle-config.js 
: プロジェクトの設定ファイル。

4. テストの実行

テストの実行手順は、次のとおりです。

(1) テスト用のSolidityファイルの実行。

$ truffle test ./test/TestMetaCoin.sol
Compiling your contracts...
===========================
✓ Fetching solc version list from solc-bin. Attempt #1
✓ Downloading compiler. Attempt #1.
> Compiling ./contracts/ConvertLib.sol
> Compiling ./contracts/MetaCoin.sol
> Compiling ./test/TestMetaCoin.sol
> Artifacts written to /var/folders/gx/c__vwtf50339svt6kx9bg_y00000gn/T/test--76715-p5KX37meYbxf
> Compiled successfully using:
   - solc: 0.8.13+commit.abaa5c0e.Emscripten.clang


  TestMetaCoin
    ✔ testInitialBalanceUsingDeployedContract (1163ms)
    ✔ testInitialBalanceWithNewMetaCoin (1106ms)


  2 passing (21s)

(2) テスト用のJavaScriptファイルの実行。

$ test ./test/metacoin.js
Compiling your contracts...
===========================
> Compiling ./contracts/ConvertLib.sol
> Compiling ./contracts/MetaCoin.sol
> Artifacts written to /var/folders/gx/c__vwtf50339svt6kx9bg_y00000gn/T/test--76735-J4M0rMXmi0ew
> Compiled successfully using:
   - solc: 0.8.13+commit.abaa5c0e.Emscripten.clang


  Contract: MetaCoin
    ✔ should put 10000 MetaCoin in the first account
    ✔ should call a function that depends on a linked library (49ms)
    ✔ should send coin correctly (1160ms)


  3 passing (1s)

5. コンパイルの実行

コンパイルの実行手順は、次のとおりです。

$ truffle compile
Compiling your contracts...
===========================
> Compiling ./contracts/ConvertLib.sol
> Compiling ./contracts/MetaCoin.sol
> Artifacts written to /Users/furukawahidekazu/Desktop/post/14_truffle/MetaCoin/build/contracts
> Compiled successfully using:
   - solc: 0.8.13+commit.abaa5c0e.Emscripten.clang

6. Truffle Developによるマイグレーション

スマートコントラクトをデプロイするには、ブロックチェーンに接続する必要があります。「Truffle」には、テストに使用できる組み込みの個人用ブロックチェーンがあります。このブロックチェーンはローカルで動作し、メインの Ethereumネットワークとはやり取りしません。

(1) Truffle Developの実行。
ブロックチェーンとやり取りするときに使用できる10 個のアカウントおよびその秘密鍵が表示され、最後にTruffle Developプロンプトが表示されます。

$ truffle develop
Truffle Develop started at http://127.0.0.1:9545/

Accounts:
(0) 0xd176aed5c990a84e1a9ecf2ddb8e0fee1213bf8a
(1) 0xe25a06b9d1e32ccbf81b82cf73a1bee42c509b5d
(2) 0xae5486c993074a730714b6f615b42c3b6567b8b8
(3) 0xd5161d3943b93c9fa2c15d8896ef73b5d7e8d345
(4) 0xb765649e656af22df2156c3bd27b992d9e5e4073
(5) 0x570041ef1a94248431d79f889848ca5174164ca5
(6) 0xccacee08857edbb33136a5b062df99d42de15318
(7) 0x1b1020680818da663013bc4106663e590bbb82f4
(8) 0x734aacfbb32c100e7d322bae68c912cc0eab6317
(9) 0xead2b9db35ed3f2c94af09b154e7cb8f54fd30b7

Private Keys:
(0) 6ac7d1892ba420ec65a98bb83ea561390729a479e69002a116552999a250625f
(1) 64b21c21c67b657859e0346819bd9a69fbb35776e7a7b8e86254a7ed5f82a868
(2) 1a14134b5f14ce486b6640126c1710f2d8c2b8c1e270bffdbacef403f3a5040a
(3) e98568b39982fda7ba35a034c3860509ac42a24f4092446fb356c1d534d2a625
(4) 23f84c6507f31b2668f3b70e328a821a18f3a1e842d3369dc9fe9c9a279d2fe1
(5) 368e28f7659736fdcf81b5af7558a1ab822f96d7851ba231608fbd34bbb59ec7
(6) 391ee94e5e21bae0a8f391829171b7385b2473fe26b6f9ddae96ba3f26961133
(7) 975e7f7cf63a44d7a33b25d41ee7d083aea9e139b318932e1d73b9cdb4dc2a77
(8) 26af0f80e4a445c1b8103193eb3cfe399cd7697f8310561d0f90ee5809fe961c
(9) 0fd6bf3ed4d8785aae3b8ab3aa4cd0c9162e741800861b544cf638dbb3f6adf1

Mnemonic: alarm differ list receive identify mutual general grape pelican lazy exhibit arrange

⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.

truffle(develop)>

「Truffle Developプロンプト」では、truffle接頭辞を省略して Truffleコマンドを実行できます。例えば「truffle compile」は「compile」で実行します。

(2) コンパイルされたコントラクトをブロックチェーンにマイグレーション。

truffle(develop)> migrate
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


Starting migrations...
======================
> Network name:    'develop'
> Network id:      5777
> Block gas limit: 6721975 (0x6691b7)


1_deploy_contracts.js
=====================

   Deploying 'ConvertLib'
   ----------------------
   > transaction hash:    0x18a79aeec870d803f5188cbc1a0b7d365bdf0155261e3f9d1743a07be60597f2
   > Blocks: 0            Seconds: 0
   > contract address:    0xDDB331fBf03DD37ecce8367df48Bd57ba4D3c108
   > block number:        1
   > block timestamp:     1660172288
   > account:             0xD176AED5C990a84e1A9ecF2DDB8E0FEE1213Bf8A
   > balance:             99.999468208
   > gas used:            157568 (0x26780)
   > gas price:           3.375 gwei
   > value sent:          0 ETH
   > total cost:          0.000531792 ETH


   Linking
   -------
   * Contract: MetaCoin <--> Library: ConvertLib (at address: 0xDDB331fBf03DD37ecce8367df48Bd57ba4D3c108)

   Deploying 'MetaCoin'
   --------------------
   > transaction hash:    0x4b19904593f49cdfa67326a295535e3641a51539f69eb094488db0bb85053b5e
   > Blocks: 0            Seconds: 0
   > contract address:    0xc154eaEaa58472a80d4acD13951f7e4d26016E99
   > block number:        2
   > block timestamp:     1660172288
   > account:             0xD176AED5C990a84e1A9ecF2DDB8E0FEE1213Bf8A
   > balance:             99.998105632065943366
   > gas used:            416594 (0x65b52)
   > gas price:           3.270752661 gwei
   > value sent:          0 ETH
   > total cost:          0.001362575934056634 ETH

   > Saving artifacts
   -------------------------------------
   > Total cost:     0.001894367934056634 ETH

Summary
=======
> Total deployments:   2
> Final cost:          0.001894367934056634 ETH

デプロイされたコントラクトのトランザクション ID とアドレスを示しています。コストの概要とリアルタイムのステータス更新も含まれます。

7. Ganacheによるマイグレーション

「Truffle Develop」はオールインワンのパーソナルブロックチェーンおよびコンソールですが、デスクトップアプリケーション「Ganache」を使ってパーソナルブロックチェーンを起動することもできます。

「Ganache」は、より多くの情報を表示するため、Ethereumとブロックチェーンを初めて使用する人にとって、より理解しやすいツールになります。

「Ganache」の利用手順は、次のとおりです。

(1) 「Ganache」をダウンロードしてインストール。

(2) 「truffle-config.js」を以下のように編集。
「Ganache」のデフォルトの接続パラメータを使用した接続が許可されます。

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    }
  }
};

(3) 「Ganache」を起動し、「NEW WORKSPACE」を選択し、「ADD PRPJECT」で先ほど編集した「truffle-config.js」を追加。

(4) コンパイルされたコントラクトをブロックチェーンにマイグレーション。
コンソールで以下を実行します。

$ truffle migrate
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


Starting migrations...
======================
> Network name:    'development'
> Network id:      5777
> Block gas limit: 6721975 (0x6691b7)


1_deploy_contracts.js
=====================

   Replacing 'ConvertLib'
   ----------------------
   > transaction hash:    0x2edd5b5da0f0581d8ab6c879b9c06c653c3b9a9f4c28392e16ea074b04aad680
   > Blocks: 0            Seconds: 0
   > contract address:    0xFcF951D22876fDe25f91ffC23EbD8E43642f5d92
   > block number:        1
   > block timestamp:     1660173688
   > account:             0x0620d29046732a4ADd4F3d845645ae3448eea0f8
   > balance:             99.99684864
   > gas used:            157568 (0x26780)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00315136 ETH


   Linking
   -------
   * Contract: MetaCoin <--> Library: ConvertLib (at address: 0xFcF951D22876fDe25f91ffC23EbD8E43642f5d92)

   Replacing 'MetaCoin'
   --------------------
   > transaction hash:    0xd8422a70e56368a83ec50ba330f12527a77c9ec1089d839aea0d392a61497966
   > Blocks: 0            Seconds: 0
   > contract address:    0xd8ca50c3EE5F35DFDfb2BABf6a08e505596c383A
   > block number:        2
   > block timestamp:     1660173689
   > account:             0x0620d29046732a4ADd4F3d845645ae3448eea0f8
   > balance:             99.98855876
   > gas used:            414494 (0x6531e)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00828988 ETH

   > Saving artifacts
   -------------------------------------
   > Total cost:          0.01144124 ETH

Summary
=======
> Total deployments:   2
> Final cost:          0.01144124 ETH


x86_64 npaka-mac-4$ truffle console

(5) Truffle Developコンソールの起動。
コンソールで以下を実行します。

$ truffle console
truffle(development)> 

8. コントラクトとの対話

コントラクトとの対話を行います。

(1) デプロイしたMetaCoinコントラクトインスタンスとブロックチェーンのアカウントの取得。

truffle(development)> let instance = await MetaCoin.deployed()
truffle(development)> let accounts = await web3.eth.getAccounts()

(2) アカウントのMetaCoinの残高の確認。

truffle(development)> let balance = await instance.getBalance(accounts[0])
truffle(development)> balance.toNumber()
10000

(3) 残高がどれだけのetherに相当するかを確認。
コントラクトでは1メタコインが2etherに相当すると定義されています。

truffle(development)> let ether = await instance.getBalanceInEth(accounts[0])
truffle(development)> ether.toNumber()
20000

(4) 任意のアカウントから別のアカウントにメタコインを送金。

truffle(development)> instance.sendCoin(accounts[1], 500)

(5) メタコインを受信したアカウントの残高を確認。

truffle(development)> let received = await instance.getBalance(accounts[1])
truffle(development)> received.toNumber()
500

(6) メタコインを送信したアカウントの残高を確認。

truffle(development)> let newBalance = await instance.getBalance(accounts[0])
truffle(development)> newBalance.toNumber()
9500

次回


この記事が気に入ったらサポートをしてみませんか?