Daily Archive2022-01-08

Truffle.js Framework

Ethereum 環境の理解を深めるために、以前フレームワークやツールを使わずテストをしましたが、今回はTruffle.jsフレームワークを使って構築・テストをしたいと思います。

参考: https://zenn.dev/shunp110/articles/0080928ab43289
  : https://qiita.com/toshiok/items/12b47b28e5fb6c5909b1

以前Gethで作ったブロックチェーンのローカル環境は、Ganacheを使います。

環境: Ubuntu20.04/WSL/Windows11

$ node -v
v16.13.1
$ npm -v
8.1.2

インストール

$ sudo npm install -g truffle
$ sudo npm install -g ganache-cli

ネットワーク起動

$ ganache-cli
Ganache CLI v6.12.2 (ganache-core: 2.13.2)
Available Accounts
(0) 0x6Adc538Ed8526217B04354DDF6E15dF53039B986 (100 ETH)
(1) 0xcB2289aAa662eadFDCB5c0655E88B6a44dc11FaD (100 ETH)
(2) 0x85B350bC7c0c75D70EE9FE5e3d20c5Ead091F8dA (100 ETH)
(3) 0x3CC61a4a4E70Ae097390f6d0DfC8c56c9555EFD9 (100 ETH)
(4) 0x12099D695cc5526D9A71944F3b551b03b25A3Fee (100 ETH)
….

アカウントやETHがあらかじめ用意されています。

次に、別コンソールでコードの作成、configの編集、コンパイル、デプロイ、コンソールの実行をします。

$ truffle init

contracts/Hello.sol

pragma solidity >=0.4.22 <0.9.0; contract Hello { function get() public pure returns (string memory) { return "Hello!"; } }
Code language: JavaScript (javascript)

migrations/2_hello.js

const Hello = artifacts.require("Hello"); module.exports = function (deployer) { deployer.deploy(Hello); };
Code language: JavaScript (javascript)

(デフォルトで生成される、1_initial_migrations.js をそのままにしたため2_という名前にする)

truffle_config.js

development: { host: "127.0.0.1", // Localhost (default: none) port: 8545, // Standard Ethereum port (default: none) network_id: "*", // Any network (default: none) },
Code language: CSS (css)

上記部分のコメントをはずす。

$ truffle compile

$ truffle migrate –network development

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

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

1_initial_migration.js
======================
   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xaf7dc12859e4a1275e2daa1710c2ce7673652a7da394f395435fad33879c84f1
   > Blocks: 0            Seconds: 0
   > contract address:    0x67cD5Bee85BBbFFF12F8482711fB8649F506a4e5
   > block number:        1
   > block timestamp:     1641626555
   > account:             0x6Adc538Ed8526217B04354DDF6E15dF53039B986
   > balance:             99.99502292
   > gas used:            248854 (0x3cc16)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00497708 ETH

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00497708 ETH

2_hello.js
==========
   Deploying 'Hello'
   -----------------
   > transaction hash:    0xad64a961af2ce0ccab6901c45fd7030c2fe8a91cc480ac996267c508ef3a3081
   > Blocks: 0            Seconds: 0
   > contract address:    0x0A551aEF4c63f9a77eC2f307D9e99878C7c32Ee6
   > block number:        3
   > block timestamp:     1641626555
   > account:             0x6Adc538Ed8526217B04354DDF6E15dF53039B986
   > balance:             99.99147276
   > gas used:            134995 (0x20f53)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.0026999 ETH

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:           0.0026999 ETH

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

$ truffle console –network development

truffle(development)> web3.eth.getAccounts(function(err, data){accounts = data });
[
‘0x6Adc538Ed8526217B04354DDF6E15dF53039B986’,
‘0xcB2289aAa662eadFDCB5c0655E88B6a44dc11FaD’,
‘0x85B350bC7c0c75D70EE9FE5e3d20c5Ead091F8dA’,
‘0x3CC61a4a4E70Ae097390f6d0DfC8c56c9555EFD9’,
‘0x12099D695cc5526D9A71944F3b551b03b25A3Fee’,
‘0x3Ff15F4c7EEC3338104645780D6c78C6ca9103A7’,
‘0x2095e763CD5bD681308d259905D4eDCE0e7f9Af3’,
‘0xcFAd6063c4B5FF7233950Ca55f34Aa56eF72175a’,
‘0xA0BA9eB80Bd62D0c56CAe6311Cb8C7482F21523f’,
‘0xa4188D85d855bD1837e31C9EA5251bC75c650014’
]
truffle(development)> web3.eth.getBalance(accounts[0]);
‘99990922500000000000’
truffle(development)> web3.eth.getBalance(accounts[1]);
‘100000000000000000000’
truffle(development)> web3.eth.sendTransaction({from: accounts[0], to: accounts[1], value: web3.utils.toWei(’20’,’ether’)});
{
transactionHash: ‘0x4e040a381ba1bae54f090b0b60e723b5f0c0e0fed2fab660e925cd7ecc040d72’,
transactionIndex: 0,
blockHash: ‘0x975091b47f1343022343bc87c4880b64328d79117a457891a7f7bb62049ca10b’,
blockNumber: 5,
from: ‘0x6adc538ed8526217b04354ddf6e15df53039b986’,
to: ‘0xcb2289aaa662eadfdcb5c0655e88b6a44dc11fad’,
gasUsed: 21000,
cumulativeGasUsed: 21000,
….
truffle(development)> web3.eth.getBalance(accounts[0]);
‘79990502500000000000’
truffle(development)> web3.eth.getBalance(accounts[1]);
‘120000000000000000000’
truffle(development)> web3.eth.getTransaction(‘0x4e040a381ba1bae54f090b0b60e723b5f0c0e0fed2fab660e925cd7ecc040d72’);
{
hash: ‘0x4e040a381ba1bae54f090b0b60e723b5f0c0e0fed2fab660e925cd7ecc040d72’,
nonce: 4,
blockHash: ‘0x975091b47f1343022343bc87c4880b64328d79117a457891a7f7bb62049ca10b’,
blockNumber: 5,
transactionIndex: 0,
from: ‘0x6Adc538Ed8526217B04354DDF6E15dF53039B986’,
to: ‘0xcB2289aAa662eadFDCB5c0655E88B6a44dc11FaD’,
value: ‘20000000000000000000’,
gas: ‘0x15f90’,
gasPrice: ‘20000000000’,
input: ‘0x’,
v: ‘0x25’,
r: ‘0xae5a478f99b3a927b949957b50f7a11d063a342f10cd19350f4032d2d5474e30’,
s: ‘0x4f25702b2eba9d2aa51cd895f013848c0afdc00f56d5e5c8b8d9e700c06b6222’
}
truffle(development)> Hello.deployed().then( c => instance = c );
TruffleContract {
constructor: [Function: TruffleContract] {
_constructorMethods: {
configureNetwork: [Function: configureNetwork],
setProvider: [Function: setProvider],
….
truffle(development)> instance.get()
‘Hello!’

コンソールでは、ETHの送金、確認、それからコントラクトの関数の実行をしています。accounts[0]のETHが最初から少ないのは、デプロイのときにGAS代がひかれています。

この組み合わせは、gethで構築したことを考えると本当にありがたく感じます。IDEとかはまた試す予定です。

※まだこのブログテーマの使い方になれていないせいで、表示が見づらい点がありますが、改善していきます。