xmodel/xmodel_verify.go
(完整代码) 1KBpackage xmodel
import (
"fmt"
"github.com/xuperchain/xuperunion/pb"
)
func (s *XModel) verifyInputs(tx *pb.Transaction) error {
//确保tx.TxInputs里面声明的版本和本地model是match的
for _, txIn := range tx.TxInputsExt {
verData, err := s.GetUncommited(txIn.Bucket, txIn.Key) //because previous txs in the same block write into batch cache
if err != nil {
return err
}
localVer := GetVersion(verData)
remoteVer := GetVersionOfTxInput(txIn)
if localVer != remoteVer {
return fmt.Errorf("verifyInputs failed, version missmatch: %s / %s, local: %s, remote:%s",
txIn.Bucket, txIn.Key,
localVer, remoteVer)
}
}
return nil
}
func (s *XModel) verifyOutputs(tx *pb.Transaction) error {
//outputs中不能出现inputs没有的key
inputKeys := map[string]bool{}
for _, txIn := range tx.TxInputsExt {
rawKey := string(makeRawKey(txIn.Bucket, txIn.Key))
inputKeys[rawKey] = true
}
for _, txOut := range tx.TxOutputsExt {
if txOut.Bucket == TransientBucket {
continue
}
rawKey := string(makeRawKey(txOut.Bucket, txOut.Key))
if !inputKeys[rawKey] {
return fmt.Errorf("verifyOutputs failed, not such key in txInputsExt: %s", rawKey)
}
if txOut.Value == nil {
return fmt.Errorf("verifyOutputs failed, value can't be null")
}
}
return nil
}
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
