115 lines
3.2 KiB
Go
115 lines
3.2 KiB
Go
package btc
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
func getRawTransactionParams(trxid, blockchash string) []interface{} {
|
|
return []interface{}{trxid, true, blockchash}
|
|
}
|
|
|
|
type GetRawTransactionResponseResult struct {
|
|
InActiveChain bool `json:"in_active_chain"`
|
|
Txid string `json:"txid"`
|
|
Hash string `json:"hash"`
|
|
Version int `json:"version"`
|
|
Size int `json:"size"`
|
|
Vsize int `json:"vsize"`
|
|
Weight int `json:"weight"`
|
|
Locktime int `json:"locktime"`
|
|
Vin []struct {
|
|
Txid string `json:"txid"`
|
|
Vout int `json:"vout"`
|
|
ScriptSig struct {
|
|
Asm string `json:"asm"`
|
|
Hex string `json:"hex"`
|
|
} `json:"scriptSig"`
|
|
Txinwitness []string `json:"txinwitness"`
|
|
Sequence int64 `json:"sequence"`
|
|
} `json:"vin"`
|
|
Vout []GetRawTransactionResponseResultVout `json:"vout"`
|
|
Hex string `json:"hex"`
|
|
Blockhash string `json:"blockhash"`
|
|
Confirmations int `json:"confirmations"`
|
|
Time int `json:"time"`
|
|
Blocktime int `json:"blocktime"`
|
|
}
|
|
|
|
type GetRawTransactionResponseResultVout struct {
|
|
Value float64 `json:"value"`
|
|
N int `json:"n"`
|
|
ScriptPubKey struct {
|
|
Asm string `json:"asm"`
|
|
Hex string `json:"hex"`
|
|
Address string `json:"address,omitempty"`
|
|
Type string `json:"type"`
|
|
} `json:"scriptPubKey,omitempty"`
|
|
}
|
|
|
|
func (g GetRawTransactionResponseResult) getOpReturn() string {
|
|
opReturn := ""
|
|
for _, v := range g.Vout {
|
|
if strings.HasPrefix(v.ScriptPubKey.Asm, "OP_RETURN") {
|
|
opReturn = v.ScriptPubKey.Asm
|
|
break
|
|
}
|
|
}
|
|
if !strings.HasPrefix(opReturn, "OP_RETURN") {
|
|
return ""
|
|
}
|
|
hexMessage := strings.Split(opReturn, " ")[len(strings.Split(opReturn, " "))-1]
|
|
return hexMessage
|
|
}
|
|
|
|
type GetRawTransactionResponse struct {
|
|
Result GetRawTransactionResponseResult `json:"result"`
|
|
RPCResponse
|
|
}
|
|
|
|
func NewGetRawTransactionResponse(bts []byte) (*GetRawTransactionResponse, error) {
|
|
resp := new(GetRawTransactionResponse)
|
|
err := json.Unmarshal(bts, resp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return resp, nil
|
|
}
|
|
|
|
func (b *BitcoinService) getRawTransaction(trxid, blockhash string) (*GetRawTransactionResponseResult, error) {
|
|
req := b.NewRPCRequest().WithMethod(GET_RAW_TRANSACTION)
|
|
if req == nil {
|
|
return nil, fmt.Errorf("NewRPCRequest %s is nil", GET_RAW_TRANSACTION)
|
|
}
|
|
|
|
bts := getRawTransactionParams(trxid, blockhash)
|
|
if bts == nil {
|
|
return nil, fmt.Errorf("getRawTransactionParams is nil")
|
|
}
|
|
|
|
resp, err := req.Call(bts...)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("req.Call: %s", err)
|
|
}
|
|
|
|
strinResp := string(resp)
|
|
if strinResp == "" {
|
|
return nil, fmt.Errorf("strinResp: %s", err)
|
|
}
|
|
|
|
trx, err := NewGetRawTransactionResponse(resp)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("NewGetRawTransactionResponse: %s", err)
|
|
}
|
|
if trx.Error != nil {
|
|
return nil, fmt.Errorf("raw.Error: %+v", trx.Error)
|
|
}
|
|
if trx.Result.Txid != trxid {
|
|
return nil, fmt.Errorf("trx.Result.Txid: %s != trxid %s", trx.Result.Txid, trxid)
|
|
}
|
|
|
|
return &trx.Result, nil
|
|
}
|