8.7 KiB
permalink | parent | title |
---|---|---|
/spec/9 | Stable specs | 9/ETHEREUM-USAGE |
9/ETHEREUM-USAGE
Version: 0.1
Status: Stable
Authors: Andrea Maria Piana andreap@status.im
Status interactions with the Ethereum blockchain
In this document we document all the interactions that the Status client has with the Ethereum blockchain.
All the interactions are made through JSON-RPC. Currently Infura is used. The client assumes high-availability, otherwise it will not be able to interact with the Ethereum blockchain. We rely on these nodes to validate the integrity of the transaction and report a consistent history.
Key handling is described here
Wallet
The wallet in Status has two main components:
- Sending transactions
- 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.
Sending transactions
EstimateGas
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)
26d271dfbb/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)
26d271dfbb/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)
26d271dfbb/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
26d271dfbb/ethclient/ethclient.go (L512)
Fetching balance
We currently fetch the current and historical [ECR20] (https://eips.ethereum.org/EIPS/eip-20) and ETH balance for the user wallet address. Collectibles following the ECR-721 are also fetched if enabled.
We support by default the following tokens. Custom tokens can be added by specifying the address
, symbol
and decimals
.
BlockByHash
BlockByHash
returns the given full block.
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)
26d271dfbb/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)
26d271dfbb/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)
26d271dfbb/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)
26d271dfbb/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)
26d271dfbb/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)
26d271dfbb/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)
26d271dfbb/ethclient/ethclient.go (L270)
ENS
All the interactions with ENS
are made through the ENS contract
For the stateofus.eth
username, one can be registered through these contracts
Registering, releasing and updating
- Registering a username
- Releasing a username
- [Updating a username] (
77d9394d21/contracts/registry/UsernameRegistrar.sol (L174)
)
Slashing
Usernames MUST be in a specific format, otherwise they MAY be slashed:
-
They MUST only contain alphanumeric characters
-
They MUST NOT be in the form
0x[0-9a-f]{5}.*
and have more than 12 characters -
They MUST NOT be in the [reserved list] (
47c4c6c205/config/ens-usernames/reservedNames.js
) -
They MUST NOT be too short, this is dynamically set in the contract and can be checked against the contract
-
[Slash an invalid username] (
77d9394d21/contracts/registry/UsernameRegistrar.sol (L261)
)
ENS names are propagated through ChatMessage
and ContactUpdate
payload.
A client SHOULD verify ens names against the public key of the sender on receiving the message against the ENS contract
Copyright
Copyright and related rights waived via CC0.