Conflux 中的代付机制详解

代付简介 绝大部分的公有链中都存在着名为 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的代付。通过访问一次水龙头就可以完成下列的所有操作。实际环境中如何设置代付的金额请视具体场景而定。

在测试网环境中,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后执行,不出错即可。
      Conflux 中的代付机制详解
      文章图片

  3. 设置 Gas 代付。
    1. 仍然与SponsorWhitelistControl合约交互。选择setSponsorForGas方法。
    2. 设置CFX to Send。填入400
    3. contractAddr设置为希望设置代付的合约地址。
    4. upperBound设置为10000000000(10G)
    5. signer可以进行任意设置,只要其具有足够多的 CFX 即可(大于设置的500)
    6. 同前estimate并执行
Conflux 中的代付机制详解
文章图片

  1. 设置抵押代付。
    1. SponsorWhitelistControl合约交互。选择setSponsorForCollateral方法。
    2. 设置CFX to Send。填入400
    3. contractAddr设置为希望设置代付的合约地址。
    4. signer可以进行任意设置,只要其具有足够多的 CFX 即可(大于设置的500)
    5. 同前estimate并执行
Conflux 中的代付机制详解
文章图片

至此,合约的代付设置完毕。
代付中的部分细节说明 本部分会对上述提到的部分参数进行说明,详细的说明可以参考Conflux 内置合约功能介绍,该文对代付的方方面面做到了非常详尽的介绍。
合约的代付白名单列表
合约代付采用了白名单机制,在SponsorWhitelistControl合约中,为每个合约地址维护了一个用户白名单列表:只有位于白名单中的用户才能被代付。默认情况下该白名单为空,意味着代付未被启用。
【Conflux 中的代付机制详解】该列表由合约的 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. 点击“申请”
Conflux 中的代付机制详解
文章图片

Conflux 中的代付机制详解
文章图片

Conflux 中的代付机制详解
文章图片

路径二:

  1. 进入 ConfluxScan 官网(confluxscan.io)
  2. 点击“合约区块链”,在合约栏中选择“赞助合约”,进入赞助合约界面
  3. 在搜索栏内填入想申请赞助的合约地址,点击“搜索”
  4. 点击“申请”
Conflux 中的代付机制详解
文章图片

Conflux 中的代付机制详解
文章图片

代付规则 无差别的存储代付: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...
相关资料库:
  • Conflux开发资料包
  • conflux-chain github
  • conflux-fans github

    推荐阅读