golang对接瑞波币,XRP JSONRPC

目的: 实现创建xrp地址,发起交易,查看账户余额

代码方法包括( 生成随机字符串, 发起post请求,创建钱包地址,查看账户余额,发起交易,交易日志 )

直接先上代码

package xrp

import (
	"encoding/json"
	"errors"
	"io/ioutil"
	"math/rand"
	"net/http"
	"strings"
	"time"
)

const (
	XrpRpcURL                = "http://127.0.0.1:5005" //xrp 节点服务器地址
	BalanceNotEnough         = "账户余额不足"
	SendSignFailed           = "发起签名失败"
	SubmitTransactionFailed  = "提交交易失败"
	ToNotExistOrXrpNotEnough = "收款方不存在.发送的XRP太少,无法创建交易!"
	RequestWasAborted        = "请求失败"
)

//CreateAccount 创建账户 
//userCode 为 GetRandomString() 方法生成的随机数,可以存到数据库中
func CreateAccount(userCode string) (map[string]interface{}, error) {
	var params = map[string]interface{}{
		"passphrase": userCode,
		"key_type":   "secp256k1",
	}
	result, err := xrpPost("wallet_propose", params)
	if err != nil {
		return nil, err
	}
	return result, nil
}

//GetAccountBalance 获取钱包地址账户余额
//account 钱包地址
func GetAccountBalance(account string) (float64, error) {
	var params = map[string]interface{}{
		"account": account,
		"strict":  false,
	}
	result, err := xrpPost("account_info", params)
	if err != nil {
		return 0.00, err
	}
	accountInfo := result["account_data"].(map[string]interface{})
	return accountInfo["Balance"].(float64) / 1000000, nil
}

//SendTranction 先签名, 后发起交易
//from 出钱者 , to 收钱者 , userCode 用户随机码(创建账户的那个) , money 交易数量
//returnData 错误信息,hash  --> 错误信息如果是success 表示发起交易成功
func SendTranction(from, to, userCode string, money float64) (string, string) {
    //  passphrase 和 key_type 一起使用 可以发起签名, 或者直接使用  secret 两者选其一
	var params = map[string]interface{}{
		// "passphrase": userCode,
		// "key_type":   "secp256k1",
		"secret": userCode,
		"tx_json": map[string]interface{}{
			"TransactionType": "Payment",
			"Account":         from, //出
			"Destination":     to,   //收
			"Amount":          money * 1000000,
		},
	}
	result, err := xrpPost("sign", params)
	if err != nil {
		return SendSignFailed, ""
	}
	var subParams = map[string]interface{}{
		"tx_blob": result["tx_blob"],
	}
	subResult, err := xrpPost("submit", subParams)
	if err != nil {
		return SubmitTransactionFailed, ""
	}
	if subResult["engine_result_message"] == "Insufficient XRP balance to send." {
		return BalanceNotEnough, ""
	}
	if subResult["engine_result_message"] == "Destination does not exist. Too little XRP sent to create it." {
		return ToNotExistOrXrpNotEnough, ""
	}
	return "success", subResult["hash"].(string)
}

//TranscationLog 交易日志
//account 钱包地址
func TranscationLog(account string) ([]interface{}, error) {
	var params = map[string]interface{}{
		"account":          account,
		"ledger_index_max": -1,
	}
	result, err := xrpPost("account_tx", params)
	if err != nil {
		return nil, err
	}
	if result["transactions"] == nil {
		return nil, nil
	}
	return result["transactions"].([]interface{}), nil
}

//GetRandomString 生成随机字符串
func GetRandomString(lenth int) string {
	str := "rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"
	bytes := []byte(str)
	result := []byte{}
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	for i := 0; i < lenth; i++ {
		result = append(result, bytes[r.Intn(len(bytes))])
	}
	return string(result)
}

//xrpPost post请求
func xrpPost(method string, params map[string]interface{}) (map[string]interface{}, error) {
	var formData = map[string]interface{}{
		"method": method,
		"params": []map[string]interface{}{params},
	}

	formDataJson, err := json.Marshal(formData)
	if err != nil {
		return nil, err
	}
	result, err := http.Post(XrpRpcURL, "application/x-www-form-urlencoded", strings.NewReader(string(formDataJson)))
	// log.Printf("%+v", result)
	if err != nil {
		return nil, err
	}
	defer result.Body.Close()
	content, err := ioutil.ReadAll(result.Body)
	if err != nil {
		return nil, err
	}
	var resultMap map[string]interface{}
	if err := json.Unmarshal(content, &resultMap); err != nil {
		return nil, err
	}
	returnData := resultMap["result"].(map[string]interface{})
	// log.Printf("%+v", returnData)
	if returnData["status"] != "success" {
		return nil, errors.New(RequestWasAborted)
	}
	return returnData, nil
}

怎么使用这些方法就不描述了

节点服务器不知道怎么搭建的, 请看这篇文章

https://blog.csdn.net/Little_Ji/article/details/93629887

如果疑问或者代码使用有问题,可以+QQ 2453564902 互相交流, 加QQ备注下信息

你可能感兴趣的:(go,区块链)