bitcoin-ruby

$ sudo apt-get install git gcc build-essential libreadline-dev zlib1g-dev
$ sudo apt-get install libssl1.0-dev
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo ‘export PATH=”$HOME/.rbenv/bin:$PATH”‘ >> ~/.bash_profile
$ echo ‘eval “$(rbenv init -)”‘ >> ~/.bash_profile
$ exec $SHELL -l

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ rbenv -v
rbenv 1.1.2-11-gc46a970
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ rbenv install 2.0.0-p643
Downloading ruby-2.0.0-p643.tar.bz2…
-> https://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p643.tar.bz2
Installing ruby-2.0.0-p643…

WARNING: ruby-2.0.0-p643 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.

Installed ruby-2.0.0-p643 to /home/vagrant/.rbenv/versions/2.0.0-p643

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ rbenv rehash
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ rbenv versions
* system (set by /home/vagrant/.rbenv/version)
2.0.0-p643
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ rbenv global 2.0.0-p643
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ ruby -v
ruby 2.0.0p643 (2015-02-25 revision 49749) [x86_64-linux]

ビットコイン・ネットワークノード接続

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli getconnectioncount
error: Could not connect to the server 127.0.0.1:8332

Make sure the bitcoind server is running and that you are connecting to the correct RPC port.
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoind -daemon
Bitcoin server starting
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli getconnectioncount
6

接続しているpeerの情報も見れる。
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli getpeerinfo
[
{
“id”: 0,
“addr”: “82.195.237.253:8333”,
“addrlocal”: “106.154.137.22:64472”,
“addrbind”: “10.0.2.15:37006”,
“services”: “000000000000040d”,
“relaytxes”: true,
“lastsend”: 1572482905,
“lastrecv”: 1572482905,
“bytessent”: 1002038,
“bytesrecv”: 113691047,
“conntime”: 1572482645,
“timeoffset”: 0,
“pingtime”: 0.359843,
“minping”: 0.359843,
“version”: 70015,
“subver”: “/Satoshi:0.18.0/”,
“inbound”: false,
“addnode”: false,
“startingheight”: 601714,
“banscore”: 0,
“synced_headers”: 601716,
“synced_blocks”: 40376,
“inflight”: [
40404,
40411,
40416,
40447,
40451,
40463,
40464,
40465,
40466,
40472,
40480,
40485,
40499,
40519,
40523,
40524
],
“whitelisted”: false,
“bytessent_per_msg”: {
“addr”: 55,
“feefilter”: 32,
“getaddr”: 24,
“getdata”: 304889,
“getheaders”: 696606,
“ping”: 96,
“pong”: 96,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
},
“bytesrecv_per_msg”: {
“addr”: 30247,
“block”: 1261801,
“feefilter”: 32,
“getheaders”: 1053,
“headers”: 112377726,
“inv”: 19756,
“ping”: 96,
“pong”: 96,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
}
},
{
“id”: 7,
“addr”: “70.123.51.122:8333”,
“addrlocal”: “106.154.137.22:64482”,
“addrbind”: “10.0.2.15:45234”,
“services”: “000000000000040d”,
“relaytxes”: true,
“lastsend”: 1572482905,
“lastrecv”: 1572482905,
“bytessent”: 470175,
“bytesrecv”: 18568584,
“conntime”: 1572482661,
“timeoffset”: 0,
“pingtime”: 0.248508,
“minping”: 0.248508,
“version”: 70015,
“subver”: “/Satoshi:0.18.1/”,
“inbound”: false,
“addnode”: false,
“startingheight”: 601715,
“banscore”: 0,
“synced_headers”: 601716,
“synced_blocks”: 40390,
“inflight”: [
40448,
40452,
40455,
40457,
40458,
40459,
40460,
40462,
40491,
40494,
40544,
40546,
40547,
40548,
40549,
40555
],
“whitelisted”: false,
“bytessent_per_msg”: {
“addr”: 110,
“feefilter”: 32,
“getaddr”: 24,
“getdata”: 360103,
“getheaders”: 109474,
“ping”: 96,
“pong”: 96,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
},
“bytesrecv_per_msg”: {
“addr”: 30137,
“block”: 1515686,
“feefilter”: 32,
“getheaders”: 1053,
“headers”: 16989937,
“inv”: 31307,
“ping”: 96,
“pong”: 96,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
}
},
{
“id”: 9,
“addr”: “188.194.53.187:8333”,
“addrlocal”: “106.154.137.22:64485”,
“addrbind”: “10.0.2.15:57228”,
“services”: “000000000000040d”,
“relaytxes”: true,
“lastsend”: 1572482905,
“lastrecv”: 1572482905,
“bytessent”: 295793,
“bytesrecv”: 17806963,
“conntime”: 1572482668,
“timeoffset”: 0,
“pingtime”: 0.544024,
“minping”: 0.544024,
“version”: 70015,
“subver”: “/Satoshi:0.18.0/”,
“inbound”: false,
“addnode”: false,
“startingheight”: 601715,
“banscore”: 0,
“synced_headers”: 601716,
“synced_blocks”: 40393,
“inflight”: [
40421,
40449,
40453,
40481,
40513,
40536,
40539,
40541,
40545,
40550,
40551,
40552,
40553,
40554,
40566,
40569
],
“whitelisted”: false,
“bytessent_per_msg”: {
“addr”: 55,
“feefilter”: 32,
“getaddr”: 24,
“getdata”: 185840,
“getheaders”: 109474,
“ping”: 64,
“pong”: 64,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
},
“bytesrecv_per_msg”: {
“addr”: 30222,
“block”: 754920,
“feefilter”: 32,
“getheaders”: 1053,
“headers”: 16989937,
“inv”: 30431,
“ping”: 64,
“pong”: 64,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
}
},
{
“id”: 10,
“addr”: “34.211.159.217:8333”,
“addrlocal”: “106.154.137.22:64486”,
“addrbind”: “10.0.2.15:37076”,
“services”: “000000000000040d”,
“relaytxes”: true,
“lastsend”: 1572482905,
“lastrecv”: 1572482905,
“bytessent”: 600482,
“bytesrecv”: 19067437,
“conntime”: 1572482669,
“timeoffset”: 0,
“pingtime”: 0.306789,
“minping”: 0.301101,
“version”: 70015,
“subver”: “/Satoshi:0.17.0/”,
“inbound”: false,
“addnode”: false,
“startingheight”: 601715,
“banscore”: 0,
“synced_headers”: 601716,
“synced_blocks”: 40387,
“inflight”: [
40473,
40482,
40486,
40511,
40512,
40514,
40515,
40520,
40525,
40526,
40529,
40531,
40533,
40534,
40535,
40537
],
“whitelisted”: false,
“bytessent_per_msg”: {
“addr”: 110,
“feefilter”: 32,
“getaddr”: 24,
“getdata”: 490474,
“getheaders”: 109474,
“ping”: 64,
“pong”: 64,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
},
“bytesrecv_per_msg”: {
“addr”: 30082,
“block”: 2015514,
“feefilter”: 32,
“getheaders”: 1053,
“headers”: 16989937,
“inv”: 30451,
“ping”: 64,
“pong”: 64,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
}
},
{
“id”: 11,
“addr”: “24.86.184.66:8333”,
“addrlocal”: “106.154.137.22:64526”,
“addrbind”: “10.0.2.15:33247”,
“services”: “000000000000040d”,
“relaytxes”: true,
“lastsend”: 1572482905,
“lastrecv”: 1572482905,
“bytessent”: 437167,
“bytesrecv”: 1929784,
“conntime”: 1572482769,
“timeoffset”: 0,
“pingtime”: 0.277844,
“minping”: 0.268512,
“version”: 70015,
“subver”: “/Satoshi:0.17.0.1/”,
“inbound”: false,
“addnode”: false,
“startingheight”: 601716,
“banscore”: 0,
“synced_headers”: 601716,
“synced_blocks”: 40390,
“inflight”: [
40454,
40505,
40506,
40516,
40518,
40521,
40527,
40530,
40538,
40540,
40542,
40543,
40556,
40558,
40561,
40565
],
“whitelisted”: false,
“bytessent_per_msg”: {
“addr”: 55,
“feefilter”: 32,
“getaddr”: 24,
“getdata”: 435635,
“getheaders”: 1053,
“ping”: 64,
“pong”: 64,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
},
“bytesrecv_per_msg”: {
“addr”: 30137,
“block”: 1884252,
“feefilter”: 32,
“getheaders”: 1053,
“headers”: 106,
“inv”: 13834,
“ping”: 64,
“pong”: 64,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 128
}
},
{
“id”: 13,
“addr”: “99.79.135.85:8333”,
“addrlocal”: “106.154.137.22:64537”,
“addrbind”: “10.0.2.15:56065”,
“services”: “0000000000000409”,
“relaytxes”: true,
“lastsend”: 1572482905,
“lastrecv”: 1572482905,
“bytessent”: 329279,
“bytesrecv”: 1443236,
“conntime”: 1572482803,
“timeoffset”: -1,
“pingtime”: 0.4799,
“minping”: 0.4799,
“version”: 70015,
“subver”: “/Satoshi:0.18.99/”,
“inbound”: false,
“addnode”: false,
“startingheight”: 601716,
“banscore”: 0,
“synced_headers”: 601716,
“synced_blocks”: 40390,
“inflight”: [
40500,
40502,
40503,
40507,
40508,
40509,
40510,
40517,
40522,
40557,
40559,
40560,
40562,
40563,
40564,
40567
],
“whitelisted”: false,
“bytessent_per_msg”: {
“feefilter”: 32,
“getaddr”: 24,
“getdata”: 327866,
“getheaders”: 1053,
“ping”: 32,
“pong”: 32,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
},
“bytesrecv_per_msg”: {
“addr”: 30082,
“block”: 1402751,
“feefilter”: 32,
“getheaders”: 1053,
“headers”: 106,
“inv”: 8907,
“ping”: 32,
“pong”: 32,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 127
}
},
{
“id”: 14,
“addr”: “144.76.136.19:8333”,
“addrlocal”: “106.154.137.22:64546”,
“addrbind”: “10.0.2.15:57609”,
“services”: “000000000000040d”,
“relaytxes”: true,
“lastsend”: 1572482905,
“lastrecv”: 1572482905,
“bytessent”: 185008,
“bytesrecv”: 823277,
“conntime”: 1572482832,
“timeoffset”: 0,
“pingtime”: 0.459487,
“minping”: 0.459487,
“version”: 70015,
“subver”: “/Satoshi:0.18.0/”,
“inbound”: false,
“addnode”: false,
“startingheight”: 601716,
“banscore”: 0,
“synced_headers”: 601716,
“synced_blocks”: 40356,
“inflight”: [
40467,
40469,
40470,
40471,
40474,
40475,
40476,
40477,
40478,
40483,
40487,
40489,
40492,
40495,
40497,
40498
],
“whitelisted”: false,
“bytessent_per_msg”: {
“addr”: 55,
“feefilter”: 32,
“getaddr”: 24,
“getdata”: 183540,
“getheaders”: 1053,
“ping”: 32,
“pong”: 32,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
},
“bytesrecv_per_msg”: {
“addr”: 30082,
“block”: 784172,
“feefilter”: 32,
“getheaders”: 1053,
“headers”: 106,
“inv”: 7528,
“ping”: 32,
“pong”: 32,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
}
},
{
“id”: 15,
“addr”: “95.216.40.83:8333”,
“addrlocal”: “106.154.137.22:64547”,
“addrbind”: “10.0.2.15:57602”,
“services”: “000000000000040d”,
“relaytxes”: true,
“lastsend”: 1572482905,
“lastrecv”: 1572482905,
“bytessent”: 178267,
“bytesrecv”: 744186,
“conntime”: 1572482834,
“timeoffset”: 0,
“pingtime”: 0.407235,
“minping”: 0.407235,
“version”: 70015,
“subver”: “/Satoshi:0.18.0/”,
“inbound”: false,
“addnode”: false,
“startingheight”: 601716,
“banscore”: 0,
“synced_headers”: 601716,
“synced_blocks”: 40394,
“inflight”: [
40456,
40461,
40468,
40479,
40484,
40488,
40490,
40493,
40496,
40501,
40504,
40528,
40532,
40568,
40570
],
“whitelisted”: false,
“bytessent_per_msg”: {
“addr”: 85,
“feefilter”: 32,
“getaddr”: 24,
“getdata”: 176769,
“getheaders”: 1053,
“ping”: 32,
“pong”: 32,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
},
“bytesrecv_per_msg”: {
“addr”: 30167,
“block”: 705406,
“feefilter”: 32,
“getheaders”: 1053,
“headers”: 106,
“inv”: 7118,
“ping”: 32,
“pong”: 32,
“sendcmpct”: 66,
“sendheaders”: 24,
“verack”: 24,
“version”: 126
}
}
]

regtestモードで起動してブロック生成する
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoind -regtest -daemon
Bitcoin server starting
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli -regtest generate 1
[
“18c1e609d11c30dbec70459f8d84f51448cbe83f442553f91c438e710b3bbb12”
]

bitcoinを扱うソフトウェア

Bitcoin Core: C++
L https://github.com/bitcoin/bitcoin
NBitcoin: C# .netプラットフォーム
L https://github.com/MetacoSA/NBitcoin
bitcoinj: Java ビットコインプロトコルを扱うライブラリ
L https://github.com/bitcoinj/bitcoinj
BitcoinJS: Javascript
L https://github.com/bitcoinjs/bitcoinjs-lib
btcd: Go 代替フルノードビットコインの実装
L https://github.com/btcsuite/btcd
bitcoin-ruby: Ruby
L https://github.com/lian/bitcoin-ruby
python-bitcoinlib: python
L https://github.com/petertodd/python-bitcoinlib

パッケージファイルからbitcoinをインストールします
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ sudo apt-add-repository ppa:bitcoin/bitcoin
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ sudo apt-get update
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ sudo apt-get install bitcoind bitcoin-qt
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoind -daemon
Bitcoin server starting

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli getinfo
error code: -32601
error message:
getinfo

This call was removed in version 0.16.0. Use the appropriate fields from:
– getblockchaininfo: blocks, difficulty, chain
– getnetworkinfo: version, protocolversion, timeoffset, connections, proxy, relayfee, warnings
– getwalletinfo: balance, keypoololdest, keypoolsize, paytxfee, unlocked_until, walletversion

bitcoin-cli has the option -getinfo to collect and format these in the old format.

なに??

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli getblockchaininfo
{
“chain”: “main”,
“blocks”: 35694,
“headers”: 601708,
“bestblockhash”: “000000009062077e217f362f93fda8db55cf0e35eb972356deef5717e2ae4347”,
“difficulty”: 1.305062131591525,
“mediantime”: 1264099851,
“verificationprogress”: 8.429550730434574e-05,
“initialblockdownload”: true,
“chainwork”: “00000000000000000000000000000000000000000000000000008e9262c37e60”,
“size_on_disk”: 9994385,
“pruned”: false,
“softforks”: [
{
“id”: “bip34”,
“version”: 2,
“reject”: {
“status”: false
}
},
{
“id”: “bip66”,
“version”: 3,
“reject”: {
“status”: false
}
},
{
“id”: “bip65”,
“version”: 4,
“reject”: {
“status”: false
}
}
],
“bip9_softforks”: {
“csv”: {
“status”: “defined”,
“startTime”: 1462060800,
“timeout”: 1493596800,
“since”: 0
},
“segwit”: {
“status”: “defined”,
“startTime”: 1479168000,
“timeout”: 1510704000,
“since”: 0
}
},
“warnings”: “”
}

ubuntuのgolangをアップデート

ubuntuのgolangをアップデートします
vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ go env
GOARCH=”amd64″
GOBIN=””
GOCHAR=”6″
GOEXE=””
GOHOSTARCH=”amd64″
GOHOSTOS=”linux”
GOOS=”linux”
GOPATH=””
GORACE=””
GOROOT=”/usr/lib/go”
GOTOOLDIR=”/usr/lib/go/pkg/tool/linux_amd64″
TERM=”dumb”
CC=”gcc”
GOGCCFLAGS=”-g -O2 -fPIC -m64 -pthread”
CXX=”g++”
CGO_ENABLED=”1″
vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ sudo apt-get update
vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ sudo apt-get install gcc make
vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ sudo apt-get install golang-1.10
vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ ls /usr/lib | grep go
go
go-1.10
gold-ld
vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ cd /usr/bin
vagrant@vagrant-ubuntu-trusty-64:/usr/bin$ sudo mv go go_16
vagrant@vagrant-ubuntu-trusty-64:/usr/bin$ sudo mv gofmt gofmt_16
vagrant@vagrant-ubuntu-trusty-64:/usr/bin$ sudo ln -s /usr/lib/go-1.10/bin/go /usr/bin/go
vagrant@vagrant-ubuntu-trusty-64:/usr/bin$ sudo ln -s /usr/lib/go-1.10/bin/gofmt /usr/bin/gofmt
vagrant@vagrant-ubuntu-trusty-64:/usr/bin$ go version
go version go1.10.4 linux/amd64

OK^^

再度makeします
vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ make -C go-ethereum geth

/usr/lib/go-1.10/pkg/tool/linux_amd64/link: -X flag requires argument of the form importpath.name=value

何いいいいいいいいいいいいい

Ethereumのインストール

ubuntuにgo言語実装のgo-ethereumを入れる
vagrant@vagrant-ubuntu-trusty-64:~$ mkdir ethereum
vagrant@vagrant-ubuntu-trusty-64:~$ ls
ethereum
vagrant@vagrant-ubuntu-trusty-64:~$ cd ethereum
vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ sudo apt-get install -y build-essential libgmp3-dev golang

vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ sudo apt-get install git
vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ git version
git version 1.9.1

vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ git clone -b release/1.3.6 https://github.com/ethereum/go-ethereum.git

おおお

vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ make -C go-ethereum geth
make: Entering directory `/home/vagrant/ethereum/go-ethereum’
build/env.sh go install -v -ldflags ‘-X main.gitCommit bf324bd24be9036046e36c6248b2d7c31cce9eca’ ./cmd/geth
github.com/codegangsta/cli
github.com/ethereum/go-ethereum/rlp
# github.com/ethereum/go-ethereum/rlp
build/_workspace/src/github.com/ethereum/go-ethereum/rlp/encode.go:162: undefined: sync.Pool
github.com/ethereum/go-ethereum/crypto/ecies
github.com/ethereum/go-ethereum/crypto/sha3
github.com/ethereum/go-ethereum/crypto/randentropy
github.com/ethereum/go-ethereum/crypto/secp256k1
github.com/pborman/uuid
golang.org/x/crypto/pbkdf2
golang.org/x/crypto/ripemd160
golang.org/x/crypto/scrypt
github.com/ethereum/go-ethereum/logger/glog
github.com/ethereum/go-ethereum/params
github.com/hashicorp/golang-lru
github.com/rcrowley/go-metrics
github.com/syndtr/goleveldb/leveldb/util
github.com/syndtr/goleveldb/leveldb/cache
github.com/syndtr/goleveldb/leveldb/comparer
github.com/syndtr/goleveldb/leveldb/storage
github.com/syndtr/goleveldb/leveldb/errors
github.com/syndtr/goleveldb/leveldb/filter
github.com/syndtr/goleveldb/leveldb/iterator
github.com/syndtr/goleveldb/leveldb/journal
github.com/syndtr/goleveldb/leveldb/memdb
github.com/syndtr/goleveldb/leveldb/opt
github.com/syndtr/gosnappy/snappy
github.com/syndtr/goleveldb/leveldb/table
github.com/syndtr/goleveldb/leveldb
gopkg.in/karalabe/cookiejar.v2/collections/prque
github.com/ethereum/go-ethereum/event
gopkg.in/fatih/set.v0
github.com/huin/goupnp/httpu
github.com/huin/goupnp/scpd
github.com/huin/goupnp/soap
github.com/huin/goupnp/ssdp
golang.org/x/net/html/atom
golang.org/x/net/html
golang.org/x/text/transform
golang.org/x/text/encoding
golang.org/x/text/encoding/internal/identifier
golang.org/x/text/encoding/internal
golang.org/x/text/encoding/charmap
golang.org/x/text/encoding/japanese
golang.org/x/text/encoding/korean
golang.org/x/text/encoding/simplifiedchinese
golang.org/x/text/encoding/traditionalchinese
golang.org/x/text/encoding/unicode
golang.org/x/net/html/charset
github.com/huin/goupnp
# github.com/huin/goupnp
build/_workspace/src/github.com/ethereum/go-ethereum/Godeps/_workspace/src/github.com/huin/goupnp/goupnp.go:113: unknown http.Client field ‘Timeout’ in struct literal
github.com/jackpal/go-nat-pmp
github.com/ethereum/go-ethereum/event/filter
github.com/robertkrimen/otto/file
github.com/robertkrimen/otto/token
github.com/robertkrimen/otto/ast
github.com/robertkrimen/otto/dbg
github.com/robertkrimen/otto/parser
github.com/robertkrimen/otto/registry
github.com/robertkrimen/otto
github.com/rs/cors
github.com/peterh/liner
github.com/mattn/go-isatty
github.com/shiena/ansicolor
github.com/fatih/color
github.com/mattn/go-runewidth
github.com/nsf/termbox-go
github.com/gizak/termui
make: *** [geth] Error 2
make: Leaving directory `/home/vagrant/ethereum/go-ethereum’

vagrant@vagrant-ubuntu-trusty-64:~/ethereum$ go version
go version go1.2.1 linux/amd64

https://github.com/ethereum/go-ethereum

Building geth requires both a Go (version 1.10 or later) and a C compiler. You can install them using your favourite package manager. Once the dependencies are installed, run

あれ?

Ethereum

Ethereumは、Solidityなどチューリング完全(※)な拡張言語を備える

※ある計算メカニズムが万能チューリングマシンと同じ計算能力を持つとき、その計算モデルはチューリング完全という
M =

Ethereumネットワークでは、EVM(Ethereum Virtual Machine Code)によって記述、処理される。この高水準言語が「Solidity」
仮想通貨の単位はEther, それより下の単位も存在し、10^-8Etherが「Szabo」、10^-18Etherが「Wei」
Ethereumはスマートコントラクトそのものや実行履歴も記録する
マイニングを行うと、取引の実行として通貨の送金やスマートコントラクトに記述したプログラムを実行し、記録する
アカウント間のやり取りだけでなく、スマートコントラスト(取引記録)のやり取りが可能
スマートコントラクトの実行環境はEVM
EthereumクライアントはC++、Go、Pythonなどの実装があるが、Goが最も活発
 え??? Goなの😅 

必要なアプリケーション: go-ethereum

CXX libbitcoin_server_a-blockencodings.o g++: internal compiler error: Killed (program cc1plus)

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ sudo make install
Making install in src
make[1]: Entering directory `/home/vagrant/bitcoin/src/bitcoin/src’
make[2]: Entering directory `/home/vagrant/bitcoin/src/bitcoin/src’
make[3]: Entering directory `/home/vagrant/bitcoin/src/bitcoin’
make[3]: Leaving directory `/home/vagrant/bitcoin/src/bitcoin’
CXX libbitcoin_server_a-blockencodings.o
g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See for instructions.
make[2]: *** [libbitcoin_server_a-blockencodings.o] Error 4
make[2]: Leaving directory `/home/vagrant/bitcoin/src/bitcoin/src’
make[1]: *** [install-recursive] Error 1
make[1]: Leaving directory `/home/vagrant/bitcoin/src/bitcoin/src’
make: *** [install-recursive] Error 1

なに?????????
c++: internal compiler error: Killed (program cc1plus) はメモリが足りない??

メモリを増設するか、swap領域を確保するか。
メモリ増設だとvagrant fileか?

  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end

現状を確認します。
swapは0Bか?
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ cat /etc/fstab
LABEL=cloudimg-rootfs / ext4 defaults 0 0
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ swapon -s
Filename Type Size Used Priority
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ free -h
total used free shared buffers cached
Mem: 489M 209M 279M 720K 7.0M 37M
-/+ buffers/cache: 165M 324M
Swap: 0B 0B 0B

swapファイルを作成する
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ sudo fallocate -l 2G /swapfile
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ ls -lh /swapfile
-rw-r–r– 1 root root 2.0G Oct 28 14:21 /swapfile
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ sudo chmod 600 /swapfile
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ ls -lh /swapfile
-rw——- 1 root root 2.0G Oct 28 14:21 /swapfile
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=fa2787e1-8129-4685-9586-651f61fb0d8e
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ sudo swapon /swapfile
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src/bitcoin$ free -h
total used free shared buffers cached
Mem: 489M 211M 278M 720K 7.1M 38M
-/+ buffers/cache: 166M 323M
Swap: 2.0G 0B 2.0G

きたーーーーーーーーーー

で、もう一回、bitconfのディレクトリでmakeします。今度は行けるか?
あれ、もしかして来たか??

ubuntuにbitcoin coreをインストール

vagrantでubuntuにssh接続して、githubからbitcoin coreをgit cloneします。
Bitcoin Core

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ mkdir src
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ cd src
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin/src$ git clone https://github.com/bitcoin/bitcoin.git
Cloning into ‘bitcoin’…
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
Receiving objects: 100% (147338/147338), 132.89 MiB | 112.00 KiB/s, done.
remote: Total 147338 (delta 1), reused 2 (delta 1), pack-reused 147334
Resolving deltas: 100% (102529/102529), done.
Checking connectivity… done.

入りました

apt-get updateでパッケージリストを更新して、gcc、libdb4.8、関連ライブラリ、GUIライブラリをインストール
Bitocoin Coreをビルド
./autogen.sh
./configure
make

おおおおおおおおおお、なんかすげーなこれ

ブロックチェーンの電子署名

ブロックチェーンでは、電子署名によってトランザクションの正当性を保証している
各トランザクションに一つずつ電子署名が付与され、電子署名を検証するための公開鍵もセットで付与される
電子署名を検証することで、トランザクションの内容が偽造・改ざんされていてないことを確認できる
ビットコインではSHA-256(256ビット)のハッシュ関数が採用されている

ビットコインのブロックは、ブロックヘッダ+トランザクション情報(複数)からなる
ブロックヘッダは「前ブロックヘッダのハッシュ値+ナンス+トランザクションのハッシュ値」から構成されている

ところで、リミックスなど、取引所でコインが盗まれる、というのはどういう事象を指しているのだろうか?トランザクションはチェーンに記録として残るのだから、盗難したコインの送付先は解るようみ見えるのだが、、
何からのトランザクションを追えない仕組みで送付しているのかな。

そういえば、サトシ・ナカモトは論文を発表しただけでなく、ブロックチェーン基盤自体の開発にも携わってるんですね。。知らんかった。

PBFT(Pratical Byzantine Fault Tolerance)

PoWやPoSと同様Byzantine Faultモデルだが、ファイナリティの不確実性や性能問題を解消している

– PBFTではネットワークのすべての参加者をあらかじめ知っている必要がある
– 参加者の1人がプライマリーとなり、要求を全参加者に送る。要求に対する結果を集計し、多数を占めている値を採用することでブロックを確定。
– 不正なノード数をf個とする場合、ノード数は3f+1個である必要があり、確定にはf+1個以上のノードが必要
– 分岐しない為、性能的に非常に高速

Sieve
IBMで考案されたPBFTを拡張したアルゴリズム
Paxos、Raftなどのコンセンサスアルゴリズムもある

考え方によるが、中央集権型か、合意形成型かで大きく異なる様ですね。しかし、PoWのビットコインがこれだけ仮想通貨の中で支持を集めているというのは、ネットが登場して、現代社会というのは本当に変わりましたな。