Table of Contents:

《精通以太坊——实现数字合约》 中文版 https://github.com/inoutcode/ethereum_book

13 The Ethereum Virtual Machine

instruction set
struc ture
operation
the context of Ethereum state updates.

The EVM has a stack-based architecture, storing all in-memory values on a stack

The EVM Instruction Set (Bytecode Operations)
In addition to the typical bytecode operations, the EVM also has access to account
information (e.g., address and balance) and block information (e.g., block number
and current gas price)

eth使用

搭建私有链

1.配置文件设置

见文末config.json

2.启动程序

./aleth --config config.json -m on -a 00b99ed83a12d5d20aae7db4168c581b6ee01d87 --no-discovery --pin --unsafe-transactions

其他命令行参数
--network-id 1108 --ipc --listen 30307 --port 30307 -d ipctest --db-path db

json rpc接口

ethereum-console

连接到cpp-ethereum的工具,因安装过程多次失败,弃之

MetaMask连接私有链

在网络设置中选择:自定义RPC

使用remix部署和执行合约

1.编写合约
2.编译合约
3.部署合约
    1.environment选择Injected Web3
    2.连接MetaMask
    3.MetaMask显示一笔部署合约交易
4.合约部署完毕
    Deployed Contracts下面显示合约的名字和地址
5.调用合约    
    在Deployed Contracts下面执行合约
6.remix中的合约如何保存在本地
    需要用到remixd

交易的代码
1.普通的交易
2.创建智能合约的交易
3.执行智能合约的交易

虚拟机执行的几个相关区
栈区
内存区
storage区

EVM的不合理设计

缺乏标准库支持:
EVM缺少完善的标准库支持,甚至最基本的string类型支持,在EVM中都很鸡肋,例如字符串拼接、切割、查找等等都需要开发者自己实现。带来的后果就是开发者需要关注更多非本身业务的零碎细节,不能专注本身业务开发。同时自行实现的类库可能会因为时间、空间复杂度太高,消耗大量无谓的gas,又或者开发者从开源项目中借鉴相关类库代码,但也会引入更多安全性方面的问题,加重合约代码审计的复杂度,亦是得不偿失。

难以调试和测试:
EVM难以调试和测试,EVM除了能抛出OutOfGas异常之外,不会给开发者返回任何信息,无法打印日志、要做到断点、单步调试更是完全不可能。虽然event机制可以部分改善这个问题,但event机制的本身设计就决定了他不是一个优雅好用的调试工具。

不支持浮点数:
EVM不支持浮点数,以太坊以Wei为最小单位,只有整数,不支持其他粒度的计量,这种设计避免了引入浮点数导致的精度问题,但开发者在实际开发中,为了表示一个eth变量,就会在变量后面跟很多0,导致代码维护极度复杂。同时不可否认,浮点数在特定的场景下,还是有很大的利用价值的,不能一刀切直接放弃引入。

合约不能升级:
EVM不支持合约升级,合约升级是智能合约开发中的一个强需求,也是每一个合约开发者必须要考虑的问题,合约升级可以实现给现有合约打安全补丁、扩展现有合约功能等等。EVM完全不支持升级,开发者只能通过发布新合约来解决这个问题,费时费力。