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とかはまた試す予定です。
※まだこのブログテーマの使い方になれていないせいで、表示が見づらい点がありますが、改善していきます。