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的签名,用户可以在以太坊合约中进行两次提币。而分成两步后,就可以杜绝这种情况的发生。