golang 区块链:验证签名

1.遍历交易集合txs获取全部的消费记录inputMap
2.从区块链获取inputMap的消费记录input对应的output
3.传入output的集合,逐笔验证签名

验证:
1.复制一份新的交易对象(input的签名和公钥置空)
2.对复制的交易进行hash,获取签名需要的hash

获取input的output所在的交易
设置vin的公钥为utxo的pubhash
对交易进行hash

3.验证签名

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值