zoukankan      html  css  js  c++  java
  • 开发指南:BUMO 交易所对接指南

    BUMO 交易所对接指南

    概述

    本文档用于交易所对接BUMO节点、使用BUMO SDK。

    JAVA SDK 用法说明

    JAVA SDK的使用包括了生成用户充值地址检测账户地址的合法性 以及资产交易

    生成用户充值地址

    交易所需要给每一个用户生成一个充值地址,交易所可通过 Bumo-sdk-java 中提供的Keypair.generator()创建用户的充值地址,具体示例如下所示:

       /**
    
            * 生成账户私钥、公钥以及地址
            */
           @Test
           public void createAccount() {
               Keypair keypair = Keypair.generator();
               System.out.println(JSON.toJSONString(keypair, true));
           }
    

    返回值如下所示:

    {
        "address": "buQa6wYkP9YPtE7xGJZKZ4TLHEJ79XFTFXRC",
        "privateKey": "privbytvfniP81UAD9FzyVhe43U2EKXcZqDXfkv2txhHuKN9AJszg4VC",
        "publicKey": "b00152f649c63d1b069a19f3a4647333cc9734f8f19452932ce25a4d6bd6b3697e1d88e69d61"
    }
    

    检测账户地址的合法性

    通过如下所示代码检测账户地址的合法性。

       /**
    
            * 检验账户地址是否合法
            */
           @Test
           public void checkAccountAddress() {
               String address = "buQemmMwmRQY1JkcU7w3nhruoX5N3j6C29uo";
               AccountCheckValidRequest accountCheckValidRequest = new AccountCheckValidRequest();
               accountCheckValidRequest.setAddress(address);
               AccountCheckValidResponse accountCheckValidResponse = sdk.getAccountService().checkValid(accountCheckValidRequest);
               if (0 == accountCheckValidResponse.getErrorCode()) {
                   System.out.println(accountCheckValidResponse.getResult().isValid());
               } else {
                   System.out.println(JSON.toJSONString(accountCheckValidResponse, true));
               }
           }
    

    注意

    • 如果返回值为 true 则表示账户地址合法。
    • 如果返回值为 false 则表示账户地址非法。

    资产交易

    在BUMO网络里,每10秒产生一个区块,每个交易只需要一次确认即可得到交易终态。在本章节将介绍 探测用户充值 、用户提现或转账 以及 查询交易 。

    探测用户充值

    交易所需要开发监听区块生成,然后解析区块里的交易记录,从而确认用户充值行为。具体步骤如下:

    1. 确保节点区块状态正常。
    2. 解析区块里包含的交易(解析方法见解析区块交易)。
    3. 记录解析后的结果。

    查看区块状态

    通过如下所示代码查看区块状态。

       /**
    
            * 检测连接的节点是否区块同步正常
            */
           @Test
           public void checkBlockStatus() {
               BlockCheckStatusResponse response = sdk.getBlockService().checkStatus();
               System.out.println(response.getResult().getSynchronous());
           }
    

    注意

    • 如果返回值为 true 则表示区块正常。
    • 如果返回值为 false 则表示区块异常。

    解析区块交易

    交易所可根据区块高度查询该区块里的交易信息,然后分析每条交易信息。

    请求示例:

       /**
    
            * 探测用户充值操作
            * 
            * 通过解析区块中的交易来探测用户的充值动作
            */
           @Test
           public void getTransactionOfBolck() {
               Long blockNumber = 617247L;// 第617247个区块
               BlockGetTransactionsRequest request = new BlockGetTransactionsRequest();
               request.setBlockNumber(blockNumber);
               BlockGetTransactionsResponse response = sdk.getBlockService().getTransactions(request);
               if (0 == response.getErrorCode()) {
                   System.out.println(JSON.toJSONString(response, true));
               } else {
                   System.out.println("Failure
    " + JSON.toJSONString(response, true));
               }
               // 探测某个账户是否充值BU
               // 解析transactions[n].transaction.operations[n].pay_coin.dest_address 
        
               // 注意:
               // Operations是数组,有可能有多笔转账操作
           }
    

    响应报文如下:

      {
        "total_count": 1,
        "transactions": [{
            "close_time": 1524467568753121,
            "error_code": 0,
            "error_desc": "",
            "hash": "89402813097402d1983c178c5ec271c6890db40c3beb9f06db71c8d52dab6c86",
            "ledger_seq": 33063,
            "signatures": [{
                "public_key": "b001dbf0942450f5601e39ac1f7223e332fe0324f1f91ec16c286258caba46dd29f6ef9bf93b",
                "sign_data": "668984fc7ded2dd30d87a1577f78eeb34d2198de3485be14ea66d9ca18f21aa21b2e0461ad8fedefc1abcb4221d346b404e8f9f9bd9c93a7df99baffeb616e0a"
            }],
            "transaction": {
                "fee_limit": 1000000,
                "gas_price": 1000,
                "metadata": "333133323333",
                "nonce": 25,
                "operations": [{
                    "pay_coin": {
                        "amount": 3000,
                        "dest_address": "buQctxUa367fjw9jegzMVvdux5eCdEhX18ME"
                    },
                    "type": 7
                }],
                "source_address": "buQhP7pzmjoRsNG7AkhfNxiWd7HuYsYnLa4x"
            }
        }]
      }
    
      响应报文解释:
    
      total_count    交易总数(一般情况下都是1)
      transactions   查询区块中交易对象,数组大小是该区块的交易总数
      actual_fee     交易费用,单位是MO
      close_time     交易时间
      error_code     交易状态 0 是成功 非0 为失败
      error_desc     交易状态信息
      hash           交易哈希
      ledger_seq     区块高度
      signatures     签名信息
      public_key     签名者公钥
      sign_data      签名者签名数据
      transaction    签名对象
      fee_limit      费用最小值,单位 MO
      gas_price      Gas,单位 MO
      metadata       交易附加信息
      nonce          交易原账号交易数
      operations     操作对象(支持多个)
      pay_coin       操作类型:内置token
      amount         转移BU数量,单位 MO
      dest_address   接收方地址
      type           操作类型:7 为内置token转移
      source_address 转出方地址
    

    注意

    • 关于Bumo-sdk-java 如何使用,请访问:JAVA SDK

    • 关于交易所对接示例,请访问以下链接:ExchangeDemo.java

    用户提现或转账

    用户提现操作可参考bumo-sdk-java 提供的转账示例,如下所示:

       /**
            * 发送一笔BU交易
            *
            * @throws Exception
            */
           @Test
           public void sendBu() throws Exception {
               // 初始化变量
               // 发送方私钥
               String senderPrivateKey = "privbyQCRp7DLqKtRFCqKQJr81TurTqG6UKXMMtGAmPG3abcM9XHjWvq";
               // 接收方账户地址
               String destAddress = "buQswSaKDACkrFsnP1wcVsLAUzXQsemauE";
               // 发送BU数量
               Long amount = ToBaseUnit.BU2MO("0.01");
               // 固定写 1000L,单位是MO
               Long gasPrice = 1000L;
               // 设置最大费用 0.01BU
               Long feeLimit = ToBaseUnit.BU2MO("0.01");
               // 参考getAccountNonce()获取账户Nonce+ 1
               Long nonce = 1L;
    
               // 记录 txhash,以便后续再次确认交易真实结果
               // 推荐5个区块后通过txhash再次调用`根据交易Hash获取交易信息`(参考提示:getTxByHash())来确认交易终态结果
               String txhash = sendBu(senderPrivateKey, destAddress, amount, nonce, gasPrice, feeLimit);
        
           }
    

    注意

    • 记录提现操作的hash值,以便后续查看该笔提现操作的终态结果。
    • gasPrice 目前(2018-04-23)最低值是1000MO。
    • feeLimit 建议填写1000000MO,即0.01BU。

    查询交易

    用户提现操作的终态结果可通过当时发起提现操作时返回的hash值进行查询。

    调用示例如下所示:

       /**
        * 基于交易hash查询交易信息
        */
           @Test
           public void getTxByHash() {
               String txHash = "fba9c3f73705ca3eb865c7ec2959c30bd27534509796fd5b208b0576ab155d95";
               TransactionGetInfoRequest request = new TransactionGetInfoRequest();
               request.setHash(txHash);
               TransactionGetInfoResponse response = sdk.getTransactionService().getInfo(request);
               if (0 == response.getErrorCode()) {
                   System.out.println(JSON.toJSONString(response, true));
               } else {
                   System.out.println("Failure
    " + JSON.toJSONString(response, true));
               }
           }
    

    注意

    • tx.totalCount 数量大于等于1时说明交易历史存在。
    • tx.transactions.errorCode 等于0表示交易成功,非0表示交易失败,具体原因查看 errorDesc
    • 用户提现操作,交易所请关注 pay_coin 操作。
    • 完整用户提现响应示例:
      {
        "total_count": 1,
        "transactions": [{
            "close_time": 1524467568753121,
            "error_code": 0,
            "error_desc": "",
            "hash": "89402813097402d1983c178c5ec271c6890db40c3beb9f06db71c8d52dab6c86",
            "ledger_seq": 33063,
            "signatures": [{
                "public_key": "b001dbf0942450f5601e39ac1f7223e332fe0324f1f91ec16c286258caba46dd29f6ef9bf93b",
                "sign_data": "668984fc7ded2dd30d87a1577f78eeb34d2198de3485be14ea66d9ca18f21aa21b2e0461ad8fedefc1abcb4221d346b404e8f9f9bd9c93a7df99baffeb616e0a"
            }],
            "transaction": {
                "fee_limit": 1000000,
                "gas_price": 1000,
                "metadata": "333133323333",
                "nonce": 25,
                "operations": [{
                    "pay_coin": {
                        "amount": 3000,
                        "dest_address": "buQctxUa367fjw9jegzMVvdux5eCdEhX18ME"
                    },
                    "type": 7
                }],
                "source_address": "buQhP7pzmjoRsNG7AkhfNxiWd7HuYsYnLa4x"
            }
        }]
      }
      total_count    交易总数(一般情况下都是1)
      transactions   查询区块中交易对象,数组大小是该区块的交易总数
      actual_fee     交易费用,单位是MO
      close_time     交易时间
      error_code     交易状态 0 是成功 非0 为失败
      error_desc     交易状态信息
      hash           交易哈希
      ledger_seq     区块高度
      signatures     签名信息
      public_key     签名者公钥
      sign_data      签名者签名数据
      transaction    签名对象
      fee_limit      费用最小值,单位 MO
      gas_price      Gas,单位 MO
      metadata       交易附加信息
      nonce          交易原账号交易数
      operations     操作对象(支持多个)
      pay_coin       操作类型:内置token
      amount         转移BU数量,单位 MO
      dest_address   接收方地址
      type           操作类型:7 为内置token转移
      source_address 转出方地址
    

    BU-Explorer

    BUMO提供了区块链数据浏览工具,可供用户查询区块数据。

    您访问以下链接查询区块链数据:

    BUMO钱包

    BUMO提供了Windows和Mac版全节点钱包,可供用户管理用户私钥、查看BU余额转账以及离线签名交易等功能。

    您可以通过以链接下载BUMO钱包:

    https://github.com/bumoproject/bumo-wallet/releases

    常见问题

    BUChain命令行的节点启动

    问:使用BUChain命令行时是否需要启动该节点?

    答:不用。

    gas_price和fee_limit的值是否固定

    问:gas_price 是固定1000MO,fee_limit 是1000000MO 吗?

    答:不是固定。但目前(2018-04-23) gas_price 是1000MO,gas_price 越大越优先打包。fee_limit 是交易时交易发起方最多给区块链的交易费用,在正常合法的交易情况下区块链收取的真实费用小于调用方填写的 fee_limit 。( gas_price 可通过 http://seed1.bumo.io:16002/getLedger?with_fee=true 查询的结果 result.fees.gas_price 字段得到)。

    账户余额转出

    问:账户的余额能否全部转出?

    答:不能。为了防止DDOS 攻击,防止创建大量垃圾账户,BUMO激活的账户必须保留一定数量的BU,目前是0.1BU(可通过 http://seed1.bumo.io:16002/getLedger?with_fee=true 查询的结果 result.fees.base_reserve字段得到)。

  • 相关阅读:
    UVA 1152 4 Values whose Sum is 0
    IOI 2006 Pyramid
    CTSC 2000 冰原探险
    IOI 2009 Mecho
    IOI 2011 Rice Hub 米仓
    NOIP 2013 火柴排队 程序
    USACO 2004 MooFest 奶牛集会
    USACO Training Section 3.1 Contact
    动态加载Ribbon功能区
    Ribbon2: 创建动态的Ribbon库
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313231.html
Copyright © 2011-2022 走看看