-1

我很难理解智能合约以及它们在网络上的工作方式。我将以 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. 在构造函数中,它声明“将所有令牌交给创建者”。这是否意味着智能合约只运行一次,然后就存在于区块链上。智能合约不可能像一个类,而代币就像对象,因为那样的话,这意味着每个代币都有能力创造自己的供应量。

我为我的不理解道歉。我来自面向对象的背景,掌握智能合约的概念对我来说有点困难。

先感谢您!

4

1 回答 1

0

这个部署在网络上的智能合约是谁?代币是否类似于从该合约实例化的对象?

合约只是以太坊状态树中的一个账户。每个账户都有余额、随机数、字节码和存储树的根哈希。对于普通账户,字节码和存储哈希为空。对于合约,字节码是合约的代码,存储哈希是合约存储中所有键值对的默克尔根哈希。唯一进入区块的是交易本身,以及整个状态树的默克尔根哈希。要成为全节点,您必须保留状态树(其中键是地址,值是序列化帐户)和每个合约帐户的存储树(其中键是存储位置,值是存储位置)的所有键值对存储值)。

EVM 内存是瞬态的。EVM 并不是真正的虚拟机(VM 对许多人来说具有很强的内涵)——它只是 EVM 汇编语言的解释器。当解释器运行时,它维护一个堆栈(其中每个元素是 32 个字节)和一个内存字节数组,并且可以访问合约的存储树。执行完成后,堆栈和内存字节数组将被删除。但是,是的,每个节点都运行事务——在执行的任何时候,堆栈的状态、内存字节数组、程序计数器和存储在每个节点上都应该是相同的。

每个节点都为每个事务运行解释器。就像比特币一样。每个节点都会运行一个小脚本,当您尝试从以前未花费的输出中花费时执行该脚本(假设您了解比特币)。交易的哈希在被填充到默克尔树之前是不相关的。在运行执行时,我们只关心gas 量、传入的数据以及被调用的合约代码。当执行完成时,合约的存储树可能会更新,因此我们重新计算该树的默克尔根哈希(以及可能已被该树调用的任何其他合约!)

状态转换函数有一系列部分。有更新账户余额和随机数的部分(简单部分),处理gas和gas退款的部分,执行EVM字节码的部分(可能导致账户余额和存储值发生变化),以及支付矿工的部分用于采矿块和叔叔。这个“函数”在黄皮书中有详细定义,并在每个以太坊客户端(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

于 2020-01-02T06:47:58.080 回答