記事ディレクトリ
プロジェクトの github アドレスリンク
1. プロジェクトのビジョン
このプロジェクトを通じて、ブロックチェーンの構成と、完全に機能するブロックチェーンを実装する方法を理解することができます。
2. プロジェクトの構造
3. プロジェクトの特徴
1. 分散化
2. 追跡可能
3. 不変
4. プロジェクトのプロセス
ブロックの基本構造と動作
ブロックヘッダーの詳細を上の図に示します。各ブロックは、タイムスタンプ、前のブロックのハッシュ、現在のブロックのハッシュ、乱数、ブロック番号(ブロックの高さ)、マークル ルートの6 つの部分で構成されますが、コードの便宜上、マークル ルートはデータとして表されます。最後のブロックのコードは次のとおりです。
// 实现一个基本的区块结构
type Block struct {
TimeStamp int64 //代表区块时间
Hash []byte //当前区块hash
PrevBlockHash []byte //前一区块Hash
Height int64 //区块高度
Data []byte //存储交易数据(先不考虑merkle树)
}
ブロックを作成する
各ブロックには上記の 6 つの部分が必要ですが、このうちタイムスタンプは作成時に生成でき、現在のブロックのハッシュと乱数も作成時に生成されるため、パラメータは前と同じように渡す必要があります。ブロックハッシュ、ブロック高さ、トランザクションデータ。
具体的なコードは次のとおりです。
// 新建区块
func newBlock(prevBlockHash []byte, height int64, data []byte) *Block {
var block Block
block = Block{
TimeStamp: time.Now().Unix(),
Hash: nil,
PrevBlockHash: prevBlockHash,
Height: height,
Data: data,
}
return &block
}
ジェネシス ブロックを作成し、その高さを 1 に設定します。
// 生成创世区块
func CreateGenesisBlock(data []byte) *Block {
return NewBlock(nil, 1, data)
}
スクリーンショットを実行する
ブロックチェーンの生成と基本操作
ブロックチェーンの基本構造
ブロックを保存するには 2 つの方法があり、スライスと構造の両方を実現できます。わかりやすくするために、ここではストレージに構造を使用します。
// 区块链基本结构
type BlockChain struct {
Blocks []*Block //区块链的切片
}
ブロックチェーンの運用においては、ブロックを追加することでブロックチェーンの拡張を実現します。
// 添加区块到区块链中
func (bc *BlockChain) AddBlock(prevBlockHash []byte, height int64, data []byte) {
var newBlock *Block
newBlock = NewBlock(prevBlockHash, height, data)
bc.Blocks = append(bc.Blocks, newBlock)
}
ただし、最初のブロックについては、先行ノードがないため、個別にジェネシス ブロックとして扱われます。
// 初始化区块链
func CreateBlockChainWithGenesisBlock() *BlockChain {
//生成创世区块
block := CreateGenesisBlock([]byte("the first block"))
return &BlockChain{
[]*Block{
block}}
}
ジェネシスブロックを追加した最終的なブロックチェーンは次のようになります.
最終的に、次のように 3 つのブロックがブロックチェーンに追加されました。
// 启动
func main() {
//初始化区块链
blockChain := BLC.CreateBlockChainWithGenesisBlock()
//fmt.Printf("the first block :%v\n", blockChain)
//加入第二个区块
blockChain.AddBlock(blockChain.Blocks[len(blockChain.Blocks)-1].Hash,
blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, []byte("Alice send 10 btc to bob"))
//加入第三个区块
blockChain.AddBlock(blockChain.Blocks[len(blockChain.Blocks)-1].Hash,
blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, []byte("Bob send 5 btc to Tom"))
//依次展示区块
for _, d := range blockChain.Blocks {
fmt.Printf("prevHash:%v\nnowHash:%v\n", d.PrevBlockHash, d.Hash)
}
}
ハッシュ値がチェーンかどうかを検証する