EIP101 - 宁静货币和加密抽象

# 规格

  1. 帐户现在在其 RLP 编码中只有两个字段:codestorage
  2. Ether 不再直接存储在账户对象中;相反,在地址 0 处,我们预挖了一份包含所有以太币持有量的合约。 web3 中的 eth.getBalance 命令被适当地重新映射。
  3. msg.value 不再作为操作码存在。
  4. 一笔交易现在只有四个字段:tostartgasdatacode
  5. 除了 RLP 有效性检查,并检查 to 字段的长度是否为 20 个字节,startgas 是一个整数,code 为空或散列到 to 地址,没有其他有效性限制;什么都行。但是,区块 gas 限制仍然存在,因此矿工不愿意包含垃圾。
  6. code 中的字节按与 data 相同的费率收费。
  7. 发送交易时,如果接收账户尚不存在,则创建该账户,并将其代码设置为交易中提供的代码;否则代码将被忽略。
  8. 在索引为 0x5c 的现有 msg.gas 旁边添加了一个 tx.gas 操作码;这个新的操作码允许交易访问为交易分配的原始 gas

请注意,现在底层规范中没有 ECRECOVER 、序列号/随机数递增和以太币(注意:以太币将继续在 Casper PoS 中扮演特权角色)。为了在新模型下复制现有功能,我们执行以下操作。

简单的用户帐户可以具有以下默认的标准化代码:

# 我们假设数据采用以下模式:
# bytes 0-31: v (ECDSA sig)
# bytes 32-63: r (ECDSA sig)
# bytes 64-95: s (ECDSA sig)
# bytes 96-127: 序列号(以前称为 `nonce` )
# bytes 128-159: gasprice
# bytes 172-191: to
# bytes 192+: data

# 获取交易签名的哈希值
~mstore(0, msg.gas)
~calldatacopy(32, 96, ~calldatasize() - 96)
h = sha3(96, ~calldatasize() - 96)
# 调用 ECRECOVER 合约获取发送方
~call(5000, 3, [h, ~calldataload(0), ~calldataload(32), ~calldataload(64)], 128, ref(addr), 32)
# 检查发件人的正确性
assert addr == 0x82a978b3f5962a5b0957d9ee9eef472ee55b42f1
# 检查序号正确性
assert ~calldataload(96) == self.storage[-1]
# 增加序号
self.storage[-1] += 1
# 进行子调用并丢弃输出
~call(msg.gas - 50000, ~calldataload(160), 192, ~calldatasize() - 192, 0, 0)
# 支付 `gas`
~call(40000, 0, [SEND, block.coinbase, ~calldataload(128) * (tx.gas - msg.gas + 50000)], 96, 0, 0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

这本质上实现了签名和随机数检查,如果两个检查都通过,那么它使用所有剩余的 gas 减去 50000 来发送实际所需的调用,然后最终支付 gas

矿工在收到交易时可以遵循以下算法:

  1. 运行最多 50000 gas 的代码,如果他们看到有可能超过此限制的操作或调用,则停止
  2. 看到该操作后,确保它至少留下 50000 gas 备用(通过检查静态 gas 消耗量是否足够小或检查它是否是一个以 msg.gas - 50000 作为其 gas 限制的调用范围)
  3. 模式匹配以确保最后的 gas 支付代码与上面的代码完全相同。

此过程可确保矿工在知道是否值得将交易包含在内之前浪费最多 50000 个 gas,并且还非常通用,因此用户可以尝试新的密码学(例如 ed25519Lamport)、环签名、准本地多重签名等。理论上,甚至可以创建一个帐户,其有效签名类型是收据的有效默克尔分支,从而创建一个准本地闹钟。

如果有人想发送一个非零值的交易,而不是当前的 msg.sender 方法,我们编译成一个三步过程:

  1. 在调用之前的外部作用域中,调用以太合约以创建所需数量的支票
  2. 在内部作用域中,如果合约在被调用函数的任何地方使用 msg.value 操作码,那么我们让合约在函数调用开始时兑现支票并将兑现金额存储在内存中的标准化地址
  3. 在刚刚调用后的外部作用域中,如果尚未兑现,则向以太合约发送消息以禁用支票

# 基本原理

这使得普遍性有了很大的提高,特别是在几个领域:

  1. 用于保护帐户的密码算法(我们可以合理地说以太坊是量子安全的,因为使用 Lamport 签名可以完全自由地保护自己的帐户)。 现在,随机数递增方法也可以由账户持有人进行修订,允许在 k 可并行随机数技术、UTXO 方案等方面进行实验。
  2. 将以太提升到一个抽象级别,其特别的好处是允许以太和子代币在合约中得到类似的处理
  3. 减少自定义策略账户(如多重签名)所需的间接级别

它还大大简化和净化了底层的以太坊协议,降低了最小共识实现的复杂性。

# 执行

即将推出。

▲ Powered by Vercel