Guidelines
- Introduction
- Installation
- Quick Start
Guides
- Introductions
- Build local test node
- Smart Contract - ABI Files
- Smart Contract——JS Contract
- Deploy Contracts
- Test Contract
- Develop DApp Client
Smart Contracts
- Contract Introduction
- ABI File
- Database
- Account Authority
- Call In-contract
- Notification
System Contracts
- Resources
- Account
- Permission
Token Contracts
- Transfer
- Token
- Token Exchange
- Contract Sub-Wallet
Node Guide
- Node Introduction
- Add to nodes network
- Node Data Persistence
Access Guide
- FO 接入安全指南
FO 接入安全指南
该指南旨在帮助各项目方完成与 FO 通证的安全对接,保障各项目方 FO 充提业务的安全稳定以及 FIBOS 节点的安全。
交易所充值提现接入方案
基本逻辑
充值: 交易所需要给交易所中充值的账户生成平台内唯一的可识别标识,用户充值至交易所账户时需在转账操作的 memo 字段中填入交易所平台为该用户生成的唯一标识。
提现: 用户提现时填入自己的 FIBOS 账户,交易所通过转账方式将用户所提现 FO 的数量转给用户所填账户名,从而完成提币。在此过程中,memo 字段可能也是必要的,因为用户有可能从一交易所提现至另一交易所。
注意事项
FIBOS 上 FO 的充提币逻辑与 EOS 主网基本一致,但其中的不同之处需要各大交易所提起注意:
FIBOS 的转账类型:
FIBOS 网络中的转账函数分为两种:transfer
和 extransfer
transfer
其中 transfer
函数表示的是与 EOS 主网兼容的转账方法,函数原型为:
1 | void transfer(account_name from, account_name to, asset quantity, string memo) |
示例:
1 | transfer('accountfrom', 'accountto', '1.0000 FO', 'memo field') |
在链上获取到的 action 示例为:
1 | { |
extransfer:
其中 extransfer
函数表示的是与 FIBOS 主网扩展的转账方法,该方法支持在 FIBOS 上发行的所有通证的转账,函数原型为:
1 | void extransfer(account_name from, account_name to, extended_asset quantity, string memo) |
示例:
1 | extransfer('accountfrom', 'accountto', '1.0000 FO@eosio', 'memo field') |
其中,@ 字符后表示的是该通证的发行方,系统通证 FO 为 FO@eosio,eosio 表示的是该通证是系统原生发行的通证。
在链上获取到的 action 示例为:
1 | { |
注意:
FO 通证的转账支持上述两种转账方法,因此为防止用户充值记录的丢失,交易所需要对上述两种转账方法提供支持。
交易所充提业务安全指南
该部分内容总结了在交易所对接 FO 业务时可能遭受的一系列攻击,并且给出了对应的安全解决方案。
不可逆高度判断
由于 FIBOS 公链的使用了 DPOS 的共识机制,在判断一笔转账(一笔 Transaction)是否可信需要对当前转账动作所在的块高度进行判断。在 FIBOS 网络中,一笔交易所在的高度如果在不可逆高度之内,我们就可以认定该交易已经被 FIBOS 网络中的 BP(Block Producer)节点所确认,进入了不可逆状态,不可被回滚。
因此交易所在判断一笔用户充值交易是否有效时,需要判断该转账所在高度小于当前 FIBOS 的不可逆高度,获取 FIBOS 的不可逆高度可以通过 fibos.js 客户端或者 RPC 获取链上基本信息:
1 | { |
其中的 last_irreversible_block_num
字段表示的即为 FIBOS 网络当前的最新不可逆高度。
一笔交易从被打包进某区块的状态变为不可逆状态大概需要耗费 164 秒,因此该时间即为用户充值到账的延迟时间。
“假币”充值
因为 FIBOS 公链上有众多用户都发行了自己的通证,如果交易所的业务处理不慎,会导致有用户自行发行的通证充值进入交易所参与交易,我们称这种攻击为“假币充值”,对于这种假币充值行为,交易所需要在充值业务中做好防范。
对于 transfer
转账( action.name 为 transfer )来说,示例如下:
1 | "actions": [ |
需要判断:
action.account
必须为 ‘eosio.token’actions.data.to
必须为交易所充值账户名actions.data.quantity
必须为 ‘xxx.xxxx FO’
对于 extransfer
转账( action.name 为 extransfer)来说,示例如下:
1 | "actions": [ |
需要判断:
action.account
必须为 ‘eosio.token’actions.data.to
必须为交易所充值账户名actions.data.quantity
必须为 ‘xxx.xxxx FO’actions.data.quantity.contract
必须为 ‘eosio’
Hard - failed 状态攻击
FIBOS 链上交易的执行状态存在多种,其中有一种状态为 hard-failed,处于这种状态下的交易的特点是,没有被成功执行,但是依旧在链上留下了记录,攻击者可以利用 FIBOS 的这一交易特性对交易所造成威胁,从而进行虚假充值。对这一安全威胁的防范办法是,在不可逆高度的基础上,对交易的状态进行判断,如果发现充值交易的状态是 hard-failed
则认定为是假充值。对于以下的示例交易来说,交易所应当判断:transactions.status 为 executed。只有处于 executed
状态并且已经在不可逆高度下的交易才能认定是真实、不可篡改的充值记录。
1 | { |
交易所 FIBOS 节点安全配置
对于交易所来说,搭建的 FIBOS 节点的安全也是不容忽视的,在交易所中 FIBOS API 节点承载着充币记录以及提币操作的功能,一旦出现安全问题,所带来的损失可能是不可估量的。这一部分内容为交易所搭建安全可靠的 FIBOS 网络节点提供了部分指导。
节点配置
为了满足交易所充提币业务,推荐搭建 FIBOS 节点机器的物理配置如下:
推荐配置 | 最低配置 | |
---|---|---|
系统类型 | Ubuntu Server 16.04+,X64 | Ubuntu Server 16.04+,X64 |
CPU | 4核 | 2核 |
内存 | 8GB | 4GB |
硬盘 | 300GB + (SSD) | 100GB + (SSD) |
RPC 安全
交易所 API 节点建议禁用外网 RPC,如果节点需要 RPC 访问,建议使用内网 HTTP,对应配置示例代码如下:
1 | fibos.load("http", { |
P2P 安全
为了保证 API 节点的稳定可靠,节点的 P2P 广播网络需要尽可能保证可靠,FIBOS 维护了目前主网稳定可用的 P2P 节点地址列表,地址为:https://github.com/FIBOS-Community/fibos-p2p/blob/master/p2p.json,请节点按照最新的 P2P 节点列表进行节点启动,同时建议各大交易所节点应该定期对该文件进行更新,重新启动节点。
示例 P2P 列表如下:
1 | [ |
注:对于如何启动 FIBOS 的节点,参考 https://github.com/FIBOS-Community/fibos-nodes/
如有其他相关技术疑问,请前往 https://dev.fo/zh-cn/index.html 或 https://github.com/fibosio 了解更多。也可以直接微信搜索 FIBOSio 添加 FIBSO 社区小助理,加入开发者群与我们交流。