mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-23 13:16:42 +00:00
impl SendRawTransactionSync
This commit is contained in:
parent
0e82b6be63
commit
d9afba069b
4 changed files with 52 additions and 0 deletions
|
|
@ -696,6 +696,16 @@ func (ec *Client) SendTransaction(ctx context.Context, tx *types.Transaction) er
|
||||||
return ec.c.CallContext(ctx, nil, "eth_sendRawTransaction", hexutil.Encode(data))
|
return ec.c.CallContext(ctx, nil, "eth_sendRawTransaction", hexutil.Encode(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SendTransactionSync combining transaction submission and receipt retrieval into a single RPC call
|
||||||
|
// TODO: testing
|
||||||
|
func (ec *Client) SendRawTransactionSync(ctx context.Context, tx *types.Transaction) error {
|
||||||
|
data, err := tx.MarshalBinary()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return ec.c.CallContext(ctx, nil, "eth_sendRawTransactionSync", hexutil.Encode(data))
|
||||||
|
}
|
||||||
|
|
||||||
// RevertErrorData returns the 'revert reason' data of a contract call.
|
// RevertErrorData returns the 'revert reason' data of a contract call.
|
||||||
//
|
//
|
||||||
// This can be used with CallContract and EstimateGas, and only when the server is Geth.
|
// This can be used with CallContract and EstimateGas, and only when the server is Geth.
|
||||||
|
|
|
||||||
|
|
@ -1636,6 +1636,38 @@ func (api *TransactionAPI) SendRawTransaction(ctx context.Context, input hexutil
|
||||||
return SubmitTransaction(ctx, api.b, tx)
|
return SubmitTransaction(ctx, api.b, tx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (api *TransactionAPI) SendRawTransactionSync(ctx context.Context, input hexutil.Bytes, timeout int64) (map[string]interface{}, error) {
|
||||||
|
tx := new(types.Transaction)
|
||||||
|
if err := tx.UnmarshalBinary(input); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
hash, err := SubmitTransaction(ctx, api.b, tx)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// waiting for receipt
|
||||||
|
timer := time.NewTimer(time.Duration(timeout) * time.Second)
|
||||||
|
defer timer.Stop()
|
||||||
|
|
||||||
|
<-timer.C
|
||||||
|
receipt, err := api.GetTransactionReceipt(ctx, hash)
|
||||||
|
// If the timeout expires without obtaining a receipt, return code error 4
|
||||||
|
if receipt == nil {
|
||||||
|
return nil, &timeoutError{
|
||||||
|
message: "the timeout expires without obtaining a receipt",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return receipt, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Sign calculates an ECDSA signature for:
|
// Sign calculates an ECDSA signature for:
|
||||||
// keccak256("\x19Ethereum Signed Message:\n" + len(message) + message).
|
// keccak256("\x19Ethereum Signed Message:\n" + len(message) + message).
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -3885,3 +3885,7 @@ func (b configTimeBackend) HeaderByNumber(_ context.Context, n rpc.BlockNumber)
|
||||||
func (b configTimeBackend) CurrentHeader() *types.Header {
|
func (b configTimeBackend) CurrentHeader() *types.Header {
|
||||||
return &types.Header{Time: b.time}
|
return &types.Header{Time: b.time}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSendRawTransactionSync(t *testing.T) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,7 @@ const (
|
||||||
errCodeInvalidParams = -32602
|
errCodeInvalidParams = -32602
|
||||||
errCodeReverted = -32000
|
errCodeReverted = -32000
|
||||||
errCodeVMError = -32015
|
errCodeVMError = -32015
|
||||||
|
errCodeTimeout = 4
|
||||||
)
|
)
|
||||||
|
|
||||||
func txValidationError(err error) *invalidTxError {
|
func txValidationError(err error) *invalidTxError {
|
||||||
|
|
@ -168,3 +169,8 @@ type blockGasLimitReachedError struct{ message string }
|
||||||
|
|
||||||
func (e *blockGasLimitReachedError) Error() string { return e.message }
|
func (e *blockGasLimitReachedError) Error() string { return e.message }
|
||||||
func (e *blockGasLimitReachedError) ErrorCode() int { return errCodeBlockGasLimitReached }
|
func (e *blockGasLimitReachedError) ErrorCode() int { return errCodeBlockGasLimitReached }
|
||||||
|
|
||||||
|
type timeoutError struct{ message string }
|
||||||
|
|
||||||
|
func (e *timeoutError) Error() string { return e.message }
|
||||||
|
func (e *timeoutError) ErrorCode() int { return errCodeTimeout }
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue