热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

绝大部分的私有链中都存在着名为gas的机制(或称之为“燃气费”),该机制有着丰盛的作用,如反抗拒绝服务攻打、回避智能合约的停机问题、激励矿工等。但gas机制也随之带来了一个问题,那就是进步了用户与智能合约进行交互的门槛——gas意味着领有区块链中的原生代币是与智能合约进行交互的前提。

代付简介

绝大部分的私有链中都存在着名为 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

推荐阅读
author-avatar
迅驰代驾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有