diff --git a/graphql/graphql.go b/graphql/graphql.go index 4c6e5545b..0654fd1af 100644 --- a/graphql/graphql.go +++ b/graphql/graphql.go @@ -33,6 +33,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" ) @@ -516,10 +517,18 @@ func (t *Transaction) V(ctx context.Context) (hexutil.Big, error) { return hexutil.Big(*v), nil } +func (t *Transaction) Raw(ctx context.Context) (hexutil.Bytes, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return hexutil.Bytes{}, err + } + return tx.MarshalBinary() +} + func (t *Transaction) RawReceipt(ctx context.Context) (hexutil.Bytes, error) { receipt, err := t.getReceipt(ctx) if err != nil || receipt == nil { - return nil, err + return hexutil.Bytes{}, err } return receipt.MarshalBinary() } @@ -798,6 +807,22 @@ func (b *Block) TotalDifficulty(ctx context.Context) (hexutil.Big, error) { return hexutil.Big(*td), nil } +func (b *Block) RawHeader(ctx context.Context) (hexutil.Bytes, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + return rlp.EncodeToBytes(header) +} + +func (b *Block) Raw(ctx context.Context) (hexutil.Bytes, error) { + block, err := b.resolve(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + return rlp.EncodeToBytes(block) +} + // BlockNumberArgs encapsulates arguments to accessors that specify a block number. type BlockNumberArgs struct { // TODO: Ideally we could use input unions to allow the query to specify the diff --git a/graphql/schema.go b/graphql/schema.go index c908866be..ff3919be7 100644 --- a/graphql/schema.go +++ b/graphql/schema.go @@ -140,7 +140,11 @@ const schema string = ` # Envelope transaction support type: Int accessList: [AccessTuple!] - # RawReceipt is the binary encoding of the receipt. For post EIP-2718 typed transactions + # Raw is the canonical encoding of the transaction. + # For legacy transactions, it returns the RLP encoding. + # For EIP-2718 typed transactions, it returns the type and payload. + raw: Bytes! + # RawReceipt is the canonical encoding of the receipt. For post EIP-2718 typed transactions # this is equivalent to TxType || ReceiptEncoding. rawReceipt: Bytes! } @@ -238,6 +242,10 @@ const schema string = ` # EstimateGas estimates the amount of gas that will be required for # successful execution of a transaction at the current block's state. estimateGas(data: CallData!): Long! + # RawHeader is the RLP encoding of the block's header. + rawHeader: Bytes! + # Raw is the RLP encoding of the block. + raw: Bytes! } # CallData represents the data associated with a local contract call.