aboutsummaryrefslogtreecommitdiffstats
path: root/internal
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2018-11-23 12:12:10 +0800
committerWei-Ning Huang <w@byzantine-lab.io>2019-06-12 17:27:18 +0800
commit41c03e07c6ad09b30c336c929442087618fefd66 (patch)
treefb685c2f7411c03504b9f32dbf66e1effc644fbb /internal
parentfc2df4ef1c189accd7a4c4ed90d8e3562b5d9e60 (diff)
downloadgo-tangerine-41c03e07c6ad09b30c336c929442087618fefd66.tar.gz
go-tangerine-41c03e07c6ad09b30c336c929442087618fefd66.tar.zst
go-tangerine-41c03e07c6ad09b30c336c929442087618fefd66.zip
api: allow sending batch of raw transactions
Diffstat (limited to 'internal')
-rw-r--r--internal/ethapi/api.go39
-rw-r--r--internal/ethapi/backend.go1
2 files changed, 40 insertions, 0 deletions
diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go
index 8c950d5cf..3dec0b114 100644
--- a/internal/ethapi/api.go
+++ b/internal/ethapi/api.go
@@ -1288,6 +1288,31 @@ func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (c
return tx.Hash(), nil
}
+// submitTransactions is a helper function that submits batch of tx to txPool and logs a message.
+func submitTransactions(ctx context.Context, b Backend, txs []*types.Transaction) ([]common.Hash, error) {
+ errs := b.SendTxs(ctx, txs)
+ var hashes []common.Hash
+ for i, err := range errs {
+ if err != nil {
+ return nil, err
+ }
+ tx := txs[i]
+ if tx.To() == nil {
+ signer := types.MakeSigner(b.ChainConfig(), b.CurrentBlock().Number())
+ from, err := types.Sender(signer, tx)
+ if err != nil {
+ return nil, err
+ }
+ addr := crypto.CreateAddress(from, tx.Nonce())
+ log.Info("Submitted contract creation", "fullhash", tx.Hash().Hex(), "contract", addr.Hex())
+ } else {
+ log.Info("Submitted transaction", "fullhash", tx.Hash().Hex(), "recipient", tx.To())
+ }
+ hashes = append(hashes, tx.Hash())
+ }
+ return hashes, nil
+}
+
// SendTransaction creates a transaction for the given argument, sign it and submit it to the
// transaction pool.
func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args SendTxArgs) (common.Hash, error) {
@@ -1335,6 +1360,20 @@ func (s *PublicTransactionPoolAPI) SendRawTransaction(ctx context.Context, encod
return submitTransaction(ctx, s.b, tx)
}
+// SendRawTransactions will add the signed transaction to the transaction pool.
+// The sender is responsible for signing the transaction and using the correct nonce.
+func (s *PublicTransactionPoolAPI) SendRawTransactions(ctx context.Context, encodedTxs []hexutil.Bytes) ([]common.Hash, error) {
+ var txs []*types.Transaction
+ for _, encodedTx := range encodedTxs {
+ tx := new(types.Transaction)
+ if err := rlp.DecodeBytes(encodedTx, tx); err != nil {
+ return nil, err
+ }
+ txs = append(txs, tx)
+ }
+ return submitTransactions(ctx, s.b, txs)
+}
+
// Sign calculates an ECDSA signature for:
// keccack256("\x19Ethereum Signed Message:\n" + len(message) + message).
//
diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go
index 801b55d5c..da13d3661 100644
--- a/internal/ethapi/backend.go
+++ b/internal/ethapi/backend.go
@@ -65,6 +65,7 @@ type Backend interface {
// TxPool API
SendTx(ctx context.Context, signedTx *types.Transaction) error
+ SendTxs(ctx context.Context, signedTxs []*types.Transaction) []error
GetPoolTransactions() (types.Transactions, error)
GetPoolTransaction(txHash common.Hash) *types.Transaction
GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error)