EIP101 - Serenity Currency and Crypto Abstraction

# 规范

  1. 目前账户其 RLP 编码中只有两个字段:codestorage
  2. Ether 不再直接存储在账户对象中;相反,在 address 0,我们预先制定了一份包含所有以太坊代币持有量的合约。web3 中的 eth.getBalance 命令也被适当地重新映射。
  3. msg.value 操作代码作废。
  4. 一笔交易现在只有四个字段:tostartgasdatacode
  5. 除了 RLP 有效性检查,并检查 to 字段长度是否为 20 字节,startgas 是一个整数,并且代码为空或 to 地址的哈希值之外,没有其他有效性约束。但是区块 GAS 限制仍然存在,矿工会拒绝含有 junk 的行为。
  6. code 中字节的 gas 费率与 data 保持一致.
  7. 发送交易时,如果接收账户尚不存在,则创建该账户,并将其代码设置为交易中提供的代码;否则代码将被忽略。
  8. 一个 tx.gas 操作码被添加到现有 msg.gas 的索引处 0x5c;这个新的操作码允许交易访问为交易分配的默认数量的 gas。

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

基础用户可以具有以下默认的标准化代码:

# We assume that data takes the following schema:
# bytes 0-31: v (ECDSA sig)
# bytes 32-63: r (ECDSA sig)
# bytes 64-95: s (ECDSA sig)
# bytes 96-127: sequence number (formerly called "nonce")
# bytes 128-159: gasprice
# bytes 172-191: to
# bytes 192+: data

# Get the hash for transaction signing
~mstore(0, msg.gas)
~calldatacopy(32, 96, ~calldatasize() - 96)
h = sha3(96, ~calldatasize() - 96)
# Call ECRECOVER contract to get the sender
~call(5000, 3, [h, ~calldataload(0), ~calldataload(32), ~calldataload(64)], 128, ref(addr), 32)
# Check sender correctness
assert addr == 0x82a978b3f5962a5b0957d9ee9eef472ee55b42f1
# Check sequence number correctness
assert ~calldataload(96) == self.storage[-1]
# Increment sequence number
self.storage[-1] += 1
# Make the sub-call and discard output
~call(msg.gas - 50000, ~calldataload(160), 192, ~calldatasize() - 192, 0, 0)
# Pay for 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 限制参数为参数的请求)。

  3. 模式匹配以确保最后的 gas 支付代码与上面的代码完全相同。 这个过程确保矿工在知道是否值得将交易包括在内之前最多浪费 50000 gas,并且也是高度通用的,因此用户可以尝试新的区块密码(例如 ed25519、Lamport)、环签名、多重签名等。理论上,我们甚至可以创建一个账户,其有效签名类型是收据的有效默克尔分支,从而创建一个准本地闹钟。 如果有人想发送一个非零值的交易,而不是目前的 msg.sender 方法,我们编译成一个三步过程:

  4. 在调用外部请求前,调用以太坊合约以创建所需金额的订单。

  5. 在内部范围内,如果合约在被调用的函数中的任何地方使用 msg.value 操作码,那么我们让合约在函数调用开始时支付,并将支付金额存储在内存中的一个标准化的地址中。

  6. 在调用后,向合约发送一个确认消息,如果尚未支付,就禁用它。

# 原理阐述

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

  1. 用于保护账户的加密算法(我们可以合理地说,以太坊是量子安全的,因为一个人可以完全自由地保护自己的账户,通过 Lamport 签名)。同时 nonce-incrementing 的方法也对账户持有人的修改开放,允许在 k-parallelizable nonce、UTXO 方案等方面进行实验。
  2. 将以太坊提升到一个特殊的级别,其好处是允许以太坊和子代币以类似的方式处理。
  3. 减少自定义政策账户所需的指令级别,如多重签名。

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

# 实现

暂无内容。

▲ Powered by Vercel