ビットコインアドレスの生成

Bitcoin Coreで自分のwalletに新しい公開鍵暗号の鍵のペアを作成する
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoind -daemon
Bitcoin server starting
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli getnewaddress
39Gydphv6RaWwmx3bwEbGihtvXdXWXnobW

walletの秘密鍵の暗号化
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli encryptwallet password
wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet. The keypool has been flushed and a new HD seed was generated (if you are using HD). You need to make a new backup.
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoind -daemon
Bitcoin server starting

U01 testnet Faucet https://bitcoinfaucet.uo1.net/

あれ、rpc errorってなってる??

transactionがpendingになっているので、Proof of workがまだって理解でOK?
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli getbalance
0.00000000

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli listunspent
[
]

bitcoin coreを動かすと、大分具体的になるね。

require 'bitcoin'
require 'net/http'
require 'json'
Bitcoin.network = :testnet3
RPCUSER = 
RPCPASSWORD =
HOST = "localhost"
PORT=18332

def bitcoinRPC(method, param)
	http = Net::HTTP.new(HOST, PORT)
	request = Net::HTTP::Post.new('/')
	request.basic_auth(RPCUSER,RPCPASSWORD)
	request.content_type = 'application/json'
	request.body = {method: method, params: param, id: 'jsonrpc'}.to_json
	JSON.parse(http.request(request).body)["result"]
end

ビットコインアドレス

ビットコインの送金は原理的には送金先の公開鍵があればできる
ビットコインで実際に送金先を表す固有名はビットコインアドレス
公開鍵と1対1に対応している

ビットコインアドレスは、チェックサム、プレフィックス、base58エンコーディングの利用を行なっている

0x04 公開鍵x 256ビット 公開鍵y 256ビット
↓                     チェックサム
1バイト ペイロード 20バイト(160バイト) 4バイト
↓ base58 エンコーディング
ビットコインアドレス アルファベット26-35文字

base58エンコーディングは1,l,0,o,+,/,=を使わない

プレフィックス
ビットコインアドレスの先頭1バイトはバージョン・種別を表す
0x00(mainnet), 0x6F(testnet), 0x05(mainnet), 0xC4(testnet)

チェックサム
SHA256(SHA256(プレフィックス + 512ビット公開鍵))

ビットコインのトランザクション

総量保存則
データ構造は、インプットとアウトプットという2つの領域で出来ている
複数存在することが可能
複式簿記と同様、インプットとアウトプットの総額は一致しないといけない
確実性の保証の為、トランザクションに対する会計監査が必ず一致しないといけない
通貨的価値が増減することはない為、通貨価値の総量保存則と呼んでいる

自制式三色簿記構造
トランザクションのアウトプットには、未使用状態と使用済み状態があり、未使用状態のアウトプットをUTXO(unspent transaction output)と呼ぶ
使用済みアウトプットは次のトランザクションのインプットから参照

トランザクションの手数料
送信者はマイナーに対して自分のトランザクションを優先的にブロックに取り込んでもらう為、手数料を支払う必要がある
インプットの総額とアウトプットの総額の差額が手数料
どのトランザクションをブロックに含めるかどうかはマイニングに成功したマイナー次第

-トランザクション手数料に関するパラメータのデフォルト値
txconfirmtarget: 2(block)
paytxfee: 0(BTC/kB)
fallbackfee: 0.0002 BTC/kB
maxtxfee: 0.10BTC

マイナーは受け取ったトランザクションをメモリープールに保管し、マイニングに成功するとブロックに格納する
ブロックサイズは固定
ハッシュチェーンという暗号技術とマイニングと呼ばれる計算競争が行われている

ハッシュチェーンは暗号学的ハッシュ関数を利用
1つのブロックには、平均10分間、数百から数千程度のトランザクションが格納
ブロック高0はジェネシス・ブロックと呼ばれる
マイニングの計算競争の難易度は、要する時間の平均が10分になるように自律的に調整されている
マイナーは中国を中心とする専門業者の独壇場になっている(10社程度でシェア90%)
通貨発行権はマイナーが持つ

公開鍵暗号を採用しており、ワレットをインストールすると、秘密鍵、公開鍵が生成されてワレットに登録される
最も長い枝が正統なブロックチェーンというルール
最新のブロックが接続するまでに何個のブロックが存在しているかの数を確認数という

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

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”: “”
}

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ビット)のハッシュ関数が採用されている

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

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

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