我很难理解智能合约及其在网络上的工作方式。我将以ERC20令牌智能合约为例:
contract EIP20 is EIP20Interface {
uint256 constant private MAX_UINT256 = 2**256 - 1;
mapping (address => uint256) public balances;
mapping (address => mapping (address => uint256)) public allowed;
string public name; //fancy name: eg Simon Bucks
uint8 public decimals; //How many decimals to show.
string public symbol; //An identifier: eg SBX
function EIP20(
uint256 _initialAmount,
string _tokenName,
uint8 _decimalUnits,
string _tokenSymbol
) public {
balances[msg.sender] = _initialAmount; // Give the creator all initial tokens
totalSupply = _initialAmount; // Update total supply
name = _tokenName; // Set the name for display purposes
decimals = _decimalUnits; // Amount of decimals for display purposes
symbol = _tokenSymbol; // Set the symbol for display purposes
}
我的问题是:
我对我的理解不足深表歉意。我来自面向对象的背景,对我来说,掌握智能合约的概念有些困难。
提前谢谢!
答案 0 :(得分:0)
此智能合约在网络上部署了谁?令牌之类的对象是从该合同中实例化的吗?
合约只是以太坊状态树中的一个账户。每个帐户都有一个余额,一个随机数,字节码和一个存储树的根哈希。对于普通帐户,字节码和存储哈希为空。对于合同,字节码是合同的代码,存储哈希是合同存储中所有键值对的merkle根哈希。块中唯一要做的是事务本身,以及整个状态树的Merkle根哈希。要成为完整节点,您必须保留状态树(其中的键是地址,值是序列化帐户)和每个合同帐户的存储树的所有键值对(其中,键是存储位置,值是存储值)。
EVM内存是瞬态的。 EVM并不是真正的虚拟机(VM对许多人都有很强的内涵)-只是EVM汇编语言的解释器。在解释器运行时,它维护一个堆栈(每个元素为32个字节)和一个内存字节数组,并可以访问合同的存储树。执行完成后,将删除堆栈和内存字节数组。但是,是的,每个节点都运行事务-在执行的任何时候,堆栈的状态,内存字节数组,程序计数器和存储在每个节点上都应相同。
每个节点都为每个事务运行解释器。就像比特币一样。当您尝试从以前未使用的输出中花费时(假设您了解比特币),每个节点都会运行该小脚本。直到将事务填充到merkle树中之前,该事务的哈希才有意义。在运行执行过程时,我们关心的只是汽油量,传递的数据以及所调用合同的代码。执行完成后,合同的存储树可能会更新,因此我们重新计算该树的Merkle根哈希值(以及该合同可能调用的任何其他合同!)
状态转换功能由一系列部分组成。其中包括更新帐户余额和随机数的部分(简单部分),处理天然气和天然气退款的部分,执行EVM字节码的部分(这可能导致帐户余额和存储值发生变化)以及向矿工付款的部分采矿块和叔叔。该“功能”在yellow paper中进行了详细定义,并在每个以太坊客户端(c ++,go,python等)中独立实现。 EVM,或者我所说的解释器,通常只是一个for循环,它使程序计数器递增,并具有一个很大的switch语句,告诉它对字节码中的每个操作执行什么操作(弹出/推入堆栈,加载/存储内存,加载/存储存储,调用另一个合同,自杀等)
来源:https://www.reddit.com/r/ethereum/comments/3k4h3w/basic_questions_about_the_ethereum_evm_and_state/
这是否意味着智能合约只运行一次,然后才生活在区块链上。
网络中的每个节点都会为您调用的每个交易执行智能合约代码。因此,智能合约会在您每次调用它并更改其状态时运行。 每个节点都必须验证调用智能合约的交易的结果。结果是至少每个完整节点都将执行代码。
看看以太坊开发教程: https://github.com/ethereum/wiki/wiki/Ethereum-Development-Tutorial