虚拟机的输入输出
虚拟机的输入输出
虚拟机区别于普通的计算机,它的输入输出很少。(普通的计算机有键盘、网络、鼠标等输入和显示器、打印机、网络等输出)输入的方式仅仅局限于两类来源:
- 另一个以太坊虚拟机传来的函数调用所携带的数据。
- 外部账户调用合约账户,所携带的交易数据。
以太坊虚拟机是“确定性”的–当输入确定的时候,它的输出无论重复多少次运行也是确定的输出。所以在以太坊虚拟机中寻找一个随机源是很困难的,智能合约能够获取到的随机输入值更是少的可怜。有些需要随机性的合约(例如彩票开奖)往往使用前一个区块的哈希值作为随机源,但是该随机源容易受到挖矿者的攻击。因为以太坊虚拟机不依赖于传统计算机的键盘鼠标等会产生随机熵的输入设备。这也是很多攻击以太坊的源头。
虚拟的输出也很简单,包含两种输出:
- 运行过程中修改的区块链账户的存储区。
- 日志。
每当虚拟机执行完毕后,更改存储区,并将执行结果发送归还给调用者就可以结束生命周期。但是在输出阶段其实有一个容易被忽略的输出对象,就是Log日志。以太坊虚拟机在执行过程中产生的Log日志将会永久记录在以太坊中,组织成交易的收据而存在,供日后查询。现在广泛流行的交易所,就采用监控日志的方式来确定某些虚拟货币的存取情况。
以太坊虚拟机的数据的存储是要花费 gas 的,尤其是存储区的存储,代价昂贵。发送交易的时候我们可以指定 gas 的花费上限,以防止智能合约代码有 bug 而导致无限循环执行下去。一旦 gas 过早耗尽,则虚拟机抛出异常, ...