代码方法包括( 生成随机字符串, 发起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备注下信息