1. 概念
侧链这一术语在Adam Back等人2014年左右的论文《用楔入式侧链实现区块链的创新》被首次讨论。论文描述了“双向楔入侧链”,这种机制通过证明你已经“锁定”了一些你拥有的货币,从而允许你在一个侧链内操作一些其他的货币。 这里要澄清一个误解。侧链能增加规模,但是这不意味着扩展性。侧链在提升扩展性上并不比增加区块体积优秀。侧链带来的是实验的能力。能够建立以不同的,甚至可能更好的技术为基础的网络。
2. 术语
checkpoint:检查点,侧链定期向主链发送merkle root
two-way-peg:双向楔入,在主链锁定一部分token,而允许在侧链拥有其他的token
zk-SNARKs:零知识证明
3. plasma
Plasma是参考雷电网络,并将其拓展到任何Tx的layer 2 扩展方案,目的是引导大家只将安全级别很高的部分放置在main chain上,其他低安全级别的部分放置在side chain/off-chain上面完成,参考:https://www.bitrates.com/news/p/plasma-design-space-for-custom-blockchains-extending-off-the-ethereum-blockchain
主链和侧链的交互
通过smart contract交互
Plasma内部是一个tree of blockchain
Plasma MVP
参考
//www.greatytc.com/p/b79eabd4e2a1
https://blog.csdn.net/ITleaks/article/details/82863285
https://ethresear.ch/t/minimal-viable-plasma/426
关键点:
1. 使用merkletree和 UTXO的存储方式
2. Priority queue:提交exit的时候先放入链中,先入的先处理,防止用户退链的时候,operator也提出退链
3. 利于攸关者的挑战:所有的退出请求都在队列中保留7天,如果有人挑战成功则退出失败
数据结构如下:
Block 只包含hash root和时间戳
struct PlasmaBlock {
bytes32 root;
uint256 timestamp;
}
transaction 是经典的UTXO格式
class Transaction(rlp.Serializable): fields = [
('blknum1', big_endian_int),
('txindex1', big_endian_int),
('oindex1', big_endian_int),
('blknum2', big_endian_int),
('txindex2', big_endian_int),
('oindex2', big_endian_int),
('cur12', utils.address),
('newowner1', utils.address),
('amount1', big_endian_int),
('newowner2', utils.address),
('amount2', big_endian_int),
('sig1', binary),
('sig2', binary),]
SubmitBlock: 完成合约内交易后,child chain(plasma contract作为root chain, 其他区块链作为child chain来实现)调用该接口提交交易的hash root 和timestamp到plasma block chain。
Deposit: 实现从主链向合约转token的操作,计算操作的hash root,写入plasma block,如下:
bytes32 root = keccak256(abi.encodePacked(msg.sender, address(0), msg.value));
startDepositExit:存款人从合约中提款到主链,输入block index和amount后计算hash 和plasma block中的root比对,如果一致加入到exit 链中。
startExit:如果存款人转账给A,A提款到主链,需要携带交易所在的block num和merkle proof,合约计算后如果一致加入到exit链中
challengeExit:挑战提款,如果之前A转账给B后,A就发起了startExit/startDepositExit,由于合约无法校验最终的token属于谁,所以需要先放入exitPriority queue,等待7天如果没人挑战就退出,否则B发现后(通过监听退出消息得知)使用该接口,输入A转账B的交易信息后,合约校验无误后,删除A的退出请求。
Plasma CASH
参考
https://blog.csdn.net/ITleaks/article/details/83106336
https://ethresear.ch/t/plasma-cash-plasma-with-much-less-per-user-data-checking/1298
关键点:
用户调用deposit将主链的ETH, ERC20, ERC721代币生成coin,coin类似房产,只能整体交易,没法分割,用户在子链通过交易修改coin的所有权(更改coin的owner),可以简化验证,因为只能验证交易是否存在,没有每个用户的余额信息,所以视为整体,不把这个依赖challenge来保证。
使用sparse merkle-tree(相比标准的merkletree主要的优势是除了可以证明存在,还可以证明不存在,这样可以防止operator 构造假的block):https://medium.com/@kelvinfichter/whats-a-sparse-merkle-tree-acda70aeb837 和coin的存储方式
数据结构如下:
struct Coin {
Mode mode;
State state;
address owner; // who owns that nft
address contractAddress; // which contract does the coin belong to
Exit exit;
uint256 uid;
uint256 denomination;
uint256 depositBlock;
}
类似MVP的PlasmaBlock
struct ChildBlock {
bytes32 root;
uint256 createdAt;
}
transaction结构不同于MVP,包含了coin的索引slot
struct TX {
uint64 slot;
address owner;
bytes32 hash;
uint256 prevBlock;
uint256 denomination;
}
submitBlock(bytes32 root):完成合约内交易后,child chain(plasma contract作为root chain, 其他区块链作为child chain来实现)调用该接口提交交易的hash root 和timestamp到plasma block chain。
deposit:实现从主链向合约转token的操作,相比较MVP增加了uid的参数用来标识token的类型,需要将该种coin保存在合约中,并计算操作的hash root,写入child block
startExit:不同于MVP,需要携带之前的该coin的交易和现在的交易,校验这两个交易都存在后,将其放入队列当中,等待7天,如果没有挑战,就可以通过下面的withdraw方法取出,如果有挑战且成功,则将奖励发放给揭发者。相比MVP安全性更高一些
withdraw:在startExit之后没有挑战或挑战失败后,将token取出到主链,
challengeBefore:提出一个比退出区块早的证据,只能证明提出者的来源的来源是自己。
respondChallengeBefore:针对challenge,如果可以证明之后又转给了自己就是胜利。
challengeBetween:可以证明提出者的来源有问题。直接惩罚
challengeAfter:可以证明提出者后面已经消费。直接惩罚
关于 RootStock
参考
https://github.com/rsksmart/rskj/wiki
采用侧链+公证人的方式实现,流程如下:
用户A转账到federator账户(多签账户)
Federation账户通过钱包内置功能调用rsk-chain的bridge的智能合约的方法(receiveHeaders和registerBtcTransaction)将SPV证明发送过去
Rsk-chain,收到receiveHeaders之后保存header信息,建立一个BTC的header链(类似钱包),收到registerBtcTransaction后解锁对应固定汇率(1:10)的SBTC,并使用用户A的公钥生成账户(这样用户A可以直接控制),将SBTC存入到该账户下
用户A想要从rsk-chain取回BTC,需要调用智能合约方法releaseBtc,销毁对应数量的SBTC
在federator的BTC账户下投票(钱包是通过注册的消息得知),确定将对应余额返回给用户A的BTC账户。
可以看出通信的关键在于federator账户的钱包。
关于BTC Relay
请参考
https://github.com/ethereum/btcrelay
BTC Relay是带有Bitcoin SPV钱包功能的以太坊智能合约,包括 Relayers社区成员:Relayers为BTC Relay提供新的比特币区块头(header),当交易在区块链进行验证或者区块头被检索的时候,Relayer会获得一笔手续费作为奖励,Relayer提交区块头的这种循环——然后处理比特币支付和奖励Relayer手续费的应用程序——使系统能够自立和自治,如下图:
BTC-Relay使用场景举例
1. Alice和Bob同意使用在以太坊上的BTCSwap合约来进行交易,Alice要买Bob的eth,Bob先把他的 eth发送到BTCSwap合约
2. Alice向Bob发送bitcoin,
3. Alice通过bitcoin的交易信息以及BTCSwap合约地址来调用btcrelay.relayTx(),btcrelay通过verifyTx接口验证这笔交易通过后就触发BTCSwap合约里面的processTransaction方法
4. BTCSwap合约在被触发后确认这个btcrelay地址是一个合法地址,然后释放之前Bob的eth
大致流程图如下:
可以看出该方案中,bitcoin和ethereum的通信时依靠转帐者调用合约实现的,并且严重依赖relayer不断通过bitcoin的header。