Ethereum入門 (7) - Truffle
「Truffle」の使い方をまとめました。
前回
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
プロジェクトを作成するコマンドは、次のとおりです。
3. プロジェクトのフォルダ構成
プロジェクトのフォルダ構成は、次のとおりです。
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
次回
この記事が気に入ったらサポートをしてみませんか?