はじめに
前回は、nonceの実装までやりましたが、今回はマイニングの実装をしていきます。
- 前回までの記事
- バージョン
- Go 1.22.0
マイニングとは
マイニングとは、トランザクションを確認し、新しいブロックをブロックチェーンに追加するプロセスです。
具体的には、以下のステップが含まれます。
- トランザクションの収集
- nonceの計算(プルーフ・オブ・ワークの計算)
- ブロックの追加と報酬の受け取り
1.では、未確認のトランザクションを収集し、新しいブロックにまとめます。
2.では、前回の記事で実装した、nonceを求める計算を行います。そして、正しいハッシュ値を見つけたマイナーは、そのブロックをネットワークに提出できます。
3.では、2.で提出したブロックが他のネットワーク参加者によって受け入れられると、そのブロックはブロックチェーンに追加されます。マイナーはトランザクション手数料の形で、新たに発行される暗号通貨を受け取ります。
実装
マイニングの実装
const (
MINING_SENDER = "THE BLOCKCHAIN"
MINING_REWARD = 1.0
)
type Blockchain struct {
transactionPool []*Transaction
chain []*Block
blockchainAddress string // 追加
}
func NewBlockchain(blockchainAddress string) *Blockchain { // 引数を追加
b := &Block{}
bc := new(Blockchain)
bc.blockchainAddress = blockchainAddress // 追加
bc.CreateBlock(0, b.Hash())
return bc
}
func (bc *Blockchain) Mining() bool {
bc.AddTransaction(MINING_SENDER, bc.blockchainAddress, MINING_REWARD)
nonce := bc.ProofOfWork()
previousHash := bc.LastBlock().Hash()
bc.CreateBlock(nonce, previousHash)
return true
}
まず、MINING_SENDERとMINING_REWARDの定数を定義しています。
MINING_SENDERは、マイニングした時の報酬をマイナーに送る送信元で、MINING_REWARDは、マイニングした時の報酬の値です。
BlockchainのstructにblockchainAddressを追加します。これは、マイナーに報酬を送るときに、マイナーのaddressを登録していないと報酬が送れないので、Blockchainにアドレスを登録するようにします。
これにより、NewBlockchainを実行するときに、引数としてblockchainAddressを渡して登録するように変更します。
Miningでは、まず、AddTransactionでマイナーに報酬を渡すtransactionsを追加しています。次に、前回実装したProofOfWorkを実行して、nonceを求めます。そしてCreateBlockに、ここで求めたnonceとpreviousHashを渡して、ブロックを追加しています。
おわりに
今回は、マイニングの実装をしていきました。
これで、ブロックチェーンのシステムの基本的な機能は実装できました。
参考