1.遍历交易集合txs获取全部的消费记录inputMap
2.从区块链获取inputMap的消费记录input对应的output
3.传入output的集合,逐笔验证签名文章来源:https://www.toymoban.com/news/detail-519068.html
验证:
1.复制一份新的交易对象(input的签名和公钥置空)
2.对复制的交易进行hash,获取签名需要的hash
(
获取input的output所在的交易
设置vin的公钥为utxo的pubhash
对交易进行hash
)
3.验证签名文章来源地址https://www.toymoban.com/news/detail-519068.html
type Client struct {
Blockchain *blockchain.Blockchain
}
type Blockchain struct {
Tip []byte //最新区块的hash
DB *bolt.DB //"github.com/boltdb/bolt"
}
type UTXO struct {
Hash []byte //交易哈希
Index int //索引
Output *TXOutput //未花费的output
}
type TXOutput struct {
//金额
Value int
//ripemd160
PubHash []byte
}
type TXInput struct {
//交易的Hash
TxHash []byte
//存储TXOutput在Vout里面的索引
Vout int
//数字签名
ScriptSig []byte
//公钥
PubKey []byte
}
/*
验证交易
*/
func (client *Client)verifyTxs(txs []*transaction.Transaction) (validTxs []*transaction.Transaction,msg string, err error) {
/*
从数据库查询最新的hash
并将数据库设值给blockchain
*/
client.getBlockchainAndSetToClient()
iterator := client.Blockchain.Iterator()
//遍历txs获取全部inputMap
var inputMap = make(map[string]*transaction.TXInput)
for _, tx := range txs {
for _, vin := range tx.Vins {
inputMap[string(vin.TxHash)] = vin
//log.Printf("传入的vin:%+v\n",vin)
}
}
//调用方法,根据inputMap获取全部utxos
var utxos []*transaction.UTXO
utxos,msg,err = getUTXOsByInputMap(iterator,inputMap)
//遍历txs,逐比验证
for _, tx := range txs {
isValid,_ := tx.VerifySign(utxos)
if !isValid {
continue
}
//有效交易添加到返回值
validTxs = append(validTxs, tx)
}
return
}
/*
new 一个迭代器
*/
func (blc *Blockchain) Iterator() *BlockchainIterator {
if blc.DB == nil {
return nil
}
return &BlockchainIterator{
NextHash: blc.Tip, DB: blc.DB}
}
验证交易的签名
/*
验证交易的签名
*/
func (tx *Transaction) VerifySign
到了这里,关于golang 区块链:验证签名的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!