Skip to content

Commit

Permalink
Merge pull request #1313 from libangzhu/proxyExec-update
Browse files Browse the repository at this point in the history
Proxy exec update
  • Loading branch information
bysomeone authored Oct 20, 2023
2 parents 53391fd + c9658b5 commit dff390b
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 210 deletions.
106 changes: 0 additions & 106 deletions Jenkinsfile

This file was deleted.

71 changes: 57 additions & 14 deletions executor/execenv.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ import (
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/address"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/system/crypto/secp256k1eth"
drivers "github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
"github.com/golang/protobuf/proto"
)

//执行器 -> db 环境

// 执行器 -> db 环境
type executor struct {
stateDB dbm.KV
localDB dbm.KVDB
Expand Down Expand Up @@ -110,9 +112,9 @@ func DelMVCC(db dbm.KVDB, detail *types.BlockDetail) (kvlist []*types.KeyValue)
return kvlist
}

//隐私交易费扣除规则:
//1.公对私交易:直接从coin合约中扣除
//2.私对私交易或者私对公交易:交易费的扣除从隐私合约账户在coin合约中的账户中扣除
// 隐私交易费扣除规则:
// 1.公对私交易:直接从coin合约中扣除
// 2.私对私交易或者私对公交易:交易费的扣除从隐私合约账户在coin合约中的账户中扣除
func (e *executor) processFee(tx *types.Transaction) (*types.Receipt, error) {
from := tx.From()
accFrom := e.coinsAccount.LoadAccount(from)
Expand Down Expand Up @@ -599,10 +601,25 @@ func (e *executor) rollback() {
}
}

func (e *executor) getCurrentNonce(addr string) int64 {

nonceLocalKey := secp256k1eth.CaculCoinsEvmAccountKey(addr)
evmNonce := &types.EvmAccountNonce{}
nonceV, err := e.localDB.Get(nonceLocalKey)
if err == nil {
_ = types.Decode(nonceV, evmNonce)
}

return evmNonce.GetNonce()

}

func (e *executor) proxyGetRealTx(tx *types.Transaction) (*types.Transaction, error) {

if string(types.GetRealExecName(tx.GetExecer())) != "evm" {
return nil, fmt.Errorf("execName %s not allowd", string(types.GetRealExecName(tx.GetExecer())))
}

var actionData types.EVMContractAction4Chain33
err := types.Decode(tx.GetPayload(), &actionData)
if err != nil {
Expand All @@ -621,17 +638,23 @@ func (e *executor) proxyGetRealTx(tx *types.Transaction) (*types.Transaction, er

}

func (e *executor) proxyExecTx(tx *types.Transaction) (*types.Transaction, error) {
var realTx = tx
var err error
if tx.To == e.cfg.GetModuleConfig().Exec.ProxyExecAddress {
realTx, err = e.proxyGetRealTx(tx)
if err != nil {
return realTx, err
func (e *executor) checkProxyExecTx(tx *types.Transaction) bool {
if tx.To == e.cfg.GetModuleConfig().Exec.ProxyExecAddress && types.IsEthSignID(tx.Signature.Ty) {
if string(types.GetRealExecName(tx.GetExecer())) == "evm" {
return true
}
realTx.Signature = tx.Signature

}
return false
}
func (e *executor) proxyExecTx(tx *types.Transaction) (*types.Transaction, error) {

realTx, err := e.proxyGetRealTx(tx)
if err != nil {
return realTx, err
}
realTx.Signature = tx.Signature

return realTx, nil
}

Expand All @@ -646,14 +669,32 @@ func (e *executor) execTx(exec *Executor, tx *types.Transaction, index int) (*ty
}
return receipt, nil
}
var feelog *types.Receipt

var err error
//代理执行 EVM-->txpayload-->chain33 tx
if e.cfg.IsFork(e.height, "ForkProxyExec") {
if e.cfg.IsFork(e.height, "ForkProxyExec") && e.checkProxyExecTx(tx) {
defer func(tx *types.Transaction) {
cloneTx := tx.Clone()
//执行evm execlocal 数据,主要是nonce++
//此处执行execlocal 是为了连续多笔同地址下的交易,关系上下文用,否则下一笔evm交易的nonce 将会报错
elog.Info("proxyExec", "isSameTmeExecLocal", e.isExecLocalSameTime(tx, index))
err = e.execLocalSameTime(cloneTx, feelog, index)
if err != nil {
elog.Error("proxyExec ReExecLocal", " execLocalSameTime", err.Error())
}
}(tx)

////由于代理执行交易并不会检查tx.nonce的正确性,所以在此处检查
currentNonce := e.getCurrentNonce(tx.From())
if currentNonce != tx.GetNonce() {
return nil, fmt.Errorf("proxyExec nonce missmatch,tx.nonce:%v,localnonce:%v", tx.Nonce, currentNonce)
}
tx, err = e.proxyExecTx(tx)
if err != nil {
return nil, err
}

}

//交易检查规则:
Expand All @@ -670,7 +711,7 @@ func (e *executor) execTx(exec *Executor, tx *types.Transaction, index int) (*ty
//处理交易手续费(先把手续费收了)
//如果收了手续费,表示receipt 至少是pack 级别
//收不了手续费的交易才是 error 级别
feelog, err := e.execFee(tx, index)
feelog, err = e.execFee(tx, index)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -731,6 +772,7 @@ func (e *executor) execLocalSameTime(tx *types.Transaction, receipt *types.Recei
r.Ty = receipt.Ty
r.Logs = receipt.Logs
}

_, err := e.execLocalTx(tx, r, index)
return err
}
Expand All @@ -739,6 +781,7 @@ func (e *executor) execLocalSameTime(tx *types.Transaction, receipt *types.Recei

func (e *executor) execLocalTx(tx *types.Transaction, r *types.ReceiptData, index int) (*types.LocalDBSet, error) {
kv, err := e.execLocal(tx, r, index)

if err == types.ErrActionNotSupport {
return nil, nil
}
Expand Down
39 changes: 38 additions & 1 deletion executor/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ func New(cfg *typ.Chain33Config) *Executor {
return exec
}

//Wait Executor ready
// Wait Executor ready
func (exec *Executor) Wait() {}

// SetQueueClient set client queue, for recv msg
Expand Down Expand Up @@ -378,6 +378,7 @@ func (exec *Executor) procExecTxList(msg *queue.Message) {
}

func (exec *Executor) procExecAddBlock(msg *queue.Message) {

//panic 处理
defer func() {
if r := recover(); r != nil {
Expand Down Expand Up @@ -423,6 +424,7 @@ func (exec *Executor) procExecAddBlock(msg *queue.Message) {
if len(kvs) > 0 {
kvset.KV = append(kvset.KV, kvs...)
}

kvs, err = plugin.ExecLocal(execute, datas)
if err != nil {
msg.Reply(exec.client.NewMessage("", types.EventAddBlock, err))
Expand All @@ -443,6 +445,26 @@ func (exec *Executor) procExecAddBlock(msg *queue.Message) {
for i := 0; i < len(b.Txs); i++ {
tx := b.Txs[i]
execute.localDB.(*LocalDB).StartTx()
elog.Info("procExecAddBlock", "execute.execLocalTx:", ctx.height, "tx.From", tx.From(), "tx.Nonce", tx.Nonce)

//解析TX PROXY_EXEC,优先解析代理执行交易进行execlocal 处理
if execute.checkProxyExecTx(tx) {
var kv = new(types.LocalDBSet)
realTx, err := execute.proxyExecTx(tx)
if err == nil {
elog.Info("procExecAddBlock", "proxyExecTx execute.execLocalTx blockheight:", ctx.height, "tx.From", tx.From(), "tx.Nonce", tx.Nonce)
kv, err = execute.execLocal(realTx, datas.Receipts[i], i)
if err != nil {
msg.Reply(exec.client.NewMessage("", types.EventAddBlock, err))
return
}

if kv != nil && kv.KV != nil {
kvset.KV = append(kvset.KV, kv.KV...)
}
}
}

kv, err := execute.execLocalTx(tx, datas.Receipts[i], i)
if err != nil {
msg.Reply(exec.client.NewMessage("", types.EventAddBlock, err))
Expand All @@ -451,6 +473,7 @@ func (exec *Executor) procExecAddBlock(msg *queue.Message) {
if kv != nil && kv.KV != nil {
kvset.KV = append(kvset.KV, kv.KV...)
}

}
}
msg.Reply(exec.client.NewMessage("", types.EventAddBlock, &kvset))
Expand Down Expand Up @@ -513,6 +536,20 @@ func (exec *Executor) procExecDelBlock(msg *queue.Message) {
if !exec.disableExecLocal {
for i := len(b.Txs) - 1; i >= 0; i-- {
tx := b.Txs[i]
//先检查是否是代理交易
if execute.checkProxyExecTx(tx) {
realTx, err := execute.proxyExecTx(tx)
if err == nil {
kv, err := execute.execDelLocal(realTx, datas.Receipts[i], i)
if err == nil && kv != nil {
if execute.checkPrefix(realTx.Execer, kv.KV) == nil {
kvset.KV = append(kvset.KV, kv.KV...)
}

}
}
}

kv, err := execute.execDelLocal(tx, datas.Receipts[i], i)
if err == types.ErrActionNotSupport {
continue
Expand Down
Loading

0 comments on commit dff390b

Please sign in to comment.