mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 18:32:23 +00:00
ethclient/lightclient: implement SendTransaction and PendingNonceAt
This commit is contained in:
parent
b31680fb19
commit
d9b4da31a1
2 changed files with 59 additions and 0 deletions
|
|
@ -241,6 +241,9 @@ func (c *Client) CodeAt(ctx context.Context, account common.Address, blockNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) {
|
func (c *Client) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) {
|
||||||
|
if blockNumber.IsInt64() && rpc.BlockNumber(blockNumber.Int64()) == rpc.PendingBlockNumber {
|
||||||
|
return c.PendingNonceAt(ctx, account)
|
||||||
|
}
|
||||||
proof, _, err := c.state.getProof(ctx, blockNumber, account, nil, false)
|
proof, _, err := c.state.getProof(ctx, blockNumber, account, nil, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
|
|
@ -255,3 +258,44 @@ func (c *Client) BlockReceipts(ctx context.Context, blockNrOrHash rpc.BlockNumbe
|
||||||
}
|
}
|
||||||
return c.txAndReceipts.getBlockReceipts(ctx, hash)
|
return c.txAndReceipts.getBlockReceipts(ctx, hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TransactionSender interface {
|
||||||
|
func (c *Client) SendTransaction(ctx context.Context, tx *types.Transaction) error {
|
||||||
|
return c.txAndReceipts.sendTransaction(ctx, tx)
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// PendingStateReader interface {
|
||||||
|
func (c *Client) PendingBalanceAt(ctx context.Context, account common.Address) (*big.Int, error) {
|
||||||
|
return c.BalanceAt(ctx, account, big.NewInt(int64(rpc.LatestBlockNumber)))
|
||||||
|
//TODO subtract upper estimate for pending tx costs?
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) PendingStorageAt(ctx context.Context, account common.Address, key common.Hash) ([]byte, error) {
|
||||||
|
return c.StorageAt(ctx, account, key, big.NewInt(int64(rpc.LatestBlockNumber)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) {
|
||||||
|
return c.CodeAt(ctx, account, big.NewInt(int64(rpc.LatestBlockNumber)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) {
|
||||||
|
nonce, err := c.NonceAt(ctx, account, big.NewInt(int64(rpc.LatestBlockNumber)))
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
//TODO
|
||||||
|
return nonce, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) PendingTransactionCount(ctx context.Context) (uint, error) {
|
||||||
|
return 0, nil //TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlockNumberReader interface {
|
||||||
|
func (c *Client) BlockNumber(ctx context.Context) (uint64, error) {
|
||||||
|
if head := c.canonicalChain.getHead(); head != nil {
|
||||||
|
return head.BlockNumber(), nil
|
||||||
|
}
|
||||||
|
return 0, errors.New("chain head unknown")
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum"
|
"github.com/ethereum/go-ethereum"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
"github.com/ethereum/go-ethereum/common/lru"
|
"github.com/ethereum/go-ethereum/common/lru"
|
||||||
"github.com/ethereum/go-ethereum/consensus/misc/eip4844"
|
"github.com/ethereum/go-ethereum/consensus/misc/eip4844"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
|
|
@ -251,3 +252,17 @@ func (t *txAndReceipts) cacheBlockTxPositions(block *types.Block) {
|
||||||
t.txPosCache.Add(tx.Hash(), txInBlock{blockNumber: blockNumber, blockHash: blockHash, index: uint(i)})
|
t.txPosCache.Add(tx.Hash(), txInBlock{blockNumber: blockNumber, blockHash: blockHash, index: uint(i)})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *txAndReceipts) sendTransaction(ctx context.Context, tx *types.Transaction) error {
|
||||||
|
data, err := tx.MarshalBinary()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := t.client.CallContext(ctx, nil, "eth_sendRawTransaction", hexutil.Encode(data)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
/*t.sentTxLock.Lock()
|
||||||
|
t.sentTxs[tx.]
|
||||||
|
t.sentTxLock.Unlock()*/
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue