openethereum/src/evm/ext.rs

94 lines
2.6 KiB
Rust
Raw Normal View History

2016-01-09 21:39:38 +01:00
//! Interface for Evm externalities.
2015-12-30 12:46:10 +01:00
2016-01-16 17:17:43 +01:00
use common::Bytes;
2015-12-23 13:02:01 +01:00
use util::hash::*;
2015-12-29 12:04:03 +01:00
use util::uint::*;
2016-01-11 22:32:01 +01:00
use evm::{Schedule, Error};
use env_info::*;
2016-01-06 13:00:14 +01:00
2016-01-16 20:11:12 +01:00
/// Result of externalities create function.
pub enum ContractCreateResult {
/// Returned when creation was successfull.
/// Contains an address of newly created contract and gas left.
Created(Address, U256),
/// Returned when contract creation failed.
/// VM doesn't have to know the reason.
Failed
}
/// Result of externalities call function.
pub enum MessageCallResult {
/// Returned when message call was successfull.
/// Contains gas left.
Success(U256),
/// Returned when message call failed.
/// VM doesn't have to know the reason.
Failed
}
2016-01-20 16:52:22 +01:00
/// Externalities interface for EVMs
2016-01-09 00:51:09 +01:00
pub trait Ext {
2016-01-07 23:33:54 +01:00
/// Returns a value for given key.
2016-01-15 18:56:28 +01:00
fn storage_at(&self, key: &H256) -> H256;
2016-01-07 23:33:54 +01:00
/// Stores a value for given key.
2016-01-16 20:11:12 +01:00
fn set_storage(&mut self, key: H256, value: H256);
/// Determine whether an account exists.
fn exists(&self, address: &Address) -> bool;
2016-01-07 23:33:54 +01:00
/// Returns address balance.
fn balance(&self, address: &Address) -> U256;
/// Returns the hash of one of the 256 most recent complete blocks.
fn blockhash(&self, number: &U256) -> H256;
/// Creates new contract.
2016-01-11 14:08:03 +01:00
///
2016-01-14 21:21:46 +01:00
/// Returns gas_left and contract address if contract creation was succesfull.
2016-01-16 20:11:12 +01:00
fn create(&mut self, gas: &U256, value: &U256, code: &[u8]) -> ContractCreateResult;
2016-01-09 23:24:01 +01:00
/// Message call.
2016-01-11 14:08:03 +01:00
///
2016-01-14 21:21:46 +01:00
/// Returns Err, if we run out of gas.
2016-01-14 19:52:40 +01:00
/// Otherwise returns call_result which contains gas left
/// and true if subcall was successfull.
2016-01-11 14:08:03 +01:00
fn call(&mut self,
gas: &U256,
2016-01-23 10:41:13 +01:00
sender_address: &Address,
receive_address: &Address,
2016-01-25 23:59:50 +01:00
value: Option<U256>,
2016-01-11 14:08:03 +01:00
data: &[u8],
code_address: &Address,
2016-01-16 20:11:12 +01:00
output: &mut [u8]) -> MessageCallResult;
2016-01-07 23:33:54 +01:00
/// Returns code at given address
2016-01-16 17:17:43 +01:00
fn extcode(&self, address: &Address) -> Bytes;
2016-01-07 23:33:54 +01:00
/// Creates log entry with given topics and data
2016-01-16 17:17:43 +01:00
fn log(&mut self, topics: Vec<H256>, data: &[u8]);
2016-01-11 02:17:29 +01:00
/// Should be called when transaction calls `RETURN` opcode.
/// Returns gas_left if cost of returning the data is not too high.
fn ret(&mut self, gas: &U256, data: &[u8]) -> Result<U256, Error>;
2016-01-11 02:17:29 +01:00
/// Should be called when contract commits suicide.
2016-01-13 16:16:21 +01:00
/// Address to which funds should be refunded.
fn suicide(&mut self, refund_address: &Address);
2016-01-11 02:17:29 +01:00
/// Returns schedule.
2016-01-11 16:28:30 +01:00
fn schedule(&self) -> &Schedule;
2016-01-11 22:32:01 +01:00
/// Returns environment info.
fn env_info(&self) -> &EnvInfo;
2016-01-16 20:11:12 +01:00
/// Returns current depth of execution.
///
/// If contract A calls contract B, and contract B calls C,
/// then A depth is 0, B is 1, C is 2 and so on.
fn depth(&self) -> usize;
/// Increments sstore refunds count by 1.
fn inc_sstore_clears(&mut self);
2016-01-07 23:33:54 +01:00
}