之前一直在忙于通用跨链公链PalletOne的研发,没有怎么做技术分享的博客,最近PalletOne主网上线也有几个月的时间了,即将进行PTN(PalletOne上面的主Token)从ERC20到主网的转网工作。在转网进行时,正好将这其中的技术原理与大家分享。

一、Token转网的方式

因为ERC20同质化通证标准的流行,大量区块链项目都是通过先在以太坊上以ERC20的形式发行Token,进行募资、糖果发放、Token买卖等,等到自己的主链研发完成,就会将ERC20上的Token销毁或者冻结,而将对应数量的Token在主网上发放到各个持币用户,这个过程叫做Token转网。

Token转网一般有两种方式,通过交易所转网或者通过项目方转网。通过交易所转网对用户来说最简单,用户只需要将ERC20充币到对应的交易所,然后再提币时,提的就是主网的Token。而通过项目方转网的实现方式就比较多了,有通过以太坊合约进行地址映射,通过专门的转网网站进行转网操作,通过以太坊快照确认每个地址的Token余额,通过创世区块进行Token分配等多种方式,看项目方根据自己链的特点来决定。

二、交易所转网的技术原理

交易所要支持一个新的公链,那么必然会在交易所建立该公链的全账本节点,而交易所本来就支持ERC20代币,所以也有以太坊的全账本节点。交易所转网分为一次性转网和持续转网两种操作方式。

一次性转网

一次性转网就是交易所规定一个时间,在该时间后,不再支持该ERC20的充币提币,交易所获得一个确定的ERC20余额,然后将这些ERC20按项目方的要求进行销毁或者转移到某个锁定地址。项目方将对应数量的主网Token转移到交易所的新公链钱包地址。这些操作完成后,交易所重新打开该Token的充币提币通道,只不过现在充币只能接受主网的Token,充币地址也是该主网的新地址,而提币也只能提取主网的Token。

持续性转网

持续转网是指交易所不规定停止ERC20充币的时间,用户随时都可以将ERC20充币到交易所,也就是说充币支持主网Token和ERC20两种方式,而提币只支持主网Token。交易所先按一次性转网的流程,将自己持有的ERC20兑换成主网Token,以后当用户充值的是ERC20时,交易所会定时将所有充值的ERC20进行销毁或者转移到项目方规定的锁定地址,然后向项目方发出ERC20兑换的请求,这个请求一般会发送到项目方的一个RPC API,项目方的该API确认ERC20锁定后,会将自己持有的主网Token以对应数量发送给交易所指定的地址。

三、PTN转网合约的技术原理

PalletOne调色板因为本身就是一个支持比特币、以太坊等公链的通用跨链公链,所以其上的Token PTN转网就基于其跨链的特点,再配合上陪审团和以太坊适配器执行跨链合约,实现主网智能合约的Token转网。下面详细介绍一下其中的技术原理。

1.以太坊发布地址映射与Token锁定合约

要进行异构链的Token转网,一般来说需要3步操作:

  1. 以太坊地址与主网地址的映射
  2. ERC20的锁定
  3. 主网Token的释放

其中步骤1和2都可以在以太坊上通过智能合约来实现。如果以太坊上面ERC20 Token转账时能够附上一句话,那么就太简单了,只需要在将ERC20转移到锁定地址的这个交易中,以字符串形式附上本次锁定的Token在主网中对应的映射地址即可。但是我们看看ERC20的标准:https://eips.ethereum.org/EIPS/eip-20

function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)

无论是transfer还是transferFrom,都只有金额,没有备注字段,所以我们想要在转账时附加上主网映射地址是不现实的。所以我们需要专门发布一个地址映射的合约方法,持币用户调用该方法时,合约将持币用户地址与传入的主网地址进行关联,再使用一个查询方法,即可查询以太坊地址对应的主网地址。另外还有一个方案是发布一个地址映射的网站,持币用户到该网站注册以太坊地址和主网地址的映射,然后网站给出一个字符串,用户用以太坊的私钥对该字符串进行签名,并提交签名给网站,这样网站就可以验证这次映射确定是该以太坊用户自己发出,而不是别人冒充的。

以上提出的2个方案都有个验证的问题,那就是对持币用户要求很高。一个普通的持币用户,没有太多的计算机知识,没有广泛被使用的合约调用或者签名的钱包工具,那么是很难操作“调用地址映射方法”和“对消息进行签名”的。普通的支持ERC20的钱包,主要就是对ERC20标准的支持,也就是对transfer函数的支持,所以PalletOne地址映射方法被包装成了transfer方法,用户只需要用普通的以太坊钱包即可实现地址映射。

其中的具体原理是,以太坊的address _to地址是20字节,而PalletOne的地址虽然形如:P1CumdbKemvLLFXQxH7ufHgjRSzcednFvgd 这样的形式,但是其本质上也是20字节,所以我们可以将PalletOne地址转换为以太坊地址:0x82a445064ac1de016719c653fcd2d13e5b62575c,所以我们定义一个新的ERC20 Token,名字叫PTNMap,持币用户在钱包中添加这种Token,然后就可以看到余额为1(表示没有进行映射),发起转账,将接收方设置为PalletOne地址转换后的以太坊地址即可。转账成功后,可以看到余额为0,则说明地址映射成功了。

该合约不仅仅是一个包装成了ERC20的地址映射合约,也是一个Token锁定合约。持币用户在进行了PTNMap的转账(地址映射)后,即可将ERC20转账到该合约地址。由于该合约没有提出ERC20的合约方法,所以这是一个锁定(销毁)合约。

2.PalletOne的以太坊适配器

PalletOne基于对大量主流区块链的抽象,完成了区块链操作的适配器抽象接口定义,在适配器的接口定义中,定义了区块链通用操作、加密货币操作、智能合约操作3大类。Eth-Adaptor以太坊适配器是一种针对以太坊ETH和ERC20的实现。https://github.com/palletone/eth-adaptor

针对PTN转网来说,以太坊适配器主要使用了

GetTransferTx(input *GetTransferTxInput) (*GetTransferTxOutput, error)

GetPalletOneMappingAddress(addr *GetPalletOneMappingAddressInput) (*GetPalletOneMappingAddressOutput, error)

这两个方法,一个用于转网合约查询某笔ERC20转账交易是否成功,源地址、目标地址、金额等,一个用户计算在主网的地址,然后就可以根据金额和主网地址进行主网Token的发放。

3.PalletOne主网部署转网合约

PalletOne支持图灵完备的智能合约,并且从设计上能够支持多语言(Golang、Java、NodeJS等),支持多链的操作(比特币、以太坊等)。

PalletOne的智能合约与其他公链不同,智能合约并不在记账节点运行,而是在选出的陪审团内运行。一个陪审团由至少4个陪审员节点组成(当然也可以采用更多陪审员节点以进一步加强安全性),每个陪审员分别独立的运行合约,得到合约执行结果,并进行签名,如果3/4的节点都对同一个结果达成共识并签名,那么这个结果就被认为是可信的,记账节点会将这个结果进行打包。

本次PTN转网合约由Golang写成,PTN转网合约的核心方法是:

func (p *PTNMain) PayoutPTNByTxID(ethTxID string, stub shim.ChaincodeStubInterface) pb.Response

其主要逻辑就是通过传入的锁定ERC20的以太坊交易Hash,调用适配器查询交易是否真实存在,并获得交易细节,根据交易金额和映射地址,将合约上的PTN转移给对应的用户地址。当然还有很多关于错误判断、重放攻击检查之类的,就不一一详述了。

4.定时任务扫描以太坊,触发转网合约

原本是计划让用户自己来调用PalletOne合约,将ERC20锁定转账的交易Hash作为参数传入的,但是发现一个矛盾的地方,就是用户还没有进行转网的话,就没有PTN,没有PTN就没办法发起合约调用,所以就没办法获得转网的PTN。所以就由我们发布一个定时任务来做。该程序不断的循环扫描以太坊上的ERC20 PTN的事件日志,如果发现有PTN的转账,则看转账的接收方是不是锁定合约地址,如果是,则说明有人要进行转网。接下来就是判断该交易是否被足够的块确认,一旦确认的块数达到一定数量(比如15个确认),那么就触发PalletOne转网合约的调用。

最后,PalletOne的转网合约操作步骤嵌入到了PalletOne钱包中,用户可以下载钱包,自行转网:https://pallet.one/wallet/

PalletOne调色板Token PTN跨链转网的技术原理的更多相关文章

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

    实现区块链的跨链,最主要的诉求就是Token的转移,而Token的跨链转移又分为充币和提币2种操作.以PalletOne调色板来说,如果要把ETH跨链到PalletOne上来流转,就是ETH的充币操作 ...

  2. PalletOne调色板跨链的BTC实现

    之前已经讲到了PalletOne调色板跨链以太坊ETH和ERC20的技术原理,接下来我们来讲解PalletOne跨链比特币BTC的技术原理. 一.BTC充币 假如用户A持有一定数量的比特币BTC,他希 ...

  3. 基于SimpleChain Beta的跨链交互与持续稳态思考

    1. 区块链扩展性迷局 比特币作为第一个区块链应用与运行到目前为止最被信任的公链,其扩展性问题却持续被作为焦点贯穿着整个链的发展周期.事实上,在2009年1月4日比特币出现的那一天到2010年10月1 ...

  4. SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换

    作者介绍 虫洞社区·签约作者 steven bai 前言 如果能够进行以太坊和比特币跨链原子资产交换,是不是一件很酷的事情? 目前链下的扩容方式有很多,最广为人知的就是比特币的闪电网络和以太坊的雷电网 ...

  5. BlockChain 的跨链技术的重要性和必要性

    本期我们将从跨链技术的重要性和必要性.畅想区块链未来世界.什么是跨链.目前四种跨链技术的对比.构建EOS同构跨链体系群.EOCS跨链技术介绍.跨链通道.中继等几个层面带大家走进EOS跨链和EOCS的世 ...

  6. Bystack跨链技术源码解读

    Bystack是由比原链团队提出的一主多侧链架构的BaaS平台.其将区块链应用分为三层架构:底层账本层,侧链扩展层,业务适配层.底层账本层为Layer1,即为目前比较成熟的采用POW共识的Bytom公 ...

  7. ES Bridge跨链桥服务升级,新增BSC跨链网络

    3月15日,Equal Sign Bridge(ES Bridge)跨链桥宣布新增BSC跨链网络,方便更多用户参与到ES Bridge的建设与发展,未来还将持续拓展更多的主流跨链币种,提升各链间的互操 ...

  8. 分享系列--面试JAVA架构师--链家网

    本月7日去了一趟链家网面试,虽然没有面上,但仍有不少收获,在此做个简单的分享,当然了主要是分享给自己,让大家见笑了.因为这次是第一次面试JAVA网站架构师相关的职位,还是有些心虚的,毕竟之前大部分时间 ...

  9. EOCS跨链核心技术内幕

    EOCS跨链技术的核心就是ICP模块,ICP即Inter Chain Protocol(跨链交互协议),下面着重介绍ICP工作原理和实现细节. Inter Chain Protocol(ICP) IC ...

随机推荐

  1. netty用法总结

    /**decoder和encoder,如果不需要解析,就使用系统的 * ch.pipeline().addLast(new StringDecoder()); * ch.pipeline().addL ...

  2. BBS项目知识点汇总

    目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...

  3. Error: Cannot find module 'webpack/lib/node/NodeTemplatePlugin'

    在webpack的管理输出的部分,设定HtmlWebpackPlugin部分,运行npm run build 会报错 Error: Cannot find module 'webpack/lib/no ...

  4. 使用where 过滤数据

    --本章主要内容是MySQL中使用where搜索条件进行过滤数据. where条件在from子句后面给出,如下所示: select name,price from shops where price& ...

  5. 基于C#WPF框架——动画

    WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不必考虑它们的渲染方式.这个模型基于依赖项属性基础架构.本质上,WPF动画只不过是在一段时间间隔内修染方式.这个模型基于依赖项属性基础架 ...

  6. 规范git commit提交记录和版本发布记录

    在开发过程中我们一般都会用到git管理代码,在git commit提交代码时我们一般对git commit message随便写点简单的描述,可是随着项目参与人数的增多,发现提交的commit记录越来 ...

  7. Nginx优化之一

    一.Nginx安全优化 1.1:隐藏nginx版本信息 官方配置参数说明:http://nginx.org/en/docs/http/ngx_http_core_module.html#server_ ...

  8. 多线程之美2一ThreadLocal源代码分析

    目录结构 1.应用场景及作用 2.结构关系 2.1.三者关系类图 2.2.ThreadLocalMap结构图 2.3. 内存引用关系 2.4.存在内存泄漏原因 3.源码分析 3.1.重要代码片段 3. ...

  9. 这几天加班熬夜把所有Python库整理了一遍,非常全面!

    库名称简介 Chardet 字符编码探测器,可以自动检测文本.网页.xml的编码.colorama 主要用来给文本添加各种颜色,并且非常简单易用.Prettytable 主要用于在终端或浏览器端构建格 ...

  10. Pycharm导入Django项目

    Pycharm导入Django项目 添加项目:file-->open,找到项目所在的位置打开项目 添加django后台项目路径 file-->settings-->Languages ...