Loading
0

SEER交易所及第三方平台充提网关接入指南

本指南主要目的是帮助交易所和其它第三方平台(包括但不限于非SEER DAPPs应用、中心化应用等)搭建充提网关接入SEER主网,上线SEER主资产及基于SEER区块链发行的token,例如PFC、OPC等。

使用SEER主网进行充提等操作,手续费远远低于SEER的ERC-20token和BTS资产,且不受以太坊拥堵等事件的影响。

基本原理

大部分交易所及第三方平台使用的网关(充值提现)是一个中心化的应用服务。

以交易所充提为例,交易所为每位用户提供有一个平台id,任何用户向交易所的SEER主网账户转账,并在MEMO中填写该id,当交易所的SEER主网账户收到一笔转账时,可以根据MEMO中填写的信息确定是来自哪位用户的充值,从而在交易所平台内为用户上账。

举例:

1、小明从自己的SEER主网账户xiaoming充值1000SEER到交易所账户seerdex,MEMO中填写10010,交易所检测到主网账户seerdex收到一笔1000SEER的转账,MEMO为10010,则在小明的交易所账户10010中上账1000SEER;

2、小明请朋友小花帮自己充值,小花从自己的SEER主网账户xiaohua充值1000SEER到交易所账户seerdex,MEMO中填写10010,交易所检测到主网账户seerdex收到一笔1000SEER的转账,MEMO为10010,则在小明的交易所账户10010中上账1000SEER;

3、小明将自己玩大富翁游戏中赢得的SEER充值交易所,小明在大富翁游戏的提现页面中填写提现1000SEER到交易所账户seerdex,并填写MEMO10010,大富翁游戏在平台内扣除小明账户余额1000SEER,同时通过大富翁的SEER主网账户dafuweng向交易所账户seerdex转账1000SEER,MEMO为10010,交易所检测到主网账户seerdex收到一笔1000SEER的转账,MEMO为10010,则在小明的交易所账户10010中上账1000SEER。

例子3中,我们举例了用户从第三方平台提现到交易所的流程,从交易所提现到另一家交易所也是如此,这就需要交易所及第三方平台在设计提现功能时提供MEMO功能。为了资金安全,您可以部署两个或多个账号,其中一个账号负责用户充值,其它账号负责提现。

准备工作

运行环境

推荐服务器配置为:2vCPUs 4G内存 20G以上硬盘,Ubuntu 16.04.4 x64 系统。

获得账号及私钥

注册账号

您可以通过SEER网页钱包 https://wallet.seer.best 注册账号,其中账号中带有横杠或数字的账号为普通账号名,可以直接免费注册(点击了解方法) ,例如seer-exchange或seerdex01 ,而由纯英文字母构成的账号名为高级用户名,例如seerdex,则需通过一个终身会员账户缴纳注册手续费来注册。

获得私钥

在充提网关等功能中,我们需要账户的至少两对密钥,即当前资金密钥(Active key)和当前备注密钥(memo key),资金密钥让您拥有资金的转账及其他链上操作权限,备注密钥让您能生成和读取和该账号相关的MEMO信息。点击这里了解获取私钥的方法 。

配置一个SEER全节点

1、在服务器新建一个名叫seer的窗口;

2、在root目录下新建一个名叫seer的目录,下载v0.0.5版本的程序包到此目录,并更名为seer.tar.gz。(请到SEER软件发布页https://github.com/seer-project/seer-core-package/releases 复制最新的ubuntu版本程序包链接替换掉此下载链接。)

3、进入seer目录,解压此软件包。

4、带websocket参数启动witness_node:

其中的--rpc-endpoint参数为节点监听的websocket RPC IP地址和端口号,需要您替换,此处127.0.0.1为本机,9090是为节点指定的WS端口。

对于处理充提业务的节点,我们并不需要保存全部数据,仅需要保存和交易所账户相关的账户数据以节省内存开支,因此我们需要设置partial-operations参数和--track-account参数,此处partial-operations=true表示只需要部分的数据,"\"seerdex-withdraw\""和"\"seerdex-deposit\""表示要追踪的一个或多个账户id,需要您替换。

--max-ops-per-account参数设定内存中保留账户的多少条操作记录,此处1000表示保留追踪账户的1000条操作记录,需要您按需求填写。

5、观察节点运行正常后,ctrl+A d隐藏screen,断开服务器。之后要再打开运行有节点的Sreeen,则使用 screen -R ,或 screen -r seer。

节点正常启动后,会显示像下面一样的3秒一个的出块信息。

如果要关闭节点,则使用control + C 。

配置一个SEER命令行钱包

1、在服务器新建一个名叫cli的窗口,运行seer目录中的命令行钱包程序;

-s参数可以设置要连接的节点api地址及端口,此处ws://127.0.0.1:9090为上一步中运行的本地节点的websocket RPC地址和端口,您也可以在此处使用局域网或公网中的其他公共api地址,不过有因外部api无法提供服务而导致命令行钱包异常退出的风险;

-r参数可以设置命令行钱包要监听的websocket RPC地址和端口,此处设为127.0.0.1:9191,负责充提业务的程序可以使用此端口调用命令行钱包进行操作;

-H参数可以设置命令行钱包要监听的Http-RPC地址和端口,此处设为127.0.0.1:9192,负责充提业务的程序也可以使用此端口调用命令行钱包进行操作。

2、钱包启动成功后,会显示:

先设置钱包解锁密码,123替换为你想设置的密码

解锁钱包

导入账号资金私钥和备注私钥

显示如下:

接入命令行钱包

可以使用Http-RPC或websocket RPC方式接入命令行钱包。使用JSON-RPC远程调用协议传入相应的指令,即可让命令行钱包进行相关操作或返回需要的信息。

格式如下(实际使用时不换行无注释):

Http-RPC接入示例

可以使用curl命令来测试Http-RPC连接命令行钱包实现获取指定账户的各资产余额:

websocket RPC接入示例

首先在服务器上安装使用wscat测试ws:

测试通过websocket RPC连接命令行钱包实现一笔转账:

切换回命令行钱包所在窗口,可以看到钱包内有如下信息:

实现了让钱包进行了一次转账操作。

常用指令

get_dynamic_global_properties

作用:列出链的当前全局动态参数

示例:{"jsonrpc": "2.0", "method": "get_dynamic_global_properties", "params": [], "id": 1}

返回信息示例:

充提业务需关注 head_block_number 当前区块高度, last_irreversible_block_num 最近一个不可逆块块号。用于判断是否是可信充值操作以及提现是否已处理。

info

作用:显示当前Seer区块链的状态

示例:{"jsonrpc": "2.0", "method": "info", "params": [], "id": 1}

返回信息示例:

充提业务需关注 head_block_age 上一个区块生成时间,participation 区块生产参与率。 提现操作前判断区块链是否正常运行。

list_account_balances

格式:list_account_balances name

参数:name可以是账户名,也可以是账户的id

作用:列出账号为id的账户的各资产余额

示例:{"jsonrpc": "2.0", "method": "list_account_balances", "params": ["abc"], "id": 1}

返回信息示例:

充提业务需关注asset_id为1.3.0(即SEER)的amount (余额)是否足够并支付网络手续费,若涉及SEER链上其他资产的充提业务,则还需要关注相应资产的余额是否足够。

transfer2

格式:transfer2 from to amount asset_symbol memo broadcast(true/false)

参数:from为转出账户,to为接收账户,amount为转账数量, asset_symbol为资产名,memo为备注。from/to 可以是用户名或者id,broadcast设置是否广播。

作用:转账

示例:{"jsonrpc": "2.0", "method": "transfer2", "params": ["seerdex-withdraw","ffffff","500000","SEER","Welcome to SEERTALK. https://forum.seerchain.org",true], "id": 1}

返回信息示例:

充提业务需关注返回信息的第一个字符串,即交易id,另expiration 交易过期时间。

get_account_id

格式:get_account_id name

参数:name是账户名

作用:列出账户name的账户id

示例:{"jsonrpc": "2.0", "method": "get_account_id", "params": ["seerdex-withdraw"], "id": 1}

返回信息示例:

get_relative_account_history

格式:get_relative_account_history name start limit end

参数:name可以是账户名或id,start为返回结果的最小编号,limit 为返回结果的数量上限,end为返回结果的最大编号;

返回数据排序方式为按时间顺序,越新的越靠前;

编号从1开始,若end = 0,则返回最新的limit条操作信息;

若end - start > limit,则返回满足条件的最新的limit条操作信息。

作用:列出账户name的操作历史记录

请避免一次性返回超过100条数据,以免节点或钱包报错。同时,在命令行钱包中使用此命令时只会返回 "description"中的数据,用RPC调用方能返回完整数据。

示例:{"jsonrpc": "2.0", "method": "get_relative_account_history", "params": ["seerdex-withdraw",15,1,30], "id": 1}

返回信息示例:

get_relative_account_history会列出和此账户有关的所有操作,例如自己转账给别人(包括提现)、别人转账给自己(包括充值)、账号注册、参与预测等;

充提业务只需关注op.op.N(操作类型)为0,即转账的操作;

当然最重要的是memo(转账MEMO)和op.op.amount.amount(转账数额)以及op.op.amount.asset_id(资产类型);

以及op.op.from(转出id),若同一个账号即负责充值又负责提现,则判断op.op.from是否和get_account_id获得的当前账户一样来区分该笔操作是否是本帐户发起的提现操作;

op.id为该操作的对象id,也是该转账操作的唯一id;

另外,还需要关注op.block_num,即该操作的入块高度,
op.trx_in_block 该操作所属交易在该区块内的位置,
op.op_in_trx 该操作在该交易内的位置,
以及op.virtual_op 该操作的虚拟操作编号。

以上四个数据可以和其他指令配合获得该操作所属的txid及判断该操作的唯一性。

get_block

格式:get_block num

参数:块号

作用:显示第num个块的概况

示例:get_block 2090482

返回信息示例:

充提业务需需配合get_relative_account_history中获取的op.block_num来关注get_block获取的transaction_ids数据,若同一个块里有多笔交易,则会有多个transaction_id,需配合get_relative_account_history中获取到的op.trx_in_block来得到该操作所对应的txid。

处理充值业务

1、通过get_relative_account_history查询账户相关历史。

返回结果中并没有直接显示每条记录的序号,需要自行获取和记录。

建议:从start = 1,limit = 1, end = 2开始以一定时间间隔发送请求,每次start 和 end 各自 +1,limit恒等于1,若返回信息不为空,则将该条信息编号并存储。若返回信息为空:{"id":1,"jsonrpc":"2.0","result":[]},则表示没有新的操作,等待有新的操作信息时继续记录存储。

2、判断是否为充值业务。

get_relative_account_history会列出和此账户有关的所有操作,例如自己转账给别人(包括提现)、别人转账给自己(包括充值)、账号注册、参与预测等,充提业务只需要op.op.N(操作类型)为0(转账)的操作数据;

若同一个账号即负责充值又负责提现,则需要区分op.op.from是否和当前账户id一样,,若一样,则是本帐户发起的提现操作,需要排除掉;

剩下的便是待处理的充值操作。

3、获得相关充值数据。

通过Http-RPC或websocket-RPC连接的命令行钱包在unlocked状态时,在get_relative_account_history返回的信息中可以查看memo内容,用户填写的交易所ID等入账信息便从此处获取;

通过op.op.amount.amount(转账数额)加上小数点,便是充值数额;

通过op.op.amount.asset_id(资产类型)来判断是否是平台支持的正确资产类型。

4、判断是否为可信操作。

不同于比特币和以太坊采用确认数来从概率上降低交易被退回的可能性,像SEER这样的石墨烯项目中有不可逆块的概念,不可逆块及更早区块中的交易,可以保证不会发生回退。

get_relative_account_history会返回该笔操作所属的op.block_num(入块高度),但即使交易未入块,仍然可能出现在账户历史中,因此需要和通过get_dynamic_global_properties获取到的last_irreversible_block_num(最近一个不可逆块块号)比较,op.block_num必须小于或等于last_irreversible_block_num,才能被视为可信操作。

5、记录下该操作的相关信息。

get_relative_account_history中获取到的op.block_num+op.trx_in_block + op.op_in_trx + op.virtual_op 组合到一起,标识该操作的唯一性,可识别避免重复操作;

get_relative_account_history中获取到的op.id也是该转账操作的唯一id;

可以通过get_object op.block_num 获取该转账操作所在块的信息,再通过op.trx_in_block的数值来获取到块信息中transaction_ids数组里该转账操作对应的txid,同一个txid可能对应多个操作。

6、如果有充值的MEMO或资产类型不正确,建议不要直接退回,而是等待用户主动联系确认退回路径,因为用户可能是通过交易所或第三方平台提现过来充值的,直接退回但没有对方MEMO可能会造成处理困难甚至资产损失。

处理提现业务

1、提现操作前检查区块链网络是否正常运行

提现业务需关注区块链网络是否正常运行状态,只在网络正常时处理提现。

通过info指令获取到head_block_age(上一个区块生成时间),须在1分钟以内,participation(区块生产参与率)须在80以上,表示80%的区块生产者在正常工作。

同时get_dynamic_global_properties指令获取到的 head_block_number(当前区块高度)和 last_irreversible_block_num(最近一个不可逆块)相差不会太大,一般在30以内。

2、检查提现账户余额

通过list_account_balances列出账户各资产余额,检查asset_id为1.3.0(即SEER)的amount (余额)是否足够并支付网络手续费,若涉及SEER链上其他资产的充提业务,则还需要关注相应资产的余额是否足够。

3、转账并跟踪操作是否成功

通过transfer2向用户转账相应数额的指定资产。

需关注返回信息中的交易id,向用户提供此信息可以让用户在区块浏览器查询自己的提现操作在区块链上的状态和信息,在转出目标未到账的情况下确定该笔操作是否已出账;

关注transfer2返回信息中的expiration(交易过期时间),转账操作发出后,一般很快可以从get_relative_account_history中获取到该笔转账操作的信息,并通过op.block_num和last_irreversible_block_num比较来确认入块;

(1)若确认入块,则返回信息中的交易id应该已经存在于get_object op.block_num 获取该转账操作所在块信息的transaction_ids数组中。

(2)若发出的转账操作超过了expiration还未确认入块,则这笔交易可能由于您同时广播的操作太多等各种原因未被区块链打包并已经被丢弃,此时重新发起转账是安全的。

声明:本站信息大都来源于互联网,如无意中侵犯了您的权益,请联系站长删除,谢谢。

最后编辑于:2018/10/16作者: seer123