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
}
}