侧链

作者: 文博园 | 来源:发表于2018-11-14 10:11 被阅读0次

    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

    参考

    https://www.jianshu.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://www.jianshu.com/p/a1c53795ae20?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    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。

    相关文章

      网友评论

          本文标题:侧链

          本文链接:https://www.haomeiwen.com/subject/pzddfqtx.html