its current value upon return.
defer func(i Interpreter) {
evm.interpreter = i
}(evm.interpreter)
evm.interpreter = interpreter
}
return interpreter.Run(contract, input, readOnly)
}
}
return nil, ErrNoCompatibleInterpreter
} 用图形来表示的话,具体的逻辑如下图: 那么预编译合约的瓶颈在哪里? 以太坊目前有八个预编译的合约: ECRecover - 通过签名恢复对应地址 SHA256 - 计算SHA256哈希 RIPEMD160 - 计算RIPEMD160哈希 Identity - 返回输入数据的原值 ModExp - 进行模数指数运算 ECAdd - 椭圆曲线点加法 ECMul - 椭圆曲线点乘法 ECPairing - 配对运算,验证椭圆曲线点 可以看到第一到第四个预编译合约提供的基础的签名,哈希等加密功能,第五个到第八个提供了椭圆曲线运算,这些和zk-snark相关。 那么问题来了,为什么以太坊预编译只支持了八个预编译合约,预编译合约不是降低了gas消耗吗?而且为什么不直接把ECS(全链游戏的框架)植入以太坊预编译合约中呢? 其实主要是以下三个原因: 1.过度依赖预编译合约会降低整个平台的去中心化程度: 首先,预编译合约的代码需要集成在客户端节点代码中,增加了客户端的复杂性。第二,验证节点可能因为安全原因可能会过滤掉预编译合约的计算,所以大部分预编译合约的请求是由全节点完成的,目前全球的以太坊全节点的数量只有4000-6000个,而且验证节点有50万个,确实比起非预编译合约要中心化很多。 2.预编译合约的新增和修改需要硬分叉升级,不易灵活演进。 预编译合约的支持需要进行EIP流程,举个例子:EIP-196增加了在alt_bn128曲线上的ECADD()和ECMUL()两个预编译合约。EIP-197增加了在alt_bn128曲线上的配对Pairing函数。基本都是为了让隐私在以太坊上可用进行支持,而且整个EIP的流程是漫长和考究的,等待EIP通过也不是一个现实的问题。 3.预编译合约之间难以进行交互和组合,扩展性差。 这点就不多做解释了,很直观。 预编译合约在全链游戏扮演什么角色? 预编译合约跳过EVM直接通过节点执行,可以提升运算效率,但同时降低了全链的去中心化程度。将高频使用的游戏核心逻辑置于预编译中,可以优化该类游戏的性能。不同的游戏类型,其关键逻辑也不尽相同。因此,针对某一类游戏的专用链上,其预编译设计可以高度优化该类型游戏的需求。在游戏迭代过程中,最具效率的预编译合约组合也会逐步优化出来。 来源:金色财经lg...