ビットコインの基礎知識(4) - ビットコインの流れ

ブロックチェーン上でビットコインをやり取りする時には次のようなフローになります。

1. トランザクションの生成

ウォレット・アプリを操作することで、受信者のアドレスと送信者の秘密鍵で作成した署名を付与したトランザクションを生成します。

2. ノードに送信

生成したトランザクションを、ブロックチェーン・ネットワークへの参加端末(ノード)に送信します。

3. マイニング開始

トランザクションを受信した参加端末(ノード)は、トランザクションの正常性を検証後、前のブロックを生成後10分経過するとマイニングを開始します。

4. ブロック生成とブロックのブロードキャスト

マイニングで正しいノンスを見つけたノードは、受信したトランザクションと自身へのマイニング報酬を示すトランザクションからブロックを生成し、自身の台帳に追加するとともに全ノードにブロックをブロードキャストで転送します。

5. 分散台帳の登録

各ノードは受信したブロックの正常性を検証後、それぞれが持つ分散元帳の最後に書き込みます。

以上です。

ビットコインの基礎知識(3) - 参加者

参加者

ビットコイン・ネットワークには特定の管理運営者や所有者はいません

世界中の開発者がビットコイン・プログラムを開発し、さまざまな目的を持つ参加者がこのプログラムをコンピュータ上で稼働させてノードとなり、これらをつなげあうことでネットワークが構築されています。

参加者は次のように4分類できます。

  • 利用者
  • 交換所、取引所
  • マイナー(採掘者)
  • コア・プログラムの開発者

マイナーはビットコインをマイニング(採掘)して報酬を得ることを目的としています。(ビットコイン・ネットワークはシステムの維持運営への協力に対する報酬をマイナーに発行します。)

マイナーは報酬として得たビットコインを通貨取引所や交換所を通じて、個人の利用者との間で法定通貨と売買することで流通が行われます。

ビットコインの基礎知識(2) - 発行上限

発行上限は2100万BTC

ビットコインには中央銀行のような管理組織はありません

このためマイニングで無限にビットコインが発行されると、ビットコイン自体の価値が低下するというインフレになります。

コア開発者はこれを防ぐため、2100万BTCを発行上限とし、半減期という仕組みで徐々に発行量を減らすプログラムを組み込みました。

具体的には4年ごとにマイニング報酬額を半分に減らすというもので、2140年頃に発行量はゼロとなるように作られています。

ビットコインの基礎知識(1)

ビットコインの実態は取引データの集合体

ビットコインの取引を行うためには、ウォレット・アプリを自身のパソコン・スマホ・タブレットに導入する必要があります。

このウォレットに誰かからビットコインを送金してもらうと、ウォレット上に自身が所有するビットコインの量(BTC)が表示されるようになります。

取引されたビットコインは、利用者同士のウォレット間で送受信された訳ではありません。

取引データはビットコイン・ネットワークと呼ばれる世界中にある何千台ものノードにブロードキャストされ、各ノードの中にある台帳に書き込まれます。

この台帳に書かれた取引データこそがビットコインの実態です。

全てのノードの台帳は常に同期されているため、ウォレットがどのノードに接続しても同じ取引データを参照でき、送金が行われるとそれを利用者は認識できます。

オープンソースのブロックチェーンを試す(6) - Ethereum(イーサリアム)のアカウント登録とマイニング

前回はUbuntuで、Ethereumの起動テストまでを行いました。

今回はアカウントの登録とマイニングを行います。

アカウントの登録

アカウントを登録するためにはpersonal.newAccountコマンドを使います。

コマンド入力後、パスフレーズを2回入力する必要がありますが、このパスフレーズは絶対に忘れないようにしてください。

パスフレーズを忘れた場合の救済措置は一切ありません

[コマンド]

1
personal.newAccount()

[実行結果]

途中実行ログが表示されてしまって少々見づらいですが、最終行に表示されている文字列がアカウントを表す情報となります。

ちなみに、eth.accountsコマンドを使うと、登録されているアカウントの一覧を表示することができます。

[コマンド]

1
eth.accounts

[実行結果]

マイニング

Ethereumでは何かを行うときに、ether(コイン、報酬)が必要となります。

理由は仲間内のブロックチェーンでも、チェーンがつながるためには複数ノードのよるマイニングが必要で、そのマイニングする動機づけとして報酬が必要だからです。

というわけで、下記コマンドを使ってマイニングを開始します。

[コマンド]

1
minert.start()

[実行結果]

マイニングを開始すると下記のようなログが表示されるようになります。

[実行結果]

  • Commit new mining work
    「新しいマイニング作業をコミットした(始まった)」・・・という意味でしょうか。
  • Successfully sealed new block
    「新しいブロックのシール貼りが成功した」・・・という意味でしょうか。
  • mined potential block
    「潜在的なブロックを採掘した」・・・という意味でしょうか。

マイニングしている雰囲気を感じてもらえたら十分かと思います。🙇‍♀️🙇‍♀️🙇‍♀️

マイニング状況の確認

しばらくマイニングを続けたら、一旦下記コマンドでマイニングを止めます。

[コマンド]

1
miner.stop()

[実行結果]

採掘されたブロック数を確認します。

[コマンド]

1
eth.blockNumber

[実行結果]

次に残高(マイニングして得た報酬)を確認します。

[コマンド]

1
eth.getBalance("アカウント")

[実行結果]

マイニングを行うことで、ブロックが生成され、マイニングを行ったアカウントに対して報酬(ether)を入手できることが確認できました。

オープンソースのブロックチェーンを試す(5) - Ethereum(イーサリアム)の起動2回目

前回はWSL上で、Ethereumの起動テストを行いまして失敗しました。

調べたところWSLだとListen設定ができないとのことで、WindowsにVirtualBoxをインストールし、ゲストOSとしてUbuntu20.04を設定し、再度Ethereumの起動テストを行いました。

さらに、これまでWSL上で実行してきた手順オープンソースのブロックチェーンを試す(1)~(3)をやり直しました。

以下はその続きとなります。

ジェネシス・ブロックの準備

まず、Ethereum起動の前準備としてジェネシス・ブロックを用意します。

[ジェネシス・ブロック genblock.json]

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"config": {
"chainId": 1100
},
"nonce": "0x0000000000000033",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x8000000",
"difficulty": "0x100",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}

環境の初期化

次に下記のコマンドを実行し、環境の初期化を行います。

datadirオプションにはデータを保存するディレクトリを指定します。

initには作成したジェネシス・ブロック(genblock.json)を指定します。

[Ethereum起動コマンド]

1
geth --datadir ./data init ./genblock.json

[実行結果]

Ethereumの起動

初期化が完了したら、いよいよEthereumの起動を行います。

下記コマンドを実行します。

なおnetworkidオプションには、genblock.jsonのchainIdで設定した値と同じものを指定します。

[Ethereum起動コマンド]

1
geth --networkid "1100" --datadir ./data  console

[実行結果]

一部エラーは出ていますが、起動自体はできているようです。

次回は、アカウントの登録とマイニングを行ってみます。

オープンソースのブロックチェーンを試す(4) - Ethereum(イーサリアム)の起動

今回はEthereumの起動を行います。

ジェネシス・ブロックの準備

まずは、Ethereum起動の前準備としてジェネシス・ブロックを用意する必要があります。

[ジェネシス・ブロック genblock.json]

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"config": {
"chainId": 1100
},
"nonce": "0x0000000000000033",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x8000000",
"difficulty": "0x100",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}

環境の初期化

次に下記のコマンドを実行し、環境の初期化を行います。

datadirオプションにはデータを保存するディレクトリを指定します。

initには作成したジェネシス・ブロック(genblock.json)を指定します。

[Ethereum初期化コマンド]

1
geth --datadir ./data init ./genblock.json

[実行結果]

Ethereumの起動

初期化が完了したら、いよいよEthereumの起動を行います。

下記コマンドを実行します。

なおnetworkidオプションには、genblock.jsonのchainIdで設定した値と同じものを指定します。

[Ethereum起動コマンド]

1
geth --networkid "1100" --datadir ./data  console

[実行結果]

致命的なエラーとなり、うまく起動できませんでした。

調べたところWSL環境ではソケットのListenができないために、Ethereumが起動できないようです😢

次回は、WSLではなくLinux環境を構築し、再びEthereum環境の起動をトライします。

オープンソースのブロックチェーンを試す(3) - Ethereum(イーサリアム)用プログラム作成

前回記事にてEthereumを使う準備が整いました。

Ethereum環境については、本番環境ではなくプライベート・ネットワーク(テスト用)を使います。

またネットワークに接続するコンピュータの数を0に設定し、自分一人がローカルで動作するモードとします。

プログラムの準備

スマート・コントラクトは、契約の自動化を目的としたものではありますが、プログラムの実行環境でもあります。

今回はデータを保存処理を組み込んでいきます。

データを保存するプログラムは以下の通りです。

プログラムはSolidityというEthereumの独自言語です。

[ソース savedata.sol]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pragma solidity ^0.8.4;

contract SingleNumRegister {

uint storedData;

function set(uint x) public{
storedData = x;
}

function get() public view returns (uint retVal) {
return storedData;
}

}

Solidityコンパイラの準備

ソースをビルドするためには、solcコマンドが必要なのでインストールします。

[コマンド]

1
2
sudo apt-get install solc
solc --version

[結果]
solcバージョン確認結果

プログラムのビルド

solcコンパイラが準備できたので、準備したプログラム(savedata.sol)を下記コマンドでビルドします。

[コマンド]

1
solc -o savedata --abi --bin savedata.sol

正常にビルドできると次のような2ファイルが生成されます。

  • savedata/SingleNumRegister.abi

    SingleNumRegister.abi
  • savedata/SingleNumRegister.bin

    SingleNumRegister.bin

次回は、Ethereum環境の起動を行います。

オープンソースのブロックチェーンを試す(2) - Ethereum(イーサリアム)の環境構築

オフィシャル・リリースであるgo-ethereumを使って、Ethereumの環境を構築します。

ソースからビルドする方法もありますが、今回はパッケージを使用してインストールします。

パッケージを利用してインストール

WSLコンソールでgo-ethereumをインストールしていきます。

まずはリポジトリ追加のコマンドとethereumリポジトリの追加を行います。

[コマンド]

1
2
3
4
sudo apt-get install apt-file
sudo apt-file update
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum

Ethereum gethコマンドのインストール

Ethereum gethコマンドをインストールします。

[コマンド]

1
2
3
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install ethereum

gethコマンドのバージョン確認

go-ethereumがインストールできていることを確認するために、gethコマンドのバージョンを確認します。

[コマンド]

1
geth version

[結果]

次回は、Ethereum環境の起動を行います。

オープンソースのブロックチェーンを試す(1) - Ethereum(イーサリアム)

ブロックチェーンは、さまざまな実装が行われ暗号通貨サービス以外への応用も進められてきました。

その多くがオープンソースとして公開されています。

Ethereum(イーサリアム)

ビットコインについでシェアが大きい暗号通貨はEthereum(イーサリアム)です。

Ethereumは暗号通貨としてだけではなく、スマートコントラクトと呼ばれる、契約条件の確認や実行の自動化を実現するための基盤となっています。

分散環境で処理を実行するためのプラットフォームという側面もあります。

Ethereum(イーサリアム)

実サービスで利用可能

Ethereumは、実サービスでも利用でき、開発環境も用意されています。

これからオープンソースのブロックチェーン基盤を使ったアプリ作成を行っていきます。

オープンソース

次回はまず、ステップ1としてEthereum環境の構築をしていきます。