PalletOne調色板Token PTN跨鏈轉網的技術原理

之前一直在忙於通用跨鏈公鏈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.定時任務掃描以太坊,觸發轉網合約

原本是計劃讓用戶自己來調用以太坊合約,將ERC20鎖定轉賬的交易Hash作爲參數傳入的,但是發現一個矛盾的地方,就是用戶還沒有進行轉網的話,就沒有PTN,沒有PTN就沒辦法發起合約調用,所以就沒辦法獲得轉網的PTN。所以就由我們發佈一個定時任務來做。該程序不斷的循環掃描以太坊上的ERC20 PTN的事件日誌,如果發現有PTN的轉賬,則看轉賬的接收方是不是鎖定合約地址,如果是,則說明有人要進行轉網。接下來就是判斷該交易是否被足夠的塊確認,一旦確認的塊數達到一定數量(比如15個確認),那麼就觸發PalletOne轉網合約的調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章