fc2ブログ

Ethereumテストネットワークでマイニングしてみる

どうも、ぺろりんです。

今回は「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」でのお勉強に戻ってきました。

先日の投稿でGethを起動したところからの続きです。
Gethを起動したら以下のような画面になったのでした。
vm01@ubuntu:~$ geth --networkid 4649 --nodiscover --maxpeers 0 --datadir /home/vm01/data_testnet console 2>> /home/vm01/data_testnet/geth.log
Welcome to the Geth JavaScript console!

instance: Geth/v1.5.5-stable-ff07d548/linux/go1.6.2
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>

これの続きをやっていきます。

今回はテストネットでアカウントを作成してマイニングしてみます。

だいぶマターリ進行ですがあしからずw


アカウントの作成

EOAとContractアカウントというものがあるそうで、まずはEOAアカウントを作成します。(アカウントについては別記事でもーちょい調べた内容を書きました)
> personal.newAccount("pass0")
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"


pass0はアカウントのパスフレーズで、1行目でEnterを押して出てきた2行目が、送金に使うアドレスです。

アカウントの確認をしてみます。
> eth.accounts
["0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"]


アカウントをもう1つ作ってから確認すると、こんな感じでアカウントのリストが増えます。
> personal.newAccount("pass1")
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
> eth.accounts
["0x8ade49123c81461e676fd2f8f2eb31885cdb07e0", "0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"]


インデックスを付けると各個別アカウントの値を返すので、「eth.accounts」という配列に各アカウントのアドレスが入っているようです。
> eth.accounts[0]
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"
> eth.accounts[1]
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"


「exit」でGethコンソールを抜けて、Linux側で「geth」コマンドによるアカウント作成・確認もできます。
vm01@ubuntu:~$ geth --datadir /home/vm01/data_testnet/ account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat passphrase:
Address: {ecac305a22ac002107cdac420e24042d430bcb26}
vm01@ubuntu:~$
vm01@ubuntu:~$ geth --datadir /home/vm01/data_testnet/ account list
Account #0: {8ade49123c81461e676fd2f8f2eb31885cdb07e0} /home/vm01/data_testnet/keystore/UTC--2018-03-25T15-36-45.854394759Z--8ade49123c81461e676fd2f8f2eb31885cdb07e0
Account #1: {3a8e6c0304c761b88feeefb5cdefe27ced28d620} /home/vm01/data_testnet/keystore/UTC--2018-04-15T07-34-57.756551935Z--3a8e6c0304c761b88feeefb5cdefe27ced28d620
Account #2: {ecac305a22ac002107cdac420e24042d430bcb26} /home/vm01/data_testnet/keystore/UTC--2018-04-15T08-00-19.988671829Z--ecac305a22ac002107cdac420e24042d430bcb26


Linuxの端末から上記gethコマンドで見てみると、Linux上では「/home/vm01/data_testnet/keystore/」という場所に「UTC--2018-03-25T15-36-45.854394759Z--8ade49123c81461e676fd2f8f2eb31885cdb07e0」などというのが作成されていて、こいつがアドレス情報のファイルのようです。
catコマンドで中身を見てみるとこんな感じです。
vm01@ubuntu:~$ cat data_testnet/keystore/UTC--2018-03-25T15-36-45.854394759Z--8ade49123c81461e676fd2f8f2eb31885cdb07e0 
{"address":"8ade49123c81461e676fd2f8f2eb31885cdb07e0","crypto":{"cipher":"aes-128-ctr","ciphertext":"c8bf1c8a3ec4338e7c98a7a4afe7f8172e44c92f2049b80b9914755aec436d62","cipherparams":{"iv":"af13fe72364dd06b91c33d358f3b46af"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c493bb2b3a7c4bc338f8a70fd95dde747b86a73d71dbe8971110e8aef7c8f283"},"mac":"ffa7c3527aca8afa549de4b14d9817e55e6a8f689ddca550c02209d2226bc97d"},"id":"4db341af-88af-418b-861f-c626a0ad689d","version":3}


内容としては参考に挙げたところによると以下の内容とのことです。
ひとまずそのまま訳してみるので、誤訳などあればメールフォームからご指摘いただけると助かります。

・cipher:対称AES[注1]アルゴリズムの名前。
・cipherparams:上記「cipher」アルゴリズムで要求されるパラメータ。
・ciphertext:上記「cipher」アルゴリズムを使って暗号化されたあなた(対象アカウント)の秘密鍵。
・kdf:パスワードを用いてあなた(対象アカウント)のキーストアファイルを暗号化するのに使う鍵導出関数[注2]
・kdfparams:上記「kdf」アルゴリズムで要求されるパラメータ。
・mac:あなた(対象アカウント)のパスワードを認証するためのメッセージ認証符号[注3]



Ethereumのマイニング

マイニング前の状況確認

マイニング報酬を受け取るCoinbase(Etherbase)を確認します。
> eth.coinbase
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"


これは、先ほど確認したeth.accounts[0]です。デフォルトだとこれになるようです。
ちなみにEtherbaseの変更は以下のようにできます。
> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"


ためしにやってみたのですが、Etherbaseに2つのアカウントを登録するのはうまくいかないみたいです。
> miner.setEtherbase(eth.accounts[1],eth.accounts[2])
true
> eth.coinbase
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
> eth.accounts[1]
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
> eth.accounts[2]
"0xecac305a22ac002107cdac420e24042d430bcb26"


あと、eth.coinbaseに入っているアドレスは、各文字が配列として入っているみたいです。
> eth.coinbase
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
> eth.coinbase[0]
"0"
> eth.coinbase[1]
"x"
> eth.coinbase[2]
"3"
> eth.coinbase[3]
"a"
> eth.coinbase[4]
"8"
> eth.coinbase[40]
"2"
> eth.coinbase[41]
"0"
> eth.coinbase[42]
undefined


遊び終えたのでEtherbaseをeth.accounts[0]に戻しておきます。
> miner.setEtherbase(eth.accounts[0])
true
> eth.coinbase
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"
> eth.accounts[0]
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"


現状でEthereumの残高を確認するとこんな感じです。
> eth.getBalance(eth.accounts[0])
0
> eth.getBalance(eth.accounts[1])
0
> eth.getBalance(eth.accounts[2])
0


このeth.getBalanceでついでにちょっと遊んでみると、引数なしでやったりするとダメっぽいですね。
> eth.getBalance
function()
> eth.getBalance(eth.accounts)
Error: invalid address
at web3.js:3887:15
at web3.js:4939:28
at map ()
at web3.js:4938:12
at web3.js:4964:18
at web3.js:4989:23
at :1:1

>
> eth.getBalance(eth.accounts[3])
Error: invalid address
at web3.js:3887:15
at web3.js:4939:28
at map ()
at web3.js:4938:12
at web3.js:4964:18
at web3.js:4989:23
at :1:1

>


最後のやつは、存在しないeth.accounts[3]というアカウントを引数にした場合です。

まだ何もしていないのでブロック数は0です。(Genesisファイルは作ったので0番目のブロックはあるのでしょう)
> eth.blockNumber
0


…という状態からマイニングをはじめてみましょう。


マイニング

マイニング開始。
> miner.start(1)
true


引数の1は、マイニングのスレッド数です。
初回はDAG(Directed acyclic graph)というのを作成するために時間がかかるようです。(DAGについては別途調べました
別コンソールを開いてtailでgeth.logを見ていましたが、私の環境だと12分くらいかかりました。。

DAG作成が終わってマイニングが始まるところのログがこんな感じです。
I0417 07:33:00.085336 vendor/github.com/ethereum/ethash/ethash.go:276] Done generating DAG for epoch 0, it took 12m12.900405808s
I0417 07:33:47.791323 miner/unconfirmed.go:83] 🔨 mined potential block #1 [251d30b4…], waiting for 5 blocks to confirm
I0417 07:33:47.854460 miner/worker.go:516] commit new work on block 2 with 0 txs & 0 uncles. Took 52.320461ms
I0417 07:34:00.458694 miner/unconfirmed.go:83] 🔨 mined potential block #2 [335402cf…], waiting for 5 blocks to confirm
I0417 07:34:00.459445 miner/worker.go:516] commit new work on block 3 with 0 txs & 0 uncles. Took 509.749µs


DAGファイル(1GBくらい)はここに作成されています。
vm01@ubuntu:~$ tree .ethash/
.ethash/
└── full-R23-0000000000000000

0 directories, 1 file
vm01@ubuntu:~$ ls -lh .ethash/full-R23-0000000000000000
-rw-rw-r-- 1 vm01 vm01 1.0G Apr 17 07:33 .ethash/full-R23-0000000000000000


マイニングされているか、1秒当たりのハッシュ計算の回数、現在のブロック数は以下です。
> eth.mining
true
> eth.hashrate
72632
> eth.blockNumber
191


このへんでマイニング停止。
> miner.stop()
true
> eth.mining
false
> eth.hashrate
0
> eth.blockNumber
196


この時点での残高はこんな感じ(単位はwei)。
マイニング報酬は、すべてeth.coinbase(今のデフォルト設定だと、=eth.accounts[0])に行きます。
> eth.getBalance(eth.coinbase)
980000000000000000000
> eth.getBalance(eth.accounts[0])
980000000000000000000
> eth.getBalance(eth.accounts[1])
0
> eth.getBalance(eth.accounts[2])
0


以前見たEthereumの他の通貨単位に変換することもできます。
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
980
> web3.fromWei(eth.getBalance(eth.coinbase),"ether")
980
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
980
> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
0
> web3.fromWei(eth.getBalance(eth.accounts[2]),"ether")
0
> web3.fromWei(eth.getBalance(eth.accounts[0]),"szabo")
980000000
> web3.fromWei(eth.getBalance(eth.accounts[0]),"finney")
980000


(参考)
Ethereum入門 – アカウントとマイニング(BlockChain Online)
What is an Ethereum keystore file?(Medium)


まとめ

今回は、(コマンドの動作確認をすこし挟みつつ)アカウント作成とマイニング実行までをやりました。
少なくともこれだけなら簡単にできましたね。

わからない単語もいくつかありましたが、これらは別途調べた記事をご参照ください。

この次はテストネットでEthereumの送金をやります。

ではではこのへんで。


[注1] AES…DESの後継として米国の国立標準技術研究所(NIST:National Institute of Standards and Technology)によって制定された共通鍵の暗号化規格。
(参考)
Advanced Encryption Standard(Wikipedia)
マスターIT/暗号技術:第3回 AES暗号化(@IT)
・AESの仕様書:FIPS-197「Advanced Encryption Standard」[PDF](NIST)

[注2] 鍵導出関数…与えられたパスワードから共通鍵暗号用の鍵を生成する関数。鍵導出関数として使われている具体的な関数はいくつかあって、その内の1つがここで設定されている「scrypt」という名前が付けられた関数のようです。
(参考)
鍵導出関数(Wikipedia)
パスワード暗号(シニアエンジニアの庵)
Android 4.4(KRT16S)では、「端末の暗号化」機能に関する重大なバグの修正が行われている(juggly.cn)

[注3] メッセージ認証符号(Message Authentication Code)…ネットワークスペシャリストの問題の解答によると、「通信内容の改ざんの有無を検証し、完全性を保証するために通信データから生成される固定長のビット列」だそうです。送信者と受信者であらかじめ共通鍵を共有した状態で、送信者は「元データ」+「(元データ+共通鍵)から生成したMAC値」を送り、受信者は共通鍵を使って「元データ」から送信者と同じMAC値が得られるか照合して改ざんを確かめる。このMAC値のことをメッセージ認証符号と呼ぶようです。この手順で公開鍵は出てきません。
(参考)
ネットワークスペシャリスト 平成27年秋期 午前Ⅱ 問16(ネットワークスペシャリストドットコム)
メッセージ認証符号(Wikipedia)
メッセージ認証コード(サイファー・テック株式会社)
MAC(メッセージ認証コード)とは(CubicLouve)
MAC(message authentication code)(情報処理安全確保支援士(情報セキュリティスペシャリスト) - SE娘の剣 -)

gethコマンドのヘルプ

どうも、ぺろりんです。

ほぼ個人的なメモみたいな意味ですが、こういうのも記事にしとくと便利かなぁと思ったのでとりあえず載せておきます。

他の記事に入れようとしたら、いかんせん長いw
…ので単発記事として。

gethコマンドのヘルプ

gethのヘルプは「-h」オプションで閲覧できます(このオプションのつけ方はLinuxの場合かな?)。
たたいてみるとこんな感じです。
vm01@ubuntu:~$ geth -h
NAME:
geth - the go-ethereum command line interface

Copyright 2013-2016 The go-ethereum Authors

USAGE:
geth [options] command [command options] [arguments...]

VERSION:
1.5.5-stable-ff07d548

COMMANDS:
init Bootstrap and initialize a new genesis block
import Import a blockchain file
export Export blockchain into file
upgradedb Upgrade chainblock database
removedb Remove blockchain and state databases
dump Dump a specific block from storage
monitor Monitor and visualize node metrics
account Manage accounts
wallet Manage Ethereum presale wallets
console Start an interactive JavaScript environment
attach Start an interactive JavaScript environment (connect to node)
js Execute the specified JavaScript files
makedag Generate ethash DAG (for testing)
version Print version numbers
license Display license information
help, h Shows a list of commands or help for one command

ETHEREUM OPTIONS:
--datadir "/home/vm01/.ethereum" Data directory for the databases and keystore
--keystore Directory for the keystore (default = inside the datadir)
--networkid value Network identifier (integer, 0=Olympic (disused), 1=Frontier, 2=Morden (disused), 3=Ropsten) (default: 1)
--olympic Olympic network: pre-configured pre-release test network
--testnet Ropsten network: pre-configured test network
--dev Developer mode: pre-configured private network with several debugging flags
--identity value Custom node name
--fast Enable fast syncing through state downloads
--light Enable light client mode
--lightserv value Maximum percentage of time allowed for serving LES requests (0-90) (default: 0)
--lightpeers value Maximum number of LES client peers (default: 20)
--lightkdf Reduce key-derivation RAM & CPU usage at some expense of KDF strength

PERFORMANCE TUNING OPTIONS:
--cache value Megabytes of memory allocated to internal caching (min 16MB / database forced) (default: 128)
--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-inteactive 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 (default: "eth,net,web3")
--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 (default: "eth,net,web3")
--wsorigins value Origins from which to accept websockets requests
--ipcdisable Disable the IPC-RPC server
--ipcapi value APIs offered over the IPC-RPC interface (default: "admin,debug,eth,miner,net,personal,shh,txpool,web3")
--ipcpath "geth.ipc" 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)
--jspath loadScript JavaScript root path for loadScript (default: ".")
--exec value Execute JavaScript statement (only in combination with console/attach)
--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
--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:) (default: "any")
--nodiscover Disables the peer discovery mechanism (manual peer addition)
--v5disc Enables the experimental RLPx V5 (Topic Discovery) mechanism
--nodekey value P2P node key file
--nodekeyhex value P2P node key as hex (for testing)

MINER OPTIONS:
--mine Enable mining
--minerthreads value Number of CPU threads to use for mining (default: 1)
--autodag Enable automatic DAG pregeneration
--etherbase value Public address for block mining rewards (default = first account created) (default: "0")
--targetgaslimit value Target gas limit sets the artificial target gas floor for the blocks to mine (default: "4712388")
--gasprice value Minimal gas price to accept for mining a transactions (default: "20000000000")
--extradata value Block extra data set by the miner (default = client version)

GAS PRICE ORACLE OPTIONS:
--gpomin value Minimum suggested gas price (default: "20000000000")
--gpomax value Maximum suggested gas price (default: "500000000000")
--gpofull value Full block threshold for gas price calculation (%) (default: 80)
--gpobasedown value Suggested gas price base step down ratio (1/1000) (default: 10)
--gpobaseup value Suggested gas price base step up ratio (1/1000) (default: 100)
--gpobasecf value Suggested gas price base correction factor (%) (default: 110)

VIRTUAL MACHINE OPTIONS:
--jitvm Enable the JIT VM
--forcejit Force the JIT VM to take precedence
--jitcache value Amount of cached JIT VM programs (default: 64)

LOGGING AND DEBUGGING OPTIONS:
--ethstats value Reporting URL of a ethstats service (nodename:secret@host:port)
--metrics Enable metrics collection and reporting
--fakepow Disables proof-of-work verification
--verbosity value Logging verbosity: 0=silent, 1=error, 2=warn, 3=info, 4=core, 5=debug, 6=detail (default: 3)
--vmodule value Per-module verbosity: comma-separated list of = (e.g. eth/*=6,p2p=5)
--backtrace value Request a stack trace at a specific logging statement (e.g. "block.go:271") (default: :0)
--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

EXPERIMENTAL OPTIONS:
--shh Enable Whisper
--natspec Enable NatSpec confirmation notice

MISCELLANEOUS OPTIONS:
--solc value Solidity compiler command to be used (default: "solc")
--netrestrict value Restricts network communication to the given IP networks (CIDR masks)
--help, -h show help


COPYRIGHT:
Copyright 2013-2016 The go-ethereum Authors


これはまぁ、、ひとまず見るだけ…w
たぶん上記じゃ見づらいと思うので、ご利用の際はメモ帳にでもコピペしてご覧ください。

(参考)
Ethereum入門 – アカウントとマイニング(BlockChain Online)

GenesisファイルとGethの起動コマンド

どうも、ぺろりんです。

前回予告した通り、今回は前回出てきた用語の深堀りをやりたいと思います。

テーマは「Genesisファイル」と「Gethの起動コマンド」。
前回はそれぞれおまじないと思って言われるがままやってみたわけですが、この辺はちゃんと知っとくべきかと思い調べてみました。


Genesisファイル

Genesisファイルとは?

そのチェーンの最初のブロックであるGenesisブロック(ブロック番号「0」)の情報を記述したファイルのことのようです。
これは0番目の「ブロック」そのものというよりも、ブロックの「構成ファイル」なのかな?(だとすると、前回の記述は語弊がある)

デフォルトのGenesisブロックというのも用意されているようですが、これだと採掘難度が高くて、テストで遊ぶには面倒みたいです。


Genesisファイルのパラメータ内容

設定値の内容について調べてみると日本語では詳しいのは見つからず、参考に挙げた英語のサイトが一番詳しかったです。

個人的な勉強の意味でも、参考にした英語サイトにあった内容をほぼそのまま日本語訳しておきます。
誤訳のご指摘などありましたらメールフォームからお問い合わせいただけると助かります。

【mixhash】
256bitのハッシュで、ナンス(nonce)と組み合わせることで、このブロック上で十分な量の計算がされたことを証明する(Proof-of-Work)。
ナンスとミックスハッシュの組み合わせは、イエローペーパーの式(44)を満たさないといけない。
これにより、そのブロックが本当に暗号論的に採掘されていて、この意味で妥当なものと検証できる。

【nonce】
64bitのハッシュで、ミックスハッシュと組み合わせることで、このブロック上で十分な量の計算がされたことを証明する(Proof-of-Work)。
ナンスとミックスハッシュの組み合わせは、イエローペーパーの式(44)を満たさないといけない。
これにより、そのブロックが本当に暗号論的に採掘されていて、この意味で妥当なものと検証できる。
このトークンの値を決定するにあたって特定領の計算がなされたことについて、合理的な疑いを残さない程度に証明するようなプルーフ・オブ・ワークという暗号学的に安全なマイニングがナンスである。

【difficulty】
このブロックでナンスを見つけるまでに適用される難易度に相当するスカラー値[注1]
これは1つ前のブロックの難易度とタイムスタンプから計算されるマイニングターゲットを定義する。
難易度を高くすると、マイナーは妥当なブロックを見つけるために、統計的により多くの計算をしないといけなくなる。
この値は、対象の範囲でブロック生成の頻度を保つようなあるブロックチェーンにおけるブロック生成時間を制御するために使われる。
妥当なブロックの発見はブロックチェーンのトランザクション実行に要求されるため、テストネットワーク上ではテストの待ち時間を避けるため低い値に保つ。

【alloc】
初めから中身の入ったウォレットのリストを定義するのを許可する。
これは「イーサの事前売り出し(プリセール)」期を扱うためのイーサ特有の機能。
ローカルのイーサはすぐに採掘できるので、このオプションは使わない。

【coinbase】
このブロックで成功したマイニングから集められた(イーサでの)全ての報酬が送られる160bitのアドレス。
これらはマイニング報酬自体と返金を実行するコントラクトのトランザクションとの合計。
仕様書では「beneficiary(受取人)」と名付けられていて、オンラインの文書だと「etherbase(イーサベース)」だったりする。
新しいブロックが生成されるときマイナーの設定によって設定される値なので、Genesisブロックでの値は何でも良い。

【timestamp】
このブロックの最初の時点での、Unixのtime()関数の妥当な出力に等しいスカラー値[注1]
この機構はブロック間時間の意味で恒常性を強制する。
最後の2ブロック間の時間間隔が小さくなると難易度は大きくなり、従って次の妥当なブロックを見つけるためにはよりたくさんの計算が要求される。
もしこの時間間隔が大きくなりすぎると、難易度と次のブロックまでの時間は減らされる。
またタイムスタンプで、そのチェーン内にあるブロックの順序を確かめられる。

【parentHash】
ナンスとミックスハッシュを含む、すべての親ブロックヘッダーのKeccak[注2]による256bitのハッシュ。
その親ブロックへのポインタ[注3]であり、したがって複数のブロックからなるチェーンを実質的に作っている。
Genesisブロックの場合のみ、これは「0」。

【extraData】
自由に選べる値。
ただし、ethernity[注4]のスマートさを保つために最長32byteのスペース。

【gasLimit】
1ブロックあたりに消費するGasに対する現在のチェーン幅制限に当たるスカラー値[注1]
テスト中、この閾値によって制限されるのを避けるため、今の場合は大きい値が設定されている。(このブログと同じ値)
注意として、この値を大きくしたからと言って、我々のコントラクトでGas消費に注意しなくて良いわけではない。


個人的な理解と疑問のメモ

上記の訳とさらに調べてみた内容から、現状の理解と疑問をメモしておきます。
まだよくわかってないので、触りながらおいおい疑問を解消していきたいところ。

・mixhash、nonce→マイニング結果の成否判定に使う値として設定する。この2つはイエローペーパーの式(44)の関係を満たすものが正当な組み合わせ。ナンスを設定しておいて、設定したナンスに対してイエローペーパーの式(44)を満たすミックスハッシュを総当たりで探すのがマイニングということかな。今回、本に書いてたGenesis.jsonの中身にあったミックスハッシュの値は自明な値ってことかな…?

・difficulty→採掘難易度。この値がナンスの値に条件を付ける。難易度を上げると、正しいミックスハッシュを見つけるのが難しいナンスが設定されるということかな。

・alloc→ウォレットの初期値設定ということか。

・coinbase→マイニング報酬が送られるアドレス。Genesis.jsonで設定したcoinbaseのアドレスにすべての報酬が送られるのか…?それとも各ブロックごとに、ブロックを生成したノード(マイナー)のアカウントアドレスが設定されるんだろうか?前者だとすると、マイナーすべての報酬をまとめたアドレスからマイナーが報酬をもらうの…?それともこのアドレスは複数設定できるのだろうか?まだよく理解できない。。

・timestamp→ブロックに設定された生成時刻…ってことでいいのかな?

・parentHash→親ブロック情報をハッシュ値にしたもの。以前書いた内容で、(狭義の)ブロックチェーンはハッシュ値でブロックをつなげたものというのがありましたが、ブロック同士をつなげるためのハッシュ値がこの「親ハッシュ」という値のことみたいですね。実際には親ブロックすべてではなく、親ブロックのヘッダ情報のハッシュ値を、親ブロックの情報として持っているということかな。

・extraData→その他の関連情報、という感じですがいまいち用途がわからない。。ネットニュースで「Extradata」という言葉は出てきていますが。。

・gasLimit→これはたぶん、以前書いた内容と同じと思ってよさそうです。

現状の私の理解はこんな感じですね。
まだ理解できていない箇所が結構ありますが、これは今後肉付けしていきたいところ。

(参考)
What does each genesis.json parameter mean?(StackExchange)
プライベート・ネットに接続する(Ethereum入門)
etherを採掘する(Ethereum入門)
Ethereumはどのように動いているのか(The Coffee Times)
イーサリアム(Ethereum)サーバ構築編(都会暮らしを楽に生きる)
Ethash(ethereum/wiki)
Ethereumを使って独自トークンを作ってみる(1)(FRONT)


Gethの起動コマンド

前回使ったGeth起動「呪文」の内容を見ておこうかと思います。

前回唱えた呪文は、こんな内容。
vm01@ubuntu:~$ geth --networkid 4649 --nodiscover --maxpeers 0 --datadir /home/vm01/data_testnet console 2>> /home/vm01/data_testnet/geth.log


とりあえずオプションの意味をメモしておきます。

・--networkid→ネットワーク識別子。「0」~「3」は予約済みのため使えない。

・--nodiscover→自分のノードを、他のノードから検出できないようにするオプション。

・--maxpeers→自分のノードに接続できるノード数。「0」だと他のノードと接続しない。

・--datadir →データディレクトリの指定。指定なしだとデフォルトのディレクトリが使用される。

・console→対話型JavaScriptコンソールを起動。

・2>>→エラー出力のリダイレクト。(Linuxコマンドでの出力先指定)


まとめ

今回は、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」からはちょっと寄り道して、「Genesisファイル」と「Gethの起動コマンド」について深めてみました。

パラメータの内容を調べて、結果と自分なりの理解や疑問をメモしました。
内容は上記参照のこと。

パラメータ内容は何となくわかってきたので、疑問点はいったんおいておいて次は教科書をすすめたいと思います。

では今回はこのへんで。


[注1] スカラー値…向きなどの情報を持たないただの数のこと。これに対してベクトル値だと、複数の数を組み合わせることで向きの情報も持たせることができる。
[注2] Keccak…ハッシュ関数(ハッシュ生成アルゴリズム)の1つ。SHA-3。
(参考)
次世代ハッシュ関数 SHA-3 アルゴリズム(JPCERTCC)
SHA-3(Wikipedia)

[注3] ポインタ…wikiによると「あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照する(指し示す)もの」。データそのものではなく、データの位置情報。
(参考)
ポインタ (プログラミング)(Wikipedia)

[注4] ethernity…これのこと…?

コインチェック事件のその後と最近の仮想通貨業界

どうも、ぺろりんです。

以前の記事でcoincheck(コインチェック)のNEM流出事件についてまとめましたが、個人的な頭の整理もかねて、今回はその後の展開をまとめておこうかと思います。

金融庁が本腰を入れて動きだしたりcoincheckが買収されたり、この数か月で仮想通貨業界の歴史が動いているなぁと思いつつ、何が起きたのかをこのあたりでもう一度まとめておこうかなぁと。

以前の記事では2018/2/4時点までの動向をまとめました。
これは、金融庁によるcoincheckへの立ち入り調査が実施されてすぐくらいでした。

今回は、その後の動向をまとめてみます。


NEM流出事件のその後

金融庁によるcoincheckへの立ち入り調査実施後、他の業者へも立ち入り調査が波及します。
2018/2/8、金融庁の登録業者およびみなし業者からなるすべての仮想通貨取引所31社について、金融庁による立ち入り調査が実施されます。

2018/2/9には凍結されていたcoincheckのユーザー口座から日本円出金が再開されました。
そして立ち入り調査後の報告期限である2018/2/13、coincheckから報告書を提出し、coincheck COOの大塚氏による緊急記者会見も開かれました。

2018/3/8には2度目の業務改善命令が金融庁からcoincheckへ出され、2018/3/12には予告されていた方針によるNEMの補償が始まり、一部仮想通貨の売却および出金も再開されました。

流出したNEMはダークウェブ経由で匿名性の高い通貨を経由して資金洗浄され、2018/3/20にはついにNEM財団による流出NEMの追跡が終了されました。

そして2度目の業務改善命令の報告期限である2018/3/22に報告書の提出を報せるとともに、LSK(LISK:リスク)とFCT(Factom:ファクトム)の売却と出金も再開されました。

日本の新年度に入った2018/4/6、REP(Augur:オーガー)、DASH(ダッシュ)、ZEC(Zcash:ジーキャッシュ) の売却および出金再開とともに、coincheckがマネックスグループにより買収されるという大きな動きがありました。

ここまでが、2018/4/14時点での大まかな動向かな、という理解です。
(書きもらしていたら追記しますので、メールフォームからご指摘いただけると助かります)

(参考)
コインチェック以外の仮想通貨業者も立ち入りへ 金融庁(朝日新聞デジタル)
仮想通貨、2取引所検査 全社立ち入りへ(毎日新聞)
国内の取引所へ金融庁の立ち入り検査始まる(仮想通貨JAPAN)
日本円出金再開のお知らせ(coincheck)
業務改善命令に係る報告書提出のご報告(coincheck)
日本円振込のお知らせ(coincheck)
「コインチェック出金再開」を報告する心中複雑な投資家たち(Business Insider Japan)
当社に対する金融庁の業務改善命令について(coincheck)
NEM保有者への補償は来週めど――2回目の業務改善命令を受けたコインチェックが会見(TechCrunch Japan)
不正に送金された仮想通貨NEMの保有者に対する補償について(coincheck)
一部仮想通貨の出金、売却再開のお知らせ(coincheck)
NEM/XEMの補償金が日本円で入金されました その税金の処理は?(谷口孔陛 税理士事務所)
コインチェック、NEMの補償を開始--仮想通貨の出金・売却も一部再開( CNET Japan)
コインチェック流出NEM、ダークウェブで4割販売済み(YOMIURI ONLINE)
NEM財団、流出した仮想通貨「NEM」の追跡を終了(ねとらぼ)
コインチェックから流出したNEM、追跡打ち切り NEM財団が声明(ITmedia NEWS)
NEM財団がハッカーの追跡を終了、事実上の敗北宣言(格差脱出の資産運用)
業務改善命令に対する業務改善計画書提出のご報告(coincheck)
一部仮想通貨の出金、売却再開のお知らせ(LSK、FCT)(coincheck)
コインチェック株式会社、マネックスグループ株式会社の完全子会社化及び新経営体制のご報告(coincheck)
一部仮想通貨の出金、売却再開のお知らせ(REP、DASH、ZEC)(coincheck)


マネックスGによるcoincheckの買収

さて、coincheckがついに買収されました。
NEM流出事件直後からこの可能性も話題に挙がっており、選択肢の1つとして有用なものだったのでしょう。
買収したのはマネックスグループという、マネックス証券などを運営する「IT」というよりも「金融」の会社。

36億円での買収とのことですが、これが“お買い得”となるか否かは今後の動向によりますね。
2018/4/6に財務諸表が公表されましたが、売上高772億円ってすごいな。。

これにより和田・大塚両氏は取締役を退任し執行役員への就任となりましたが、マネックスGの松本社長によると今後の社長復帰もあり得るとのことで、これは先輩経営者が後輩の経営者を“助けた”ような形に見えるのは私がチョロイのだろうか。
個人的にはポジティブな買収だったのかな、という印象を持っています。

これは仮想通貨市場でも株式市場でも好感を持たれている様子です。
買収発覚時にマネックスの株価が上がったり、これ以後は仮想通貨市場も上昇傾向にあるように見えます。

(参考)
【速報】マネックスがcoincheck買収か?仮想通貨価格は報道を受けて回復中。(まだ仮想通貨持ってないの?)
コインチェック(coincheck)買収を受け入れ|マネックスが買収決定!(bitcoin Feed)
マネックス証券がコインチェック買収か?今後どうなる【みんなの反応】(COINHACK2)
コインチェックの財務諸表が初開示、17年3月期の純資産は5.4億円(au Webポータル経済・ITニュース)
初開示されたコインチェック社の業績を見たら、諭吉でも人の上に立つレベル。そして買収額が安価な理由とは (IT RUSH!)
なぜコインチェックを買収? マネックス社長「仮想通貨は重要な資産クラスになる」(engadget 日本版)


「仮想通貨交換業等に関する研究会」

2018/4/10、金融庁により「仮想通貨交換業等に関する研究会」の第1回会合が開かれました。
メンバー名簿を見た感じでは、技術的なところは置いておいて法的な部分に重点が置かれているように見えます。

参考に挙げた金融庁のページに資料がありますが、なかなかちゃんと調べられていて良い資料ですね。
ようやくまともな議論ができるくらいに理解が進みつつあるのかなという印象を受けます。

ICOについても1つのテーマとして議論して賛否両論あったようで、安全性のための規制だけでなく、規制することによる有望な企業への悪影響やICOのメリットについても言及されたみたいですね。
こういう建設的な議論ができるようになってきたのは良い傾向かと思います。

(参考)
「仮想通貨交換業等に関する研究会」(第1回)議事次第(金融庁)
ICOが諸悪の根源? 金融庁「仮想通貨研究会」の行方(MONEY PLUS)


まとめ

今年1月のNEM流出事件を受けて2月初めにcoincheckが業務改善命令を受けた後の仮想通貨業界の大まかな動向を、coincheckを中心としてまとめてみました。

やはり一番大きなターニングポイントというのがマネックスグループによるcoincheckの買収でしょう。
NEM流出事件からずっと低調、もしくは下降傾向にあった仮想通貨市場が、恐らくこれを機に上昇傾向に転じているように見えます。

金融のノウハウを持ったマネックスグループとの協働によりcoincheckが以下に復活するか、そして今後も仮想通貨業界を盛り上げてくれるのか、というところに注目したいです。
個人的な感想としては、手数料は高いんですが、UIは使いやすいし購入自体もやりやすいcoincheckは結構好きです。
また、今回の対応は悪くなかったと思っていますし、若い経営者が頑張っているというのも応援したいです。

仮想通貨業界の動向としては、金融庁の会合がなかなか良いもののように思えて今後に期待が持てるかな、という印象です。
しっかり議論して、現状のバカげた税金計算も改善していただきたいところです。

引き続き、仮想通貨業界の動向を興味深く見ていきたいとおもいます。
ではでは今回はこのへんで。

Gethはじめ

どうも、ぺろりんです。


今回も「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」でお勉強していきます。
コード以外は本の内容そのまま書かないよう注意せねば。。

さて、今回はGethの起動です。


準備

ここでは、起動前にテストネットワーク用のデータディレクトリと、Genesisブロック(0番目のブロック)を作成します。
で、準備の最後にGethを初期化します。

前回rootユーザー(ユーザー名の横に「#」がついてる)になってたので、私の場合、ひとまず本に合わせて普通のユーザー(ユーザー名の横に「$」がついてる)になっておきます。初めから「$」になってたら特にやる必要はないです。
root@ubuntu:~# exit
ログアウト
vm01@ubuntu:~$


ユーザーを変えたので、とりあえずPathだけ確認しておきます。大丈夫そう。
vm01@ubuntu:~$ which geth
/usr/local/bin/geth



データディレクトリの作成

ここでは本に合わせた場所と名前でデータ用のディレクトリを作成します。
vm01@ubuntu:~$ mkdir ~/data_testnet
vm01@ubuntu:~$ cd data_testnet/
vm01@ubuntu:~/data_testnet$ pwd
/home/vm01/data_testnet



Genesisファイルの作成

次に、Genesisファイルを作成します。ファイルはjson形式[注1]です。本のとおり、Linuxのテキストエディタのviエディタ[注2]を起動して作成しましょう。viに慣れてなかったら、たぶん拡張子だけ「json」にして、GUIからテキストファイルで同じ場所にファイルを作れば良いかと思います。
vm01@ubuntu:~/data_testnet$ vi genesis.json


開いたらこんな感じの内容を入れます。
{
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0",
"gasLimit": "0x8000000",
"difficulty": "0x4000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}
~
~
~
~
~
~
~
~
~
~
"genesis.json" 11 lines, 367 characters


作成できたことを確認します。ちゃんとありますね。
vm01@ubuntu:~/data_testnet$ ls
genesis.json


中身も確認しておきましょう。
vm01@ubuntu:~/data_testnet$ cat genesis.json 
{
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0",
"gasLimit": "0x8000000",
"difficulty": "0x4000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}



Gethの初期化

この「おまじない」で初期化できるそうです。「vm01」のところはご自分のユーザー名を入れてください。
vm01@ubuntu:~/data_testnet$ geth --datadir /home/vm01/data_testnet init /home/vm01/data_testnet/genesis.json


おまじないを唱えると、こんな感じになります。はじめの行に「WARNING」と出てますが、本と同じなので大丈夫そう。
I0321 06:51:35.178564 cmd/utils/flags.go:615] WARNING: No etherbase set and no accounts found as default
I0321 06:51:35.180028 ethdb/database.go:83] Allotted 128MB cache and 1024 file handles to /home/vm01/data_testnet/geth/chaindata
I0321 06:51:35.243803 ethdb/database.go:176] closed db:/home/vm01/data_testnet/geth/chaindata
I0321 06:51:35.245107 ethdb/database.go:83] Allotted 128MB cache and 1024 file handles to /home/vm01/data_testnet/geth/chaindata
I0321 06:51:35.306442 cmd/geth/chaincmd.go:131] successfully wrote genesis block and/or chain rule set: 3b3326d56983eec74bcd3c5757801dcd42e0bf2f169fc0c5d695e28e20f217d7


初期化するとデータディレクトリがこんな感じになります。
vm01@ubuntu:~/data_testnet$ cd
vm01@ubuntu:~$ tree data_testnet/
data_testnet/
├── genesis.json
├── geth
│   └── chaindata
│   ├── 000002.log
│   ├── CURRENT
│   ├── LOCK
│   ├── LOG
│   └── MANIFEST-000003
└── keystore

3 directories, 6 files


これで準備が終わりました。


Gethの起動

本に言われた通りのおまじないをたたきます。(gethコマンドのヘルプはこちらへ)
vm01@ubuntu:~$ geth --networkid 4649 --nodiscover --maxpeers 0 --datadir /home/vm01/data_testnet console 2>> /home/vm01/data_testnet/geth.log


こうなればうまく起動したってことみたいです。
Welcome to the Geth JavaScript console!

instance: Geth/v1.5.5-stable-ff07d548/linux/go1.6.2
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>



まとめ

今回は、Geth用のディレクトリを用意してGethの起動までやりました。

内容を気にせず本に言われた通りすすめてきましたが、そろそろ気持ち悪いので「Genesisファイル」と「Gethの起動コマンド」についてもう少し理解を深めていきたいと思います。
ここに書くと記事が長くなりそうだったので、これは次回にまわします。


[注1] json形式…JavaScript Object Notation の略だそう。調べた結果をザクっというと、「JavaScriptから派生し、テキストベースでいろんなブラウザとか言語に対応したデータ記述形式の一種」とのこと。
(参考)
非エンジニアに贈る「具体例でさらっと学ぶJSON」(Developers.IO)
JSONってなにもの?(Think IT)
JSONの意味・解説(Weblio 辞書)

[注2] viエディタ…Linuxで使うテキストエディタ。癖があるので初見だとドキッとするかも。「文字入力するためにモード切替する」とかいうエディタです。もう少しいうと、カーソルを動かしたりするモード、入力するモード、ファイルを終了(保存したりしながら)するためのモード、という3つのモードがあります。とりあえずviコマンドたたいてみたけど戻れねーよ!!ってなったら、[Esc]を押してから[:]を押して[q]、最後に[Enter]で抜けましょう。[q]でだめなら[:]のあとに[q]、[!]と入力して[Enter]で強制終了です。詳しい使い方は参考サイトをご参照ください。
(参考)
viエディタの使い方(Linux 入門)

Ethereum送金時のHEXとIBANの違い

どうも、ぺろりんです。

Ledger NanoS にEthereumを送金するとき、「HEX」と「IBAN」という選択肢があってよくわからないので調べてみました。


日本語サイトだけ調べてもモヤモヤが残るので、今回は海外サイトまで手を広げて調べました。


「HEX」

hexadecimal(16進数)アドレスのことのようです。
これは「0x...」から始まるアドレスになって いて、こちらが「普通の」アドレスっぽいです。

(参考)
Hex address? (ethereum - Reddit)
hex address(英辞郎 on the WEB)


「IBAN」

ICAP (Inter-exchange Client Address Protocol)というのに対応したウォレット間の送金で使える、IBAN[注1]のフォーマットに沿ったアドレスのようです。

こちらには送金アドレスの記載ミスを防ぐためのチェックサム[注2]が入っているとのこと。
なので、これを使えるウォレット同士の送金であればIBAN(もしくはICAP)アドレスを使う方が安全そうです。

(参考)
What is the difference between ICAP and HEX addresses?(Stack Exchange)
Which Ethereum clients/wallets support the ICAP?(Stack Exchange)
What's the point of IBAN addresses?(Stack Exchange)
What is an ICAP address?(Stack Exchange)
HEX、ICAP、IBAN 地址的差別(凝視、散記)
ICAP: Inter exchange Client Address Protocol(ethereum/wiki)
イーサを入金する際HexとICAPのどちらを選べばよいのですか。(Kraken)


まとめ

Ethereum送金時に選べるアドレスの意味は以下の通りでした。
 ・HEX→普通の16進数アドレス。
 ・IBAN(or ICAP)→IBANコード対応のアドレス。

重要な違いとしては、IBANの方はチェックサムが入っているところですかね。


[注1] IBAN(アイバン)…International Bank Account Number(国際銀行口座番号)の略。「銀行口座の所在国、支店、口座番号を一意に特定するための統一規格のコード」だそうです。国際送金のための規格みたいです。国際銀行間通信協会(SWIFT)が登録機関になっているようです。コード例が参考に挙げたWikiにあるのでご参考ください。
(参考)
 ・IBAN(三菱UFJ銀行)
 ・IBANコード(Wikipedia)
 ・IBANコードとは(iFinance)

[注2] チェックサム…誤り制御で使う符号。送受信時にデータが壊れた場合に、間違ったデータであることが分かるようにした仕組み。詳しくは参考ページへ。
(参考)
 ・チェックサム(コトバンク)
 ・チェックサム(Wikipedia)
 ・IP チェックサムの秘密(MEW.org)

プロフィール

ぺろりん

Author:ぺろりん
まだ始まってもいない暗号資産(仮想通貨)、今後が楽しみです。
基本的な技術をちゃんと知りたいなぁと思いつつ、まったりお勉強していこうかと思います。

twitter:ぺろりん@ぶろっくちぇーん

カテゴリ
最新記事
最新コメント
月別アーカイブ
カレンダー
03 | 2018/04 | 05
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -
検索フォーム
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

Bitcoin 取引情報
Ethereum 取引情報