diff --git a/accountmgr/gas_payer.go b/accountmgr/gas_payer.go index 1123f3c2a24349a9623a78f5dd40e98c8e40baa3..20a0a55744c58e4b215a9cc9c01a316862b39c4d 100644 --- a/accountmgr/gas_payer.go +++ b/accountmgr/gas_payer.go @@ -5,6 +5,8 @@ import ( "errors" "fmt" + configPb "chainmaker.org/chainmaker/pb-go/v2/config" + "chainmaker.org/chainmaker/common/v2/crypto" "chainmaker.org/chainmaker/pb-go/v2/store" @@ -258,6 +260,30 @@ func (g *AccountManagerRuntime) getMethodPayer( return []byte(payerAddress), nil } +func getPayerAddrByTx(tx *commonPb.Transaction, ac protocol.AccessControlProvider, cfg *configPb.ChainConfig) ([]byte, + error) { + + txPayer := tx.GetPayer() + if txPayer != nil { + member, err1 := ac.NewMember(txPayer.GetSigner()) + if err1 != nil { + return nil, fmt.Errorf("failed to create access control member from pb, err = %v", err1) + } + + addr, err2 := utils.GetStrAddrFromMember(member, cfg.Vm.AddrType) + if err2 != nil { + return nil, fmt.Errorf("member to address failed, err = %v", err2) + } + //utils.GetStrAddrFromMember计算出的地址已经根据地址类型做了区分,只是至信链地址没有加"ZX"前缀 + if cfg.Vm.AddrType == configPb.AddrType_ZXL { + addr = "ZX" + addr + } + return []byte(addr), nil + } + + return nil, nil +} + //nolint: gocyclo func (g *AccountManagerRuntime) getTxPayer( txSimContext protocol.TxSimContext, params map[string][]byte) ([]byte, error) { @@ -285,18 +311,9 @@ func (g *AccountManagerRuntime) getTxPayer( g.log.Debugf("GetTxWithInfo was called, txInfo = %#v", txInfo) tx := txInfo.Transaction - if txPayer := tx.GetPayer(); txPayer != nil { - member, err1 := ac.NewMember(txPayer.GetSigner()) - if err1 != nil { - return nil, fmt.Errorf("failed to create access control member from pb, err = %v", err1) - } - - addr, err2 := utils.GetStrAddrFromMember(member, chainConfig.Vm.AddrType) - if err2 != nil { - return nil, fmt.Errorf("member to address failed, err = %v", err2) - } - - return []byte(addr), nil + addr, err1 := getPayerAddrByTx(tx, ac, chainConfig) + if addr != nil && err1 == nil { + return addr, nil } txPayload := tx.GetPayload()