ブロックチェーンの生成と基本操作


プロジェクトの 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)
	}
}

ハッシュ値がチェーンかどうかを検証する
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45931661/article/details/127720272