• PalletOne调色板跨链的ETH提币实现


    实现区块链的跨链,最主要的诉求就是Token的转移,而Token的跨链转移又分为充币和提币2种操作。以PalletOne调色板来说,如果要把ETH跨链到PalletOne上来流转,就是ETH的充币操作,要将PalletOne上的PETH(PalletOne上发行的与ETH1:1等值兑换的Token)跨链回到以太坊,变成ETH,就是ETH的提币操作。

    ETH的充币

    这里的过程其实和我之前的一篇博客PalletOne调色板Token PTN跨链转网的技术原理 相似,只是我们需要在PalletOne上面创建一个与ETH等值兑换的Token,我们这里就命名为PETH吧。总结一下充币的过程,细节我就不再累述了:

    1.用户在以太坊映射和锁定合约上注册映射自己的PalletOne地址。

    2.用户将一定数量的ETH转账到该映射和锁定合约。

    3.定时任务扫描合约的转入事件,发现有新的转入,就发起PalletOne充币合约的调用,该充币合约检查ETH的转账和地址映射,将同等数量的PETH转账到用户指定的映射地址上。

    ETH的提币

    用户在获得了PETH后,可以在PalletOne网络进行各种Token操作,比如去中心化交易所的币币互换,游戏合约的道具购买,积分兑换等等。假如另一个用户拿到了PETH,他需要将这些Token变现为ETH,该怎么操作呢?下面我们来详细介绍一下其中的过程。

    0.初始化了4个陪审员的公钥到以太坊锁定合约

    这个是运营方在设置ETH充币提币合约时就做好的,只需要做一次。ETH的提币合约在PalletOne中是由陪审团来执行,而陪审团是由4个陪审员节点组成。每个陪审员节点都生成了一个以太坊的公私钥和地址,并且将公钥和地址公开到网络上。项目运营方在以太坊的映射和锁定合约(接下来我们就命名为0x1合约)上将这4个陪审员的公钥设置进去,只有这4个公钥中的3个签名才能解锁其中的ETH。

    1.(PalletOne钱包)传入ETH收款地址,锁定PETH

    PalletOne上面有一个ETH提币合约我们就命名为PC1,用户将自己的PETH转账到PC1,同时在交易的Data Message中提供了自己的以太坊地址。出于降低钱包操作难度的目的,用户无论使用官方PalletOne钱包还是第三方支持PTN的钱包,只要能过进行转账时附言即可。

    2.(PalletOne合约)发起提币调用,生成解锁ETH的签名,并最终生成以太坊合约的inputdata

    等步骤1的调用被打包后,用户或者定时任务扫描锁定PETH的交易,一旦发现有新的交易,即发起对PC1合约的“提币”方法的调用,该方法读取锁定PETH交易的数据,并由4个陪审员各自用自己的以太坊私钥进行签名,签名后的数据再进行排序,我们只需要取3个签名即可。这个时候,合约已经获得了调用0x1合约进行ETH提币的所有参数:

    • 以太坊ETH映射和锁定合约的地址0x1
    • 用户映射的收ETH的地址
    • 要转网的ETH数量(=转入的PETH的数量-ETH转网Gas费)
    • 锁定PETH的TxHash
    • 3个陪审员的签名

    在以太坊锁定合约0x1上,有一个方法:

    function withdraw(address recver, uint amount, bytes32 reqid, bytes sigstr1, bytes sigstr2, bytes sigstr3) public

    该方法接收的参数都已经完备,所以我们就可以按照以太坊的规则,生成对应的inputData。最终将合约地址0x1,调用的inputData写入到StateDB中,以供专门用于以太坊合约调用的定时任务查询和调用。

    3.(以太坊合约)发起以太坊锁定合约的提币,用户获得ETH

    定时任务(以太坊合约调用者)扫描PC1合约的状态,一旦发现有新的提币调用,就读取这次提币申请的如下信息:

    • 要被调用的以太坊合约地址
    • 调用合约时传入的inputData(也就是要被调用的合约方法和合约参数编码后的值)
    • GasFee

    定时任务根据以上信息,用自己的账号发起对指定合约的调用。调用完毕后,可以获得本次调用的TxHash,定时任务再发起对PC1合约的调用,登记本次ETH提币的TxHash,以便用户能够查询转网的结果。陪审员会根据TxHash去验证转网结果,并更新本次转网提币请求的状态。如果一切正常,用户映射的以太坊收款地址,将收到对应数量的ETH,对用户来说本次转网提币结束。

    4.(PalletOne合约)以太坊合约调用者获得GasFee的补偿

    因为以太坊的合约调用是需要花费真金白银的ETH的,所以转网提币合约必须对该调用者进行ETH的补偿。我们前面提到:  要转网的ETH数量=转入的PETH的数量-ETH转网Gas费。也就是说,如果我有1个PETH要进行提币,而转网提币的手续费是0.01PETH,那么我最终以太坊钱包会收到0.99ETH。而以太坊合约调用者在步骤3中向PC1合约登记了转网TxHash,陪审员验证转网成功的同时,也会将手续费0.01PETH记账到合约调用者的地址下,合约调用者随时可以从PC1合约提取PETH。

    总结

    以上就是PalletOne调色板关于跨链以太坊提币的详细过程,我们以锁定PETH的RequestHash作为提币的唯一标识,无论在PalletOne合约还是在以太坊合约中,都使用,主要就是为了防止重放攻击,由于RequestHash是唯一的,不可能碰撞出一模一样的RequestHash,所以合约中只需要检查RequestHash对应的状态,就可以确定下一步该怎么处理。

    按理来说,步骤1和步骤2应该是可以合并成一步的,为什么要分开呢?主要是为了预防双花攻击。如果一个人发起了双花交易,这两笔交易都是转入1PETH,但是手续费用的是同一笔UTXO,由于PalletOne的合约是异步执行的,所以陪审团在执行两个提币请求时,并不知道存在双花,所以陪审团都会生成3个签名,而最终在打包的时候Mediator发现双花,只打包其中的一笔。这个时候虽然最终打包是一笔,但从P2P角度来看,整个网络上其实获得了两笔提取ETH的签名,用户可以在以太坊合约中进行两次提币。而分成两步后,就可以杜绝这种情况的发生。

  • 相关阅读:
    今日大跌!
    web servers
    ASP.NET2.0缓存机制
    赚钱的总是史玉柱?
    asp.net速查手册
    为伊消得人憔悴,我的2007成就难有,内心彷徨
    success
    失守4600点
    Linux下chkconfig命令详解
    FTP批处理下载木马
  • 原文地址:https://www.cnblogs.com/studyzy/p/11860649.html
Copyright © 2020-2023  润新知