著者: 禅とコンピュータープログラミングの芸術
1 はじめに
「A 株投資の「氷と火」の影響 – インターネット大手の「不人気ビジネス」」では、2017 年末までにプライベート エクイティ ファンド、先物会社、貴金属取引所、およびその他の市場への参加が減少したと述べました。その他の市場 レートは高くありません。しかし、2018年初頭までに、さまざまな投資プラットフォームの出現とホットマネーの流入により、資本市場では競争が始まり、さらに熾烈な競争が始まった。これは人々に疑問を抱かせるに違いありません、私たちの脳はお金で買われているのでしょうか、それとも私たちの思考はお金によって支配されているのでしょうか?後者であれば、ブロックチェーン技術は、この問題を真に解決できる唯一残っている技術の 1 つであるため、将来的に重要なリーダーとなるでしょう。
ブロックチェーン技術は徐々に業界に参入し、広範囲にわたる影響力を持っています。分散台帳技術 (DLT) に基づくブロックチェーン技術は、複雑なビジネス データ転送プロセスを効果的に管理することが証明されており、それにより、ユーザー情報のセキュリティ、データの改ざん防止、信頼性と衛生性の実現などが保証されます。ブロックチェーンは、独立した分散システムとして、フォールト トレランス、高性能、低遅延、自動化の点で強力なセキュリティとプライバシー保護機能を備えています。したがって、多くのシナリオにおいて、ブロックチェーン技術は間違いなく将来の金融サービスの重要な手段となるでしょう。
ビットコインなどの仮想デジタル通貨の出現も新たなチャンスをもたらしています。これは支払いツールであると同時に価値記憶媒体でもあり、大きな商業的価値を持っています。さらに、これは初めての実質的なブロックチェーン適用事例でもあり、真の分散型金融システムに向けて進化しています。ビットコインの基礎となるプロトコルとインフラストラクチャが他の分散型金融システムにコピーされる限り、これらのシステムもより安全で、透明性があり、高速で使いやすくなります。
2. 基本的な概念と用語の説明
2.1 DLT (分散型台帳技術)
DLT(分散台帳技術)とは、分散ネットワーク技術を使用して構築されたデータベースを指し、すべての参加者の取引行動を記録および検証し、情報の信頼性の高い普及と包括的な一貫性を確保し、二重支払い、偽造取引、偽造などを防ぐことができます。現在、主流の分散型台帳テクノロジーには、ビットコイン、イーサリアム、ハイパーレジャーファブリックなどが含まれます。
2.2 コンセンサスアルゴリズム
コンセンサス アルゴリズム (コンセンサス アルゴリズム) は、複数のノード間でデータの同期を維持し、コンセンサスに達するために分散システムで使用されるアルゴリズムです。一般的に使用されるコンセンサス アルゴリズムには、Paxos、Raft、Zab、PBFT などが含まれます。ブロックチェーンでは、通常、Proof of Work (PoW) アルゴリズムを使用してコンセンサスを構築します。つまり、コンピューティング リソース (CPU、GPU など) を使用してワークロードの証明 (Work) を完了します。このアルゴリズムではマイナーが多数の反復計算を実行する必要があるため、ブロックチェーン ネットワーク全体が攻撃されにくくなります。
2.3 分散型台帳
分散データベースまたはブロックチェーン技術とも呼ばれる分散台帳技術 (DLT) は、ネットワークを介して取引活動を記録および検証する技術であり、分散ネットワーク技術を使用して構築されたデータベースによって特徴付けられ、すべての参加者の取引行動を記録できます。情報の信頼性の高い普及と包括的な一貫性を確保し、二重支払い、偽造取引、偽造などを防止できます。現在、主流の分散型台帳テクノロジーには、ビットコイン、イーサリアム、ハイパーレジャーファブリックなどが含まれます。
2.4 ブロックチェーン
ブロックチェーンとは、暗号化技術により構築された分散型データベースのことで、世界中に送信される一連のデータを記録・検証するための、非保管・分散型会計技術です。取引データの暗号化、連鎖、保管、検証などのプロセスの非改ざん性、非偽造性、トレーサビリティなどの特性により、参加者は誰でも取引履歴データを検証および確認でき、取引プロセス全体が透明性、効率性、安全性を確保します。そして信頼できます。ブロックチェーンには、悪ではない、コンセンサスメカニズム、高速トランザクション、匿名性、および高い同時処理という特徴があります。
2.5 ブロックチェーンの応用事例
2.5.1 ビットコイン
暗号通貨であるビットコインは、2009 年にサトシ・ナカモトによって初めて作成されました。国や法人に依存せず、個人によって完全に管理・管理されるピアツーピアの電子通貨です。高効率、高透明性、完全オープンという特徴があり、決済、保管、即時消費などにも利用可能です。ビットコインは主に Proof of Work (PoW) アルゴリズムを使用して分散型公開台帳を確立しており、大規模な分散ネットワークがこの台帳を共同で維持し、各ブロックがチェーンに参加するには一意の Proof of Work を 1 つだけ持つことができるように維持されています。通貨供給量を気にせず即時取引が実現でき、安全性が高いのがメリットです。
2.5.2 イーサリアム
イーサリアムは、スマート コントラクト プログラミング言語 Solidity をサポートするオープンソースの軽量ブロックチェーンです。超大規模な分散トランザクション処理に対応できるシャーディングアーキテクチャが特徴であると同時に、イーサリアムが提供する低額の取引手数料と柔軟なスマートコントラクト機能により、研究や投資への関心が高まっています。アプリケーション。イーサリアムは次世代の分散アプリケーション開発プラットフォームとなり、ブロックチェーンの繁栄を推進します。
2.5.3 リップル
リップルは、世界的な暗号通貨であるXRPをベースに発行されるデジタル通貨で、独自のシャーディングアーキテクチャ設計により、非常に高いトランザクション処理速度をサポートします。もう1つの機能はトランザクションの即時確認であり、高速かつ正確なトランザクションを保証しますが、現時点ではイーサリアムのようなスマートコントラクトを実装するプログラミング言語であるSolidityを備えていません。しかし、リップルの現在のコミュニティのサポートと受け入れは比較的良好で、その市場価値はゆっくりと上昇しています。
2.5.4 カルダノ
Cardano は、POS+POW ハイブリッド コンセンサス メカニズムを使用して、スマート コントラクトをサポートしながら効率的かつ低コストのトランザクション確認を提供するオープンソースのブロックチェーン プロジェクトです。委託生産アプローチのおかげで、Cardano はシャーディング技術を通じてネットワークを複数のサブネットワークに分割することもできます。このプロジェクトは、金融サービスの現在の状況を変えるでしょう。
3. コアアルゴリズムの原則と具体的な操作手順
3.1 プルーフ・オブ・ワークのアルゴリズム
PoW アルゴリズム (プルーフ・オブ・ワーク・アルゴリズム) は、ブロックチェーン・コンセンサス・アルゴリズムの一種で、マイナーが大量の反復計算を実行して、作業が特定の条件で検証されたかどうかを検証する必要があります。通常の状況では、PoW アルゴリズムは、ブロック生成の適時性を確保するために、生成されるブロック サイズ、ブロック生成時間間隔などを制限します。ブロックチェーン システムでは、PoW アルゴリズムにより各ノードのデータの一貫性、セキュリティ、完全性が保証されます。具体的な操作手順は以下の通りです。
- マイナーはノンス値を選択し、以前のブロック ハッシュ、現在のトランザクション レコード、乱数ノンス、その他の情報に対してハッシュ演算を実行して結果を取得します。
- 結果が特定の数値で終わる場合、その数値はターゲット値を表します。つまり、ブロック内のトランザクションはルールに従っており、プルーフ・オブ・ワークの追加を続ける必要があります。
- この結果を前のブロックのハッシュ値と比較し、異なる場合には生成されたブロックをブロックチェーンにパッケージ化します。
- ブロックが生成されると、そのブロック上のすべてのトランザクションがチェーン上にパッケージ化されます。
- 新しいブロックは新しいトランザクションを受け入れることができ、新しいブロックには元のトランザクション情報がすべて含まれ、重複レコードは存在しません。
- 一般のユーザーは、チェーン上のすべての取引情報を照会し、取引情報に基づいて自己検証を行うことができます。
3.2 プルーフ・オブ・ステークアルゴリズム
PoS アルゴリズム (プルーフ オブ ステーク アルゴリズム) は、別のブロックチェーン コンセンサス アルゴリズムです。PoW アルゴリズムと比較すると、PoS アルゴリズムは、バリデーターのコンピューティング能力に報酬を与えるのではなく、ブロックチェーン ネットワーク内の権利と利益をバリデーターに割り当てます。このアプローチにより、PoW アルゴリズムの集中化と制御可能性が排除され、ブロックチェーンの分散化レベルが向上し、その柔軟性、自律性、スケーラビリティが強化されます。PoS アルゴリズムの下では、バリデーターはブロックチェーン ネットワークの保守と運用に参加するために、一定量の暗号通貨を保持するだけで済みます。このモデルでは、十分なバリデーターがシステムに参加している限り、ネットワークは常にオンラインのままになります。PoS アルゴリズムでは、ブロック生成の頻度は目標値の変化ではなく時間間隔によって決定されるため、ブロック生成プロセス中にブロックが発生することはありません。具体的な操作手順は以下の通りです。
- ユーザーは、仮想通貨の量を資本として使用して、トランザクション リクエストをブロックチェーン ネットワークに送信します。
- ネットワークは一定数のバリデーターを選択し、一定の割合 (たとえば 1/3) に従って彼らの権利と利益を分配します。
- ユーザーが行いたい取引をブロックチェーンネットワークに送信し、ネットワークが取引記録を検証し、検証に合格すると、取引記録がブロックにパッケージ化されます。
- 各バリデータには一定の期間(例えば10秒)が割り当てられ、その期間中にブロックを収集し、ブロック内のトランザクション情報を確認します。確認されたブロックが前のブロックよりも長い場合、オンチェーン ブロックにアップグレードされます。
- ユーザーはチェーン上のすべての取引情報をクエリし、取引情報に基づいて自己検証を行うことができます。
3.3 マークルツリーアルゴリズム
マークル ツリー アルゴリズム (マークル ツリー アルゴリズムとしても知られる) は、重要なブロックチェーン データ構造です。マークル ツリーは、要素のセットのハッシュ値のセットを表すために使用されるバイナリ ツリーであり、各ノードはセットのメンバーに対応します。ルート ノードの値は、コレクション全体のハッシュ値を表します。ブロックチェーン システムでは、マークル ツリーを使用してデータの整合性を確保し、データの相関関係を検証でき、高速です。具体的な操作手順は以下の通りです。
- データ セットのハッシュ関数は、すべてのデータ項目のコレクションを、データ セットのハッシュ値を表す単一の値に変換します。
- データ項目のハッシュ値の順序に従って、ハッシュ ツリーが形成されます。
- ハッシュ ツリーをルート ノードから下方向にたどっていき、リーフ ノードに遭遇するたびに、ルート ノードに至るまで、リーフ ノードの値が取得され、親ノードのハッシュ値が取得されます。
- 最終結果は、このデータ セットの全体的なハッシュ値です。
- これら 2 つのステップを通じて、データの整合性とデータの相関性を検証できます。
3.4 プログラム可能なスマートコントラクト
スマート コントラクトは分散会計テクノロジの重要な部分であり、その機能は、一連の契約コードをブロックチェーン システムに展開し、バイトコードにコンパイルして、実行のためにブロックチェーン ネットワークに入れることです。スマートコントラクトは、資産交換、融資、ゲームギャンブルなどのさまざまなアプリケーションシナリオを実現できます。ブロックチェーン システムでは、スマート コントラクトは次の機能の実現に役立ちます。
- デジタル通貨の発行
- さまざまなビジネスロジックを実行する
- デジタル資産を管理する
- 署名検証を提供する
- 複数のプログラミング言語をサポート
- 複雑な金融デリバティブ取引システムを構築する
3.5 トークンとトークン
トークンは、ブロックチェーン上のデジタル資産を識別するために使用される標準化された用語です。トークンとトークンは交換可能なデジタル トークンであり、その主な目的は、異なるブロックチェーン間でのデジタル資産の交換を容易にすることです。トークンとトークンは、分散会計テクノロジにおいて重要な役割を果たします。具体的な操作手順は以下の通りです。
- トークンの発行
- トークンをトークンに変換
- トークン情報の表示
- 取引
トークンやトークンの発行、変換、閲覧、取引はすべてブロックチェーン上で行われる一連の操作であり、デジタル資産の取引、流通、流通を促進することを目的としています。
4. コード例と説明
4.1 Python の例: 単純なブロックチェーンの作成
このセクションでは、Python と Flask フレームワークを使用して単純なブロックチェーンを作成する方法を示します。まず、関連するライブラリをインストールする必要があります。
pip install flask
pip install Flask-Cors
pip install requests
app.py
ファイルを作成し、次のコードを記述します。
from flask import Flask, jsonify, request
from hashlib import sha256
class Block:
def __init__(self, index, timestamp, data, previous_hash):
self.index = index
self.timestamp = timestamp
self.data = data
self.previous_hash = previous_hash
self.hash = self._calc_hash()
def _calc_hash(self):
block_str = str(self.index) + \
str(self.timestamp) + \
str(self.data) + \
str(self.previous_hash)
return sha256(block_str.encode()).hexdigest()
class BlockChain:
def __init__(self):
self.unconfirmed_transactions = []
self.chain = []
self.create_genesis_block()
def create_genesis_block(self):
genesis_block = Block(0, '01/01/2018', "Genesis Block", "0")
self.chain.append(genesis_block)
def get_last_block(self):
return self.chain[-1]
def add_new_transaction(self, transaction):
self.unconfirmed_transactions.append(transaction)
def mine_pending_transactions(self, miner_address):
last_block = self.get_last_block()
new_block = Block(len(self.chain),
len(self.chain),
{
'tx': [t.to_json() for t in
self.unconfirmed_transactions]},
last_block.hash)
proof = self.proof_of_work(new_block)
new_block.hash = new_block._calc_hash()
reward_transaction = Transaction("Miner Reward", miner_address, None,
len(self.chain)+1)
self.add_new_transaction(reward_transaction)
self.chain.append(new_block)
self.unconfirmed_transactions = []
return (new_block, proof)
@staticmethod
def proof_of_work(block):
nonce = 0
while True:
if BlockChain.valid_proof(block, nonce):
print('Successfully found the proof')
break
else:
nonce += 1
return nonce
@staticmethod
def valid_proof(block, nonce):
guess_str = str(block.index) + \
str(block.timestamp) + \
str({
'tx': [t.to_json() for t in
block.data['tx']]}).replace("'", '"') + \
str(block.previous_hash) + \
str(nonce)
guess_hash = sha256(guess_str.encode()).hexdigest()
return guess_hash[:4] == '0'*4
class Transaction:
def __init__(self, sender, recipient, amount, time_stamp):
self.sender = sender
self.recipient = recipient
self.amount = amount
self.time_stamp = time_stamp
def to_json(self):
return {
'sender': self.sender,
'recipient': self.recipient,
'amount': self.amount,
'time_stamp': self.time_stamp
}
app = Flask(__name__)
CORS(app)
blockchain = BlockChain()
@app.route('/mine', methods=['POST'])
def mine():
miner_address = request.get_json()['miner_address']
new_block, proof = blockchain.mine_pending_transactions(miner_address)
response = {
'message': "New Block Forged",
'index': new_block.index,
'transactions': [{
'sender': tx['sender'],'recipient': tx['recipient'], 'amount': tx['amount']} for tx in
new_block.data['tx']],
'proof': proof,
'previous_hash': new_block.previous_hash
}
return jsonify(response), 200
@app.route('/transactions/new', methods=['POST'])
def new_transaction():
values = request.get_json()
required_fields = ['sender','recipient', 'amount']
if not all(k in values for k in required_fields):
return 'Missing values', 400
transaction = Transaction(values['sender'], values['recipient'], float(values['amount']),
int(datetime.now().strftime('%s')))
blockchain.add_new_transaction(transaction)
return "Transaction will be added to Block {}".format(blockchain.get_last_block().index+1), 201
@app.route('/chain', methods=['GET'])
def full_chain():
chain_data = [b.__dict__ for b in blockchain.chain]
return jsonify({
'length': len(chain_data)-1, 'chain': chain_data})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
上記のコードは、ブロックを作成する Block クラス、ブロックチェーン データ構造を維持する BlockChain クラス、およびトランザクション データ構造を作成する Transaction クラスを定義します。このうち、BlockChainクラスは、ブロックの生成、マイニング、トランザクションレコードの追加など、さまざまなブロックチェーン操作を実装します。
app.py ファイルでは、次の 3 つのルートも定義されています。
/mine
、新しいブロックを生成するためのマイニングに使用されます。/transactions/new
、新しい取引レコードを作成するために使用されます。/chain
、ブロックチェーンの完全な情報を取得するために使用されます。コード スニペット
では、Flask サーバーを起動します。if __name__ == '__main__':
コマンドを実行します:
flask run --host=0.0.0.0 --port=5000
この時点で、ブラウザを開いて http://localhost:5000 と入力できます。次の出力が表示された場合は、ブロックチェーンが正常に実行されていることを意味します。
Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: XXX-XXX-XXX
ブラウザで http://localhost:5000/chain にアクセスして、ブロックチェーンの完全な情報を表示します。
次の図は、新しいブロックが正常に生成された例です。
4.2 C++ の例: 単純なブロックチェーンの作成
このセクションでは、C++、OpenSSL、および Boost ライブラリを使用して単純なブロックチェーンを作成する方法を示します。まず、関連するライブラリをインストールする必要があります。
sudo apt update && sudo apt upgrade -y
sudo apt install build-essential cmake libboost-all-dev openssl libssl-dev wget curl git unzip -y
ソースコードをダウンロード:
mkdir ~/src
cd src
git clone https://github.com/DaveGamble/c-blosc
git clone https://github.com/openssl/openssl
OpenSSL をインストールします。
cd openssl
./config no-shared no-tests -fPIC
make depend
make all
sudo make install
Blosc を設定してコンパイルします。
cd../c-blosc
mkdir build
cd build
cmake.. -DCMAKE_INSTALL_PREFIX=/usr/local
make
sudo make install
ブロックチェーンを設定してコンパイルします。
cd ~
mkdir mychain
cd mychain
touch main.cpp
nano main.cpp // 编辑文件
main.cpp ファイルを作成します。
#include <iostream>
#include <sstream>
#include <vector>
#include <ctime>
#include <chrono>
#include <iomanip>
using namespace std;
string SHA256(string input){
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX ctx;
SHA256_Init(&ctx);
SHA256_Update(&ctx,input.c_str(),input.size());
SHA256_Final(hash,&ctx);
stringstream ss;
for(int i = 0; i<SHA256_DIGEST_LENGTH ; ++i)
ss << hex << setw(2) << setfill('0') << static_cast<unsigned int>(hash[i]);
return ss.str();
}
struct Block{
int index;
chrono::system_clock::time_point timestamp;
vector<pair<string,string>> transactions;
string prevHash;
string hash;
};
class BlockChain{
public:
void init(){
genesisBlock = generateGenesisBlock();
blocks.push_back(genesisBlock);
}
void addBlock(const Block& block){
if(!verifyBlock(block)){
throw invalid_argument("Invalid block");
}
blocks.push_back(block);
}
bool verifyBlock(const Block& block){
if(block.index!= this->getLastIndex()+1 || block.prevHash!= getLastHash()){
cout<<"Invalid block"<<endl;
return false;
}
if(block.hash!=calculateHash(block)){
cout<<"Invalid block's hash"<<endl;
return false;
}
return true;
}
Block getLastBlock(){
return blocks.back();
}
int getLastIndex(){
return blocks.empty()?0:blocks.back().index;
}
string getLastHash(){
return blocks.empty()?"":blocks.back().hash;
}
string calculateHash(const Block& block){
ostringstream oss;
oss<<block.index<<block.timestamp.time_since_epoch().count()
<<block.transactions<<block.prevHash;
return SHA256(oss.str());
}
Block generateGenesisBlock(){
Block block;
block.index = 0;
block.timestamp = chrono::system_clock::now();
block.transactions.emplace_back({"Dave","Alice",10});
block.prevHash = "";
block.hash = calculateHash(block);
return block;
}
const Block& getGenesisBlock(){
return genesisBlock;
}
private:
vector<Block> blocks;
Block genesisBlock;
};
void mineBlock(BlockChain& bc, string minerAddress){
auto now = chrono::system_clock::now();
auto duration = chrono::duration_cast<chrono::seconds>(now.time_since_epoch()).count();
srand((unsigned int)time(nullptr));
int randNum = rand()%100;
string dummyData="dummy";
Block block;
block.index = bc.getLastIndex()+1;
block.timestamp = now;
block.transactions.emplace_back({minerAddress,"Reward",randNum*pow(10,-1)});
block.transactions.emplace_back({"Dave","Alice",10});
block.prevHash = bc.getLastHash();
block.hash = bc.calculateHash(block);
bc.addBlock(block);
cout<<"Mined a block: "<<bc.getLastIndex()<<" | Hash:"<<block.hash<<endl;
}
int main() {
BlockChain bc;
bc.init();
mineBlock(bc,"alice");
mineBlock(bc,"bob");
mineBlock(bc,"charlie");
for(auto block : bc.blocks){
cout<<"------------------------------------------"<<endl;
cout<<"index: "<<block.index<<endl;
cout<<"timestamp: "<<chrono::system_clock::to_time_t(block.timestamp)<<endl;
for(auto pair : block.transactions){
cout<<" from: "<<pair.first<<" to: "<<pair.second<<" amount: "<<block.hash<<endl;
}
cout<<"prevHash: "<<block.prevHash<<endl;
cout<<"hash: "<<block.hash<<endl;
}
return 0;
}
main 関数では、まずブロックチェーン オブジェクトを初期化してから、mineBlock 関数を呼び出して 3 つのブロックを生成し、最後にブロックチェーンのすべての情報を出力します。
MineBlock 関数では、まず現在のタイムスタンプを取得し、次に乱数を生成して空の文字列を生成します。その後、ブロックを作成し、ブロックインデックス、タイムスタンプ、トランザクションレコード、前のブロックハッシュ、ブロックハッシュを設定して、ブロックをブロックチェーンに追加します。
CalculateHash 関数では、ostringstream を使用してブロック情報を文字列にシリアル化し、そのハッシュ値を返します。
プログラムを実行します。
g++ -std=c++11 -lcrypto -lboost_system -o main main.cpp
./main
ご覧のとおり、プログラムは生成されたブロック情報を出力します。