xmodel/xmodel_verify.go

(完整代码) 1KB

package 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 积分,解读结果公开显示在下面。

还没有人解读过这个文件。