Documentation ¶
Index ¶
- Constants
- Variables
- func CanTransfer(db vm.StateDB, fromHash common.Address, balance *big.Int) bool
- func ConvertIotxToRau(iotx int64) *big.Int
- func ExecuteContracts(blk *Block, ws state.WorkingSet, bc Blockchain, gasLimit *uint64, ...)
- func GetHashFn(stateDB *EVMStateDBAdapter) func(n uint64) common.Hash
- func MakeTransfer(db vm.StateDB, fromHash, toHash common.Address, amount *big.Int)
- type Block
- func (b *Block) ByteStream() []byte
- func (b *Block) ByteStreamHeader() []byte
- func (b *Block) CalculateTxRoot() hash.Hash32B
- func (b *Block) ConvertFromBlockHeaderPb(pbBlock *iproto.BlockPb)
- func (b *Block) ConvertFromBlockPb(pbBlock *iproto.BlockPb)
- func (b *Block) ConvertToBlockHeaderPb() *iproto.BlockHeaderPb
- func (b *Block) ConvertToBlockPb() *iproto.BlockPb
- func (b *Block) Deserialize(buf []byte) error
- func (b *Block) HashBlock() hash.Hash32B
- func (b *Block) Height() uint64
- func (b *Block) PrevHash() hash.Hash32B
- func (b *Block) ProducerAddress() string
- func (b *Block) Serialize() ([]byte, error)
- func (b *Block) SignBlock(signer *iotxaddress.Address) error
- func (b *Block) StateRoot() hash.Hash32B
- func (b *Block) TxRoot() hash.Hash32B
- func (b *Block) VerifySignature() bool
- func (b *Block) VerifyStateRoot(root hash.Hash32B) error
- type BlockFooter
- type BlockHeader
- type Blockchain
- type Creator
- type EVMParams
- type EVMStateDBAdapter
- func (stateDB *EVMStateDBAdapter) AddBalance(evmAddr common.Address, amount *big.Int)
- func (stateDB *EVMStateDBAdapter) AddLog(evmLog *types.Log)
- func (stateDB *EVMStateDBAdapter) AddPreimage(common.Hash, []byte)
- func (stateDB *EVMStateDBAdapter) AddRefund(uint64)
- func (stateDB *EVMStateDBAdapter) CreateAccount(evmAddr common.Address)
- func (stateDB *EVMStateDBAdapter) Empty(common.Address) bool
- func (stateDB *EVMStateDBAdapter) Error() error
- func (stateDB *EVMStateDBAdapter) Exist(evmAddr common.Address) bool
- func (stateDB *EVMStateDBAdapter) ForEachStorage(common.Address, func(common.Hash, common.Hash) bool)
- func (stateDB *EVMStateDBAdapter) GetBalance(evmAddr common.Address) *big.Int
- func (stateDB *EVMStateDBAdapter) GetCode(evmAddr common.Address) []byte
- func (stateDB *EVMStateDBAdapter) GetCodeHash(evmAddr common.Address) common.Hash
- func (stateDB *EVMStateDBAdapter) GetCodeSize(evmAddr common.Address) int
- func (stateDB *EVMStateDBAdapter) GetNonce(evmAddr common.Address) uint64
- func (stateDB *EVMStateDBAdapter) GetRefund() uint64
- func (stateDB *EVMStateDBAdapter) GetState(evmAddr common.Address, k common.Hash) common.Hash
- func (stateDB *EVMStateDBAdapter) HasSuicided(common.Address) bool
- func (stateDB *EVMStateDBAdapter) Logs() []*action.Log
- func (stateDB *EVMStateDBAdapter) RevertToSnapshot(int)
- func (stateDB *EVMStateDBAdapter) SetCode(evmAddr common.Address, code []byte)
- func (stateDB *EVMStateDBAdapter) SetNonce(common.Address, uint64)
- func (stateDB *EVMStateDBAdapter) SetState(evmAddr common.Address, k, v common.Hash)
- func (stateDB *EVMStateDBAdapter) Snapshot() int
- func (stateDB *EVMStateDBAdapter) SubBalance(evmAddr common.Address, amount *big.Int)
- func (stateDB *EVMStateDBAdapter) Suicide(common.Address) bool
- type Genesis
- type GenesisAction
- type Nominator
- type Option
- type Payee
- type SubChain
- type Transfer
- type Validator
Constants ¶
const ( // FailureStatus is the status that contract execution failed FailureStatus = uint64(0) // SuccessStatus is the status that contract execution success SuccessStatus = uint64(1) )
const ( // Rau is the smallest non-fungible token unit Rau int64 = 1 // KRau is 1000 Rau KRau = Rau * 1000 // MRau is 1000 KRau MRau = KRau * 1000 // GRau is 1000 MRau GRau = MRau * 1000 // Qev is 1000 GRau Qev = GRau * 1000 // Jin is 1000 Qev Jin = Qev * 1000 // Iotx is 1000 Jin, which should be fit into int64 Iotx = Jin * 1000 )
const GasLimit = uint64(1000000000)
GasLimit is the total gas limit could be consumed in a block
const RecoveryHeightKey key = "recoveryHeight"
RecoveryHeightKey indicates the recovery height key used by context
Variables ¶
var ( // ErrInvalidTipHeight is the error returned when the block height is not valid ErrInvalidTipHeight = errors.New("invalid tip height") // ErrInvalidBlock is the error returned when the block is not valid ErrInvalidBlock = errors.New("failed to validate the block") // ErrActionNonce is the error when the nonce of the action is wrong ErrActionNonce = errors.New("invalid action nonce") // ErrGasHigherThanLimit indicates the error of gas value ErrGasHigherThanLimit = errors.New("invalid gas for action") // ErrInsufficientGas indicates the error of insufficient gas value for data storage ErrInsufficientGas = errors.New("insufficient intrinsic gas value") // ErrBalance indicates the error of balance ErrBalance = errors.New("invalid balance") // ErrDKGSecretProposal indicates the error of DKG secret proposal ErrDKGSecretProposal = errors.New("invalid DKG secret proposal") )
var ErrInconsistentNonce = errors.New("Nonce is not identical to executor nonce")
ErrInconsistentNonce is the error that the nonce is different from executor's nonce
var Gen = &Genesis{ TotalSupply: ConvertIotxToRau(10000000000), BlockReward: ConvertIotxToRau(5), Timestamp: uint64(1524676419), ParentHash: hash.Hash32B{}, GenesisCoinbaseData: "Connecting the physical world, block by block", }
Gen hardcodes genesis default settings
Functions ¶
func CanTransfer ¶
CanTransfer checks whether the from account has enough balance
func ConvertIotxToRau ¶
ConvertIotxToRau converts an Iotx to Rau
func ExecuteContracts ¶
func ExecuteContracts(blk *Block, ws state.WorkingSet, bc Blockchain, gasLimit *uint64, enableGasCharge bool)
ExecuteContracts process the contracts in a block
Types ¶
type Block ¶
type Block struct { Header *BlockHeader Actions []action.Action SecretProposals []*action.SecretProposal SecretWitness *action.SecretWitness // contains filtered or unexported fields }
Block defines the struct of block
func NewBlock ¶
func NewBlock( chainID uint32, height uint64, prevBlockHash hash.Hash32B, timestamp uint64, producer keypair.PublicKey, actions []action.Action, ) *Block
NewBlock returns a new block
func NewGenesisBlock ¶
NewGenesisBlock creates a new genesis block
func NewSecretBlock ¶
func NewSecretBlock( chainID uint32, height uint64, prevBlockHash hash.Hash32B, timestamp uint64, producer keypair.PublicKey, secretProposals []*action.SecretProposal, secretWitness *action.SecretWitness, ) *Block
NewSecretBlock returns a new DKG secret block
func (*Block) ByteStream ¶
ByteStream returns a byte stream of the block
func (*Block) ByteStreamHeader ¶
ByteStreamHeader returns a byte stream of the block header
func (*Block) CalculateTxRoot ¶
CalculateTxRoot returns the Merkle root of all txs and actions in this block.
func (*Block) ConvertFromBlockHeaderPb ¶
func (b *Block) ConvertFromBlockHeaderPb(pbBlock *iproto.BlockPb)
ConvertFromBlockHeaderPb converts BlockHeaderPb to BlockHeader
func (*Block) ConvertFromBlockPb ¶
func (b *Block) ConvertFromBlockPb(pbBlock *iproto.BlockPb)
ConvertFromBlockPb converts BlockPb to Block
func (*Block) ConvertToBlockHeaderPb ¶
func (b *Block) ConvertToBlockHeaderPb() *iproto.BlockHeaderPb
ConvertToBlockHeaderPb converts BlockHeader to BlockHeaderPb
func (*Block) ConvertToBlockPb ¶
func (b *Block) ConvertToBlockPb() *iproto.BlockPb
ConvertToBlockPb converts Block to BlockPb
func (*Block) Deserialize ¶
Deserialize parses the byte stream into a Block
func (*Block) ProducerAddress ¶
ProducerAddress returns the address of producer
func (*Block) SignBlock ¶
func (b *Block) SignBlock(signer *iotxaddress.Address) error
SignBlock allows signer to sign the block b
func (*Block) VerifySignature ¶
VerifySignature verifies the signature saved in block header
type BlockFooter ¶
type BlockFooter struct {
// contains filtered or unexported fields
}
BlockFooter defines a set of proof of this block
type BlockHeader ¶
type BlockHeader struct { Pubkey keypair.PublicKey // block producer's public key DKGID []byte // dkg ID of producer DKGPubkey []byte // dkg public key of producer DKGBlockSig []byte // dkg signature of producer // contains filtered or unexported fields }
BlockHeader defines the struct of block header make sure the variable type and order of this struct is same as "BlockHeaderPb" in blockchain.pb.go
func (*BlockHeader) Timestamp ¶
func (bh *BlockHeader) Timestamp() time.Time
Timestamp returns the timestamp in the block header
type Blockchain ¶
type Blockchain interface { lifecycle.StartStopper // Balance returns balance of an account Balance(addr string) (*big.Int, error) // Nonce returns the nonce if the account exists Nonce(addr string) (uint64, error) // CreateState adds a new account with initial balance to the factory CreateState(addr string, init *big.Int) (*state.Account, error) // CandidatesByHeight returns the candidate list by a given height CandidatesByHeight(height uint64) ([]*state.Candidate, error) // For exposing blockchain states // GetHeightByHash returns Block's height by hash GetHeightByHash(h hash.Hash32B) (uint64, error) // GetHashByHeight returns Block's hash by height GetHashByHeight(height uint64) (hash.Hash32B, error) // GetBlockByHeight returns Block by height GetBlockByHeight(height uint64) (*Block, error) // GetBlockByHash returns Block by hash GetBlockByHash(h hash.Hash32B) (*Block, error) // GetTotalTransfers returns the total number of transfers GetTotalTransfers() (uint64, error) // GetTotalVotes returns the total number of votes GetTotalVotes() (uint64, error) // GetTotalExecutions returns the total number of executions GetTotalExecutions() (uint64, error) // GetTotalActions returns the total number of actions GetTotalActions() (uint64, error) // GetTransfersFromAddress returns transaction from address GetTransfersFromAddress(address string) ([]hash.Hash32B, error) // GetTransfersToAddress returns transaction to address GetTransfersToAddress(address string) ([]hash.Hash32B, error) // GetTransfersByTransferHash returns transfer by transfer hash GetTransferByTransferHash(h hash.Hash32B) (*action.Transfer, error) // GetBlockHashByTransferHash returns Block hash by transfer hash GetBlockHashByTransferHash(h hash.Hash32B) (hash.Hash32B, error) // GetVoteFromAddress returns vote from address GetVotesFromAddress(address string) ([]hash.Hash32B, error) // GetVoteToAddress returns vote to address GetVotesToAddress(address string) ([]hash.Hash32B, error) // GetVotesByVoteHash returns vote by vote hash GetVoteByVoteHash(h hash.Hash32B) (*action.Vote, error) // GetBlockHashByVoteHash returns Block hash by vote hash GetBlockHashByVoteHash(h hash.Hash32B) (hash.Hash32B, error) // GetExecutionsFromAddress returns executions from address GetExecutionsFromAddress(address string) ([]hash.Hash32B, error) // GetExecutionsToAddress returns executions to address GetExecutionsToAddress(address string) ([]hash.Hash32B, error) // GetExecutionByExecutionHash returns execution by execution hash GetExecutionByExecutionHash(h hash.Hash32B) (*action.Execution, error) // GetBlockHashByExecutionHash returns Block hash by execution hash GetBlockHashByExecutionHash(h hash.Hash32B) (hash.Hash32B, error) // GetReceiptByExecutionHash returns the receipt by execution hash GetReceiptByExecutionHash(h hash.Hash32B) (*action.Receipt, error) // GetActionsFromAddress returns actions from address GetActionsFromAddress(address string) ([]hash.Hash32B, error) // GetActionsToAddress returns actions to address GetActionsToAddress(address string) ([]hash.Hash32B, error) // GetActionByActionHash returns action by action hash GetActionByActionHash(h hash.Hash32B) (action.Action, error) // GetBlockHashByActionHash returns Block hash by action hash GetBlockHashByActionHash(h hash.Hash32B) (hash.Hash32B, error) // GetFactory returns the state factory GetFactory() state.Factory // GetChainID returns the chain ID ChainID() uint32 // ChainAddress returns chain address on parent chain, the root chain return empty. ChainAddress() string // TipHash returns tip block's hash TipHash() hash.Hash32B // TipHeight returns tip block's height TipHeight() uint64 // StateByAddr returns account of a given address StateByAddr(address string) (*state.Account, error) // For block operations // MintNewBlock creates a new block with given actions and dkg keys // Note: the coinbase transfer will be added to the given transfers when minting a new block MintNewBlock( actions []action.Action, producer *iotxaddress.Address, dkgAddress *iotxaddress.DKGAddress, seed []byte, data string, ) (*Block, error) // MintNewSecretBlock creates a new DKG secret block with given DKG secrets and witness MintNewSecretBlock(secretProposals []*action.SecretProposal, secretWitness *action.SecretWitness, producer *iotxaddress.Address) (*Block, error) // CommitBlock validates and appends a block to the chain CommitBlock(blk *Block) error // ValidateBlock validates a new block before adding it to the blockchain ValidateBlock(blk *Block, containCoinbase bool) error // For action operations // Validator returns the current validator object Validator() Validator // SetValidator sets the current validator object SetValidator(val Validator) // For smart contract operations // ExecuteContractRead runs a read-only smart contract operation, this is done off the network since it does not // cause any state change ExecuteContractRead(*action.Execution) ([]byte, error) // SubscribeBlockCreation make you listen to every single produced block SubscribeBlockCreation(ch chan *Block) error // UnsubscribeBlockCreation make you listen to every single produced block UnsubscribeBlockCreation(ch chan *Block) error }
Blockchain represents the blockchain data structure and hosts the APIs to access it
func NewBlockchain ¶
func NewBlockchain(cfg *config.Config, opts ...Option) Blockchain
NewBlockchain creates a new blockchain and DB instance
type EVMParams ¶
type EVMParams struct {
// contains filtered or unexported fields
}
EVMParams is the context and parameters
func NewEVMParams ¶
func NewEVMParams(blk *Block, execution *action.Execution, stateDB *EVMStateDBAdapter) (*EVMParams, error)
NewEVMParams creates a new context for use in the EVM.
type EVMStateDBAdapter ¶
type EVMStateDBAdapter struct {
// contains filtered or unexported fields
}
EVMStateDBAdapter represents the state db adapter for evm to access iotx blockchain
func NewEVMStateDBAdapter ¶
func NewEVMStateDBAdapter(bc Blockchain, ws state.WorkingSet, blockHeight uint64, blockHash hash.Hash32B, executionIndex uint, executionHash hash.Hash32B) *EVMStateDBAdapter
NewEVMStateDBAdapter creates a new state db with iotx blockchain
func (*EVMStateDBAdapter) AddBalance ¶
func (stateDB *EVMStateDBAdapter) AddBalance(evmAddr common.Address, amount *big.Int)
AddBalance adds balance to account
func (*EVMStateDBAdapter) AddLog ¶
func (stateDB *EVMStateDBAdapter) AddLog(evmLog *types.Log)
AddLog adds log
func (*EVMStateDBAdapter) AddPreimage ¶
func (stateDB *EVMStateDBAdapter) AddPreimage(common.Hash, []byte)
AddPreimage adds the preimage
func (*EVMStateDBAdapter) AddRefund ¶
func (stateDB *EVMStateDBAdapter) AddRefund(uint64)
AddRefund adds refund
func (*EVMStateDBAdapter) CreateAccount ¶
func (stateDB *EVMStateDBAdapter) CreateAccount(evmAddr common.Address)
CreateAccount creates an account in iotx blockchain
func (*EVMStateDBAdapter) Empty ¶
func (stateDB *EVMStateDBAdapter) Empty(common.Address) bool
Empty empties the contract
func (*EVMStateDBAdapter) Error ¶
func (stateDB *EVMStateDBAdapter) Error() error
Error returns the first stored error during evm contract execution
func (*EVMStateDBAdapter) Exist ¶
func (stateDB *EVMStateDBAdapter) Exist(evmAddr common.Address) bool
Exist checks the existence of an address
func (*EVMStateDBAdapter) ForEachStorage ¶
func (stateDB *EVMStateDBAdapter) ForEachStorage(common.Address, func(common.Hash, common.Hash) bool)
ForEachStorage loops each storage
func (*EVMStateDBAdapter) GetBalance ¶
func (stateDB *EVMStateDBAdapter) GetBalance(evmAddr common.Address) *big.Int
GetBalance gets the balance of account
func (*EVMStateDBAdapter) GetCode ¶
func (stateDB *EVMStateDBAdapter) GetCode(evmAddr common.Address) []byte
GetCode gets the code saved in hash
func (*EVMStateDBAdapter) GetCodeHash ¶
func (stateDB *EVMStateDBAdapter) GetCodeHash(evmAddr common.Address) common.Hash
GetCodeHash gets the code hash of account
func (*EVMStateDBAdapter) GetCodeSize ¶
func (stateDB *EVMStateDBAdapter) GetCodeSize(evmAddr common.Address) int
GetCodeSize gets the code size saved in hash
func (*EVMStateDBAdapter) GetNonce ¶
func (stateDB *EVMStateDBAdapter) GetNonce(evmAddr common.Address) uint64
GetNonce gets the nonce of account
func (*EVMStateDBAdapter) GetRefund ¶
func (stateDB *EVMStateDBAdapter) GetRefund() uint64
GetRefund gets refund
func (*EVMStateDBAdapter) HasSuicided ¶
func (stateDB *EVMStateDBAdapter) HasSuicided(common.Address) bool
HasSuicided returns whether the contract has been killed
func (*EVMStateDBAdapter) Logs ¶
func (stateDB *EVMStateDBAdapter) Logs() []*action.Log
Logs returns the logs
func (*EVMStateDBAdapter) RevertToSnapshot ¶
func (stateDB *EVMStateDBAdapter) RevertToSnapshot(int)
RevertToSnapshot reverts the state factory to snapshot
func (*EVMStateDBAdapter) SetCode ¶
func (stateDB *EVMStateDBAdapter) SetCode(evmAddr common.Address, code []byte)
SetCode sets the code saved in hash
func (*EVMStateDBAdapter) SetNonce ¶
func (stateDB *EVMStateDBAdapter) SetNonce(common.Address, uint64)
SetNonce sets the nonce of account
func (*EVMStateDBAdapter) SetState ¶
func (stateDB *EVMStateDBAdapter) SetState(evmAddr common.Address, k, v common.Hash)
SetState sets state
func (*EVMStateDBAdapter) Snapshot ¶
func (stateDB *EVMStateDBAdapter) Snapshot() int
Snapshot returns the snapshot id
func (*EVMStateDBAdapter) SubBalance ¶
func (stateDB *EVMStateDBAdapter) SubBalance(evmAddr common.Address, amount *big.Int)
SubBalance subtracts balance from account
type Genesis ¶
type Genesis struct { TotalSupply *big.Int BlockReward *big.Int Timestamp uint64 ParentHash hash.Hash32B GenesisCoinbaseData string CreatorPubKey string CreatorPrivKey string }
Genesis defines the Genesis default settings
func (*Genesis) CreatorAddr ¶
CreatorAddr returns the creator address on a particular chain
func (*Genesis) CreatorPKHash ¶
CreatorPKHash returns the creator public key hash
type GenesisAction ¶
type GenesisAction struct { Creation Creator `yaml:"creator"` SelfNominators []Nominator `yaml:"selfNominators"` Transfers []Transfer `yaml:"transfers"` SubChains []SubChain `yaml:"subChains"` }
GenesisAction is the root action struct, each package's action should be put as its sub struct
type Option ¶
Option sets blockchain construction parameter
func BoltDBDaoOption ¶
func BoltDBDaoOption() Option
BoltDBDaoOption sets blockchain's dao with BoltDB from config.Chain.ChainDBPath
func DefaultStateFactoryOption ¶
func DefaultStateFactoryOption() Option
DefaultStateFactoryOption sets blockchain's sf from config
func InMemDaoOption ¶
func InMemDaoOption() Option
InMemDaoOption sets blockchain's dao with MemKVStore
func InMemStateFactoryOption ¶
func InMemStateFactoryOption() Option
InMemStateFactoryOption sets blockchain's state.Factory as in memory sf
func PrecreatedDaoOption ¶
func PrecreatedDaoOption(dao *blockDAO) Option
PrecreatedDaoOption sets blockchain's dao
func PrecreatedStateFactoryOption ¶
PrecreatedStateFactoryOption sets blockchain's state.Factory to sf
type SubChain ¶
type SubChain struct { ChainID uint32 `yaml:"chainID"` SecurityDeposit int64 `yaml:"securityDeposit"` OperationDeposit int64 `yaml:"operationDeposit"` StartHeight uint64 `yaml:"startHeight"` ParentHeightOffset uint64 `yaml:"parentHeightOffset"` }
SubChain is the SubChain struct