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的窗口;
screen -S seer
2、在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
3、進入seer目錄,解壓此軟件包。
cd seer
tar xzvf seer.tar.gz
4、帶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
條操作記錄,需要您按需求填寫。
5、觀察節點運行正常後,ctrl+A d隱藏screen,斷開服務器。之後要再打開運行有節點的Sreeen,則使用 screen -R
,或 screen -r seer
。
節點正常啓動後,會顯示像下面一樣的3秒一個的出塊信息。
如果要關閉節點,則使用control
+ C
。
配置一個SEER命令行錢包
1、在服務器新建一個名叫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
,負責充提業務的程序也可以使用此端口調用命令行錢包進行操作。
2、錢包啓動成功後,會顯示:
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。
處理充值業務
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
還未確認入塊,則這筆交易可能由於您同時廣播的操作太多等各種原因未被區塊鏈打包並已經被丟棄,此時重新發起轉賬是安全的。
本文由seer愛好者提供,可能理解有誤,歡迎到github指出:https://github.com/akirasen/s...