搭建區塊鏈錢包節點
一、USDT/BTC
(1)搭建BTC/USDT節點並同步數據
git地址:https://github.com/OmniLayer/omnicore,目前該omni版本已支持BTC,不用再單獨部署btc節點
(2)檢查是否同步最新
可參考區塊瀏覽器https://btc.com/,調用omnicore-cli的getblockchaininfo方法檢查是否同步到最新高度
二、ERC20/ETH
(1)搭建eth節點
git地址:https://github.com/multi-geth/multi-geth/releases
(2)檢查最新
可參考區塊瀏覽器https://cn.etherscan.com/,使用geth attach接入節點,調用eth.syncing檢查是否同步到最新高度;或者使用RPC提供的接口eth_syncing查看。
搭建交易所錢包系統
以現在市面上用的最多的優盾錢包為例:
參考案例:優盾錢包
優盾錢包官網API接口文檔:https://www.uduncloud.com/gateway-interface
至少添加以下幾張表
(1)會員錢包表
會員ID、幣種、余額、凍結余額、充值地址
邏輯1:對應會員地址有充幣時,增加對應錢包余額
邏輯2:會員提幣時,從余額凍結對應提幣數量,待提幣成功,扣除對應凍結數量,提幣失敗,返還對應凍結數量
(2)充幣記錄表
txid、充值地址、會員ID、幣種、數量、時間
邏輯1:對應會員地址有充值時錄入充幣類型記錄
邏輯2:可根據txid和充值地址判斷唯一,防止重復入賬
(3)提幣審核表
提幣編號、會員ID、幣種、提幣地址、提幣數量、提幣狀態、txid、時間
邏輯1:會員申請提幣時錄入待審核記錄
邏輯2:審核通過,將會員提幣的金額成功發送到鏈上后,設置為審核成功,記錄交易哈希txid
邏輯3:審核拒絕,設置為審核失敗
邏輯4:獲取交易在區塊鏈的狀態,根據狀態判斷該筆審核交易的成功與失敗,成功扣除提幣凍結資金、失敗則返還
(4)支持幣種表
幣種、幣種類型
邏輯1:根據支持幣種去生成地址
邏輯2:只允許提幣支持的幣種
實現充提幣對接
生成地址:
(1)在對應部署的區塊節點上創建錢包
(2)通過rpc接口進行生成地址
(3)將生成的地址分配給交易所用戶的錢包信息中,供用戶充值使用
充提幣處理邏輯:
(1)查詢最新區塊鏈最新高度
(2)對比系統已處理的最新高度
(3)假如區塊鏈最新高度大於已處理的最新高度,則處理系統已處理的最新高度加一的高度
(4)查詢需要處理的區塊信息
(5)查詢對應區塊的所有交易信息
(6)循環處理該區塊的交易信息處理充幣
(6-1)過濾已成功的交易
(6-2)查詢到賬地址是否為系統地址
(6-3)到賬是系統地址則可以判斷為充幣,進行充幣邏輯處理
(7)處理提幣
(7-1)循環處理交易
(7-2)判斷交易哈希是否為系統提幣的交易哈希
(7-3)該筆交易狀態為成功,則系統處理提幣交易成功
(7-4)該筆交易狀態為失敗,則系統處理為提幣交易失敗
指令和調用方式
一、USDT/BTC
指令:
錢包在啟動節點時就已經創建,錢包名稱默認為"",錢包默認打開,沒有鎖定操作
例如:在賬戶recive下創建新的地址
bitcoin-cli getnewaddress "recive"
rpc函數調用:
調用方式均為標准的rpc調用方式,請求地址為http://user:password@ip:port,user/password為配置的允許調用rpc的用戶名和密碼,ip為節點部署的服務器ip,port為配置的支持rpc端口
查詢最新高度
{ "jsonrpc": "2.0", "id": 1, "method": "getbestblockhash", "params": [] }
獲取區塊相關信息信息
{ "jsonrpc": "2.0", "id": 1, "method": "getblock", "params": ["5dacf2826896060679267ff7bbf42ecae8313173f405492ec0583ad5737ffb69",true] } { "jsonrpc": "2.0", "id": 1, "method": "getblockhash", "params": [2] } { "jsonrpc": "2.0", "id": 1, "method": "getblockheader", "params": ["e2acdf2dd19a702e5d12a925f1e984b01e47a933562ca893656d4afb38b44ee3", true] }
獲取交易詳情
{ "jsonrpc": "2.0", "id": 1, "method": "getrawtransaction", "params": ["e2acdf2dd19a702e5d12a925f1e984b01e47a933562ca893656d4afb38b44ee3"] } { "jsonrpc": "2.0", "id": 1, "method": "gettxout", "params": ["e2acdf2dd19a702e5d12a925f1e984b01e47a933562ca893656d4afb38b44ee3", 1] }
發送交易
{ "jsonrpc": "2.0", "id": 1, "method": "sendrawtransaction", "params": ["signedhex"] }
二、ERC20/ETH
指令:
運行節點時,錢包已經創建,只需要創建賬戶即可!所以操作需要使用 geth attach 接入節點
# 列出當前賬戶
eth.accounts
# 創建賬戶
personal.newAccount()
#解鎖賬戶(資金來源的賬戶)
personal.unlockAccount(eth.accounts[0])
#鎖定賬戶(資金來源的賬戶)
personal.lockAccount(eth.accounts[0])
rpc函數:
官方文檔鏈接https://github.com/ethereum/wiki/wiki/JSON-RPC#net_version
常用rpc函數:
查詢最新高度
查看區塊個數
{ "jsonrpc": "2.0", "id": 1, "method": "eth_blockNumber", "params": [] }
根據區塊hash獲取區塊信息
{ "jsonrpc": "2.0", "id": 1, "method": "eth_getBlockByHash", "params": ["0x13d796b3485a49b1ff9654638a2be8f61a617d14df676a0613c70716c353f1e7", true] }
根據區塊高度獲取區塊信息
{ "jsonrpc": "2.0", "id": 1, "method": "eth_getBlockByNumber", "params": ["0x1", true] }
獲取交易詳情
{ "jsonrpc": "2.0", "id": 1, "method": "eth_getTransactionByHash", "params": ["0x9428ea6b8cc11b996625be6e04ae99b1e460a3cdf2ade9184ebf3026c2dc81c4"] }
發送交易
{ "jsonrpc": "2.0", "id": 1, "method": "eth_sendTransaction", "params": [{ "from": "0x81a8d02cfd1db2cc781940f361d301edc11b978c", "to": "0xed45bbb0c75a23b82304d77ad551f9d5d46b046a", "value": "0xDE0B6B3A7640000"}] }
發送簽名交易
{ "jsonrpc": "2.0", "id": 1, "method": "eth_sendRawTransaction", "params": ["0xf8610180825208941e4abf25b8f6d692e079cc60cebbb12e908553c48203e8801ba0d1012ee33405ee58d68837fd4bad6632d5d5f7070b9eb6312b60428c21e7e41aa025f99c502f134a15ad6b0c55256375800799e2e833e986598a4144d9d80a3f50"] }