Debian9.8でEthereumのプライベートネットワークを作成する
1,はじめに
Debian9.8でEthereumのプライベートネットワークを作成し、自前のブロックチェーンを構築します。
下記の記事を参考に実施しました。
2,イーサリアムの導入
(1)Gethのインストール(失敗)
注意:apt-getでのGethインストールは失敗に終わりました。下記(2)Gethのインストール(成功)まで読み飛ばして頂いて問題ありません。
上記の記事及び、EthereumのGitHubの下記ドキュメントの記述を基に、Gethインストールを行います。
(A) リポジトリの追加(エラー1)
apt-getコマンドで、Ethereumをインストールできるように、下記のコマンドを実行します。
ドキュメントを読むと「add-apt-repository」コマンドでリポジトリを追加する、とあるのですが、私の環境で試したところ「コマンドが見つかりません」とのエラーが出ました。
そこで、add-apt-repositoryコマンドのインストールをまず行います。
ちなみに、リポジトリの追加をしないで、installを試みると下記のエラーがでました。
root@VAIO-S-SB-Debian:~# apt-get install ethereum
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ ethereum が見つかりません
(i) install add-apt-repository command
上記のサイトの記述を参考に下記のコマンドを実行しました。
apt-get install software-properties-common
(ii) result
root@VAIO-S-SB-Debian:~# apt-get install software-properties-common
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
python3-software-properties unattended-upgrades
提案パッケージ:
bsd-mailx mail-transport-agent needrestart
以下のパッケージが新たにインストールされます:
python3-software-properties software-properties-common unattended-upgrades
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
195 kB のアーカイブを取得する必要があります。
この操作後に追加で 845 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
0% [処理中]
取得:1 ftp://ftp.riken.jp/Linux/debian/debian stretch/main amd64 python3-software-properties all 0.96.20.2-1 [49.5 kB]
取得:2 ftp://ftp.riken.jp/Linux/debian/debian stretch/main amd64 software-properties-common all 0.96.20.2-1 [83.6 kB]
取得:3 ftp://ftp.riken.jp/Linux/debian/debian stretch/main amd64 unattended-upgrades all 0.93.1+nmu1 [61.7 kB]
195 kB を 2秒 で取得しました (68.5 kB/s)
パッケージを事前設定しています ...
以前に未選択のパッケージ python3-software-properties を選択しています。
(データベースを読み込んでいます ... 現在 143469 個のファイルとディレクトリがインストールされています。)
.../python3-software-properties_0.96.20.2-1_all.deb を展開する準備をしています ...
python3-software-properties (0.96.20.2-1) を展開しています...
以前に未選択のパッケージ software-properties-common を選択しています。
.../software-properties-common_0.96.20.2-1_all.deb を展開する準備をしています ...
software-properties-common (0.96.20.2-1) を展開しています...
以前に未選択のパッケージ unattended-upgrades を選択しています。
.../unattended-upgrades_0.93.1+nmu1_all.deb を展開する準備をしています ...
unattended-upgrades (0.93.1+nmu1) を展開しています...
systemd (232-25+deb9u11) のトリガを処理しています ...
unattended-upgrades (0.93.1+nmu1) を設定しています ...
Creating config file /etc/apt/apt.conf.d/20auto-upgrades with new version
Creating config file /etc/apt/apt.conf.d/50unattended-upgrades with new version
Created symlink /etc/systemd/system/multi-user.target.wants/unattended-upgrades.service → /lib/systemd/system/unattended-upgrades.service.
Synchronizing state of unattended-upgrades.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable unattended-upgrades
man-db (2.7.6.1-2) のトリガを処理しています ...
python3-software-properties (0.96.20.2-1) を設定しています ...
dbus (1.10.26-0+deb9u1) のトリガを処理しています ...
software-properties-common (0.96.20.2-1) を設定しています ...
systemd (232-25+deb9u11) のトリガを処理しています ...
dbus (1.10.26-0+deb9u1) のトリガを処理しています ...
root@VAIO-S-SB-Debian:~#
(B) リポジトリの追加(エラー2)
では、リポジトリの追加を試みます。
下記コマンドを実行します。
add-apt-repository -y ppa:ethereum/ethereum
エラーが出ました。
root@VAIO-S-SB-Debian:~# add-apt-repository -y ppa:ethereum/ethereum
gpg: keybox '/tmp/tmpni_1z73k/pubring.gpg' created
gpg: failed to start the dirmngr '/usr/bin/dirmngr': そのようなファイルやディレクトリはありません
gpg: connecting dirmngr at '/tmp/tmpni_1z73k/S.dirmngr' failed: そのようなファイルやディレクトリはありません
gpg: keyserver receive failed: dirmngrがありません
root@VAIO-S-SB-Debian:~#
(i) install dirmngr
ネットで検索をしたところ、下記の記事が出てきました。
dirmngrがインストールされていないことが原因なので、下記のコマンドを実行しました。
apt-get install dirmngr
(ii) result
root@VAIO-S-SB-Debian:~# apt-get install dirmngr
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
提案パッケージ:
tor
以下のパッケージが新たにインストールされます:
dirmngr
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
597 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,114 kB のディスク容量が消費されます。
取得:1 ftp://ftp.riken.jp/Linux/debian/debian stretch/main amd64 dirmngr amd64 2.1.18-8~deb9u4 [597 kB]
597 kB を 1秒 で取得しました (299 kB/s)
以前に未選択のパッケージ dirmngr を選択しています。
(データベースを読み込んでいます ... 現在 143609 個のファイルとディレクトリがインストールされています。)
.../dirmngr_2.1.18-8~deb9u4_amd64.deb を展開する準備をしています ...
dirmngr (2.1.18-8~deb9u4) を展開しています...
man-db (2.7.6.1-2) のトリガを処理しています ...
dirmngr (2.1.18-8~deb9u4) を設定しています ...
root@VAIO-S-SB-Debian:~#
(C) リポジトリの追加(三度目の失敗)
三度目の正直ということわざが日本にはあります。
トラディショナルなジャパニーズのことわざは、物事に3回挑戦すれば、成功すること述べています。
そのことわざを心にともして、リポジトリの追加を試みます。
(i) command
add-apt-repository -y ppa:ethereum/ethereum
(ii) result
エラーが出ました。
root@VAIO-S-SB-Debian:~# add-apt-repository -y ppa:ethereum/ethereum
gpg: keybox '/tmp/tmpjve59rz6/pubring.gpg' created
gpg: /tmp/tmpjve59rz6/trustdb.gpg: trustdb created
gpg: key 1C52189C923F6CA9: public key "Launchpad PPA for Ethereum" imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: no valid OpenPGP data found.
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "/usr/lib/python3.5/threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 688, in addkey_func
func(**kwargs)
File "/usr/lib/python3/dist-packages/softwareproperties/ppa.py", line 386, in add_key
return apsk.add_ppa_signing_key()
File "/usr/lib/python3/dist-packages/softwareproperties/ppa.py", line 273, in add_ppa_signing_key
cleanup(tmp_keyring_dir)
File "/usr/lib/python3/dist-packages/softwareproperties/ppa.py", line 234, in cleanup
shutil.rmtree(tmp_keyring_dir)
File "/usr/lib/python3.5/shutil.py", line 480, in rmtree
_rmtree_safe_fd(fd, path, onerror)
File "/usr/lib/python3.5/shutil.py", line 438, in _rmtree_safe_fd
onerror(os.unlink, fullname, sys.exc_info())
File "/usr/lib/python3.5/shutil.py", line 436, in _rmtree_safe_fd
os.unlink(name, dir_fd=topfd)
FileNotFoundError: [Errno 2] そのようなファイルやディレクトリはありません: 'S.gpg-agent.browser'
root@VAIO-S-SB-Debian:~#
(D) apt-getでEthereumをインストールするのを諦めます
リポジトリ設定をもとに戻すため下記のコマンドを実行しました。
add-apt-repository --remove ppa:ethereum/ethereum
今後の方針として、イーサリアムの公式サイトで配布しているLinux用のバイナリをインストールします。
(2)Gethのインストール(成功)
(A) バイナリのダウンロード
下記のサイトからLinux用のバイナリをダウンロードします。
本稿執筆時にダウンロードできたのは「geth-linux-amd64-1.8.27-4bcc0a37.tar.gz」でした。
(B) ファイルを展開
jskny@VAIO-S-SB-Debian:~/ダウンロード$ tar -zxvf geth-linux-amd64-1.8.27-4bcc0a37.tar.gz
geth-linux-amd64-1.8.27-4bcc0a37/
geth-linux-amd64-1.8.27-4bcc0a37/COPYING
geth-linux-amd64-1.8.27-4bcc0a37/geth
jskny@VAIO-S-SB-Debian:~/ダウンロード$
上記でダウンロードしたファイルを展開すると、2つのファイルが作成されました。
(C) 動作確認
展開したファイル「geth」がイーサリアムのプログラムなので、動作確認を行います。
(i) command
geth -h
(ii) result
jskny@VAIO-S-SB-Debian:~/ダウンロード/geth-linux-amd64-1.8.27-4bcc0a37$ ./geth -h
NAME:
geth - the go-ethereum command line interface
Copyright 2013-2018 The go-ethereum Authors
USAGE:
geth [options] command [command options] [arguments...]
VERSION:
1.8.27-stable-4bcc0a37
COMMANDS:
account Manage accounts
attach Start an interactive JavaScript environment (connect to node)
bug opens a window to report a bug on the geth repo
console Start an interactive JavaScript environment
copydb Create a local chain from a target chaindata folder
dump Dump a specific block from storage
dumpconfig Show configuration values
export Export blockchain into file
export-preimages Export the preimage database into an RLP stream
import Import a blockchain file
import-preimages Import the preimage database from an RLP stream
init Bootstrap and initialize a new genesis block
js Execute the specified JavaScript files
license Display license information
makecache Generate ethash verification cache (for testing)
makedag Generate ethash mining DAG (for testing)
monitor Monitor and visualize node metrics
removedb Remove blockchain and state databases
version Print version numbers
wallet Manage Ethereum presale wallets
help, h Shows a list of commands or help for one command
ETHEREUM OPTIONS:
--config value TOML configuration file
--datadir "/home/jskny/.ethereum" Data directory for the databases and keystore
--keystore Directory for the keystore (default = inside the datadir)
--nousb Disables monitoring for and managing USB hardware wallets
--networkid value Network identifier (integer, 1=Frontier, 2=Morden (disused), 3=Ropsten, 4=Rinkeby) (default: 1)
--testnet Ropsten network: pre-configured proof-of-work test network
--rinkeby Rinkeby network: pre-configured proof-of-authority test network
--goerli Görli network: pre-configured proof-of-authority test network
--syncmode "fast" Blockchain sync mode ("fast", "full", or "light")
--gcmode value Blockchain garbage collection mode ("full", "archive") (default: "full")
--ethstats value Reporting URL of a ethstats service (nodename:secret@host:port)
--identity value Custom node name
--lightserv value Maximum percentage of time allowed for serving LES requests (0-90) (default: 0)
--lightpeers value Maximum number of LES client peers (default: 100)
--lightkdf Reduce key-derivation RAM & CPU usage at some expense of KDF strength
--whitelist value Comma separated block number-to-hash mappings to enforce (<number>=<hash>)
DEVELOPER CHAIN OPTIONS:
--dev Ephemeral proof-of-authority network with a pre-funded developer account, mining enabled
--dev.period value Block period to use in developer mode (0 = mine only if transaction pending) (default: 0)
ETHASH OPTIONS:
--ethash.cachedir Directory to store the ethash verification caches (default = inside the datadir)
--ethash.cachesinmem value Number of recent ethash caches to keep in memory (16MB each) (default: 2)
--ethash.cachesondisk value Number of recent ethash caches to keep on disk (16MB each) (default: 3)
--ethash.dagdir "/home/jskny/.ethash" Directory to store the ethash mining DAGs (default = inside home folder)
--ethash.dagsinmem value Number of recent ethash mining DAGs to keep in memory (1+GB each) (default: 1)
--ethash.dagsondisk value Number of recent ethash mining DAGs to keep on disk (1+GB each) (default: 2)
TRANSACTION POOL OPTIONS:
--txpool.locals value Comma separated accounts to treat as locals (no flush, priority inclusion)
--txpool.nolocals Disables price exemptions for locally submitted transactions
--txpool.journal value Disk journal for local transaction to survive node restarts (default: "transactions.rlp")
--txpool.rejournal value Time interval to regenerate the local transaction journal (default: 1h0m0s)
--txpool.pricelimit value Minimum gas price limit to enforce for acceptance into the pool (default: 1)
--txpool.pricebump value Price bump percentage to replace an already existing transaction (default: 10)
--txpool.accountslots value Minimum number of executable transaction slots guaranteed per account (default: 16)
--txpool.globalslots value Maximum number of executable transaction slots for all accounts (default: 4096)
--txpool.accountqueue value Maximum number of non-executable transaction slots permitted per account (default: 64)
--txpool.globalqueue value Maximum number of non-executable transaction slots for all accounts (default: 1024)
--txpool.lifetime value Maximum amount of time non-executable transaction are queued (default: 3h0m0s)
PERFORMANCE TUNING OPTIONS:
--cache value Megabytes of memory allocated to internal caching (default: 1024)
--cache.database value Percentage of cache memory allowance to use for database io (default: 50)
--cache.trie value Percentage of cache memory allowance to use for trie caching (default: 25)
--cache.gc value Percentage of cache memory allowance to use for trie pruning (default: 25)
--trie-cache-gens value Number of trie node generations to keep in memory (default: 120)
ACCOUNT OPTIONS:
--unlock value Comma separated list of accounts to unlock
--password value Password file to use for non-interactive password input
API AND CONSOLE OPTIONS:
--rpc Enable the HTTP-RPC server
--rpcaddr value HTTP-RPC server listening interface (default: "localhost")
--rpcport value HTTP-RPC server listening port (default: 8545)
--rpcapi value API's offered over the HTTP-RPC interface
--rpc.gascap value Sets a cap on gas that can be used in eth_call/estimateGas (default: 0)
--ws Enable the WS-RPC server
--wsaddr value WS-RPC server listening interface (default: "localhost")
--wsport value WS-RPC server listening port (default: 8546)
--wsapi value API's offered over the WS-RPC interface
--wsorigins value Origins from which to accept websockets requests
--ipcdisable Disable the IPC-RPC server
--ipcpath Filename for IPC socket/pipe within the datadir (explicit paths escape it)
--rpccorsdomain value Comma separated list of domains from which to accept cross origin requests (browser enforced)
--rpcvhosts value Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. (default: "localhost")
--jspath loadScript JavaScript root path for loadScript (default: ".")
--exec value Execute JavaScript statement
--preload value Comma separated list of JavaScript files to preload into the console
NETWORKING OPTIONS:
--bootnodes value Comma separated enode URLs for P2P discovery bootstrap (set v4+v5 instead for light servers)
--bootnodesv4 value Comma separated enode URLs for P2P v4 discovery bootstrap (light server, full nodes)
--bootnodesv5 value Comma separated enode URLs for P2P v5 discovery bootstrap (light server, light nodes)
--port value Network listening port (default: 30303)
--maxpeers value Maximum number of network peers (network disabled if set to 0) (default: 25)
--maxpendpeers value Maximum number of pending connection attempts (defaults used if set to 0) (default: 0)
--nat value NAT port mapping mechanism (any|none|upnp|pmp|extip:<IP>) (default: "any")
--nodiscover Disables the peer discovery mechanism (manual peer addition)
--v5disc Enables the experimental RLPx V5 (Topic Discovery) mechanism
--netrestrict value Restricts network communication to the given IP networks (CIDR masks)
--nodekey value P2P node key file
--nodekeyhex value P2P node key as hex (for testing)
MINER OPTIONS:
--mine Enable mining
--miner.threads value Number of CPU threads to use for mining (default: 0)
--miner.notify value Comma separated HTTP URL list to notify of new work packages
--miner.gasprice "1000000000" Minimum gas price for mining a transaction
--miner.gastarget value Target gas floor for mined blocks (default: 8000000)
--miner.gaslimit value Target gas ceiling for mined blocks (default: 8000000)
--miner.etherbase value Public address for block mining rewards (default = first account) (default: "0")
--miner.extradata value Block extra data set by the miner (default = client version)
--miner.recommit value Time interval to recreate the block being mined (default: 3s)
--miner.noverify Disable remote sealing verification
GAS PRICE ORACLE OPTIONS:
--gpoblocks value Number of recent blocks to check for gas prices (default: 20)
--gpopercentile value Suggested gas price is the given percentile of a set of recent transaction gas prices (default: 60)
VIRTUAL MACHINE OPTIONS:
--vmdebug Record information useful for VM and contract debugging
--vm.evm value External EVM configuration (default = built-in interpreter)
--vm.ewasm value External ewasm configuration (default = built-in interpreter)
LOGGING AND DEBUGGING OPTIONS:
--fakepow Disables proof-of-work verification
--nocompaction Disables db compaction after import
--verbosity value Logging verbosity: 0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)
--vmodule value Per-module verbosity: comma-separated list of <pattern>=<level> (e.g. eth/*=5,p2p=4)
--backtrace value Request a stack trace at a specific logging statement (e.g. "block.go:271")
--debug Prepends log messages with call-site location (file and line number)
--pprof Enable the pprof HTTP server
--pprofaddr value pprof HTTP server listening interface (default: "127.0.0.1")
--pprofport value pprof HTTP server listening port (default: 6060)
--memprofilerate value Turn on memory profiling with the given rate (default: 524288)
--blockprofilerate value Turn on block profiling with the given rate (default: 0)
--cpuprofile value Write CPU profile to the given file
--trace value Write execution trace to the given file
METRICS AND STATS OPTIONS:
--metrics Enable metrics collection and reporting
--metrics.influxdb Enable metrics export/push to an external InfluxDB database
--metrics.influxdb.endpoint value InfluxDB API endpoint to report metrics to (default: "http://localhost:8086")
--metrics.influxdb.database value InfluxDB database name to push reported metrics to (default: "geth")
--metrics.influxdb.username value Username to authorize access to the database (default: "test")
--metrics.influxdb.password value Password to authorize access to the database (default: "test")
--metrics.influxdb.tags value Comma-separated InfluxDB tags (key/values) attached to all measurements (default: "host=localhost")
WHISPER (EXPERIMENTAL) OPTIONS:
--shh Enable Whisper
--shh.maxmessagesize value Max message size accepted (default: 1048576)
--shh.pow value Minimum POW accepted (default: 0.2)
--shh.restrict-light Restrict connection between two whisper light clients
DEPRECATED OPTIONS:
--minerthreads value Number of CPU threads to use for mining (deprecated, use --miner.threads) (default: 0)
--targetgaslimit value Target gas floor for mined blocks (deprecated, use --miner.gastarget) (default: 8000000)
--gasprice "1000000000" Minimum gas price for mining a transaction (deprecated, use --miner.gasprice)
--etherbase value Public address for block mining rewards (default = first account, deprecated, use --miner.etherbase) (default: "0")
--extradata value Block extra data set by the miner (default = client version, deprecated, use --miner.extradata)
MISC OPTIONS:
--override.constantinople value Manually specify constantinople fork-block, overriding the bundled setting (default: 0)
--help, -h show help
COPYRIGHT:
Copyright 2013-2018 The go-ethereum Authors
jskny@VAIO-S-SB-Debian:~/ダウンロード/geth-linux-amd64-1.8.27-4bcc0a37$
無事に動作確認ができました。
3,プライベートネットワークの作成
(1) ブロックチェーンを作成
作業用のフォルダに「test-eth」ディレクトリを作成します。
jskny@VAIO-S-SB-Debian:~/Workspace$ pwd
/home/jskny/Workspace
jskny@VAIO-S-SB-Debian:~/Workspace$ mkdir test-eth
jskny@VAIO-S-SB-Debian:~/Workspace$ ls
Share_it_with_the_QR_code.html Sysrigar flowers-ink hello_world_by_flutter test-eth test_textbox
jskny@VAIO-S-SB-Debian:~/Workspace$
次に、そこにブロックチェーンの基本情報を記入するJSONファイルを作成します。
名前は何でも良いとのことなので、「test.json」とします。
jskny@VAIO-S-SB-Debian:~/Workspace$ cd test-eth/
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$ echo > test.json
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$ ls
test.json
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$
作成した「test.json」に対して、下記の内容を記入する。
この記述が、ブロックチェーンの一番最初の設定ファイルになるそうです。
設定情報等は、上述のサイトの記事を参考にしています。
test.json
{
"config": {
"chainId": 15
},
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit": "0x8000000",
"difficulty": "0x4000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}
次に、この設定情報に基づきブロックチェーンの初期化を行います。
下記のコマンドを実行します。
(A) command
/home/jskny/ダウンロード/geth-linux-amd64-1.8.27-4bcc0a37/geth --datadir ./ init test.json
環境構築をバイナリのダウンロードで行ったため、パス長くてすみません。
(B) result
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$ pwd
/home/jskny/Workspace/test-eth
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$ /home/jskny/ダウンロード/geth-linux-amd64-1.8.27-4bcc0a37/geth --datadir ./ init test.json
INFO [05-19|13:36:17.960] Maximum peer count ETH=25 LES=0 total=25
INFO [05-19|13:36:17.962] Allocated cache and file handles database=/home/jskny/Workspace/test-eth/geth/chaindata cache=16 handles=16
INFO [05-19|13:36:17.971] Writing custom genesis block
INFO [05-19|13:36:17.971] Persisted trie from memory database nodes=0 size=0.00B time=3.455µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [05-19|13:36:17.971] Successfully wrote genesis state database=chaindata hash=7b2e8b…7e0432
INFO [05-19|13:36:17.971] Allocated cache and file handles database=/home/jskny/Workspace/test-eth/geth/lightchaindata cache=16 handles=16
INFO [05-19|13:36:17.979] Writing custom genesis block
INFO [05-19|13:36:17.979] Persisted trie from memory database nodes=0 size=0.00B time=4.042µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [05-19|13:36:17.979] Successfully wrote genesis state database=lightchaindata hash=7b2e8b…7e0432
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$
初期ブロックの初期化できました。
初期化が成功すると、ブロックチェーンの情報を記録するディレクトリが、参考文献の通り作成されました。
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$ pwd
/home/jskny/Workspace/test-eth
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$ ls
geth keystore test.json
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$
(2)プライベートネットワークの起動
イーサリアムはいくつかの形態でブロックチェーンのP2Pネットワークを運用できます。
・パブリック・ネットワーク:不特定多数のノードのノードが参加し、かつその参加に制限が全くないネットワークです。参加ノードはそのネットワーク上で共有管理されたブロックチェーンに対して自由に、読み取り、トランザクションの発行、マイニングが可能です。仮想通貨としてのEthereumや、多くのパブリックなdAppはこのパブリックネットワーク上で運用されています。
プライベート・ネットに接続する · Ethereum入門
・コンソーシアム・ネットワーク:あらかじめ参加を許されたノードのみが参加することが可能なネットワークです。参加を許されるノードは一つの組織のみに管理されたものとは限らず、複数の利害関係が一致しない組織がそれぞれのノードを管理することが通常です。例えば国際送金の管理を行うブロックチェーンを構築したい場合、予め参加を許された複数の金融企業がそれぞれ管理するノードをこのP2Pのネットワークに参加することで、一つの企業にのみ管理されたシステムではない半非中央集権なシステムが構築可能になります。
・プライベート・ネットワーク:一つの組織のみに管理されたノードのみが参加することが可能なネットワークです。ネットワークは自身の管理下に置くことが可能になり、中央集権的なP2Pシステムが可能になります。
今回は、私を含むごく少数が使用するネットワークなので、プライベート・ネットワークでブロックチェーンを運用します。
下記のコマンドでプライベートネットワークを起動します。
(A) 対話コンソールの起動
(i) command
/home/jskny/ダウンロード/geth-linux-amd64-1.8.27-4bcc0a37/geth --networkid "15" --nodiscover --datadir "./" console 2>> ./geth_err.log
コマンドのパラメーターについて、
プライベート・ネットに接続する · Ethereum入門
--datadir
:本オプションはgethの動作時のブロックチェーンデータや各種ログの出力先を指定します。genesisブロックの初期化で指定したディレクトリと同一のものを指定してください。
--networkid "15"
:本オプションで任意の正の整数のIDを指定することで、ライブ・ネットとは異なるネットワークを立ち上げることが可能です(ここでは15を指定)。genesisブロックの初期化で指定したchainid
と同一の値を指定する必要があります。
--nodiscover
:Gethはデフォルトで自動的に(同じネットワークID)のEthereumネットワークのノード(Peer)を探し接続を試みます。プライベート・ネットでは未知のノードとの接続を避けるため、このオプションで自動Peer探索機能を無効にします。
console
:Gethには採掘やトランザクションの生成などを対話的に進めることができるコンソールが用意されています。console
サブ・コマンドを指定することで、Gethの起動時に同時にコンソール立ち上げることが可能です。なお、console
サブ・コマンドを付加せずに、Gethのプロセスをバックグラウンドで起動させておき、後からそのプロセスのコンソールを起動する事も可能です(下記TIP参照)。
(ii) result
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$ pwd
/home/jskny/Workspace/test-eth
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$ /home/jskny/ダウンロード/geth-linux-amd64-1.8.27-4bcc0a37/geth --networkid "15" --nodiscover --datadir "./" console 2>> ./geth_err.log
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.27-stable-4bcc0a37/linux-amd64/go1.11.9
modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
イーサリアムの対話式コンソールが起動しました。
(B) 一番最初のブロック情報を表示する
下記のイーサリアムの対話コンソール上で下記のコマンドを実行すると、一番最初のブロックの情報を表示できます。
(i) command
eth.getBlock(0)
(ii) result
jskny@VAIO-S-SB-Debian:~/Workspace/test-eth$ /home/jskny/ダウンロード/geth-linux-amd64-1.8.27-4bcc0a37/geth --networkid "15" --nodiscover --datadir "./" console 2>> ./geth_err.log
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.27-stable-4bcc0a37/linux-amd64/go1.11.9
modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
> eth.getBlock(0)
{
difficulty: 16384,
extraData: "0x",
gasLimit: 134217728,
gasUsed: 0,
hash: "0x7b2e8be699df0d329cc74a99271ff7720e2875cd2c4dd0b419ec60d1fe7e0432",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x3333333333333333333333333333333333333333",
mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
nonce: "0x0000000000000042",
number: 0,
parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 507,
stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
timestamp: 0,
totalDifficulty: 16384,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}
>
無事に一番最初のブロックの情報が表示されました。
(C) アカウントの種類について
ドキュメントを読むとイーサリアムのアカウントは2種類あると記述があります。
Ethereumには2種類のアカウントが存在します。一つはEOA(Externally Owned Account)、もう一つはContractです。
etherを採掘する · Ethereum入門
EOAは私たちユーザーによりコントロールされるアカウントであり、我々ユーザーによる任意のタイミングで、EOAがトランザクションを発生させ、他のアカウントへのetherの送金、コントラクト・コードの実行などを行います。また、etherの採掘もこのEOAアカウントにより行われます。
一方Contractは一種の自動エージェントであり、EOAにより発生したトランザクションをトリガにContractアカウントが内部に持つコントラクト・コードが実行されます。それによりContractのフィールドのデータも更新されます。オブジェクト指向言語に馴染みのある人には、「Contractは一種のクラスのようなもので、EOAによりContractのメソッドが呼ばれ、そのメソッドが実行されるとContractの持つクラス変数が書き換えられる」というアナロジーでの説明が分かりやすいかもしれません。
今回は、EOAアカウントを作成します。
まず、このノードに現在登録されているEOAアカウントを確認します。
コマンドは下記の通りです。
(i) command
eth.accounts
(ii) result
> eth.accounts
[]
>
このノードにはまだアカウントを登録していないため、空だという応答が表示されました。
(D) アカウントの作成
EOAの作成は
etherを採掘する · Ethereum入門personal.newAccount("passwd")
コマンドで行います。ここでpasswdの部分は作成するEOAのパスワードです。実行時には適宜書き換えて実行してください。実行すると、作成されたEOAの20バイトのアドレスが表示されます。また、personal.listAccounts
コマンドの実行結果にも作成したアカウントのアドレスが表示されるようになります。
上記サイトの記述に従い、アカウントを作成する。
(i) command
personal.newAccount("hogehoge01")
(ii) result
> personal.newAccount("hogehoge01")
"0xa3bb6689056948924a467c71c7a36a0ad728a8ef"
>
(iii) check
(x) command
eth.accounts
(y) result
> eth.accounts
["0xa3bb6689056948924a467c71c7a36a0ad728a8ef"]
>
(E) 採掘報酬を紐付けるアカウント
採掘を行った際に、その報酬を紐付けるアカウントを確認します。
(i) command
eth.coinbase
(ii) result
> eth.coinbase
"0xa3bb6689056948924a467c71c7a36a0ad728a8ef"
>
先程作成したアカウントのアドレスが表示されました。
(3)採掘の開始
プライベートネットの作成ができたので、採掘を開始します。
その前に、まず採掘関連のコマンドを整理します。
(A) 基本的なコマンド
採掘の開始は、下記のコマンドで行います。
miner.start()
また、採掘の停止をしたい場合は、下記のコマンドを実行します。
miner.stop()
そして、採掘しているかを判断したい場合は、下記のコマンドを実行します。
eth.mining
miningの戻り値がtrueなら採掘中で、そうでなければ停止中です。
(B) 採掘の開始
では、採掘を始めましょう。
(i) command
miner.start()
(ii) result
> miner.start()
null
>
採掘が始まりました。
ノートパソコンの動作がめちゃくちゃ重いです。
(C) 採掘結果の確認
採掘開始からある程度時間を起き、eth.blockNumberを確認します。
(i) command
eth.blockNumber
(ii) result
> eth.blockNumber
204
>
採掘されたブロック数が0から進んでいることが確認できたので、採掘を停止させます。
(i) command
miner.stop()
(ii) result
> miner.stop()
null
>
(D) 報酬の確認
報酬を確認します。
報酬の確認は下記のコマンドで行います。
(i) command
eth.getBalance(eth.accounts[0])
(ii) result
> eth.getBalance(eth.accounts[0])
1.02e+21
>
イーサリアムは、etherとweiで報酬を管理しています。
1 ether = 1,000,000,000,000,000,000 wei
ここでの表示はweiの表示なので、すごい額になっています。
表示する単位を、etherにするには、下記のコマンドを使用します。
(i) command
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
(ii) result
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
1020
>
これがパブリックネットワークでだったらすごい。
わぁおかねもちー(26,792円 * 1020 2019/05/19現在)。
4,おわりに
プライベートネットワークの作成と、採掘を行いました。
暗号通貨系は難しいイメージでしたが、先人の方々が、とてもわかりやすいドキュメントを残してくださっているので、進めることができました。
感謝です。
まだ、送金やスマートコントラクトは試していませんが、やっていきたいと思います。
最近のコメント