bitcoin, btc 비트 코 인 이체, jsonrpc 기능, 언어 golang 개발
package ltc
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"log"
"net/http"
"service/app/core/db"
"service/app/core/model"
"service/config"
"strconv"
"time"
)
const (
//RPCURL url
RPCURL = "http://x.x.x.x:9332"
//JSONRpcVersion
JSONRpcVersion = "2.0"
//COMPONY
COMPONY = "xxxxxxxxxxxxxxxxxxxxxxxxx"
)
var (
//ID id
ID int
)
//GetNewAddress
func GetNewAddress(name string) (string, error) {
var (
params = []interface{}{
name, // , , :""
}
jsonData map[string]interface{}
result []byte
err error
)
result = JSONRPCPost("getnewaddress", params)
err = json.Unmarshal(result, &jsonData)
if err != nil {
return "", err
}
if e, ok := jsonData["error"]; ok {
if e != nil {
return "", errors.New(e.(string))
}
}
return jsonData["result"].(string), nil
}
//GetReceivedByAddress , 。
func GetReceivedByAddress(address string) float64 {
var (
params = []interface{}{
address, //
6, // , :6
}
jsonData map[string]interface{}
result []byte
newAmount float64
err error
)
result = JSONRPCPost("getreceivedbyaddress", params)
err = json.Unmarshal(result, &jsonData)
if err != nil {
log.Print(err.Error())
return 0
}
if e, ok := jsonData["error"]; ok {
if e != nil {
log.Print(err.Error())
return 0
}
}
// log.Print(jsonData)
// , TODO:
newAmount, err = strconv.ParseFloat(fmt.Sprintf("%.2f", jsonData["result"]), 64)
if err != nil {
return 0
}
return newAmount
}
//GetBalanceByAddress , ,
func GetBalanceByAddress(address []string) float64 {
var (
params = []interface{}{
6, // , :1
99999999, // , :9999999
address, //
}
jsonData map[string]interface{}
result []byte
err error
amount float64
)
result = JSONRPCPost("listunspent", params)
err = json.Unmarshal(result, &jsonData)
log.Print(jsonData)
if err != nil {
return 0
}
if e, ok := jsonData["error"]; ok {
if e != nil {
return 0
}
}
log.Print(jsonData["result"])
for _, v := range jsonData["result"].([]interface{}) {
newV := v.(map[string]interface{})
num := newV["amount"].(float64)
if num > 0 && num >= minNum {
amount += num
}
}
return amount
}
//GetBalance ( ) ltc
func GetBalance(label string) float64 {
var (
params = []interface{}{
label, // , , *,
6, // UTXO , , :6
true, // , , :true
}
jsonData map[string]interface{}
result []byte
err error
)
result = JSONRPCPost("getbalance", params)
err = json.Unmarshal(result, &jsonData)
if err != nil {
return 0
}
if e, ok := jsonData["error"]; ok {
if e != nil {
return 0
}
}
return jsonData["result"].(float64)
}
//GetUTXORecordByAddress ,
func GetUTXORecordByAddress(address []string) []interface{} {
var (
params = []interface{}{
6, // , :1
99999999, // , :9999999
address, //
}
jsonData map[string]interface{}
result []byte
err error
)
result = JSONRPCPost("listunspent", params)
err = json.Unmarshal(result, &jsonData)
if err != nil {
log.Print(err.Error())
return nil
}
if e, ok := jsonData["error"]; ok {
if e != nil {
log.Print(e.(map[string]interface{})["message"])
return nil
}
}
return jsonData["result"].([]interface{})
}
//
//@param input UTXO txid,vout output :
func createRawtransaction(input, output []map[string]interface{}) (interface{}, error) {
var (
params []interface{}
result []byte
err error
jsonData map[string]interface{}
)
params = append(params, input)
params = append(params, output)
result = JSONRPCPost("createrawtransaction", params)
err = json.Unmarshal(result, &jsonData)
if err != nil {
return nil, err
}
if e, ok := jsonData["error"]; ok {
if e != nil {
return nil, errors.New(e.(map[string]interface{})["message"].(string))
}
}
return jsonData["result"], nil
}
//
//@param hex createrawtransaction
//@param options
func fundRawtransaction(hex interface{}) (interface{}, error) {
var (
options = map[string]interface{}{
"changeAddress": COMPONY,
"changePosition": 1,
"includeWatching": false,
"lockUnspents": false,
"feeRate": 0.00002,
}
params = []interface{}{
hex,
options,
}
result []byte
err error
jsonData map[string]interface{}
)
result = JSONRPCPost("fundrawtransaction", params)
err = json.Unmarshal(result, &jsonData)
if err != nil {
return nil, err
}
if e, ok := jsonData["error"]; ok {
if e != nil {
return nil, errors.New(e.(map[string]interface{})["message"].(string))
}
}
return jsonData["result"].(map[string]interface{})["hex"], nil
}
//
//@param hex fundrawtransaction hex
func signRawtransactionwallet(hex interface{}) (interface{}, error) {
var (
params = []interface{}{
hex,
}
result []byte
err error
jsonData map[string]interface{}
)
result = JSONRPCPost("signrawtransactionwithwallet", params)
err = json.Unmarshal(result, &jsonData)
if err != nil {
return nil, err
}
if e, ok := jsonData["error"]; ok {
if e != nil {
return nil, errors.New(e.(map[string]interface{})["message"].(string))
}
}
returnData := jsonData["result"].(map[string]interface{})
if !returnData["complete"].(bool) {
return nil, errors.New("No complete signature set")
}
return returnData["hex"], nil
}
// P2P
//@param hex signrawtransactionwithwallet hex
func sendRawtransaction(hex interface{}) (interface{}, error) {
var (
params = []interface{}{
hex,
}
result []byte
err error
jsonData map[string]interface{}
)
result = JSONRPCPost("sendrawtransaction", params)
err = json.Unmarshal(result, &jsonData)
if err != nil {
return nil, err
}
if e, ok := jsonData["error"]; ok {
if e != nil {
return nil, errors.New(e.(map[string]interface{})["message"].(string))
}
}
return jsonData["result"], nil
}
//SendTransaction
//@param address string
//@param amount float64
func SendTransaction(address string, amount float64) (string, error) {
var (
list []interface{}
input []map[string]interface{}
output []map[string]interface{}
amountAll float64
createResult, fundResult, signResult, sendResult interface{}
err error
)
list = GetUTXORecordByAddress([]string{COMPONY})
if len(list) <= 0 {
return "", errors.New(" UTXO ")
}
for _, v := range list {
newV := v.(map[string]interface{})
input = append(input, map[string]interface{}{
"txid": newV["txid"],
"vout": newV["vout"],
})
amountAll += newV["amount"].(float64)
}
if amountAll < amount {
return "", errors.New(" ")
}
output = append(output, map[string]interface{}{
address: amount,
})
createResult, err = createRawtransaction(input, output)
if err != nil {
return "", errors.New("createRawtransaction" + err.Error())
}
fundResult, err = fundRawtransaction(createResult)
if err != nil {
return "", errors.New("fundRawtransaction" + err.Error())
}
signResult, err = signRawtransactionwallet(fundResult)
if err != nil {
return "", errors.New("signRawtransactionwallet" + err.Error())
}
sendResult, err = sendRawtransaction(signResult)
if err != nil {
return "", errors.New("sendRawtransaction" + err.Error())
}
return sendResult.(string), nil
}
//JSONRPCPost post
func JSONRPCPost(method string, params []interface{}) []byte {
var (
formData = map[string]interface{}{
"jsonrpc": JSONRpcVersion,
"id": ID + 1,
"method": method,
"params": params,
}
httpClient = &http.Client{}
reqJSON, data []byte
req *http.Request
resp *http.Response
err error
)
reqJSON, err = json.Marshal(formData)
payloadBuffer := bytes.NewReader(reqJSON)
req, err = http.NewRequest("POST", RPCURL, payloadBuffer)
if err != nil {
log.Print(err.Error())
return nil
}
req.Header.Add("Content-Type", "application/json;charset=utf-8")
req.Header.Add("Accept", "application/json")
req.SetBasicAuth("test", "testpassword")
resp, err = httpClient.Do(req)
if err != nil {
fmt.Println(err.Error())
return nil
}
defer resp.Body.Close()
data, err = ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err.Error())
return nil
}
return data
}
비트 코 인 을 바탕 으로 개 발 된 토 큰 은 노드 기능 방법 이 거의 같 아서 공유 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
go 의 값 전달 과 참조 전달절편 과 지 도 는 모두 인용 유형 이다.현지에서 새로운 변수 로 할당 되 었 을 때 같은 내부 데이터 구 조 를 가리킨다.따라서 그 중의 한 변 수 를 바 꾸 면 다른 변수 에 영향 을 줄 수 있다. 다음은 참조 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.