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的签名,用户可以在以太坊合约中进行两次提币。而分成两步后,就可以杜绝这种情况的发生。
PalletOne调色板跨链的ETH提币实现的更多相关文章
- PalletOne调色板跨链的BTC实现
之前已经讲到了PalletOne调色板跨链以太坊ETH和ERC20的技术原理,接下来我们来讲解PalletOne跨链比特币BTC的技术原理. 一.BTC充币 假如用户A持有一定数量的比特币BTC,他希 ...
- PalletOne调色板Token PTN跨链转网的技术原理
之前一直在忙于通用跨链公链PalletOne的研发,没有怎么做技术分享的博客,最近PalletOne主网上线也有几个月的时间了,即将进行PTN(PalletOne上面的主Token)从ERC20到主网 ...
- BlockChain 的跨链技术的重要性和必要性
本期我们将从跨链技术的重要性和必要性.畅想区块链未来世界.什么是跨链.目前四种跨链技术的对比.构建EOS同构跨链体系群.EOCS跨链技术介绍.跨链通道.中继等几个层面带大家走进EOS跨链和EOCS的世 ...
- SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换
作者介绍 虫洞社区·签约作者 steven bai 前言 如果能够进行以太坊和比特币跨链原子资产交换,是不是一件很酷的事情? 目前链下的扩容方式有很多,最广为人知的就是比特币的闪电网络和以太坊的雷电网 ...
- web3.js支持SimpleChain跨链调用
SimpleChain的跨链协议已经对外开放很久了,很多应用也已经慢慢支持Simplechain的跨链.最近社区开发者web3.js中集成了Simplechain的跨链接口,开发者只需用npm安装包文 ...
- Bystack跨链技术源码解读
Bystack是由比原链团队提出的一主多侧链架构的BaaS平台.其将区块链应用分为三层架构:底层账本层,侧链扩展层,业务适配层.底层账本层为Layer1,即为目前比较成熟的采用POW共识的Bytom公 ...
- ES Bridge跨链桥服务升级,新增BSC跨链网络
3月15日,Equal Sign Bridge(ES Bridge)跨链桥宣布新增BSC跨链网络,方便更多用户参与到ES Bridge的建设与发展,未来还将持续拓展更多的主流跨链币种,提升各链间的互操 ...
- EOCS跨链核心技术内幕
EOCS跨链技术的核心就是ICP模块,ICP即Inter Chain Protocol(跨链交互协议),下面着重介绍ICP工作原理和实现细节. Inter Chain Protocol(ICP) IC ...
- 基于SimpleChain Beta的跨链交互与持续稳态思考
1. 区块链扩展性迷局 比特币作为第一个区块链应用与运行到目前为止最被信任的公链,其扩展性问题却持续被作为焦点贯穿着整个链的发展周期.事实上,在2009年1月4日比特币出现的那一天到2010年10月1 ...
随机推荐
- js打乱数组排序
用到的知识点:Math.random()//用于打乱数组索引 random() 方法可返回介于 0(包含) ~ 1(不包含) 之间的一个随机数. var arr=[1,2,3,4,5,6]; for( ...
- centos7制作U盘启动盘
一.准备相关软件 1.8G以上U盘 2.UltraISO虚拟光驱(试用版即可)最新版 下载地址:https://cn.ultraiso.net/xiazai.html 点击下载试用 3.CentOS ...
- 最简单的 Java内存模型 讲解
前言 在网上看了很多文章,也看了好几本书中关于JMM的介绍,我发现JMM确实是Java中比较难以理解的概念.网上很多文章中关于JMM的介绍要么是照搬了一些书上的内容,要么就干脆介绍的就是错的.本文试着 ...
- 如何用Pact进行微服务集成测试
原文链接 https://codefresh.io/docker-tutorial/how-to-test-microservice-integration-with-pact/ 挑战:微服务集成测试 ...
- 初步了解JVM第二篇
在一篇<初步了解JVM第一篇>中,我们已经了解了: 类加载器:负责加载*.class文件,将字节码内容加载到内存中.其中类加载器的类型有如下: 启动类加载器(Bootstrap) 扩展类加 ...
- Docker常用命令-全
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接: https://app.yinxiang.com/shard/s17/nl/19391737/9f6bf39e- ...
- Spring Cloud Config实现集群配置中心
Spring Cloud Config为分布式系统提供了配置服务器和配置客户端,可以管理集群中的配置文件.使用Git.SVN等版本管理系统存放配置文件,配置服务器会到版本管理系统获取配置,集群中的配置 ...
- Linux-3.14.12内存管理笔记【伙伴管理算法(4)】
此处承接前面未深入分析的页面释放部分,主要详细分析伙伴管理算法中页面释放的实现.页面释放的函数入口是__free_page(),其实则是一个宏定义. 具体实现: [file:/include/linu ...
- linux 定时备份数据库
说明 检查Crontab是否安装 若没有 需要先安装Crontab定时工具 安装定时工具参考(https://www.cnblogs.com/shaohuixia/p/5577738.html) 需要 ...
- <深度学习>Tensorflow遇到的坑之一
AttributeError: module 'tensorflow' has no attribute 'random_normal' AttributeError: module 'tensorf ...