首页 > 技术文章 > 区块链V4版本实现之一

shizhe99 2020-12-24 19:50 原文

部分代码(transaction.go文件中定义交易结构):

 1 type TXInput struct {
 2    TXID []byte //交易id
 3    Index int64 //output的索引
 4    Address string //解锁脚本,先使用地址来模拟
 5 }
 6 
 7 type TXOutput struct {
 8    Value float64 //转账金额
 9    Address string //锁定脚本
10 }
11 
12 type Transaction struct {
13    Txid []byte //交易id
14    TXInputs []TXInput //所有的inputs
15    TXOutputs []TXOutput //所有的outputs
16 }

部分代码(transaction.go文件中SetTXID函数实现):

 1 func (tx *Transaction) SetTXID() {
 2    var buffer bytes.Buffer
 3    encoder := gob.NewEncoder(&buffer)
 4 
 5    err := encoder.Encode(tx)
 6    if err != nil {
 7       log.Panic(err)
 8    }
 9 
10    hash := sha256.Sum256(buffer.Bytes())
11    tx.Txid = hash[:]
12 }

部分代码(transaction.go文件中挖矿交易实现):

 1 //实现挖矿交易
 2 //特点:只有输出,没有有效的输入(不需要引用id,不需要索引,不需要签名)
 3 
 4 //把挖矿的人传进来,因为有奖励
 5 func NewCoinbaseTX(miner string) *Transaction{
 6 
 7    //后面的程序需要去识别一个交易是否为coinbase,所以需要设置一些特殊的值,用于判断
 8    inputs := []TXInput{{nil,-1,genesisInfo}}
 9    outputs := []TXOutput{{12.5,miner}}
10 
11    tx := Transaction{nil,inputs,outputs}
12    tx.SetTXID()
13 
14    return &tx
15 }

使用Transaction改写程序

  1. 改写block结构
  2. 根据提示修改:逐个文件修改,直至编译成功(将Data修改为Transaction)
  3. 得出创世块挖矿成功

显示效果:

推荐阅读