From 24fa1057e4338dffa5a9365208bc6d757bfd00a8 Mon Sep 17 00:00:00 2001 From: Peter Gilbert Date: Wed, 1 Mar 2023 15:44:47 -0800 Subject: [PATCH 1/3] Fix docker build --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 958fd48..0511356 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.18-alpine as builder +FROM golang:1.19-alpine as builder RUN apk add --no-cache g++ git # override git so go can access private repos @@ -17,4 +17,4 @@ FROM alpine:latest VOLUME /executor/env WORKDIR /executor/env COPY --from=builder /im-executor/bin/executor /usr/local/bin -CMD ["/bin/sh", "-c", "executor start --test --loglevel debug --home /executor/env 2> /executor/env/app.log"] \ No newline at end of file +CMD ["/bin/sh", "-c", "executor start --test --loglevel debug --home /executor/env 2> /executor/env/app.log"] From 6eeafb4c750bf67d02e96832979fea4385919173 Mon Sep 17 00:00:00 2001 From: Peter Gilbert Date: Wed, 1 Mar 2023 16:01:05 -0800 Subject: [PATCH 2/3] Disable receiver contract whitelist: execute messages for any contract on enabled chains --- accounts/account.go | 8 +++++--- chains/chain.go | 8 ++++++++ contracts/filters.go | 2 +- executor/execution_handlers.go | 12 +++++++++--- executor/executor.go | 21 +++++++++++---------- sgn/sgn_query.go | 17 ++++++++++++++--- 6 files changed, 48 insertions(+), 20 deletions(-) diff --git a/accounts/account.go b/accounts/account.go index ac74ff0..786c261 100644 --- a/accounts/account.go +++ b/accounts/account.go @@ -23,8 +23,8 @@ func newAccount(conf *AccountConfig) *Account { transactors := make(map[uint64]*ethutils.Transactor) signers := make(map[uint64]ethutils.Signer) address := eth.ZeroAddr - for _, contract := range conf.ReceiverContracts { - chain := chains.GetChainMustExist(contract.ChainId) + for _, id := range chains.GetChainIDs() { + chain := chains.GetChainMustExist(id) if _, ok := transactors[chain.ChainID]; !ok { transactor, signer := newTransactor(chain, conf.Keystore, conf.Passphrase) transactors[chain.ChainID] = transactor @@ -32,6 +32,7 @@ func newAccount(conf *AccountConfig) *Account { address = transactor.Address() } } + err := conf.SenderGroups.Validate() if err != nil { log.Fatalf("cannot initialize account: %s", err.Error()) @@ -77,7 +78,8 @@ func (a *Account) IsSenderAllowed(sender, receiver *contracts.ContractAddress) b } recvContract, ok := a.ReceiverContract(receiver) if !ok { - log.Errorf("unable to check sender, receiver contract %s not found", receiver) + log.Warnf("unable to check sender, receiver contract %s not found", receiver) + return true } // if no allowed sender groups are configured, it is defaulted to allowed if len(recvContract.AllowSenderGroups) == 0 { diff --git a/chains/chain.go b/chains/chain.go index 1c4c537..111016d 100644 --- a/chains/chain.go +++ b/chains/chain.go @@ -107,6 +107,14 @@ func GetChainMustExist(chid uint64) *Chain { return chain } +func GetChainIDs() []uint64 { + var ids []uint64; + for _, chain := range chains.chains { + ids = append(ids, chain.ChainID) + } + return ids +} + func StartMonitoring(filters contracts.ReceiverContracts, signers map[uint64][]eth.Addr) { for _, chain := range chains.chains { go chain.startMonitoringEvents(filters) diff --git a/contracts/filters.go b/contracts/filters.go index 8a7f120..68f2db1 100644 --- a/contracts/filters.go +++ b/contracts/filters.go @@ -100,7 +100,7 @@ func (c ReceiverContracts) String() string { func (c ReceiverContracts) Validate() error { if len(c) == 0 { - return fmt.Errorf("empty executor contract filter") + log.Warnf("empty executor contract filter") } log.Infoln("executor will submit execution for these contracts:") for _, f := range c { diff --git a/executor/execution_handlers.go b/executor/execution_handlers.go index 1e34657..3fe2b3c 100644 --- a/executor/execution_handlers.go +++ b/executor/execution_handlers.go @@ -40,7 +40,9 @@ func (e *Executor) executeMessage(x *Execution) { tx, err := x.Transactor.Transact( newTransactionCallback(id, "execute message"), func(transactor bind.ContractTransactor, opts *bind.TransactOpts) (*gethtypes.Transaction, error) { - setValue(opts, x.Receiver.PayableValue) + if x.Receiver != nil { + setValue(opts, x.Receiver.PayableValue) + } method := func() (*gethtypes.Transaction, error) { return x.ExecuteMessage(opts, msg, route, sigs, signers, powers) } @@ -73,7 +75,9 @@ func (e *Executor) executeDelayedMessage(x *Execution) { tx, err := x.Transactor.Transact( newDelayTransactionCallback(delayId, "execute delayed message"), func(transactor bind.ContractTransactor, opts *bind.TransactOpts) (*gethtypes.Transaction, error) { - setValue(opts, x.Receiver.PayableValue) + if x.Receiver != nil { + setValue(opts, x.Receiver.PayableValue) + } method := func() (*gethtypes.Transaction, error) { return x.ExecuteDelayedMessage(opts, dm.Adapter, dm.SrcContract, dm.SrcChainID, dm.DstContract, dm.Calldata, dm.Nonce) } @@ -128,7 +132,9 @@ func (e *Executor) executeMessageWithTransfer(x *Execution) { tx, err := x.Transactor.Transact( newTransactionCallback(id, "execute message with transfer"), func(transactor bind.ContractTransactor, opts *bind.TransactOpts) (*gethtypes.Transaction, error) { - setValue(opts, x.Receiver.PayableValue) + if x.Receiver != nil { + setValue(opts, x.Receiver.PayableValue) + } method := func() (*gethtypes.Transaction, error) { return x.Chain.MessageBus.ExecuteMessageWithTransfer(opts, msg, xfer, sigs, signers, powers) } diff --git a/executor/executor.go b/executor/executor.go index c72c764..62aa4bc 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -74,7 +74,8 @@ func (e *Executor) startFetchingExecCtxsFromSgn() { log.Infoln("Start fetching execution contexts from SGN") for { time.Sleep(8 * time.Second) - execCtxs, err := e.sgn.GetExecutionContexts(e.accounts.ReceiverContracts()) + // get all execution contexts for any enabled chain + execCtxs, err := e.sgn.GetExecutionContexts() if err != nil { log.Errorln("failed to get messages", err) continue @@ -85,6 +86,10 @@ func (e *Executor) startFetchingExecCtxsFromSgn() { log.Tracef("Got %d execution contexts", len(execCtxs)) execCtxsToSave := []*msgtypes.ExecutionContext{} for i := range execCtxs { + // TODO: process only messages to or from target chain, e.g., sapphire testnet (0x5aff) + //if execCtxs[i].Message.SrcChainId == 0x5aff || execCtxs[i].Message.DstChainId == 0x5aff { + // execCtxsToSave = append(execCtxsToSave, &execCtxs[i]) + //} execCtxsToSave = append(execCtxsToSave, &execCtxs[i]) } db.SaveExecutionContexts(execCtxsToSave) @@ -277,12 +282,11 @@ func (e *Executor) DelayedMessageToExecution(delayedMessages []*dal.DelayedMessa func (e *Executor) newExecution(msgId common.Hash, sender, receiver *contracts.ContractAddress, chain *chains.Chain, record *models.ExecutionRecord, delayedMessage *dal.DelayedMessage, gasLimit uint64) (*Execution, error) { acc, ok := e.accounts.AccountByReceiver(receiver) if !ok { - if record != nil { - dal.GetDB().UpdateStatus(msgId.Bytes(), types.ExecutionStatus_Ignored) - } else { - dal.GetDB().UpdateDelayStatus(msgId, types.ExecutionStatus_Ignored) + // get the default account + acc, ok = e.accounts.AccountByID("") + if !ok { + return nil, fmt.Errorf("no account configured") } - return nil, fmt.Errorf("ignoring message/delayed-message with id/delayId %x: cannot find account by receiver %s", msgId, receiver) } allowed := acc.IsSenderAllowed(sender, receiver) if !allowed { @@ -297,10 +301,7 @@ func (e *Executor) newExecution(msgId common.Hash, sender, receiver *contracts.C if !ok { return nil, fmt.Errorf("transactor not registered for chainId %d", chain.ChainID) } - recvContract, ok := acc.ReceiverContract(receiver) - if !ok { - return nil, fmt.Errorf("receiver contract not registered for %s", receiver) - } + recvContract, _ := acc.ReceiverContract(receiver) bal, err := chain.EthClient.PendingBalanceAt(context.Background(), acc.Address) if err != nil { log.Debugf("failed to query balance for account %s on chain %d", acc.ID, chain.ChainID) diff --git a/sgn/sgn_query.go b/sgn/sgn_query.go index a5e0b92..0863d1e 100644 --- a/sgn/sgn_query.go +++ b/sgn/sgn_query.go @@ -4,18 +4,29 @@ import ( "context" "github.com/celer-network/goutils/log" - "github.com/celer-network/im-executor/contracts" + "github.com/celer-network/im-executor/chains" "github.com/celer-network/im-executor/sgn-v2/eth" + comtypes "github.com/celer-network/im-executor/sgn-v2/common/types" cbrtypes "github.com/celer-network/im-executor/sgn-v2/x/cbridge/types" msgtypes "github.com/celer-network/im-executor/sgn-v2/x/message/types" pegbrtypes "github.com/celer-network/im-executor/sgn-v2/x/pegbridge/types" "github.com/celer-network/im-executor/types" ) -func (c *SgnClient) GetExecutionContexts(filters contracts.ReceiverContracts) ([]msgtypes.ExecutionContext, error) { +func (c *SgnClient) GetExecutionContexts() ([]msgtypes.ExecutionContext, error) { qc := msgtypes.NewQueryClient(c.grpcConn) + + // filter execution contexts for all supported chains + filter := []*comtypes.ContractInfo{} + for _, id := range chains.GetChainIDs() { + info := &comtypes.ContractInfo{ + ChainId: id, + } + filter = append(filter, info) + } + req := &msgtypes.QueryExecutionContextsRequest{ - ContractInfos: filters.ContractInfoList(), + ContractInfos: filter, } ctx, cancel := context.WithTimeout(context.Background(), types.GatewayTimeout) defer cancel() From 353979b08625bbecf81f7a062b848cc6257f4d10 Mon Sep 17 00:00:00 2001 From: Peter Gilbert Date: Thu, 2 Mar 2023 07:47:56 -0800 Subject: [PATCH 3/3] Hardcode target chain to Sapphire testnet --- executor/executor.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/executor/executor.go b/executor/executor.go index 62aa4bc..5d0f1a3 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -86,11 +86,11 @@ func (e *Executor) startFetchingExecCtxsFromSgn() { log.Tracef("Got %d execution contexts", len(execCtxs)) execCtxsToSave := []*msgtypes.ExecutionContext{} for i := range execCtxs { - // TODO: process only messages to or from target chain, e.g., sapphire testnet (0x5aff) - //if execCtxs[i].Message.SrcChainId == 0x5aff || execCtxs[i].Message.DstChainId == 0x5aff { - // execCtxsToSave = append(execCtxsToSave, &execCtxs[i]) - //} - execCtxsToSave = append(execCtxsToSave, &execCtxs[i]) + // TODO: add a config option for this + //process only messages to or from target chain, e.g., sapphire testnet (0x5aff) + if execCtxs[i].Message.SrcChainId == 0x5aff || execCtxs[i].Message.DstChainId == 0x5aff { + execCtxsToSave = append(execCtxsToSave, &execCtxs[i]) + } } db.SaveExecutionContexts(execCtxsToSave) }