部分代码(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改写程序
- 改写block结构
- 根据提示修改:逐个文件修改,直至编译成功(将Data修改为Transaction)
- 得出创世块挖矿成功
显示效果: