原文链接: godwoken/docs/known_caveats_of_polyjuice.md at develop · godwokenrises/godwoken · GitHub
Polyjuice的设计宗旨是提高Nervos的兼容性
-
polyjuice中会使用evmone作为solidity虚拟机,这可以兼容最新版本以太坊上的智能合约
-
Polyjuice通过提供Polyjuice Web3 Provider,适配以太坊Web3接口
然而,由于CKB和Ethereum在整体架构上的不同,开发者在使用polyjuice的时候还是会有一些问题。
本文将记录这些问题,以供参考。
# Account Creation
如果想使用Godwoken的polyjuice,开发者必须先在Godwoken上注册一个账户。
注册账户的方法是向Godwoken deposit一些资产。
# pETH
pETH本身是一个xUDT。每部署一条polyjuice链,就会部署一个pETH代币。pETH代币类似以太坊的ETH,都被用作Gas费用的支付。
用户发起交易时,需要支付pETH作为手续费。
各polyjuice链可以使用不同的代币作为pETH。例如可以强制使用force bridge跨链桥的ETH代币作为pETH。
另外,每一条Godwoken链可以包含多条polyjuice链。每条polyjuice对应Godwoken上的一个账户,类似在Ethereum上的0x0000… 000地址。
pETH在godwoken上部署,用于各Polyjuice。
# 所有代币都是ERC20
在以太坊上,有两种代币,一种是ERC20 token,另一种是ETH这种链原生代币。这也就是为什么会有wETH。
但是在Godwoken中,无论你在CKB上是使用链的CKB原生代币,还是sUDT token,在Godwoken里,它都用sUDT来实现。
Polyjuice确保Godwoken上所有代币都是ERC20格式。
# Godwoken Address vs Ethereum Address
Godwoken address 引入了互操作性,希望您看完本章后,确保您了解其中的注意事项
所有Blockchain都有两个必要的部分:
-
Identity Check : 如何鉴别交易的发起人的身份
-
Computation / Verification : 如何改变链上状态
和其他区块链一样,Ethereum将两个组件合并。然而,在Nervos中,我们将Godwoken中的身份检查和链上计算完全分离开来
以实现新的特性:
-
Ethereum的Dapp 不再只能通过Metamask等以太坊钱包来交互
-
Metamask等以太坊钱包,可以交互除Ethereum以外的链
这俩不是一个事儿么
当前区块链世界中,一个用户通过一个钱包和一个地址与多个Dapp交互。
有了Polyjuice,一个dapp可以通过一次部署,向拥有不同钱包的用户打开。
看上去,我可以通过我Tron链的钱包,连接CKB的Provider,从而使用 CKB上的Dapp。如果是这个意思,那Metamask也能从Heco链上跨到BSC链上,再跨到ETH上。cosmos也行。
然而这种需求有其代价:Ethereum在身份和计算的时候使用的均是20Bytes长度的格式。这对Ethereum来说是好事,ETH计算、验证是一体的,所以用统一规格的address会很方便。
但是Godwoken要交互的并非只有Ethereum,还有Tron、EOS、BTC、CKB或者其他链。这些链的address格式都各不相同。如果我们将所有不同的地址转换成Ethereum使用的20Bytes长度格式,那么这些数据会过于庞大,以至于在polyjuice上没有空间存储。
出于这个考虑,我们引入了Godwoken address。
一旦用户通过Deposit请求,在Godwoken上创建了一个账户。那么这个账户的地址便是用户在Godwoken链上的唯一标识。无论这个账户本身是什么东西。EOA也好,Ethereum合约也好,Diam合约也好。都只有一个标识 —— Godwoken address。
我们当然知道引入这么一个Address会很麻烦,但是我们认为,他的收益大于其缺点。
我们提供了一些工具来弥补这些缺点:
-
我们提供Address转换工具。开发者可以通过这些函数 将 公链Address 和 Godwoken Address 互相转化。
-
用户可以使用 Godwoken Address来签发交易
-
引入一个新的Web3 Provider, 你可以通过这个工具和Godwoken交互。
-
我们将系统函数
ecrecover
改成了recover_account
,在函数返回时会返回Godwoken Address格式的地址。如此一来Polyjuice就可以兼容Ethereum和Godwoken了。
基于上述变化,我们建议您在开发polyjuice项目时,要注意一下事项:
-
通过polyjuice在Ethereum上部署的合约会正常工作,Godwoken地址会经过Polyjuice转换成Ethereum地址
-
我们建议再应用程序的UI中使用公链地址而不是Godwoken地址,这样用户可以直接在应用程序中使用自己的钱包地址。
-
在合约调用的时候,polyjuice会把公链地址转换成Godwoken地址
-
可以通过节点的RPC接口,将Godwoken地址和公链地址互相转换。
总之,我们建议多使用公链地址。某些情况下,必须使用公链地址。