- SmartPlasma 合约解读
- 1. 合约代码
- 2. 合约文件简单介绍
- 3. Plasma Cash 的基础数据结构
- 4. Plasma Cash 中的退出示例
- 5. 其他问题 Plasma 由 V 神在2017年8月提出,希望通过链下交易来大幅提高以太坊的 TPS.
每条 Plasma 链都会将有关交易顺序的消息换算成一个哈希值存储在根链上。比特币和以太坊都属于根链——这两条区块链具有很高的安全性,并且通过去中心化保证了(安全性和活性)。
Plasma 设计模型有两个主要的分支:Plasma MVP 和 Plasma Cash 。这里我们来研究 SmartPlasma 实现的 Plasma Cash 合约,并通过合约分析来回答大家关于 Plasma Cash 的一系列疑问.
1. 合约代码
SmartPlasma的合约代码肯定会不断升级,我针对他们在今天(2018-09-14)最新版本进行分析,这份代码目前保存在我的 github 上 plasma cash.
2. 合约文件简单介绍
文件夹中有不少与 Plasma Cash 无关的合约,这里只关注直接与 Plasma Cash 相关合约,像 ERC20Token 相关合约就忽略,自行查看.
- Mediator.sol 是 Plasma Cash 链中资产的进出口
- RootChain.sol 处理 Plasma Cash 子链(相对于以太坊而言)中的交易以及打包等
- libraries/MerkleProof.sol 是子链中交易用到的默克尔树,用于子链参与方进行欺诈证明 fraud proof.
- libraris/RLP.sol RLP编码支持,可以暂时忽略,子链中所有的交易都是用RLP 编码的.
- libraries/PlasmaLib.sol 生成 uid 的辅助函数
- ECRecovery.sol 签名验证
- datastructures/Transaction.sol 描述交易的数据结构
3. Plasma Cash 的基础数据结构
Plasma Cash 是一种子链结构,可以认为 Plasma Cash 是以太坊的一个是基于 =一种简化的UTXO模型的子链.
3.1 Plasma Cash 中的资产
Plasma Cash 中的资产都来自于以太坊,但是一旦进入 Plasma Cash 就会拥有唯一的 ID,并且不可分割. 可以参考 Mediator.sol的deposit函数. Mediator就是 Plasma Cash 资产存放的地方.
/** @dev Adds deposits on Smart Plasma. * @param currency Currency address. * @param amount Amount amount of currency. */ function deposit(address currency, uint amount) public { require(amount > 0); Token token = Token(currency); token.transferFrom(msg.sender, this, amount); /// deposit test1 bytes32 uid = rootChain.deposit(msg.sender, currency, amount); /// deposit test2 cash[uid] = entry({ currency: currency, amount: amount }); } 通过合约可以看出进入 Plasma Cash 的资产必须是 ERC20 Token,这些资产实际上是存在 Mediator 这个合约上,然后由 RootChain 为其分配一个唯一的 ID, 也就是 uid. 这个 uid 代表着什么 token, 有多少个.
3.2 Plasma Cash中的交易
关键代码在 Transaction.sol中.
struct Tx { uint prevBlock; uint uid; uint amount; address newOwner; uint nonce; address signer; bytes32 hash; } 这里可能不太明显,需要解释才能看出来这是一个 UTXO 交易的模型. 这里面的amount 和 hash 实际上都有点啰唆,可以忽略. 那么剩下的成员需要来解释.
prevBlock就是 UTXO 中的输入,来自于哪块. 至于为什么没有像比特币一样的OutPoint 结构,也就是 TxHash+Index, 后续会讲到. uid 就是交易的资产 ID newOwner 交易输出给谁, 这里也不支持像 比特币一样的脚本. nonce 是这笔资产的第多少次交易,在双花证明中有重要作用. signer必须由资产原拥有者的签名.
amount 不重要,是因为资产不可分割,导致这里的 Amount 不会随交易发生而发生变化. 而 hash 则是可以直接计算出来.
3.3 Plasma Cash 中的 Block
如果一般区块链中的 Block 一样,他是交易的集合.但是不同于一般链的是,这里面的矿工(不一定是 Operator)不仅需要维护好子链,还需要周期性的将每一个 Block 对应的默克尔树根保存到以太坊中,这个工作只能有 Operator 来完成. 具体代码可见 RootChain.sol的.
