Nervos Fans

EIP-648简易并行

2018-09-07  本文已影响5人  526ba0512193

每晚八点,我们在社区分享知识,等你。

NervosFans 微信公号:Nervosfans

入群请加乐乐微信:sensus113 美果大冰微信:xj73226

备注入群,谢谢!


VB提到过,有鉴于节点的算法某种程度上要与智能合约验证并行,因此需要节点相当强悍。

值得注意的是:EIP-648退出时可为以太坊提供这种(并行)。

参数

MAX_THREADS:8


规范

介绍一种新型交易(遵循通用EIP-232格式):

range为RLP列表,列表中的每个值都是地址前缀,代表具有该前缀的所有地址的范围。例如:

\x0指从0x0100000000000000000000000000000000000000

到 0x01ffffffffffffffffffffffffffffffffffffff的地址集合

\x02\x48\xab指从0x0248ab0000000000000000000000000000000000

    到 0x0248abffffffffffffffffffffffffffffffffff的地址集合

'l#\xfa\xce\x01O\xb3\xeb\xb6Z\xe9m\r\x7f\xf3*\xb9L\x17'指仅包含地址0x6c23face014f20b3ebb65ae96d0d7ff32ab94c17的一元素集合

空串指所有地址的集合

视超过20个字节的前缀为非法(即,包含此类前缀的交易无效)。交易为此新类型交易视,称“交易范围”为该交易中指定的所有范围的并集,反之称为所有地址的集合。举例来说,当交易的范围字段形式为[\x01,\x02\x03,\xff\x8c\x45]时,其范围是以0x01、0x0203或0xff8c45开头的所有地址的集合。

跟踪每笔交易的starting_gas_heightfinishing_gas_height。将交易T的starting_gas_height定义为T之前全部交易T'的全部finishing_gas_heights的最大值,使得(i)T'大于T之后的MAX_THREADS(即txindex_of(T) - txindex_of(T') > MAX_THREADS)或(ii)T和T'的范围相交。将T的finishing_gas_height定义为T的starting_gas_height与执行T时消耗的gas之和。

把当前start_gas与当前total_gas_used之和超过区块gas_limit时,交易无效’的规则,改成‘若T.starting_gas_height + T.start_gas > gas_limit,则交易T无效’。注意,当所有交易都使用整个地址空间作为其范围时,(新规则)与现状完全相同;当交易使用不相交范围时,则可扩充容量。

任何试图访问交易范围外帐户的CALL(调用)、CREATE(创建)、CALLCODE(调用代码)、DELEGATECALL(委托调用)或STATICCALL(静态调用)都会失败;任何试图访问交易范围外帐户的EXTCODESIZE(退出代码大小)、EXTCODECOPY(退出代码副本)、BALANCE(余额)或SELFDESTRUCT(自毁)都会立即抛出异常。地址0 ... 127有个特例:任何帐户都能对其进行STATICCALL。我们在协议开发中添加了一个强制性规范,不允许将任何地址引入该范围,范围具有逻辑,使其可根据区块内发生的交易返回不同值(但是区块间的变化可接受)。

基本原理

如此,通过静态指定(交易)可访问的地址,实现EVM中交易更为轻松的并行处理,还适当地激励进行易于并行化的交易。此方案以最大限度的向后兼容及非侵入性的方式执行此操作,仍允许旧式交易继续进行。

引入0...127地址的特例外是为了允许访问预编译和BLOCKHASH等系统合约。

注意,此EIP将区块gas上限的作用从gas消耗总量上限变为gas高度上限,意味着将区块链的理论最大容量增加NUM_THREADS倍,但是,若想避免叔伯率的增加,则需要假设矿工在有NUM_THREADS个CPU核的硬件上运行。清晰起见,或许应该把区块gas_limit重命名为gas_height_limit


客户端实现

客户端可遵循如下算法:

1. 令TXINDEX = 0

2. 初始化txgrab为空列表.

3. 当(i)索引TXINDEX处区块中的交易与txgrab中的任何交易都不相交,(ii)len(txgrab) < NUM_THREADS且(iii)TXINDEX < len(block.transactions)时,将索引TXINDEX处区块添加至txgrab并设置TXINDEX + = 1

4. 在txgrab 中并行执行全部交易。

5. TXINDEX == len(block.transactions)时,退出。反之,返回步骤2。


规范,v2

将新交易类型修改为以如下:

交易的read range(读取范围)指全部read_ranges的并集;交易的write range(写入范围)指全部write_ranges的并集。将上述“T和T'范围相交处”换成“T的读取或写入范围与T'的写入范围相交”(其中T指当前交易,T'指先前交易)。允许只读操作访问读取或写入范围,仅允许只写操作访问写入范围。

这一步则为‘两笔交易的读取范围在未写入数据处相交时,仍可对交易做并行处理’的情形带来进一步优化。

0 ... 127地址的特例可删除,任何想要使用预编译的合约在其读取范围中包含这些地址即可;即使所有交易都将这些地址包含在自己的读取范围内,也不会显著影响并行性,原因是几乎没有人愿意写入这些地址。


修订提案1(感谢@Arachnid的建议)

每个范围不用必须是RLP列表,可以是字节数组,其中每个字节代表一个字节前缀(例如,字节数组\x03\x35\xfe表示“以0x03、0x35或0xfe开头的所有地址的集合”)。空字节数组表示所有地址的集合。虽说这个修改以一定的粒度为代价换取实现的简洁性,但是这个级别的粒度值也是相当低的。


https://github.com/ethereum/EIPs/issues/648

上一篇下一篇

猜你喜欢

热点阅读