ERC20令牌智能合约如何工作?

时间:2020-01-02 00:01:29

标签: blockchain ethereum smartcontracts ether

我很难理解智能合约及其在网络上的工作方式。我将以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
    }

我的问题是:

  1. 该智能合约如何在网络上部署?令牌是从该合同中实例化的对象吗?
  2. 在构造函数中,它声明“将所有令牌提供给创建者”。这是否意味着智能合约只运行一次,然后才存在于区块链中。不可能不是智能合约就像一类,代币就像对象一样,因为那意味着每个代币都有能力创建自己的供应量。

我对我的理解不足深表歉意。我来自面向对象的背景,对我来说,掌握智能合约的概念有些困难。

提前谢谢!

1 个答案:

答案 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