From 207a6b36e8a60fbdd5e23002b3b603a3b17cadcf Mon Sep 17 00:00:00 2001 From: wakiyamap Date: Thu, 27 Sep 2018 13:26:47 -0400 Subject: [PATCH 1/2] fix monacoinparser --- bchain/coins/monacoin/monacoinparser.go | 105 +++++++++++++++++++++--- 1 file changed, 93 insertions(+), 12 deletions(-) diff --git a/bchain/coins/monacoin/monacoinparser.go b/bchain/coins/monacoin/monacoinparser.go index d5a9de37..3e3d795d 100644 --- a/bchain/coins/monacoin/monacoinparser.go +++ b/bchain/coins/monacoin/monacoinparser.go @@ -3,6 +3,7 @@ package monacoin import ( "blockbook/bchain" "blockbook/bchain/coins/btc" + "encoding/hex" "github.com/btcsuite/btcd/wire" "github.com/jakm/btcutil/chaincfg" @@ -65,7 +66,9 @@ type MonacoinParser struct { // NewMonacoinParser returns new MonacoinParser instance func NewMonacoinParser(params *chaincfg.Params, c *btc.Configuration) *MonacoinParser { - return &MonacoinParser{BitcoinParser: btc.NewBitcoinParser(params, c)} + p := &MonacoinParser{BitcoinParser: btc.NewBitcoinParser(params, c)} + p.OutputScriptToAddressesFunc = p.outputScriptToAddresses + return p } // GetChainParams contains network parameters for the main Monacoin network, @@ -82,17 +85,6 @@ func GetChainParams(chain string) *chaincfg.Params { } } -// GetMonaChainParams contains network parameters for the main Monacoin network, -// and the test Monacoin network -func GetMonaChainParams(chain string) *monacoinCfg.Params { - switch chain { - case "test": - return &MonaTestParams - default: - return &MonaMainParams - } -} - // GetAddrDescFromAddress returns internal address representation (descriptor) of given address func (p *MonacoinParser) GetAddrDescFromAddress(address string) (bchain.AddressDescriptor, error) { return p.addressToOutputScript(address) @@ -123,3 +115,92 @@ func (p *MonacoinParser) addressToOutputScript(address string) ([]byte, error) { return script, nil } } + +// GetAddressesFromAddrDesc returns addresses for given address descriptor with flag if the addresses are searchable +func (p *MonacoinParser) GetAddressesFromAddrDesc(addrDesc bchain.AddressDescriptor) ([]string, bool, error) { + return p.OutputScriptToAddressesFunc(addrDesc) +} + +// outputScriptToAddresses converts ScriptPubKey to bitcoin addresses +func (p *MonacoinParser) outputScriptToAddresses(script []byte) ([]string, bool, error) { + switch p.Params.Net { + case MainnetMagic: + sc, addresses, _, err := txscript.ExtractPkScriptAddrs(script, &MonaMainParams) + if err != nil { + return nil, false, err + } + rv := make([]string, len(addresses)) + for i, a := range addresses { + rv[i] = a.EncodeAddress() + } + var s bool + if sc != txscript.NonStandardTy && sc != txscript.NullDataTy { + s = true + } else if len(rv) == 0 { + or := TryParseOPReturn(script) + if or != "" { + rv = []string{or} + } + } + return rv, s, nil + default: + sc, addresses, _, err := txscript.ExtractPkScriptAddrs(script, &MonaTestParams) + if err != nil { + return nil, false, err + } + rv := make([]string, len(addresses)) + for i, a := range addresses { + rv[i] = a.EncodeAddress() + } + var s bool + if sc != txscript.NonStandardTy && sc != txscript.NullDataTy { + s = true + } else if len(rv) == 0 { + or := TryParseOPReturn(script) + if or != "" { + rv = []string{or} + } + } + return rv, s, nil + } +} + +// TryParseOPReturn tries to process OP_RETURN script and return its string representation +func TryParseOPReturn(script []byte) string { + if len(script) > 1 && script[0] == txscript.OP_RETURN { + // trying 2 variants of OP_RETURN data + // 1) OP_RETURN OP_PUSHDATA1 + // 2) OP_RETURN + var data []byte + var l int + if script[1] == txscript.OP_PUSHDATA1 && len(script) > 2 { + l = int(script[2]) + data = script[3:] + if l != len(data) { + l = int(script[1]) + data = script[2:] + } + } else { + l = int(script[1]) + data = script[2:] + } + if l == len(data) { + isASCII := true + for _, c := range data { + if c < 32 || c > 127 { + isASCII = false + break + } + } + var ed string + if isASCII { + ed = "(" + string(data) + ")" + } else { + ed = hex.EncodeToString(data) + } + return "OP_RETURN " + ed + } + } + return "" +} + From 43e61253ee47678b6ab889bf89c739f48e874a34 Mon Sep 17 00:00:00 2001 From: wakiyamap Date: Sat, 29 Sep 2018 07:02:12 -0400 Subject: [PATCH 2/2] change to btc.TryParseOPReturn --- bchain/coins/monacoin/monacoinparser.go | 45 ++----------------------- 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/bchain/coins/monacoin/monacoinparser.go b/bchain/coins/monacoin/monacoinparser.go index 3e3d795d..f8768641 100644 --- a/bchain/coins/monacoin/monacoinparser.go +++ b/bchain/coins/monacoin/monacoinparser.go @@ -3,7 +3,6 @@ package monacoin import ( "blockbook/bchain" "blockbook/bchain/coins/btc" - "encoding/hex" "github.com/btcsuite/btcd/wire" "github.com/jakm/btcutil/chaincfg" @@ -137,7 +136,7 @@ func (p *MonacoinParser) outputScriptToAddresses(script []byte) ([]string, bool, if sc != txscript.NonStandardTy && sc != txscript.NullDataTy { s = true } else if len(rv) == 0 { - or := TryParseOPReturn(script) + or := btc.TryParseOPReturn(script) if or != "" { rv = []string{or} } @@ -156,7 +155,7 @@ func (p *MonacoinParser) outputScriptToAddresses(script []byte) ([]string, bool, if sc != txscript.NonStandardTy && sc != txscript.NullDataTy { s = true } else if len(rv) == 0 { - or := TryParseOPReturn(script) + or := btc.TryParseOPReturn(script) if or != "" { rv = []string{or} } @@ -164,43 +163,3 @@ func (p *MonacoinParser) outputScriptToAddresses(script []byte) ([]string, bool, return rv, s, nil } } - -// TryParseOPReturn tries to process OP_RETURN script and return its string representation -func TryParseOPReturn(script []byte) string { - if len(script) > 1 && script[0] == txscript.OP_RETURN { - // trying 2 variants of OP_RETURN data - // 1) OP_RETURN OP_PUSHDATA1 - // 2) OP_RETURN - var data []byte - var l int - if script[1] == txscript.OP_PUSHDATA1 && len(script) > 2 { - l = int(script[2]) - data = script[3:] - if l != len(data) { - l = int(script[1]) - data = script[2:] - } - } else { - l = int(script[1]) - data = script[2:] - } - if l == len(data) { - isASCII := true - for _, c := range data { - if c < 32 || c > 127 { - isASCII = false - break - } - } - var ed string - if isASCII { - ed = "(" + string(data) + ")" - } else { - ed = hex.EncodeToString(data) - } - return "OP_RETURN " + ed - } - } - return "" -} -