specs/docs/raw/9-blockchain-interactions.md

187 lines
5.5 KiB
Markdown
Raw Normal View History

2020-04-29 13:51:11 +00:00
---
permalink: /spec/9
2020-05-04 11:51:52 +00:00
parent: Raw specs
2020-04-29 13:51:11 +00:00
title: 9/BLOCKCHAIN-USAGE
---
# 3/BLOCKCHAIN-USAGE
> Version: 0.1
>
2020-05-04 11:51:52 +00:00
> Status: Raw
2020-04-29 13:51:11 +00:00
>
> Authors: Andrea Maria Piana <andreap@status.im>
# Status interactions with the blockchain
In this document is document all the interactions that the Status client has
with the blockchain.
1. [Wallet](#Wallet)
2. [ENS](#ENS)
## Wallet
The wallet in Status has two main components:
1) Sending transactions
2) Fetching balance
In the section below are described the `RPC` calls made the nodes, with a brief
description of their functionality and how it is used by Status.
1. [Sending transactions](#Sending-transactions)
2020-05-04 11:51:52 +00:00
- [EstimateGas](#EstimateGas)
- [PendingNonceAt](#PendingNonceAt)
- [SuggestGasPrice](#SuggestGasPrice)
- [SendTransaction](#SendTransaction)
2020-04-29 13:51:11 +00:00
2. [Fetching balance](#Fetching-balance)
2020-05-04 11:51:52 +00:00
- [BlockByHash](#BlockByHash)
- [BlockByNumber](#BlockByNumber)
- [FilterLogs](#FilterLogs)
- [HeaderByNumber](#HeaderByNumber)
- [NonceAt](#NonceAt)
- [TransactionByHash](#TransactionByHash)
- [TransactionReceipt](#TransactionReceipt)
2020-04-29 13:51:11 +00:00
### Sending transactions
2020-05-04 11:51:52 +00:00
#### EstimateGas
2020-04-29 13:51:11 +00:00
EstimateGas tries to estimate the gas needed to execute a specific transaction based on
the current pending state of the backend blockchain. There is no guarantee that this is
the true gas limit requirement as other transactions may be added or removed by miners,
but it should provide a basis for setting a reasonable default.
```
func (ec *Client) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L499
#### PendingNonceAt
`PendingNonceAt` returns the account nonce of the given account in the pending state.
This is the nonce that should be used for the next transaction.
```
func (ec *Client) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L440
#### SuggestGasPrice
`SuggestGasPrice` retrieves the currently suggested gas price to allow a timely
execution of a transaction.
```
func (ec *Client) SuggestGasPrice(ctx context.Context) (*big.Int, error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L487
#### SendTransaction
`SendTransaction` injects a signed transaction into the pending pool for execution.
If the transaction was a contract creation use the TransactionReceipt method to get the
contract address after the transaction has been mined.
```
func (ec *Client) SendTransaction(ctx context.Context, tx *types.Transaction) error
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L512
### Fetching balance
#### BlockByHash
2020-05-04 11:51:52 +00:00
`BlockByHash` returns the given full block.
2020-04-29 13:51:11 +00:00
It is used by status to fetch a given block which will then be inspected for
transfers to the user address, both tokens and ETH.
```
func (ec *Client) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L78
#### BlockByNumber
`BlockByNumber` returns a block from the current canonical chain. If number is nil, the
latest known block is returned.
```
func (ec *Client) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L82
#### FilterLogs
`FilterLogs` executes a filter query.
Status uses this function to filter out logs, using the hash of the block
and the address that we are interested in, both inbound and outbound.
```
func (ec *Client) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L377
#### NonceAt
`NonceAt` returns the account nonce of the given account.
```
func (ec *Client) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L366
#### TransactionByHash
`TransactionByHash` returns the transaction with the given hash, used to inspect those
transaction made/received by the user.
```
func (ec *Client) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L202
#### HeaderByNumber
`HeaderByNumber` returns a block header from the current canonical chain.
```
func (ec *Client) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L172
#### TransactionReceipt
`TransactionReceipt` returns the receipt of a transaction by transaction hash.
It is used in status to check if a token transfer was made to the user address.
```
func (ec *Client) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)
```
https://github.com/ethereum/go-ethereum/blob/26d271dfbba1367326dec38068f9df828d462c61/ethclient/ethclient.go#L270
## ENS
2020-05-04 11:51:52 +00:00
All the interactions with `ENS` are made through the [ENS contract](https://github.com/ensdomains/ens)