R1協(xié)議是一種高效的去中心化Token互換協(xié)議。它解決了傳統(tǒng)Token互換協(xié)議撮合效率低、用戶(hù)體驗(yàn)差等問(wèn)題,將去中心化Token互換協(xié)議帶入了一個(gè)新的高度。目前,基于以太坊的版本已經(jīng)實(shí)現(xiàn),后續(xù)會(huì)開(kāi)發(fā)其他公鏈版本如NEO、QTUM等。
去中心化Token互換協(xié)議的發(fā)展
傳統(tǒng)互聯(lián)網(wǎng)是傳遞信息的網(wǎng)絡(luò),信息都保存在中心化的機(jī)構(gòu)中,由于缺乏可靠的信任機(jī)制,陌生節(jié)點(diǎn)間無(wú)法完成大規(guī)模的價(jià)值互換。比特幣的出現(xiàn)使可信的價(jià)值轉(zhuǎn)移成為了可能,它對(duì)中心化互聯(lián)網(wǎng)發(fā)起了挑戰(zhàn),同時(shí)也帶動(dòng)了區(qū)塊鏈技術(shù)的蓬勃發(fā)展。在后比特幣時(shí)代,涌現(xiàn)了一大批區(qū)塊鏈創(chuàng)新技術(shù),以太坊正是新型區(qū)塊鏈的卓越代表,除了價(jià)值轉(zhuǎn)移外,它實(shí)現(xiàn)了智能合約,將現(xiàn)實(shí)世界的規(guī)則以算法的形式映射在區(qū)塊鏈上,極大的擴(kuò)展了區(qū)塊鏈的應(yīng)用范圍。一大批區(qū)塊鏈項(xiàng)目基于以太坊的ERC-20標(biāo)準(zhǔn)發(fā)行了自己的代幣,據(jù)不完全統(tǒng)計(jì),目前以太坊上運(yùn)行的代幣超過(guò)一千種, 構(gòu)成了龐大的代幣經(jīng)濟(jì)體系。
種類(lèi)繁多的代幣對(duì)于交換提出了強(qiáng)勁的需求,帶動(dòng)了去中心化Token互換協(xié)議的研究,陸陸續(xù)續(xù)涌現(xiàn)了Etherdelta、0x、IDEX等去中心化交易所,不斷的挑戰(zhàn)中心化交易所的地位。但是,受限于當(dāng)前以太坊的性能,他們都存在著或多或少的問(wèn)題,交易體驗(yàn)不盡如人意。
· Etherdelta
Etherdelta的用戶(hù)需要把資產(chǎn)存入Etherdelta智能合約。在交易時(shí),用戶(hù)將訂單攔到鏈FRelayer,等待別人來(lái)成交。如果想要吃別人的訂單,用戶(hù)需要手動(dòng)指定對(duì)應(yīng)的訂單發(fā)起交易。Etherdelta不會(huì)自動(dòng)撮合用戶(hù)的訂單,交易體驗(yàn)較差。
· 0x
0x用戶(hù)不需要將資產(chǎn)存入智能合約,只需要錢(qián)包中擁有ETH或T oken即可。在開(kāi)始交易之前,用戶(hù)需要將錢(qián)包中的ETH轉(zhuǎn)換為一種叫做WETH的代幣。WETH是與ETH等價(jià)的ERC-20代幣,轉(zhuǎn)換比例為1:1,將ETH轉(zhuǎn)換成W ETH可以使0x合約方便的與其他ERC-20Tokcn進(jìn)行結(jié)算。
開(kāi)始新交易對(duì)的交易前,用戶(hù)還需要設(shè)置對(duì)應(yīng)Token的權(quán)限,授權(quán)允許0x合約轉(zhuǎn)移該Token。盡管0x做到了足夠的去中心化,但是其撮合效率還是很低。對(duì)接0x協(xié)議的撮合引|擎必須不問(wèn)斷的監(jiān)聽(tīng)用戶(hù)錢(qián)包的資金進(jìn)出,如果用戶(hù)錢(qián)包的余額不足,就需要把用戶(hù)的委托訂單從訂單簿中剔除,一旦剔除不及時(shí),該委托訂單的對(duì)手方將交易失敗。在網(wǎng)絡(luò)擁堵或者波動(dòng)大時(shí),這種情況可能頻繁出現(xiàn),嚴(yán)重影響用戶(hù)體驗(yàn)。
· IDEX
意識(shí)到0x協(xié)議的不足——0x智能合約和Rela yer無(wú)法完美的協(xié)調(diào)合作,IDEX選擇由中心化的Relayer將交易提交到鏈上。這樣IDEX可以很好的空制訂單順序,但是任然沒(méi)有解決搶單的問(wèn)題。
R1協(xié)議
1. 架構(gòu)
R1協(xié)議的架構(gòu)包含三部分。
作為去中心化的媒介,R1智能合約部署在以太坊區(qū)塊鏈上,可以存儲(chǔ)用戶(hù)的資產(chǎn)、交易記錄,達(dá)到資產(chǎn)去中心化、交易記錄可審計(jì)的目標(biāo)。
Relayer是訂單中繼系統(tǒng),與R1智能 合約交互,主要負(fù)責(zé)訂單撮合與提交上鏈。Relayer對(duì)外提供OpenAPI,允許第三方交易所提交訂單到撮合引擎。
第三方交易所的主要職責(zé)是收集用戶(hù)的訂單數(shù)據(jù),并將簽名后的訂單提交給Relayer。通過(guò)R1協(xié)議,不同交易所可以成為分布式商業(yè)系統(tǒng)的一部分,共享訂單數(shù)據(jù)和流動(dòng)性,為用戶(hù)帶來(lái)更好的交易深度和體驗(yàn)。
2. 訂單交易
2.1訂單交易流程
訂單交易處理流程描述了從用戶(hù)提交訂單開(kāi)始,到Relayer撮合訂單,再到將交易數(shù)據(jù)提交到區(qū)塊鏈上的過(guò)程。如圖所示:
1. 用戶(hù)輸入訂單信息。用戶(hù)以一定價(jià)格和數(shù)量買(mǎi)入或者賣(mài)出token, 客戶(hù)端將數(shù)據(jù)轉(zhuǎn)換成約定的訂單數(shù)據(jù)格式。
2. 用戶(hù)使用私鑰對(duì)訂單簽名。私鑰由用戶(hù)保管,任何交易所以及Relayer不存儲(chǔ)用戶(hù)的私鑰。放入后臺(tái)訂單池。簽名完成后,客戶(hù)端將訂單信息發(fā)送給Relayer, Relayer對(duì)訂 單信息進(jìn)行合法性校驗(yàn)后,放入訂單池進(jìn)行撮合。
3. 后臺(tái)撮合成功。Relayer的撮合引擎對(duì)來(lái)自不同交易所的所有訂單進(jìn)行統(tǒng)一撮合。
4. 后臺(tái)提交到鏈上交易。撮合成功后,Relayer會(huì)將匹配的兩個(gè)訂單信息及交易額提交到區(qū)塊鏈上進(jìn)行最終的結(jié)算。
以上為訂單交易的基本流程,下面詳細(xì)說(shuō)明每個(gè)過(guò)程的技術(shù)細(xì)節(jié),包含:
●訂單的數(shù)據(jù)格式;
●訂單簽名算法;
●Relayer職責(zé);
●鏈上結(jié)算邏輯。
2.2 訂單
訂單數(shù)據(jù)格式
在交易所中,用戶(hù)的訂單信息體現(xiàn)為:交易對(duì)+交易價(jià)格+交易數(shù)量。
而在R1智能合約中,訂單的數(shù)據(jù)格式如下:
參數(shù)說(shuō)明如下:
● tokenBuy: 用戶(hù)希望購(gòu)買(mǎi)的token合約地址
● amountBuy: 用戶(hù) 希望購(gòu)買(mǎi)的token數(shù)量
● tokenSel: 用希望賣(mài)出的token合約地址
● amountSell: 用戶(hù)希望賣(mài)出的token數(shù)量
●baseToken:交 易對(duì)錨定的基礎(chǔ)token。默認(rèn)填0,表示對(duì)ETH的交易對(duì)。如果是對(duì)RNT的交易對(duì),此處填RNT的合約地址
● expires:訂單過(guò)期區(qū)塊數(shù)。默認(rèn)設(shè)置-一個(gè)比較大的值,表示永不過(guò)期
● nonce: 隨機(jī)數(shù)。 用來(lái)保證訂單唯一性,目前的方案是nonce值為時(shí)間藏
●feeToken: 手續(xù) 費(fèi)支付方式。如果為0,按傳統(tǒng)方法支付,即手續(xù)費(fèi)從用戶(hù)獲得的token中扣除。如果為token合約地址,則使用該種Token支付手續(xù)費(fèi),前提是用戶(hù)存入了該token到R1智能合約中
訂單簽名
為了讓用戶(hù)的訂單能夠在網(wǎng)絡(luò)中安全的傳播并且不被篡改,需要用戶(hù)的私鑰對(duì)訂單數(shù)據(jù)進(jìn)行簽名。
訂單數(shù)據(jù)的簽名過(guò)程為:
其中
客戶(hù)端將訂單數(shù)據(jù)簽名完成后,會(huì)將訂單原始數(shù)據(jù)、訂單哈希值和訂單簽名一起發(fā)生到Relayer。Relayer會(huì)對(duì)這些數(shù)據(jù)進(jìn)行合法性校驗(yàn),主要校驗(yàn)訂單哈希值是否一致、訂單簽名是否正確,以防止訂單數(shù)據(jù)被篡改。
需要強(qiáng)調(diào)的一點(diǎn)是,對(duì)于Relayer來(lái)說(shuō),在接收到用戶(hù)的訂單信息之前,無(wú)法知道這個(gè)用戶(hù)是maker還是taker。Relayer會(huì)根據(jù)訂單信息到達(dá)的時(shí)間先后和當(dāng)前訂單池的數(shù)據(jù),來(lái)決定這個(gè)用戶(hù)是taker還是maker。如果訂單池中有對(duì)應(yīng)的訂單匹配價(jià)格,則最新提交訂單的用戶(hù)成為taker,另一方則成為maker。所以,每個(gè)用戶(hù)提交的訂單都應(yīng)該包含訂單原始數(shù)據(jù)、訂單哈希值和訂單簽名,對(duì)于Relayer來(lái)說(shuō)每個(gè)用戶(hù)都是對(duì)等的。
2.3 Relayer撮合
Relayer主要負(fù)責(zé)訂單撮合、錢(qián)包余額維護(hù)、提交上鏈等。Relayer內(nèi)部各系統(tǒng)組成如下圖所示:
● OpenAPl: Relayer 對(duì)外提供API,第三方可以通過(guò)OpenAPI提交訂單、查詢(xún)交易狀態(tài)、訂單深度以及錢(qián)包余額
● Valiator: 對(duì)訂單數(shù)據(jù)合法性進(jìn)行校驗(yàn),對(duì)賬廣余額進(jìn)行校驗(yàn)
● AccountSystem: 負(fù)責(zé)維護(hù)錢(qián)包余額
● BlockSyncing: 負(fù)責(zé)區(qū)塊信息同步,同步區(qū)塊鏈余額信息等
● MatchingEngine: 撮合引擎,負(fù)責(zé)撮合訂單
● MessageQueue: 消息系統(tǒng)。負(fù)責(zé)系統(tǒng)間通信
●Store: 存儲(chǔ)模塊。負(fù)責(zé)存儲(chǔ)信息,臨時(shí)數(shù)據(jù)緩存等。
Relayer處理邏輯
Relayer收到訂單數(shù)據(jù)后的內(nèi)部處理流程如下:
1. 對(duì)訂單數(shù)據(jù)進(jìn)行校驗(yàn)。 這里主要校驗(yàn)訂單的哈希值是否匹配,防止訂單數(shù)據(jù)被篡改;校驗(yàn)用戶(hù)簽名是否正確,保證訂單數(shù)據(jù)確實(shí)由某個(gè)擁有正確私鑰的賬號(hào)發(fā)起; 校驗(yàn)余額是否充足; 這里任何一步交易不通過(guò)都會(huì)引發(fā)訂單提交的失敗
2. 訂單撮合。訂單數(shù)據(jù)校驗(yàn)成功后,訂單被放入撮合引擎進(jìn)行撮合,同時(shí)訂單數(shù)據(jù)記錄到數(shù)據(jù)庫(kù)中。撮合引擎會(huì)根據(jù)訂單提交時(shí)間和價(jià)格高低來(lái)匹配訂單,一旦撮合成功,會(huì)標(biāo)記訂單成交。并且會(huì)將匹配的兩個(gè)訂單放入消息隊(duì)列,等待提交到鏈上結(jié)算。
3. 提交上鏈。 提交到鏈上結(jié)算調(diào)用合約的batchTrade或trade方法, 并且只有admin賬號(hào)進(jìn)行提交。admin賬號(hào)是由合約owner設(shè)置的賬號(hào),有權(quán)限調(diào)用trade方法。為了提高并發(fā),Relayer可以用多個(gè)admin賬號(hào)調(diào)用trade方法。
交易手續(xù)費(fèi)
由于調(diào)用trade方法的是admin賬號(hào),因此gas費(fèi)用是從admin賬號(hào)中扣除的。Relayer需 要保證admin賬號(hào)有足夠的ETH額度,否則可能由于額度不足以支付gas費(fèi)用而無(wú)法提交上鏈。
這筆gas費(fèi)用會(huì)由admin事先墊付,但是最終還是需要由交易雙方來(lái)共同承擔(dān)。目前的做法是maker和taker各承擔(dān)gas費(fèi)用的50%。
所以,用戶(hù)的手續(xù)費(fèi)包含兩部分:交易額的0.1%+ gas費(fèi)用的50%。Relayer會(huì)根據(jù)這 個(gè)原則算出需要扣除的token數(shù)量,傳入trade方法作為參數(shù),trade方法 會(huì)扣除相應(yīng)的費(fèi)用。對(duì)于用戶(hù)來(lái)說(shuō),用戶(hù)實(shí)際得到的token數(shù)量會(huì)比交易計(jì)算得到的數(shù)量少一些,少的部分即為扣除的費(fèi)用。
2.4 鏈上結(jié)算
鏈上結(jié)算的邏輯主要在R1智能合約的trade方法中實(shí)現(xiàn)。trade方法主要對(duì)maker和taker的訂單進(jìn)行校驗(yàn),以及做資產(chǎn)的鏈上交割。
以下說(shuō)明trade方法的具體實(shí)現(xiàn)細(xì)節(jié)
輸入?yún)?shù)
trade方法的輸入?yún)?shù)包含以下幾部分: ;
1. maker的訂單數(shù)據(jù)(見(jiàn)訂單數(shù)據(jù)格式一節(jié)說(shuō)明)
2. taker的訂單數(shù)據(jù) (見(jiàn)訂單數(shù)據(jù)格式一節(jié)說(shuō)明)
3. maker的簽名信息(υ,r,s)
4. taker的簽名信息 (υ,r,s)
5. 交易額( Relayer根據(jù)撮合結(jié)果設(shè)置本次交易額)
6. maker和taker的應(yīng)收手續(xù)費(fèi)(由Relayer設(shè)置)
7. 接收手續(xù)費(fèi)的賬號(hào) (由Relayer設(shè)置)
其中1、2、3、4這四部分的信息由用戶(hù)提供,其他人都不可篡改;而5、6、7三項(xiàng)數(shù)據(jù)由Relayer設(shè)置,
輸入?yún)?shù)校驗(yàn)
在進(jìn)行最終的資產(chǎn)交割前,需要交驗(yàn)輸入的參數(shù)是否合法,以保證交易能夠按照用戶(hù)的意圖進(jìn)行成交。需要校驗(yàn)的步驟包含:
●必須是admin賬號(hào)調(diào)用trade方法
●feeAccount (手續(xù)費(fèi)接收賬號(hào))必須合法。也就是說(shuō)feeAccount必須是合約owner授權(quán)過(guò)的
●交易雙方的訂單必須是同一交易對(duì)。合約中的代碼片段:
· maker和taker的簽名確認(rèn)。 合約中的代碼片段如下:
· 訂單價(jià)格必須匹配。訂單成交的基礎(chǔ)是價(jià)格匹配,價(jià)格必須滿足:
其中:
合約中代碼片段如下:
●余額充足。需要保證訂單交易的時(shí)候有足夠的額度,不會(huì)超過(guò)用戶(hù)希望交易的額度
以上所有條件校驗(yàn)通過(guò),才能進(jìn)行最終的資產(chǎn)交割。交割成功,該筆交易會(huì)完整的記錄在區(qū)塊鏈上。
3. 充值與提現(xiàn)
R1協(xié)議的充值提現(xiàn)與中心化交易所的流程基本一致,不同的是使用R1協(xié)議的用戶(hù)將資金存入智能合約中,不受任何第三方控制,即使交易所被黑客攻擊,用戶(hù)的資金也是安全的,做到了資產(chǎn)的去中心化。需要注意的是,只有私鑰的所有者才能操作轉(zhuǎn)入R1智能合約的資產(chǎn),用戶(hù)需要妥善保管自己的私鑰。
3.1充值
R1智能合約中用戶(hù)通過(guò)兩個(gè)方法進(jìn)行充值:
●deposit ()
●depositToken
deposit方法允許用戶(hù)將eth充入R1智能合約中。該方法會(huì)在區(qū)塊鏈上登記用戶(hù)的資產(chǎn)余額,同時(shí)拋出一個(gè)Deposit 充值事件; Relayer通過(guò)監(jiān)聽(tīng)該事件感知用戶(hù)的充值。
depositToken方法允許用戶(hù)將token充入R 1智能合約中。與充值eth的不同之處在于,根據(jù)ERC-20 Token的標(biāo)準(zhǔn),用戶(hù)充值前需要調(diào)用token合約的approve 方法,授權(quán)R 1智能合約轉(zhuǎn)賬token。只有完成這一步操作, 用戶(hù)才能成功將token充入智能合約中。為了減少approve操作次數(shù),接入R1協(xié)議的交易所可以在用戶(hù)第一次充值token時(shí)讓用戶(hù)授權(quán)一個(gè)比較大的額度。這樣,用戶(hù)再次充值該token時(shí),不需要進(jìn)行額外的approve操作,消耗gas 費(fèi)用。
3.2 提現(xiàn)
用戶(hù)可以隨時(shí)取出自己的資金,不需要人工審核。R1智能合約的用戶(hù)提現(xiàn)有以下幾種方法:
● adminWithdraw
● withdraw
● withdrawNoLimit
adminWithdraw是比較常用的提現(xiàn)方法。它的原理是,用戶(hù)將提現(xiàn)的操作委托給Relayer,Relayer根據(jù)用戶(hù)的提現(xiàn)請(qǐng)求調(diào)用R1合約的admin Withdraw,將資金轉(zhuǎn)賬給用戶(hù)的錢(qián)包。由于提現(xiàn)請(qǐng)求需要用戶(hù)的私鑰簽名,任何第三方(包括Relayer )都不能篡改用戶(hù)的數(shù)據(jù),保證了提現(xiàn)的安全可靠。該方法的意義在于,提現(xiàn)請(qǐng)求最先由Relayer感知,Relayer可以快速及時(shí)地更新訂單池,提供更好的交易體驗(yàn)。
withdraw適用于懂得如何調(diào)用智能合約的用戶(hù)。如果用戶(hù)不希望將提現(xiàn)數(shù)據(jù)委托給Relayer,那么他可以選擇調(diào)用合約的withdraw方法。但是在調(diào)用該方法前,用戶(hù)需要經(jīng)歷一個(gè)兩階段提現(xiàn)的過(guò)程。即用戶(hù)需要先調(diào)用apply Withdraw方法申請(qǐng)?zhí)岈F(xiàn),在滿足以下兩個(gè)條件的情況下,用戶(hù)才能調(diào)用
withdraw方法成功提現(xiàn)。這兩個(gè)條件是:
1. Relayer調(diào)用了approveWithdraw 方法, 同意用戶(hù)的提現(xiàn)請(qǐng)求;
2. 申請(qǐng)超過(guò)了一定的等待期后;
等待期由合約的owner設(shè)置,當(dāng)前設(shè)置的等待期為7天。合約owner會(huì)視不同情況調(diào)整等待期,如1天甚至1小時(shí),但不能超過(guò)7天。
withdrawNoLimit允許用戶(hù)方便的提現(xiàn)。只需要調(diào)用該方法即可提現(xiàn),前提是合約的owner開(kāi)啟該方法的開(kāi)關(guān)。一般情況下該方法是關(guān)閉的,只有在特殊情況如Relayer由于某些原因不能及時(shí)響應(yīng)用戶(hù)的提現(xiàn)申請(qǐng)時(shí),該方法才會(huì)打開(kāi),方便用戶(hù)提現(xiàn)。
4. R1合約的治理
作為以太坊區(qū)塊鏈上的-份智能合約,R1 由ONEROOT團(tuán)隊(duì)創(chuàng)建并部署,即R1智能合約的owner為ONEROOT團(tuán)隊(duì)。為了保證R1協(xié)議安全穩(wěn)定的運(yùn)行,R1 智能合約的owner擁有一些特殊的權(quán)限,包含:
● 設(shè)置admin 管理員賬號(hào)。admin賬號(hào)負(fù)責(zé)調(diào)用trade、 adminWithdraw、 approveWithdraw等方法,保證Relayer維持正常的交易功能。
● 設(shè)置手續(xù)費(fèi)賬號(hào)。只有經(jīng)過(guò)授權(quán)的賬號(hào)才能接受用戶(hù)支付的手續(xù)費(fèi)。
● 調(diào)整提現(xiàn)等待時(shí)間。R1智能合約的owner可以根據(jù)情況調(diào)整提現(xiàn)等待時(shí)間,方便用戶(hù)提現(xiàn)。
● 開(kāi)啟便捷提現(xiàn)開(kāi)關(guān)。在特殊情況下,如Relayer無(wú)法提供提現(xiàn)服務(wù)時(shí),R1 合約的owner需要開(kāi)啟該開(kāi)關(guān),方便用戶(hù)快速地提現(xiàn)。
admin Withdraw是比較常用的提現(xiàn)方法。它的原理是,用戶(hù)將提現(xiàn)的操作委托給Relayer,Relayer根據(jù)用戶(hù)的提現(xiàn)請(qǐng)求調(diào)用R1合約的adminWithdraw,將資金轉(zhuǎn)賬給用戶(hù)的錢(qián)包。由于提現(xiàn)請(qǐng)求需要用戶(hù)的私鑰簽名,任何第三方(包括Relayer )都不能篡改用戶(hù)的數(shù)據(jù),保證了提現(xiàn)的安全可靠。該方法的意義在于,提現(xiàn)請(qǐng)求最先由Relayer感知,Relayer可以快速及 時(shí)地更新訂單池,提供更好的交易體驗(yàn)。
未來(lái)研究
作為價(jià)值傳輸網(wǎng)絡(luò)的重要組成部分,中心化Token互換協(xié)議的研究日益深入,相關(guān)產(chǎn)品層出不窮。R1協(xié)議專(zhuān)注于提升用戶(hù)的交易體驗(yàn),力求達(dá)到中心化交易所的標(biāo)準(zhǔn)。然而,對(duì)所有基于以太坊的協(xié)議來(lái)說(shuō),以太坊網(wǎng)絡(luò)的處理能力始終是提升交易速度的瓶頸。但這并非一成不變的,即將到來(lái)的Plasma技術(shù)為以太坊帶來(lái)了商用化的希望。
Plasma技術(shù)的實(shí)現(xiàn)將大幅度提升以太坊網(wǎng)絡(luò)的TPS,改變以太坊網(wǎng)絡(luò)擁堵的狀況。同樣的,R1協(xié)議也可以采用Plasma技術(shù),在以太坊上部署-份Plasma合約, 同時(shí)啟動(dòng)一條Plasma子鏈,將Relayer的功能遷移到Plasma子鏈上,在提升性能的同時(shí)做到完全的去中心化。
除了以太坊網(wǎng)絡(luò)的技術(shù)發(fā)展,在其他公鏈上實(shí)現(xiàn)R1協(xié)議也是ONEROOT團(tuán)隊(duì)的研究方向。以EOS為例,隨著生態(tài)的不斷發(fā)展,基于EOS的Token將越來(lái)越多,相應(yīng)的去中心化交易所也會(huì)不斷涌現(xiàn)。受益于良好的TPS性能,這些交易所性能將遠(yuǎn)超以太坊,為用戶(hù)帶來(lái)非凡的交易體驗(yàn),而這也是ONEROOT研究的方向。
評(píng)論
查看更多