关于区块链:Conflux-中的代付机制详解

7次阅读

共计 5931 个字符,预计需要花费 15 分钟才能阅读完成。

代付简介

绝大部分的私有链中都存在着名为 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 后执行,不出错即可。

  3. 设置 Gas 代付。

    1. 依然与 SponsorWhitelistControl 合约交互。抉择 setSponsorForGas 办法。
    2. 设置CFX to Send。填入400
    3. contractAddr设置为心愿设置代付的合约地址。
    4. upperBound设置为10000000000(10G)
    5. signer能够进行任意设置,只有其具备足够多的 CFX 即可(大于设置的 500)
    6. 同前 estimate 并执行

  1. 设置抵押代付。

    1. SponsorWhitelistControl 合约交互。抉择 setSponsorForCollateral 办法。
    2. 设置CFX to Send。填入400
    3. contractAddr设置为心愿设置代付的合约地址。
    4. signer能够进行任意设置,只有其具备足够多的 CFX 即可(大于设置的 500)
    5. 同前 estimate 并执行

至此,合约的代付设置结束。

代付中的局部细节阐明

本局部会对上述提到的局部参数进行阐明,具体的阐明能够参考 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. 点击“申请”

门路二:

  1. 进入 ConfluxScan 官网(confluxscan.io)
  2. 点击“合约区块链”,在合约栏中抉择“资助合约”,进入资助合约界面
  3. 在搜寻栏内填入想申请资助的合约地址,点击“搜寻”
  4. 点击“申请”

代付规定

无差别的存储代付: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
正文完
 0