Skip to content

Commit 30ca9b3

Browse files
CodeCmnspringrain
authored andcommitted
CodeCmn Modify:只读跨链调用缓存问题参考v3.11流程修改,调用跨链合约invoke 加上fee,会走缓存,不加invoke不会,预执行中未找到缓存代码
1 parent e70263c commit 30ca9b3

4 files changed

Lines changed: 84 additions & 64 deletions

File tree

bcs/ledger/xledger/state/tx_verification.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import (
4343
func (t *State) ImmediateVerifyTx(tx *pb.Transaction, isRootTx bool) (bool, error) {
4444
beginTime := time.Now()
4545
code := "InvalidTx"
46-
defer func(){
46+
defer func() {
4747
metrics.CallMethodCounter.WithLabelValues(t.sctx.BCName, "ImmediateVerifyTx", code).Inc()
4848
metrics.CallMethodHistogram.WithLabelValues(t.sctx.BCName, "ImmediateVerifyTx").Observe(time.Since(beginTime).Seconds())
4949
}()
@@ -585,16 +585,31 @@ func (t *State) verifyTxRWSets(tx *pb.Transaction) (bool, error) {
585585
XMReader: reader,
586586
UTXOReader: utxoReader,
587587
}
588+
588589
sandBox, err := t.sctx.ContractMgr.NewStateSandbox(sandBoxConfig)
589590
if err != nil {
590591
return false, nil
591592
}
592593

593-
transContractName, transAmount, err := txn.ParseContractTransferRequest(req)
594+
// 构建CrossQueryCache 依据xuperchain v3.10的流程添加
595+
// 1.ParseCrossQuery()
596+
crossQueries, err := sandbox.ParseCrossQuery(tx)
594597
if err != nil {
598+
t.log.Warn("PrepareEnv ParseCrossQuery error", "err", err.Error())
595599
return false, err
596600
}
601+
// 2.IsCrossQueryEffective()
602+
if ok := sandbox.IsCrossQueryEffective(crossQueries, tx); !ok {
603+
t.log.Warn("PrepareEnv IsCrossQueryEffective error")
604+
return false, errors.New("PrepareEnv CheckCrossQueryEffective error")
605+
}
606+
// 3.crossQueries 缓存赋值到 XMCache 中
607+
sandBox.CrossQueryCache(crossQueries)
597608

609+
transContractName, transAmount, err := txn.ParseContractTransferRequest(req)
610+
if err != nil {
611+
return false, err
612+
}
598613
contextConfig := &contract.ContextConfig{
599614
State: sandBox,
600615
Initiator: tx.GetInitiator(),

kernel/contract/sandbox/cross_query_cache.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,34 +38,35 @@ func NewCrossQueryCache() *CrossQueryCache {
3838
}
3939

4040
// NewCrossQueryCacheWithData return CrossQuery instance while posttx
41-
func NewCrossQueryCacheWithData(crossQueries []*pb.CrossQueryInfo) *CrossQueryCache {
42-
return &CrossQueryCache{
43-
crossQueryCaches: crossQueries,
44-
isPenetrate: false,
45-
}
41+
// func NewCrossQueryCacheWithData(crossQueries []*pb.CrossQueryInfo) *CrossQueryCache {
42+
// return &CrossQueryCache{
43+
// crossQueryCaches: crossQueries,
44+
// isPenetrate: false,
45+
// }
46+
// }
47+
48+
func (cqc *CrossQueryCache) CrossQueryCache(crossQueries []*pb.CrossQueryInfo) {
49+
cqc.crossQueryCaches = crossQueries
50+
cqc.isPenetrate = false
4651
}
4752

4853
// CrossQuery query contract from otherchain
4954
func (cqc *CrossQueryCache) CrossQuery(
5055
crossQueryRequest *pb.CrossQueryRequest,
5156
queryMeta *pb.CrossQueryMeta) (*pb.ContractResponse, error) {
5257

53-
//log.Info("Receive CrossQuery", "crossQueryRequest", crossQueryRequest, "queryMeta", queryMeta)
54-
5558
if !isQueryMetaValid(queryMeta) {
5659
return nil, fmt.Errorf("isQueryParamValid check failed")
5760
}
5861
// Call endorsor for responce
5962
if cqc.isPenetrate {
6063
queryInfo, err := crossQueryFromEndorsor(crossQueryRequest, queryMeta)
6164
if err != nil {
62-
//log.Info("crossQueryFromEndorsor error", "error", err.Error())
6365
return nil, err
6466
}
6567
cqc.crossQueryCaches = append(cqc.crossQueryCaches, queryInfo)
6668
return queryInfo.GetResponse().GetResponse(), nil
6769
}
68-
6970
// 验证背书规则、参数有效性、时间戳有效性
7071
if cqc.crossQueryIdx > len(cqc.crossQueryCaches)-1 {
7172
return nil, fmt.Errorf("len of crossQueryCaches not match the contract")

kernel/contract/sandbox/xmcache.go

Lines changed: 56 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,10 @@ type XMCache struct {
5757
// NewXModelCache new an instance of XModel Cache
5858
func NewXModelCache(cfg *contract.SandboxConfig) *XMCache {
5959
return &XMCache{
60-
model: cfg.XMReader,
61-
inputsCache: NewMemXModel(),
62-
outputsCache: NewMemXModel(),
63-
utxoSandbox: utxo.NewUTXOSandbox(cfg),
64-
60+
model: cfg.XMReader,
61+
inputsCache: NewMemXModel(),
62+
outputsCache: NewMemXModel(),
63+
utxoSandbox: utxo.NewUTXOSandbox(cfg),
6564
crossQueryCache: NewCrossQueryCache(),
6665
}
6766
}
@@ -377,57 +376,61 @@ func (xc *XMCache) CrossQuery(crossQueryRequest *pb.CrossQueryRequest, queryMeta
377376
return xc.crossQueryCache.CrossQuery(crossQueryRequest, queryMeta)
378377
}
379378

379+
func (xc *XMCache) CrossQueryCache(crossQueries []*pb.CrossQueryInfo) {
380+
xc.crossQueryCache.CrossQueryCache(crossQueries)
381+
}
382+
380383
// ParseCrossQuery parse cross query from tx
381-
//func ParseCrossQuery(tx *pb.Transaction) ([]*pb.CrossQueryInfo, error) {
382-
// var (
383-
// crossQueryInfos []*pb.CrossQueryInfo
384-
// queryInfos []byte
385-
// )
386-
// for _, out := range tx.GetTxOutputsExt() {
387-
// if out.GetBucket() != TransientBucket {
388-
// continue
389-
// }
390-
// if bytes.Equal(out.GetKey(), crossQueryInfosKey) {
391-
// queryInfos = out.GetValue()
392-
// }
393-
// }
394-
// if queryInfos != nil {
395-
// err := UnmsarshalMessages(queryInfos, &crossQueryInfos)
396-
// if err != nil {
397-
// return nil, err
398-
// }
399-
// }
400-
// return crossQueryInfos, nil
401-
//}
384+
func ParseCrossQuery(tx *lpb.Transaction) ([]*pb.CrossQueryInfo, error) {
385+
var (
386+
crossQueryInfos []*pb.CrossQueryInfo
387+
queryInfos []byte
388+
)
389+
for _, out := range tx.GetTxOutputsExt() {
390+
if out.GetBucket() != TransientBucket {
391+
continue
392+
}
393+
if bytes.Equal(out.GetKey(), crossQueryInfosKey) {
394+
queryInfos = out.GetValue()
395+
}
396+
}
397+
if queryInfos != nil {
398+
err := UnmsarshalMessages(queryInfos, &crossQueryInfos)
399+
if err != nil {
400+
return nil, err
401+
}
402+
}
403+
return crossQueryInfos, nil
404+
}
402405

403406
// IsCrossQueryEffective check if crossQueryInfos effective
404407
// TODO: zq
405-
//func IsCrossQueryEffective(cqi []*pb.CrossQueryInfo, tx *pb.Transaction) bool {
406-
// return true
407-
//}
408+
func IsCrossQueryEffective(cqi []*pb.CrossQueryInfo, tx *lpb.Transaction) bool {
409+
return true
410+
}
408411

409412
// PutCrossQueries put queryInfos to db
410-
//func (xc *XMCache) putCrossQueries(queryInfos []*pb.CrossQueryInfo) error {
411-
// var qi []byte
412-
// var err error
413-
// if len(queryInfos) != 0 {
414-
// qi, err = MarshalMessages(queryInfos)
415-
// if err != nil {
416-
// return err
417-
// }
418-
// }
419-
// if qi != nil {
420-
// err = xc.Put(TransientBucket, crossQueryInfosKey, qi)
421-
// if err != nil {
422-
// return err
423-
// }
424-
// }
425-
// return nil
426-
//}
413+
func (xc *XMCache) putCrossQueries(queryInfos []*pb.CrossQueryInfo) error {
414+
var qi []byte
415+
var err error
416+
if len(queryInfos) != 0 {
417+
qi, err = MarshalMessages(queryInfos)
418+
if err != nil {
419+
return err
420+
}
421+
}
422+
if qi != nil {
423+
err = xc.Put(TransientBucket, crossQueryInfosKey, qi)
424+
if err != nil {
425+
return err
426+
}
427+
}
428+
return nil
429+
}
427430

428-
//func (xc *XMCache) writeCrossQueriesRWSet() error {
429-
// return xc.putCrossQueries(xc.crossQueryCache.GetCrossQueryRWSets())
430-
//}
431+
func (xc *XMCache) writeCrossQueriesRWSet() error {
432+
return xc.putCrossQueries(xc.crossQueryCache.GetCrossQueryRWSets())
433+
}
431434

432435
// ParseContractEvents parse contract events from tx
433436
func ParseContractEvents(tx *lpb.Transaction) ([]*protos.ContractEvent, error) {
@@ -474,10 +477,10 @@ func (xc *XMCache) Flush() error {
474477
return err
475478
}
476479

477-
// err = xc.writeCrossQueriesRWSet()
478-
// if err != nil {
479-
// return err
480-
// }
480+
err = xc.writeCrossQueriesRWSet()
481+
if err != nil {
482+
return err
483+
}
481484

482485
err = xc.writeEventRWSet()
483486
if err != nil {

kernel/contract/state.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type UTXOState interface {
4444
// CrossQueryState 对XuperBridge暴露对跨链只读合约的操作能力
4545
type CrossQueryState interface {
4646
CrossQuery(crossQueryRequest *pb.CrossQueryRequest, queryMeta *pb.CrossQueryMeta) (*pb.ContractResponse, error)
47+
CrossQueryCache(crossQueries []*pb.CrossQueryInfo)
4748
}
4849

4950
type ContractEventState interface {

0 commit comments

Comments
 (0)