本指南主要目的是幫助交易所和其它第三方平臺(包括但不限於非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
中上帳1000SEER
;json
二、小明請朋友小花幫本身充值,小花從本身的SEER主網帳戶xiaohua
充值1000SEER
到交易所帳戶seerdex
,MEMO中填寫10010
,交易所檢測到主網帳戶seerdex
收到一筆1000SEER
的轉帳,MEMO爲10010
,則在小明的交易所帳戶10010
中上帳1000SEER
;ubuntu
三、小明將本身玩大富翁遊戲中贏得的SEER充值交易所,小明在大富翁遊戲的提現頁面中填寫提現1000SEER
到交易所帳戶seerdex
,並填寫MEMO10010
,大富翁遊戲在平臺內扣除小明帳戶餘額1000SEER
,同時經過大富翁的SEER主網帳戶dafuweng
向交易所帳戶seerdex
轉帳1000SEER
,MEMO爲10010
,交易所檢測到主網帳戶seerdex
收到一筆1000SEER
的轉帳,MEMO爲10010
,則在小明的交易所帳戶10010
中上帳1000SEER
。api
例子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的窗口;
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
。
一、在服務器新建一個名叫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//調用標識符 }
可使用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"}]}
首先在服務器上安裝使用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
實現了讓錢包進行了一次轉帳操做。
做用:列出鏈的當前全局動態參數
示例:{"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
最近一個不可逆塊塊號。用於判斷是不是可信充值操做以及提現是否已處理。
做用:顯示當前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
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
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
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
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
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_num
和last_irreversible_block_num
比較來確認入塊;
(1)若確認入塊,則返回信息中的交易id
應該已經存在於get_object
op.block_num
獲取該轉帳操做所在塊信息的transaction_ids
數組中。
(2)若發出的轉帳操做超過了expiration
還未確認入塊,則這筆交易可能因爲您同時廣播的操做太多等各類緣由未被區塊鏈打包並已經被丟棄,此時從新發起轉帳是安全的。
本文由seer愛好者提供,可能理解有誤,歡迎到github指出:https://github.com/akirasen/s...