Conflux 中的代付機制詳解

Conflux中文社群發表於2022-01-21

代付簡介

絕大部分的公有鏈中都存在著名為 gas 的機制(或稱之為“燃氣費”),該機制有著豐富的作用,如對抗拒絕服務攻擊、迴避智慧合約的停機問題、激勵礦工等。但 gas 機制也隨之帶來了一個問題,那就是提高了使用者與智慧合約進行互動的門檻 —— gas 意味著擁有區塊鏈中的原生代幣是與智慧合約進行互動的前提

就原生代幣的獲取途徑而言,除了挖礦外,使用者只能通過鏈下的方式從其他使用者處(也包括交易所)獲取。在當前的大環境下,不管是挖礦還是鏈下交易,都意味著極高的門檻。此外,使用者每次與合約進行互動都意味著花費 gas,每次操作都存在著成本,使用者在交易之前可能權衡付出這麼多 gas 是否值得.這一點在以太坊上體現得非常明顯,直接在主鏈操作需要付出高額的 gas(不過高 gas 費的問題可以通過部分 layer2 的技術緩解)。

Conflux 中的代付機制,簡而言之,就是允許其他使用者為某個智慧合約的互動者支付 gas 費(在 Conflux 中儲存抵押費也可被代付,這裡先不談)。“被代付”的使用者發起交易時不必承擔 gas 開銷。代付啟用後,一個餘額為0的賬戶也能夠與合約進行互動,極大地降低了使用者與合約互動的門檻。

設定代付

正如“代付”這個名字所表達的,一個餘額為0的賬戶能夠與合約進行互動,並不是因為相應的費用被免除了,而是有其他人支付了相應的費用。 Conflux 的內建合約 SponsorWhitelistControl 就負責管理代付機制。提供代付資金的人向SponsorWhitelistControl支付一筆CFX,並指定代付的合約地址即可。

如果不想考慮任何代付的細節,只是希望為一個還沒有設定代付的合約設定代付的話,可以按照下面的步驟進行互動。這裡會略去部分細節,並且儘可能地保證此設定能對幾乎所有的合約通用。下面的截圖中使用了 Conflux Studio 的圖形化介面與SponsorWhitelistControl合約進行互動(Conflux Studio的使用方法可以參考 https://forum.conflux.fun/t/t... )。測試網水龍頭中一次可以獲取 1000 CFX,下面的示例會分別為 gas 與儲存抵押設定 400 CFX的代付。通過訪問一次水龍頭就可以完成下列的所有操作。實際環境中如何設定代付的金額請視具體場景而定。
<!-- 文章最後也會提供對應的使用 js-conflux-sdk 的 javascript 指令碼。 -->

在測試網環境中,CFX 代幣可以通過測試網水龍頭獲取(Conflux Studio 中均有入口,也可以使用測試網水龍頭DApp進行獲取)。在主網(Conflux Tethys中)中除了可以自行設定代付外,還可以在Conflux Scan的贊助合約頁面頁面向Conflux基金會申請,由Conflux基金會為合約代付。
  1. 部署一個合約。可以使用 Conflux Studio 中提供的 ERC20 模版建立並部署合約,這裡略去具體的步驟。
  2. 合約的admin(或合約本身)在SponsorWhitelistControl中設定代付白名單列表。合約的 admin 預設為合約的建立者,關於 admin 更詳細的說明可以參考 Conflux 內建合約功能介紹AdminControl的部分。

    1. SponsorWhitelistControl合約(地址0x0888000000000000000000000000000000000001)互動。選擇addPrivilegeByAdmin方法。
    2. 在引數中contractAddr設定為希望設定代付的合約地址。
    3. addresses引數中新增元素cfxtest:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6f0vrcsw(cfxtestnet中 的 0 地址)。
    4. signer 選擇合約的admin。
    5. 在Estimate後執行,不出錯即可。

      image.png

  3. 設定 Gas 代付。

    1. 仍然與SponsorWhitelistControl合約互動。選擇setSponsorForGas方法。
    2. 設定CFX to Send。填入400
    3. contractAddr設定為希望設定代付的合約地址。
    4. upperBound設定為10000000000(10G)
    5. signer可以進行任意設定,只要其具有足夠多的 CFX 即可(大於設定的500)
    6. 同前estimate並執行

image.png

  1. 設定抵押代付。

    1. SponsorWhitelistControl合約互動。選擇setSponsorForCollateral方法。
    2. 設定CFX to Send。填入400
    3. contractAddr設定為希望設定代付的合約地址。
    4. signer可以進行任意設定,只要其具有足夠多的 CFX 即可(大於設定的500)
    5. 同前estimate並執行

image.png

至此,合約的代付設定完畢。

代付中的部分細節說明

本部分會對上述提到的部分引數進行說明,詳細的說明可以參考Conflux 內建合約功能介紹,該文對代付的方方面面做到了非常詳盡的介紹。

合約的代付白名單列表

合約代付採用了白名單機制,在SponsorWhitelistControl合約中,為每個合約地址維護了一個使用者白名單列表:只有位於白名單中的使用者才能被代付。預設情況下該白名單為空,意味著代付未被啟用。

該列表由合約的 admin 呼叫addPrivilegeByAdmin進行設定,或者由合約自己呼叫SponsorWhitelistControl合約的addPrivilege方法。如果白名單中存在0地址,那麼任何與合約互動的使用者都可以被代付。同時該合約也能夠呼叫對應的介面(remove)移除白名單內的使用者。

通常情況下,為該名單新增0地址即可滿足我們的要求。

Gas代付設定中的upperBound

// ------------------------------------------------------------------------
// Someone will sponsor the gas cost for contract `contractAddr` with an
// `upper_bound` for a single transaction.
// ------------------------------------------------------------------------
function setSponsorForGas(address contractAddr, uint upperBound) public payable {}

在 Gas 代付設定setSponsorForGas中除了需要設定傳送的 CFX 數目(paybale關鍵字所要求)與合約地址外,還需要設定引數 upperBound。該引數意味著每筆被代付交易能夠消耗的Gas上限(單位為Drip,即10e-18 CFX),即該引數意味著被代付的交易需要滿足upperBound ≤ gasUsed * gasPrice。如果交易所需的gas超過了upperBound, gas 費將不會被代付,而是由發起交易的使用者本人進行支付。Conflux 的 tps 非常高,一般而言交易的 gasPrice 設為 1 即可滿足需求。Conflux基金會在進行代付時會將該值設定為 10G,這可以涵蓋基本所有交易。

此外需要說明的是引數 upperBound 與 傳送的 CFX 中存在著約束關係,後者需要不小於前者的1000倍。在 Conflux Studio 中傳送的CFX,注意到二者單位不一致,僅比較數字的話意味著upperBound>= CFX_to_send * 10**15

儲存抵押的代付

在 Conflux 中,當使用者在智慧合約中每儲存 1 KB 的資料,他就需要抵押 1 CFX 作為押金。押金並沒有被消耗,在滿足一定條件時會被退還。礦工也會因為儲存了資料而獲得補償。對於儲存抵押的詳細介紹可以參考Conflux 研究院 | 儲存押金機制

在儲存空間的使用期間,押金會產生年化 4.08% 的利息,這些利息將直接分配給礦工,用於補償礦工們的儲存成本在儲存空間的使用期間,押金會產生年化 4.08% 的利息,這些利息將直接分配給礦工,用於補償礦工們的儲存成本。儲存押金的價格鎖定為 1 CFX/KB。例如,如果當前共有 100 GB 的資料需要儲存,那麼儲存押金總量大約是一億 CFX,平均每個區塊產生的利息約為 0.06 CFX

代付餘額的查詢

設定代付後,CFX 將從代付者轉移至SponsorWhitelistControl合約。當代付發生時,SponsorWhitelistControl中對應的餘額會被消耗(儲存對應的則是被抵押),可以通過SponsorWhitelistControlgetSponsoredBalanceForCollateralgetSponsoredBalanceForGas查詢。

/**
* @dev get collateral sponsor address
* @param contractAddr The address of the sponsored contract
*/
function getSponsorForCollateral(address contractAddr) public view returns (address) {}

/**
* @dev get current Sponsored Balance for collateral
* @param contractAddr The address of the sponsored contract
*/
function getSponsoredBalanceForCollateral(address contractAddr) public view returns (uint) {}

代付設計的討論

DDoS 攻擊

天然地,代付機制的目的就和 gas 機制本身存在著矛盾 —— gas 的存在提高了進行交易的門檻,但這也是對惡意的攻擊者的門檻。這個門檻消失的時候,也為攻擊者開啟了方便之門。例如攻擊者可以利用具有代付的合約,構造併發起大量的交易擁塞網路。

這也許也是白名單機制存在的理由。初瞭解到代付機制時,很容易會疑惑:既然代付一個主要的目的是為了降低使用的門檻,那麼為什麼還需要白名單機制,對代付加以限制?從這個角度看,可能是作為潛在的保險,可以通過設定白名單僅為合乎條件的使用者啟用代付,防止代付被濫用。

惡意消耗代付

另一方面,代付也可能被惡意地消耗,直觀來說,惡意的攻擊者可以通過為普通交易設定極高的 gasPrice,這樣通過簡單地構造少量的交易就能快速地消耗sponsoredGas。礦工能夠從這種攻擊中直接獲利。當大夫被耗盡時,被消耗代付的合約需要重新設定代付,期間可能會影響使用者的正常使用。這可能也是upperBound這個引數的意義之一——通過設定合適的upperBound可以減緩sponsoredGas被消耗的速度。Conflux 基金會設定的 10G upperBound 看起來很高,但只相當於 10**-8 CFX,足以支援非常多的交易。

但是相對的,儲存抵押的代付可以被更容易地被佔用,相比 gas 的消費,抵押佔用的費用要高得多。每佔用 1 KB的儲存空間,對應的就會有 1 CFX 被鎖定。如果真的存在攻擊者有意地實施攻擊,儲存抵押的代付可能很容易被消耗殆盡。礦工是否可以通過這種方式獲利可能需要比較仔細的討論(礦工可以獲取儲存抵押的利息,但也付出了儲存空間;每個礦工付出了相同的儲存空間,但獲利並不一致)。不過由於攻擊者付出的代價非常小,這種攻擊仍有可能會發生。

惡意消耗儲存的例子:例如ERC20合約,使用者隨機地將 10e-18 ERC20 代幣傳送給隨機的地址就能夠很容易地消耗儲存

潛在的缺陷與收益

就上面的討論與整體環境而言,Conflux 在代付上做出的限制還是一種“防君子不防小人”的態度。但是退一步來說,就算相應的攻擊發生了,危害也並沒有想象中的那麼大 —— 或者說問題的源頭也並不是代付本身。就 DDoS 攻擊而言,攻擊者如果希望實施 DDoS 攻擊,以目前 Conflux 網路的費率標準而言,不使用代付時花費的成本也非常低,使用代付與否沒有很大區別。而就惡意消耗代付而言,合約中gas與抵押儲存也僅僅是“回歸正常”,即沒有代付的模式,也並不比沒有代付的情況更差。

但相應的,有了代付後,與合約互動的門檻大幅降低,這對於剛起步的專案(某種意義也包括 Conflux 本身)的幫助無疑是極大的。相比代付帶來的收益,代付中存在的潛在缺陷在目前階段可能並不關鍵了。

申請方法

目前,有兩種路徑可以進入申請頁面,向基金會提交代付申請:

路徑一:

  1. 進入 ConfluxScan 官網(confluxscan.io)
  2. 點選“代幣”-選擇你想要查詢的代幣合約,進入合約介面
  3. 點選更多裡的“申請贊助”
  4. 點選“申請”

image.png

image.png

image.png

路徑二:

  1. 進入 ConfluxScan 官網(confluxscan.io)
  2. 點選“合約區塊鏈”,在合約欄中選擇“贊助合約”,進入贊助合約介面
  3. 在搜尋欄內填入想申請贊助的合約地址,點選“搜尋”
  4. 點選“申請”

image.png

image.png

代付規則

無差別的儲存代付:1 * 10 cfx;
無差別的燃氣代付:5 * 1 Gdrip,upper bound 500,000 drip(大概就是 Gas price為 1 ,Gas limit不超過 50 萬)

專案申請代付需一事一議(暫不開放自助申請),請專案方完成以下兩個步驟並等待人工稽核:
1、需要完成合約需要驗證:Confluxscan 進行合約驗證,需要解決專案資訊裡的警告資訊。
內建合約 Admin 設定為0地址(注:不是合約管理的 Admin)
2、在1完成後,附帶以下資訊聯絡郵箱scan@confluxnetwork.org
專案名稱:
用途:(燃氣代付/儲存代付)
合約地址:
聯絡方式:

通常申請會在7個工作日內回覆結果,請注意提交併不代表代付申請通過,請注意郵件及2中所留聯絡方式的回覆。

參考文章

  • Conflux 內建合約功能介紹:Conflux 官方對 Conflux 的內建合約進行的介紹,資訊很詳盡。【點我檢視詳情
  • Conflux Studio 使用介紹: Conflux Studio 的操作方法介紹。值得一提的是現在也有web版可以使用 https://conflux.ide.black/ (可能載入會比較慢)【點我檢視詳情
  • 新專案如何高效啟動?Conflux 代付機制瞭解一下: Conflux 官方對代付機制的介紹。【點我檢視詳情
  • Conflux 研究院 | 儲存押金機制:關於儲存抵押的介紹【點我檢視詳情

原文連結: Conflux 中的代付及討論:https://github.com/conflux-fa...


相關資料庫:

相關文章