• 交易所钱包系统搭建流程


     

    搭建区块链钱包节点

    一、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"]
    
    }
  • 相关阅读:
    如何优化软件测试成本?——转译
    Pytest(下篇)
    人与机器人如何协同来测试软件——译
    Appium自动化测试遇到的chromedriver/chrome坑
    Pytest(上篇)
    【selenium】利用selenium进行爬虫时,防止js检测驱动的方法
    【python】python分词和识别图像中的文字
    【python】Python获取QQ截图热键(ctrl+alt+a)截取的内容
    【python】pyinstaller如何将自己写的模块一并打包到exe中
    【python】python启动线程查看线程的名称和id;python杀掉进程的方法
  • 原文地址:https://www.cnblogs.com/fly-l/p/13175746.html
Copyright © 2020-2023  润新知