FreeBSD ✖️ truffle でブロックチェーン演習
目標
仮想マシン(FreeBSD)で truffle を使って ERC20 トークンを作成するコードを用意します。それを、ホストマシンで動いている Ganache にデプロイします。
手順
まずは、truffle を使えるか試してみる。
[root@vitothon /usr/local/etc]# pkg search npm
npm-8.13.0 Node package manager
npm-node14-8.13.0 Node package manager
npm-node16-8.13.0 Node package manager
npm-node18-8.13.0 Node package manager
[root@vitothon /usr/local/etc]# pkg install npm-node16-8.13.0
[root@vitothon /usr/local/etc]# npm -v
8.13.0
[root@vitothon /usr/local/etc]# node -v
v16.15.1
[root@vitothon /usr/local/etc]# npm install -g npm@8.14.0
[root@vitothon /usr/local/etc]# npm search truffle
NAME | DESCRIPTION | AUTHOR | DATE | VERSION | KEYWORDS
truffle | Truffle - Simple… | =sukanyaparash… | 2022-07-15 | 5.5.22 |
...
[root@vitothon /usr/local/etc]# npm install -g truffle
[root@vitothon /home/shuma]# mkdir Fikacoin
[root@vitothon /home/shuma]# cd Fikacoin/
[root@vitothon /home/shuma/Fikacoin]# truffle init
[root@vitothon /home/shuma/Fikacoin]# ls
contracts migrations test truffle-config.js
[root@vitothon /home/shuma/Fikacoin]# npm init -f
[root@vitothon /home/shuma/Fikacoin]# npm install zeppelin-solidity --save
サンプルトークン contracts/Fikacoin.sol 作る。
pragma solidity ^0.8.4;
import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
contract Fikacoin is StandardToken {
string public name = "Fikacoin";
string public symbol = "FKC";
uint public decimals = 18;
function Fikacoin(uint initialSupply) public {
totalSupply_ = initialSupply;
balances[msg.sender] = initialSupply;
}
}
コンパイルしてみる。
[root@vitothon /home/shuma/Fikacoin]# truffle compile
Compiling your contracts...
===========================
✓ Fetching solc version list from solc-bin. Attempt #1
✓ Downloading compiler. Attempt #1.
> Compiling ./contracts/Fikacoin.sol
> Compiling ./contracts/Migrations.sol
> Compiling zeppelin-solidity/contracts/token/ERC20/StandardToken.sol
> Compilation warnings encountered:
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see <https://spdx.org> for more information.
--> project:/contracts/Fikacoin.sol
CompileError: ParserError: Source file requires different compiler version (current compiler is 0.8.15+commit.e14f2714.Emscripten.clang) - note that nightly builds are considered to be strictly less than the released version
--> zeppelin-solidity/contracts/token/ERC20/StandardToken.sol:1:1:
|
1 | pragma solidity ^0.4.24;
| ^^^^^^^^^^^^^^^^^^^^^^^^
Error: Truffle is currently using solc 0.8.15, but one or more of your contracts specify "pragma solidity ^0.4.24".
Please update your truffle config or pragma statement(s).
(See <https://trufflesuite.com/docs/truffle/reference/configuration#compiler-configuration> for information on
configuring Truffle to use a specific solc compiler version.)
Compilation failed. See above.
at /usr/local/lib/node_modules/truffle/build/webpack:/packages/compile-solidity/dist/run.js:64:1
at Generator.next (<anonymous>)
at fulfilled (/usr/local/lib/node_modules/truffle/build/webpack:/packages/compile-solidity/dist/run.js:4:43)
Truffle v5.5.22 (core: 5.5.22)
Node v16.15.1
バージョンの違いで、コンパイルに失敗する。zeppelin-solidity が使えないかも。代わりに @openzeppelin/contracts を使ってみる。
[root@vitothon /home/shuma/Fikacoin]# npm install @openzeppelin/contracts --save
contracts/Fikacoin.sol を以下のように修正。
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract Fikacoin is ERC20 {
constructor(uint256 initialSupply) ERC20("Fikacoin", "FKC") {
_mint(msg.sender, initialSupply);
}
}
もう一度コンパイルしてみる。
[root@vitothon /home/shuma/Fikacoin]# truffle compile
Compiling your contracts...
===========================
> Compiling ./contracts/Fikacoin.sol
> Compiling ./contracts/Migrations.sol
> Compiling @openzeppelin/contracts/token/ERC20/ERC20.sol
> Compiling @openzeppelin/contracts/token/ERC20/IERC20.sol
> Compiling @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
> Compiling @openzeppelin/contracts/utils/Context.sol
> Compilation warnings encountered:
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see <https://spdx.org> for more information.
--> project:/contracts/Fikacoin.sol
> Artifacts written to /usr/home/shuma/Fikacoin/build/contracts
> Compiled successfully using:
- solc: 0.8.15+commit.e14f2714.Emscripten.clang
成功した。次にマイグレーションファイル migrations/2_deploy_myToken.js を作成する。
const Fikacoin = artifacts.require('./Fikacoin.sol')
module.exports = (deployer) => {
const initialSupply = 100000000
deployer.deploy(Fikacoin, initialSupply)
}
とりあえず、ホストマシンの Ganache で確認するために truffle-config.js を修正する。
# ホストマシンでネットワーク状況を確認
user$ ifconfig
...
vboxnet0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:00
inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255
# FreeBSD の truffle-config.js を修正する
networks: {
development: {
host: "192.168.56.1", // Localhost (default: none)
port: 8545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
}
ホストマシンの Ganache のワークスペースは以下のように設定。
deploy してみる。
[root@vitothon /home/shuma/Fikacoin]# truffle deploy
This version of µWS is not compatible with your Node.js build:
Error: Cannot find module './uws_freebsd_x64_93.node'
Falling back to a NodeJS implementation; performance may be degraded.
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Starting migrations...
======================
> Network name: 'development'
> Network id: 5777
> Block gas limit: 67219750000 (0xfa69bfc70)
2_deploy_myToken.js
===================
Deploying 'Fikacoin'
--------------------
> transaction hash: 0x8aa71197246a8072b3ea0aecf245209fea5c4e2850c175380601b1bfbd3cf8e8
> Blocks: 0 Seconds: 0
> contract address: 0x13476AD53e77909F0059890bBF13E1D4fe880105
> block number: 3
> block timestamp: 1658060225
> account: 0x1c064ff51B520343c99be874279795306fBd4684
> balance: 99.97060556
> gas used: 1178355 (0x11faf3)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.0235671 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.0235671 ETH
Summary
=======
> Total deployments: 1
> Final cost: 0.0235671 ETH
成功!
次回
FreeBSD の jails でそれぞれブロックチェーンのノードを動かして、プライベートチェーンを動かす。