搭建CYBEX网关 - CybexDex/cybex-node-doc GitHub Wiki
网关是一个能够加快价值进出CYBEX网络的可信任交易方。为实现这个目的,网关发行可赎回的借据(以下简称IOU),作为CYBEX区块链上的可替代可分割资产。
由网关发行的IOU可以在CYBEX网络内的交易中产生作用,并有网关负责承兑至持有人的外部网络账户。网关通过将外部资产(如比特币或在其他主链发行的通证)引入CYBEX网络,起到了进出CYBEX网络的桥梁作用。
因此,网关的工作主要包含以下几个方面:
1)创建资产
,即CYBEX内盘IOU;
2)发行资产
,将IOU发放至网关CYBEX账户;
3)接收用户外部资产,将对应外部资产的内盘IOU转账
至用户CYBEX账户;
4)回收用户CYBEX账户内盘IOU,转账
相应的外部资产至用户外部账户。
其中,3、4)相当于用户发起的充值、提现操作。
注意:CYBEX网关是一个中心化的服务,上述与CYBEX主链交互的操作之外,需要根据网关前置场景的业务逻辑,对内外盘资产的承兑汇率、交易黑白名单等进行设置。同时,为了确保内外盘资产的对应关系,建议网关设计中包含内外部审计的相关逻辑,以避免超发带来的承兑风险。
创建资产
创建CYBEX内盘IOU需要通过asset_create操作实现,操作说明如下:
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
fee | asset | Y | 手续费 | 详见如何获取手续费信息 |
symbol | string | Y | 资产符号,大于等于5的资产,手续费为500CYB | 为了区别各网关发布的资产,建议命名格式遵循“网关简称.资产符号”的格式,如JADE.ETH,表示瑶池创建并负责承兑的ETH |
precision | unit8_t | Y | 资产精度,小数点后位数,填写小于等于12的正整数 | 详见金额和价格如何表示 |
common_options | asset_options | Y | 资产设置 | 详见下表“common_options参数” |
bitasset_opts | bitasset_options | N | 智能资产设置 | 网关发行的IOU一般不使用智能资产 |
is_prediction_market | bool | Y | 是否为预测市场 | 如果该资产为预测市场的资产则设置为true |
extensions | extensions_type | N | 扩展字段 |
common_options参数
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
max_supply | share_type | Y | 最大发行量,所有发行操作的资产总和不能大于该值 | 由于总量无法修改,CYBEX也不支持发行符号相同的资产,建议将该参数设置的越大越好,如10000000000000,以便应对外部资产持续增加带来的内盘资产需求。 |
market_fee_percent | uint16_t | Y | 交易手续费 | 使用该资产进行交易时,除了交易操作本身的手续费外,是否需要额外收取手续费。手续费以交易额的百分比计算,如20,表示交易额的20%为手续费 |
max_market_fee | share_type | Y | 交易手续费上限 | |
issuer_permissions | uint16_t | Y | 发行人在发行操作后,可以对哪些权限进行调整 | 详见下表“asset_issuer_permission_flags” |
flags | uint16_t | Y | 当前激活的flag | 详见下表“asset_issuer_permission_flags” |
core_exchange_rate | price | Y | 核心汇率 | 详见下表“core_exchange_rate参数” |
whitelist_authorities | flat_set<account_id_type> | Y | 资产持有账户ID白名单 | 需要限制持有账户时使用,如1.2.4532 |
blacklist_authorities | flat_set<account_id_type> | Y | 资产持有账户ID黑名单 | 需要排除持有账户时使用,如1.2.3442 |
whitelist_markets | flat_set<asset_id_type> | Y | 交易对手资产ID白名单 | 需要限制交易市场时使用,如1.3.2,表示仅可以与1.3.2的资产进行交易 |
blacklist_markets | flat_set<asset_id_type> | Y | 交易对手资产ID黑名单 | 需要排除交易市场时使用,如1.3.3,表示不能与1.3.3的资产进行交易 |
description | string | Y | 资产描述 | |
extensions | extensions_type | N | 扩展字段 |
asset_issuer_permission_flags
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
charge_market_fee | bool | Y | 是否设置了交易手续费 | |
white_list | bool | Y | 是否要求持有人加入白名单 | |
override_authority | bool | Y | 是否允许资产发行人在未征得持有人同意的情况下,强制将资产从A账户转账至B账户 | |
transfer_restricted | bool | Y | 是否强制资产发行人参与每笔交易,即每次转账操作中必须有一方为资产发行人 | |
disable_force_settle | bool | Y | 是否禁用强制清算 | |
global_settle | bool | Y | 是否允许全局清算 | |
disable_confidential | bool | Y | 是否禁用隐私交易 | |
witness_fed_asset | bool | Y | 是否由见证人节点喂价 | |
committee_fed_asset | bool | Y | 是否由委员会喂价 |
core_exchange_rate参数
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
base | asset | Y | 基准资产信息 | |
amount | share_type | Y | 汇率计算的分母 | 10 |
asset_id | asset_id_type | Y | 基准资产ID,通常设置为CYBEX的核心资产,即CYB | 1.3.0 |
quote | asset | Y | 新建资产信息 | |
amount | share_type | Y | 汇率计算的分子 | 10 |
asset_id | asset_id_type | Y | 新建资产ID,即当前资产的ID | 1.3.0 |
Python示例
https://github.com/CybexDex/cybex-node-doc/blob/master/transaction/python/advanced/create_asset.md
发行资产
创建CYBEX内盘IOU后,需要通过asset_issue操作进行资产发行,操作说明如下:
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
fee | asset | Y | 手续费 | |
issuer | account_id_type | Y | 资产发行人账户ID | |
asset_to_issue | asset | Y | 发行的资产(包含数量、资产ID) | |
issue_to_account | account_id_type | Y | 发行资产的初始归集账户,即操作执行后,本次发行的资产会由哪个账户持有。一般来说,由于网关负责承兑资产,内盘IOU的初始归集账户为网关账户 | |
memo | memo_data | N | 备注 | |
extensions | extensions_type | N | 扩展字段 |
普通转账
资产进出CYBEX网络的过程,需要通过transfer操作实现网关账户
和用户账户
的双向转账功能。操作参数如下:
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
fee | asset | Y | 手续费 | |
amount | share_type | Y | 手续费金额 | 55 |
asset_id | asset_id_type | Y | 资产ID | 1.3.0 |
from | account_id_type | Y | 付款账户ID | 1.2.37471 |
to | account_id_type | Y | 收款账户ID | 1.2.83 |
amount | asset | Y | 转账 | |
amount | share_type | Y | 转账金额 | 10000 |
asset_id | asset_id_type | Y | 资产ID | 1.3.0 |
memo | memo_data | N | 备注 | |
extension | extension_type | N | 扩展字段 |
用户发起充值、提现操作后,网关需要根据操作上链的结果,执行后续流程。例如:用户将外部资产抵押给网关后,网关将IOU从网关CYBEX账户转账至用户CYBEX账户,基于到账情况,网关对该笔充值订单的状态进行更新。
重点关注
为完成正确的网关出入金操作,需要对网关账户的资金往来加以监控。监控网关账户交易状态有多种方法,较为经济可靠的方式之一,是在每次新区块生成后,调用 get_account_history API来获取网关账户的操作记录的最新列表,对于其中新出现的操作记录加以处理。但在加以处理之前,最好确认该笔操作记录已经完全被链上确认。
CYBEX链遵循DPOS共识机制约束以产生和确认区块。任何一笔transaction交易由钱包发送至节点并加以广播后,虽会以较快的速度被打包上链,但此时刚刚上链的区块,仍属于待确认状态,该区块及其所含交易,仍有被回滚的可能。只有三分之二以上见证人节点确认此区块有效性后,才可认为该区块及其所含交易被正式记录在了CYBEX链上。
因此,在取得最新的操作记录后,要将该记录所在区块高度,与当前系统最新的不可逆区块高度进行比对。要查询当前不可逆区块高度,可通过get_dynamic_global_properties
接口获得当前系统最新状态对象,该对象的last_irreversible_block_num
字段即为当前链上不可逆区块高度。仅当操作所在区块高度低于不可逆区块高度时,才应对该笔操作进行处理。
可选操作
- 注册CYBEX账户
用户(包括网关账户)可以通过CYBEX前端页面或者水龙头服务进行CYBEX账户注册,也可以由网关获取前置应用场景的信息,代用户完成账户注册。
CYBEX为所有第三方提供了一个公共的水龙头服务模板,第三方可以选择直接使用公共水龙头,或者参考该模板的实现方式,基于前置应用加入自定义的逻辑。
注意:使用水龙头服务中,填写的“注册人”账户需要成为CYBEX终生会员,目前CYBEX终生会员的手续费为1000CYB。