Go 实现 Omni Rpc 接口

Posted wf-l5201314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 实现 Omni Rpc 接口相关的知识,希望对你有一定的参考价值。

Go 实现 Omni Rpc 接口交互

1. Rpc 接口实现

package net

import (
    "bytes"
    "errors"
    "io/ioutil"
    "net/http"
    "time"


    "github.com/astaxie/beego"
)


var userName string
var userPwd string


var url string = "http://172.30.143.249:8336"


func InitRpc() {
    //数据库类别
    omni := "omni"
    userName = beego.AppConfig.String(omni + "::RpcUsername")
    userPwd = beego.AppConfig.String(omni + "::RpcPassword")


    url = "http://" + beego.AppConfig.String(omni+"::RpcIp") + ":" + beego.AppConfig.String(omni+"::RpcPort")
}


// 发送POST请求
// url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json
// content:请求放回的内容
func HttpRpcPost(jsonStr string) (content string, err error) {
    if userName == "" || userPwd == "" {
        return "", errors.New("you mast do InitRpcAuthUser set user and password.")
    }


    req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(jsonStr)))
    req.Header.Set("Content-Type", "application/json")
    req.SetBasicAuth(userName, userPwd)
    if err != nil {
        panic(err)
    }
    defer req.Body.Close()


    client := &http.Client{Timeout: 30 * time.Second}
    resp, error := client.Do(req)
    if error != nil {
        panic(error)
    }
    defer resp.Body.Close()


    result, _ := ioutil.ReadAll(resp.Body)
    content = string(result)
    return content, nil
}


2. 使用

package models

import (
    "XXX/net" // 工具类库导入
    "encoding/json"
    "strconv"
)

/// 获取块中所有交易 hash
type OmniRpcBlockTransactionsHashResult struct {
    Result []string // 响应结果,交易 hash 数组
    Error  string   // 错误日志
}

/// 获取交易详情
type OmniRpcTransactionResult struct {
    Result OmniRpcTransactionsInfo // 响应结果,交易详情
    Error  string                  // 错误日志
}

type OmniRpcTransactionsInfo struct {
    Txid             string // 交易 hash
    Fee              string // 手续费
    Sendingaddress   string // 发送地址 ":"17rExRiMaJGgHPVuYjHL21mEhfzbRPRkui",
    Referenceaddress string // 接收地址":"1BKpa19m5Xy9SvSzC5djPWtCfbuynSDwmb",
    Ismine           bool   //":false,
    Version          int    // ":0,
    Type_int         int    // 币种类型 31 为 USDT
    Type             string // ":"DEx Accept Offer",
    Propertyid       int    // ":2,
    Divisible        bool   //":true,
    Amount           string // 交易量 ":"10.00000000",
    Valid            bool   // ":true,
    Blockhash        string // 块 hash ":"0000000000000000afb6922317c026b31b582c1096074670518bf6dd18df365c",
    Blocktime        int    // 交易成交时间 ":1391336004,
    Positioninblock  int    //":32,
    Block            int    // 块高度 ":283729,
    Confirmations    int    //":135470
}

/// 获取节点详情
type OmniRpcInfoResult struct {
    Result OmniRpcInfo // 响应结果,交易详情
    Error  string      // 错误日志
}

// Omni 节点信息
type OmniRpcInfo struct {
    Omnicoreversion_int int    // ":70000000,
    Omnicoreversion     string // ":"0.7.0",
    Mastercoreversion   string // ":"0.7.0",
    Bitcoincoreversion  string // ":"0.18.1",
    Block               int    // 最高块的块高度
    Blocktime           int    // 最高块的交易时间
    Blocktransactions   int    // 最高块的交易数量
    Totaltrades         int    // ":77,
    Totaltransactions   int    // 当前节点总交易次数
}

// 获取节点信息
func getOmniInfo() (*OmniRpcInfoResult, error) {
    jsonStr := "{"jsonrpc":"2.0", "method": "omni_getinfo"}"
    resultStr, err := net.HttpRpcPost(jsonStr)

    if err != nil {
        return nil, err
    }

    var result = OmniRpcInfoResult{}
    inputErr := json.Unmarshal([]byte(resultStr), &result)
    return &result, inputErr
}

/// 根据块高度获取交易 hash
func getOmniBlockTransactionsHash(blockHeight int) (*OmniRpcBlockTransactionsHashResult, error) {
    jsonStr := "{"jsonrpc":"2.0", "method": "omni_listblocktransactions", "params":[" + strconv.Itoa(blockHeight) + "]}"
    resultStr, err := net.HttpRpcPost(jsonStr)

    if err != nil {
        return nil, err
    }

    var result = OmniRpcBlockTransactionsHashResult{}
    inputErr := json.Unmarshal([]byte(resultStr), &result)
    return &result, inputErr
}

/// 根据 txid 获取交易详情
func getOmniTransaction(txid string) (*OmniRpcTransactionResult, error) {
    jsonStr := "{"jsonrpc":"2.0", "method": "omni_gettransaction", "params":["" + txid + ""]}"
    resultStr, err := net.HttpRpcPost(jsonStr)

    if err != nil {
        return nil, err
    }

    var result = OmniRpcTransactionResult{}
    inputErr := json.Unmarshal([]byte(resultStr), &result)
    return &result, inputErr
}
}

以上是关于Go 实现 Omni Rpc 接口的主要内容,如果未能解决你的问题,请参考以下文章

Omni Core v0.11.0 rpc-api

Omni Core v0.11.0 rpc-api

Go语言入门篇-gRPC基于golang & java简单实现

Go标准包RPC的使用

[go微服务-16] Go RPC 实现服务间通信

Go微服务—— RPC