EIP101 - 宁静货币和加密抽象
# 规格
- 帐户现在在其
RLP
编码中只有两个字段:code 和 storage。 Ether
不再直接存储在账户对象中;相反,在地址0
处,我们预挖了一份包含所有以太币持有量的合约。web3
中的eth.getBalance
命令被适当地重新映射。msg.value
不再作为操作码存在。- 一笔交易现在只有四个字段:to、startgas、data 和 code。
- 除了
RLP
有效性检查,并检查 to 字段的长度是否为20
个字节,startgas 是一个整数,code 为空或散列到 to 地址,没有其他有效性限制;什么都行。但是,区块gas
限制仍然存在,因此矿工不愿意包含垃圾。 - code 中的字节按与 data 相同的费率收费。
- 发送交易时,如果接收账户尚不存在,则创建该账户,并将其代码设置为交易中提供的代码;否则代码将被忽略。
- 在索引为
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
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
。
矿工在收到交易时可以遵循以下算法:
- 运行最多 50000
gas
的代码,如果他们看到有可能超过此限制的操作或调用,则停止 - 看到该操作后,确保它至少留下 50000
gas
备用(通过检查静态gas
消耗量是否足够小或检查它是否是一个以msg.gas - 50000
作为其gas
限制的调用范围) - 模式匹配以确保最后的
gas
支付代码与上面的代码完全相同。
此过程可确保矿工在知道是否值得将交易包含在内之前浪费最多 50000 个 gas
,并且还非常通用,因此用户可以尝试新的密码学(例如 ed25519
、Lamport
)、环签名、准本地多重签名等。理论上,甚至可以创建一个帐户,其有效签名类型是收据的有效默克尔分支,从而创建一个准本地闹钟。
如果有人想发送一个非零值的交易,而不是当前的 msg.sender
方法,我们编译成一个三步过程:
- 在调用之前的外部作用域中,调用以太合约以创建所需数量的支票
- 在内部作用域中,如果合约在被调用函数的任何地方使用
msg.value
操作码,那么我们让合约在函数调用开始时兑现支票并将兑现金额存储在内存中的标准化地址 - 在刚刚调用后的外部作用域中,如果尚未兑现,则向以太合约发送消息以禁用支票
# 基本原理
这使得普遍性有了很大的提高,特别是在几个领域:
- 用于保护帐户的密码算法(我们可以合理地说以太坊是量子安全的,因为使用
Lamport
签名可以完全自由地保护自己的帐户)。 现在,随机数递增方法也可以由账户持有人进行修订,允许在k
可并行随机数技术、UTXO
方案等方面进行实验。 - 将以太提升到一个抽象级别,其特别的好处是允许以太和子代币在合约中得到类似的处理
- 减少自定义策略账户(如多重签名)所需的间接级别
它还大大简化和净化了底层的以太坊协议,降低了最小共识实现的复杂性。
# 执行
即将推出。