Raiden是一個用來在鏈下處理以太坊ERC20的token transfer的系統(tǒng)娇斑。
其大概的原理見鏈接。
簡單的說,就是用戶A和用戶B有一些ERC20的token需要互相transfer,但是每次都走區(qū)塊鏈交易提交過程太麻煩了,而且交易手續(xù)費也是一筆不小的負擔佩憾。
于是,raiden提供了一種基于鏈外交易的辦法干花,用戶A和B首先往鏈上的某一個合約里各打入一筆錢妄帘,之后通過一些加密手段互相通過鏈下的方式交換一些憑證。到最后結算的時候池凄,將最后的憑證提交 到鏈上抡驼,合約會根據(jù)最終狀態(tài)完成最后交易。
舉例肿仑,A放入20個XXX致盟,B放入20個XXX碎税,然后A,B在鏈外進行一系列交易:A給B3個XXX,B給A2.5個XXX馏锡,A再給B10個XXX雷蹂,結果最終狀態(tài)的憑證是:A給B10.5個XXX。最終結算的時候杯道,只需要再鏈上進行三筆交易:給A9.5個XXX匪煌,給B30.5個XXX
接下來的各篇教程會分析當前Raiden項目的實現(xiàn)。首先我們來看看Raiden系統(tǒng)在鏈上部署了哪些合約党巾。
基本概念
Raiden目前用channel來表示每兩個參與者之間建立的鏈上通道萎庭,本文暫時不解釋鏈下的交易憑證是符合實現(xiàn)和保證準確性的,只討論鏈上用到的智能合約昧港。
Registry合約
Raiden會給每一個token生成一個channelManager擎椰,Registry合約就負責記錄token到channelManager之間的映射。
- addToken
負責添加新token - channelManagerByToken
獲取某個token當前的channelManager
ChannelManagerContract
每一個ChannelManager內都有一個Data對象创肥,記錄了當前注冊在該manager下的所有channel达舒。
ChannelManagerLibrary.Data
Data字段里注冊了當該ChannelManager里的所有channel
caller_channels,partner_channels根據(jù)channel雙方的地址記錄了其對應所有channel的地址
partyhash_to_channelpos記錄了特定兩個地址之間的channel的索引叹侄。
- newChannel(address partner, uint settle_timeout)
在msg.sender和partner之間建立一個channel巩搏。 里面會調用data.newChannel()。
NettingChannelLibrary
這個是最核心的一個庫函數(shù)趾代,是供下面的NettingChannelContract處理具體交易用的贯底。
-
Participant
表示一個參與者和其在該合約內的信息node_address
balance
所有通過deposit轉進來的數(shù)量locksroot
transferred_amount
該參與者轉給另外一個賬戶的總額nonce
withdrawn_locks
-
Data
用來記錄一個channel內的數(shù)據(jù)狀態(tài)和提供操作庫-
deposit
向該Data(也就是該Data所屬channel)轉賬,然后增加對應Partener.balance!!!!! 注意撒强,所有向channel的轉賬禽捆,必須通過該函數(shù)轉賬才行,直接call ERC20 token的transfer函數(shù)飘哨,channel是無法感知的胚想。
close
只能在channel還沒有關閉的時候發(fā)出,只能由channel的某一個參與者發(fā)出芽隆。
發(fā)出close請求后浊服,channel變成closing狀態(tài),close同時參與者還可以發(fā)出一個transfer更新胚吁。updateTransfer
只能在合約處于關閉期并且不是主動關閉合約的那一方發(fā)出牙躺,而且只能更新一次。recoverAddressFromSignature
這個是用來解密交易最后快照的函數(shù)腕扶,暫時不做深入講解withdraw
暫時不是特別清楚settle
最終結算函數(shù)孽拷,根據(jù)雙方的balance和transfer amount,結算對方最終token數(shù)量并調用token合約進行真正的結算
-
NettingChannelContract
這個才是真正負責處理兩個參與者之間交易的合約蕉毯。它主要通過調用上面的NettingChannelContractLibrary進行實際操作乓搬。
EndpointRegistry
這是用來注冊raiden node的合約思犁,里面有一個registerEndpoint方法,將服務器的socket地址mapping到一個ETH address上进肯。這樣當raiden node啟動起來的時候激蹲,其它交易者可以根據(jù)其合約地址找到與這個server的通信地址。