区块链技术博客
www.b2bchain.cn

区块链技术Vitalik Buterin:以太坊无状态客户端方案能如何改进?

第20468篇区块链技术文章区块链技术Vitalik Buterin:以太坊无状态客户端方案能如何改进?

为每个地址添加一个32字节的“epoch prefix”可以解决地址空间随时间呈指数级压缩的问题

直接删除它,然后将它移到另一棵Merkel树上,这样关心状态对象的人可以获得相应的Merkel分支,并在将来某个时候使用它来激活状态

回顾:状态大小管理技术

不要将对象移出树结构;相反,只在树中的那个位置标记“deactivation”,这样节点就不会存储它(协议也不要求它们这样做)。通过发送提供默克尔证据(即见证数据)的事务来访问状态,可以再次访问停用的对象

  • 方法(1)对应于“经典存储租用方案”,方法(2)对应于传统“无状态客户机”的最简单扩展,即可以忘记旧状态的模型。这两种方法都允许关心特定状态对象的个人跟踪Merkel分支,这样,如果以后停用这些状态对象,就可以使用它们来激活它们。然而,这两种方法都存在明显的问题

  • 当在过期合同的同一地址重新创建合同时,方法(1)会出现一些极端情况。也就是说,如果在地址a创建了一个契约,那么它是无效的,在地址a创建契约的事务将被重新执行,并且在地址a创建一个新对象,这将影响原始对象的激活。另一种情况是,在地址a上创建对象,然后它经过停用、激活、修改(例如,将合同上的资金发送到另一个帐户)、重新停用,以及与第一个停用所在的Merkel分支机构一起激活。这违反了保留规则,可能被用于铸币;需要添加额外的Merkel证据来证明合同没有被另一个特定的国家激活,并且该国家也试图被激活

方法(2)遇到了不同的问题。假设两个相邻的地址(即它们之间没有对象)A1和A2被停用。这样,不仅A1和A2不再可访问(除非有人存储Merkel分支),而且A1和A2之间的所有地址也不再可访问。换言之,如果总共有n个地址,则约1/n的可用地址空间不再可访问。当一半的地址被停用时,大约四分之一的地址空间不再可访问。随着时间的推移,将越来越难以找到空间来生成新的地址。此外,随着新地址越来越集中于剩余的“可访问”空间,每n年将可访问空间减半的影响将呈指数增长

我建议修改方法(2)来解决上述问题。许多方法(2)的实施方案表明,账户有两种状态:主动和非主动。非活跃账户是指超过一年未访问的账户。要访问非活动帐户,需要提供见证数据;当进入停用账户时,账户将自动被停用(任何被触碰的账户将重置其一年停用计算)。修改如下:

我们为每个地址添加一个32字节的“epoch前缀”(将被解释为整数)。例如,epoch前缀为9的地址如下:0x00000009de0b295669a9fd93d5f28d9ec85e40f4cb697bae,00000009作为前缀,默克尔的路径直接依赖于epoch的前缀,而不是它的哈希值(所以Merkle)uux Key=address[:4]+hash(address[4:]),而不是当前的Merkle_uuxkey=hash(address)。这确保了“未使用的”地址空间是连续的,除非地址的epoch前缀是小于或等于区块链已经运行的年数,

提议

我提议对方法 (2) 进行修改,可以解决以上的问题。正如很多方法 (2) 的提议实现方案所呈现的,账户有「活跃」与「失活」两种状态,失活账户是那些超过一年未被访问过的账户。要访问失活账户,你需要提供见证数据;当失活账户被访问了,该账户会自动解除失活状态 (触及任何账户都会重置它的一年失活期计算)。修改内容如下:

将添加create3操作码,该操作码将以epoch前缀为参数,并在具有epoch前缀的地址上创建合约,建议用户和合约总是尽可能使用最新的epoch前缀来创建账户,或者甚至将其设置为默认设置,因为必须有具有最新epoch前缀的full state仍然可以访问。为了保持“反事实地址”(即,在合同代码被释放之前,用户在链上交互[例如,通过发送eth或erc20令牌]或在链下交互[通过在信道中交互]的地址),可以创建具有旧epoch前缀的合同。但是,对于想要创建反事实地址的用户,如果长时间不创建反事实地址,他们将负责存储帐户的旧状态分支

经过多年的操作,预计活动状态将由两部分组成:(I)具有最新epoch前缀的所有地址空间(二) 与最近被积极使用的帐户相对应的特定旧状态;事实上,积极遵循这一计划符合合同的运作。因为在这个方案中,地址的存储部分以几个字节作为前缀,它们所代表的数字n意味着数据在n年内与这些地址相关联。这非常适合存储令牌余额之类的数据来源:etresear.ch

除非地址的 epoch 前缀是小于或等于区块链已运行的年数,否则地址不能被使用

会增加一个 CREATE3 操作码,它会把 epoch 前缀作为一个参数,并在具有该 epoch 前缀的一个地址上创建一个合约。

推荐用户和合约总是使用具有尽可能新的 epoch 前缀来创建账户,甚至设为默认设置,因为肯定会有具有最新 epoch 前缀的全状态仍然是可以访问的。为了还能保有「反事实地址 (counterfactual addresses)」(即在合约代码被发布前,用户在链上 [例如通过发送 ETH 或 ERC20 代币] 或链下 [通过在一个通道里互动] 交互的地址),用旧 epoch 前缀来创建合约还是可能的。但是,对于想要创建反事实地址的用户,如果长期不创建,他们就要负责为该账户存储旧状态的分支。

经过多年的运行,预计活跃状态会由两部分构成:(i) 有最新 epoch 前缀的全部地址空间,(ii) 与最近被活跃使用过的账户相对应的特定旧状态

请注意,这个方案正常情况下扩展到合约上;事实上,主动遵循这个方案是符合合约自身运作的。因为在这个方案里,地址中代表存储的部分以几个字节为前缀,它们所代表的数字 N 指的是这些数据是在 N 年与这些地址产生关联。这很适合用于存储像代币余额这样的数据。

来源链接:ethresear.ch

区块链技术Vitalik Buterin:以太坊无状态客户端方案能如何改进? 由www.b2bchain.cn 提供
文章整理自网络,只为个人学习与分享使用
链接地址https://www.b2bchain.cn/20468.html

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 区块链技术Vitalik Buterin:以太坊无状态客户端方案能如何改进?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们