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

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

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

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

基本原理

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

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

举例:web

一、小明从本身的SEER主网帐户xiaoming充值1000SEER到交易所帐户seerdex,MEMO中填写10010,交易所检测到主网帐户seerdex收到一笔1000SEER的转帐,MEMO为10010,则在小明的交易所帐户10010中上帐1000SEERjson

二、小明请朋友小花帮本身充值,小花从本身的SEER主网帐户xiaohua充值1000SEER到交易所帐户seerdex,MEMO中填写10010,交易所检测到主网帐户seerdex收到一笔1000SEER的转帐,MEMO为10010,则在小明的交易所帐户10010中上帐1000SEERubuntu

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

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

准备工做

运行环境

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

得到帐号及私钥

注册帐号

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

得到私钥

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

配置一个SEER全节点

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

screen -S seer

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

mkdir seer
curl -Lo seer/seer.tar.gz https://github.com/seer-project/seer-core-package/releases/download/v0.05/seer-ubuntu-0.0.5.tar.gz

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

cd seer
tar xzvf seer.tar.gz

四、带websocket参数启动witness_node:

witness_node --rpc-endpoint=127.0.0.1:9090 partial-operations=true --track-account="\"seerdex-withdraw\"" --track-account="\"seerdex-deposit\"" max-ops-per-account=1000

其中的--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条操做记录,须要您按需求填写。

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

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

节点正常启动的状态

若是要关闭节点,则使用control + C

配置一个SEER命令行钱包

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

screen -S cli
cd~
seer/cli_wallet -s ws://127.0.0.1:9090 -r 127.0.0.1:9191 -H 127.0.0.1:9192

-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,负责充提业务的程序也可使用此端口调用命令行钱包进行操做。

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

Please use the set_password method to initialize a new wallet before continuing
3564395ms th_a       main.cpp:227                  main                 ] Listening for incoming RPC requests on 127.0.0.1:9191
3564396ms th_a       main.cpp:252                  main                 ] Listening for incoming HTTP RPC requests on 127.0.0.1:9192
new >>>

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

set_password 123

解锁钱包

unlock 123

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

import_key seerdex-withdraw 5JkbV8aTaYRVaarTUJQ9Y56cr4QajxNFfCoQj6Q9JFL8XvUZ5CQ
import_key seerdex-withdraw 5KiSC6rRAEkTj72fg3G3zF8RHmCEgZw7aSXBjKqDfvY2XN1qvyd

显示以下:

new >>> set_password 123
set_password 123
null
locked >>> unlock 123
unlock 123
null
unlocked >>> import_key seerdex-withdraw  5JkbV8aTaYRVaarTUJQ9Y56cr4QajxNFfCoQj6Q9JFL8XvUZ5CQ
import_key okok 5JkbV8aTaYRVaarTUJQ9Y56cr4QajxNFfCoQj6Q9JFL8XvUZ5CQ
3572083ms th_a       wallet.cpp:793                save_wallet_file     ] saving wallet to file wallet.json
3572084ms th_a       wallet.cpp:467                copy_wallet_file     ] backing up wallet wallet.json to after-import-key-1cd0784e.wallet
true
unlocked >>> import_key seerdex-withdraw  5KiSC6rRAEkTj72fg3G3zF8RHmCEgZw7aSXBjKqDfvY2XN1qvyd
import_key else 5KiSC6rRAEkTj72fg3G3zF8RHmCEgZw7aSXBjKqDfvY2XN1qvyd
3572941ms th_a       wallet.cpp:467                copy_wallet_file     ] backing up wallet wallet.json to before-import-key-1bece5d8.wallet
3573189ms th_a       wallet.cpp:793                save_wallet_file     ] saving wallet to file wallet.json
3573191ms th_a       wallet.cpp:467                copy_wallet_file     ] backing up wallet wallet.json to after-import-key-1bece5d8.wallet
true
unlocked >>>

接入命令行钱包

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

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

{ 
    "jsonrpc" : 2.0,//定义JSON-RPC版本
    "method" : "get_block",//调用的方法名,例如转帐 transfer ,列出帐户余额 list_account_balances 等,此处get_block为返回指令块号的区块信息
    "params" : [1], //方法传入的参数,若无参数则为null,此处1表示块号
    "id" : 1//调用标识符
}

Http-RPC接入示例

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

curl http://127.0.0.1:9192 -d '{"jsonrpc": "2.0", "method": "list_account_balances", "params": ["seerdex-withdraw"], "id": 1}'

 {"id":1,"result":[{"amount":"7861151753754","asset_id":"1.3.0"},{"amount":97099800,"asset_id":"1.3.8"}]}

websocket RPC接入示例

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

apt install node-ws

测试经过websocket RPC链接命令行钱包实现一笔转帐:

wscat -c ws://127.0.0.1:9191
> {"jsonrpc": "2.0", "method": "transfer", "params": ["seerdex-withdraw","ffffff","500000","SEER","Welcome to SEERTALK. https://forum.seerchain.org",true], "id": 1}
< {"id":1,"jsonrpc":"2.0","result":{"ref_block_num":64292,"ref_block_prefix":1517346144,"expiration":"2018-10-12T07:33:12","operations":[[0,{"fee":{"amount":2136718,"asset_id":"1.3.0"},"from":"1.2.105","to":"1.2.138","amount":{"amount":"50000000000","asset_id":"1.3.0"},"memo":{"from":"SEER8UAbnsAnXY1qr3CD6uzKaRuewsyPF9ynYJJGrdvSfDANxsGNxH","to":"SEER6QbqUZF6xzjdceVoLHS7K1KwvLyszVTZS8bbsQQQXcAm8L3aZp","nonce":"4469110159915322318","message":"482a7d070d298fe2a79d5f528f55778c62584d242274a7d697dae1ec63d7038b5a0b80dc9ba524e3f5f528bc717c60a635f89ff8af1cccbd1b4189f8ddc92e39"},"extensions":[]}]],"extensions":[],"signatures":["204e8746aac14a05fb3c66ac653429dead34bddac58911c53346feb365f0c7b5767ea870c1e5da6a104d8364e42f504fc1bdcfc442652f5c2e9bb9b26a858b0ccd"]}}

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

2230368ms th_a       websocket_api.cpp:109         on_message           ] API call execution time limit exceeded. method: transfer params: ["seerdex-withdraw","ffffff","500000","SEER","Welcome to SEERTALK. https://forum.seerchain.org",true] time: 2310335

实现了让钱包进行了一次转帐操做。

经常使用指令

get_dynamic_global_properties

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

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

返回信息示例:

{
        "id": 1,
        "result": {
            "id": "2.1.0",
            "head_block_number": 3678309,//当前区块高度
            "head_block_id": "00382065d1057b13415518f913ce26e46fe45cac",//当前块号
            "time": "2018-10-12T16:37:30",//链上时间(格林尼治时间)
            "current_witness": "1.5.4",//当前出块的见证人
            "next_maintenance_time": "2018-10-13T00:00:00",//下次维护更新时间
            "last_budget_time": "2018-10-12T00:00:00",//上次维护时间
            "witness_budget": 3398400000,//本期见证人预算总额
            "accounts_registered_this_interval": 1,//帐户注册间隔
            "recently_missed_count": 0,//最近缺失区块数
            "current_aslot": 4762199,//当前总块(丢掉的块加实际块高)
            "recent_slots_filled": "340240787892099949526793007880921399231",//用于计算见证人参与度的参数
            "dynamic_flags": 0,
            "last_irreversible_block_num": 3678305//最近一个不可逆块块号
        }
}

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

info

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

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

返回信息示例:

{"id":1,
     "result":
     {
         "head_block_num":3678258,//当前块高
         "head_block_id":"00382032d0bfee243b0c5f6b37e3fd6f29682e6e",//当前块号
         "head_block_age":"0 second old",//上一个区块生成时间
         "next_maintenance_time":"7 hours in the future",//维护更新时间
         "chain_id":"da68a9c5f2fd9ed48e626ea301db1c77505523884ba0dd409e779246c6ea26cf",//链号
         "participation":"88.28125000000000000",//区块生产参与率
         "active_witnesses"://活跃见证人ID
         ["1.5.1","1.5.2","1.5.3","1.5.4","1.5.5","1.5.6","1.5.7","1.5.8"],
         "active_committee_members"://活跃理事会成员ID
         ["1.4.0","1.4.1","1.4.2","1.4.3","1.4.4","1.4.5","1.4.6","1.4.7"]
     }
 }

充提业务需关注 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}

返回信息示例:

{
        "id": 1,
        "result": [{
            "amount": "7861177753754",//余额,精度5,amount没有小数点,其数值被乘以了10000 此处即78611777.53754
            "asset_id": "1.3.0"//资产类型 此处为SEER
        }, {
            "amount": 97099800,//余额,精度5,amount没有小数点,其数值被乘以了10000 
            "asset_id": "1.3.8"//资产类型 此处为测试链上的ABC资产
        }]
}

充提业务需关注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": 1,
    "jsonrpc": "2.0",
    "result":[
        "7ab0e58b6391a770cb62f432e0f2aef93de4d18e",//交易id
        {
        "ref_block_num": 64292,//引用的区块号
        "ref_block_prefix": 1517346144,//引用的区块头
        "expiration": "2018-10-12T07:33:12",//交易过时时间
        "operations": [
            [0, {//0表示转帐
                "fee": {//手续费
                    "amount": 2136718,//金额 ,amount没有小数点,其数值被乘以了10000 
                    "asset_id": "1.3.0"//资产 此处表示SEER
                },
                "from": "1.2.105",//转出帐户id
                "to": "1.2.138",//转入帐户id
                "amount": {
                    "amount": "50000000000",//金额 amount没有小数点,其数值被乘以了10000 
                    "asset_id": "1.3.0"//资产 此处表示SEER
                },
                "memo": {//memo权限相关
                    "from": "SEER8UAbnsAnXY1qr3CD6uzKaRuewsyPF9ynYJJGrdvSfDANxsGNxH",
                    "to": "SEER6QbqUZF6xzjdceVoLHS7K1KwvLyszVTZS8bbsQQQXcAm8L3aZp",
                    "nonce": "4469110159915322318",
                    "message": "482a7d070d298fe2a79d5f528f55778c62584d242274a7d697dae1ec63d7038b5a0b80dc9ba524e3f5f528bc717c60a635f89ff8af1cccbd1b4189f8ddc92e39"
                },
                "extensions": []
            }]
        ],
        "extensions": [],
        "signatures": ["204e8746aac14a05fb3c66ac653429dead34bddac58911c53346feb365f0c7b5767ea870c1e5da6a104d8364e42f504fc1bdcfc442652f5c2e9bb9b26a858b0ccd"]
        }
    ]
}

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

get_account_id

格式:get_account_id name

参数:name是帐户名

做用:列出帐户name的帐户id

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

返回信息示例:

{"id":1,"result":"1.2.105"}

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的操做历史记录

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

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

返回信息示例:

{
        "id": 1,
        "result": [
            {
            "memo": "give you 980 SEER",//解锁并有相应私钥的钱包方能显示MEMO
            "description": "Transfer 980 SEER from alice to okok -- Memo: give you 980 SEER   (Fee: 21.05468 SEER)",//钱包通常只显示此内容
            "op": {
                "id": "1.9.703568",//该操做的对象id,可经过get_object 1.9.703568查看此操做
                "op": [
                    0, //操做类型,0表示转帐
                    {
                    "fee": {//手续费
                        "amount": 2105468,//数额
                        "asset_id": "1.3.0"//资产类型
                    },
                    "from": "1.2.109",//转出id
                    "to": "1.2.105",//接收id
                    "amount": {
                        "amount": 98000000,//转帐数额
                        "asset_id": "1.3.0"//资产类型
                    },
                    "memo": {//MEMO权限相关
                        "from": "SEER6sJwPuSSayEzHXLbVgw9HJsDnGBk5Dup5bq3ns1YziZEDMKMgU",
                        "to": "SEER8UAbnsAnXY1qr3CD6uzKaRuewsyPF9ynYJJGrdvSfDANxsGNxH",
                        "nonce": "394073041834538",
                        "message": "485e630438b9a38c94c12afd9b15007845484d7f0c8c2c29c135f4f9a155a1ee"
                    },
                    "extensions": []
                }],
                "result": [//操做返回结果
                    0, 
                    {

                    }
                ],
                "block_num": 3674099,//入块高度
                "trx_in_block": 0,//操做所属交易在区块内的位置
                "op_in_trx": 0,//操做在交易内的位置
                "virtual_op": 52924//虚拟操做编号
            }
        }]
}

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_block 2090482
{
  "previous": "001fe5f1e1dd8d195af805484ee8038a09866b76",//上一个块的块号
  "timestamp": "2018-07-30T07:31:54",//时间戳
  "witness": "1.5.22",//见证人
  "transaction_merkle_root": "72756b0f1f1711622c8030eae65e6db055200320",
  "extensions": [],
  "witness_signature": "200d202d735de10f4f8213d71a8f946a2cc49bc02e930f682bea74321819b4bc7c4d436e366f1cad962f214eeaa42b5030fd716f692077f135b3cf33c688f68f1f",//见证人签名
  "transactions": [{
      "ref_block_num": 58864,//引用的区块号
      "ref_block_prefix": 2207768636,//引用的区块头
      "expiration": "2018-07-30T07:33:51",//交易过时时间
      "operations": [[
          0,{
            "fee": {
              "amount": 200000,//手续费 
              "asset_id": "1.3.0"//资产类型 1.3.0指SEER
            },
            "from": "1.2.1250",//发起用户ID
            "to": "1.2.1292",//接收用户ID
            "amount": {
              "amount": 2000000000,//金额20000
              "asset_id": "1.3.0"//资产类型 1.3.0指SEER
            },
            "extensions": []
          }
        ]
      ],
      "extensions": [],
      "signatures": [
        "205c1f92cd9eebba507094c0fe4a05be47d301b6b2e989f4f0fdcfc8acef69ceec5356faf1667b5576629bfbc29ee5a257dbfac935c5a8fef588e32d7a7902c2b3"//交易签名集合
      ],
      "operation_results": [[
          0,{}
        ]
      ]
    }
  ],
  "block_id": "001fe5f26d0f3ee5b1569a1618fe903e4dc5aef0",//块号
  "signing_key": "SEER5oyAoCzw5GRD9unKK6vsLXkPVx1aKU7i3hX19E8BRU5u3FoAoA",//见证人签名公钥
  "transaction_ids": [
    "30e73f68d163398005557a21c58bd751db22eb53"//交易id集
  ]
}

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

处理充值业务

一、经过get_relative_account_history查询帐户相关历史。

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

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

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

get_relative_account_history会列出和此帐户有关的全部操做,例如本身转帐给别人(包括提现)、别人转帐给本身(包括充值)、帐号注册、参与预测等,充提业务只须要op.op.N(操做类型)为0(转帐)的操做数据;

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

剩下的即是待处理的充值操做。

三、得到相关充值数据。

经过Http-RPC或websocket-RPC链接的命令行钱包在unlocked状态时,在get_relative_account_history返回的信息中能够查看memo内容,用户填写的交易所ID等入帐信息便今后处获取;

经过op.op.amount.amount(转帐数额)加上小数点,即是充值数额;

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

四、判断是否为可信操做。

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

get_relative_account_history会返回该笔操做所属的op.block_num(入块高度),但即便交易未入块,仍然可能出如今帐户历史中,所以须要和经过get_dynamic_global_properties获取到的last_irreversible_block_num(最近一个不可逆块块号)比较,op.block_num必须小于或等于last_irreversible_block_num,才能被视为可信操做。

五、记录下该操做的相关信息。

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可能对应多个操做。

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

处理提现业务

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

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

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

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

二、检查提现帐户余额

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

三、转帐并跟踪操做是否成功

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

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

关注transfer2返回信息中的expiration(交易过时时间),转帐操做发出后,通常很快能够从get_relative_account_history中获取到该笔转帐操做的信息,并经过op.block_numlast_irreversible_block_num比较来确认入块;

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

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

本文由seer爱好者提供,可能理解有误,欢迎到github指出:https://github.com/akirasen/s...

相关文章
相关标签/搜索