Use only taproot scripts for mempool golomb filter
This commit is contained in:
parent
c8c7e08a18
commit
3ab5e636ff
@ -23,17 +23,18 @@ import (
|
|||||||
// BitcoinRPC is an interface to JSON-RPC bitcoind service.
|
// BitcoinRPC is an interface to JSON-RPC bitcoind service.
|
||||||
type BitcoinRPC struct {
|
type BitcoinRPC struct {
|
||||||
*bchain.BaseChain
|
*bchain.BaseChain
|
||||||
client http.Client
|
client http.Client
|
||||||
rpcURL string
|
rpcURL string
|
||||||
user string
|
user string
|
||||||
password string
|
password string
|
||||||
Mempool *bchain.MempoolBitcoinType
|
Mempool *bchain.MempoolBitcoinType
|
||||||
ParseBlocks bool
|
ParseBlocks bool
|
||||||
pushHandler func(bchain.NotificationType)
|
pushHandler func(bchain.NotificationType)
|
||||||
mq *bchain.MQ
|
mq *bchain.MQ
|
||||||
ChainConfig *Configuration
|
ChainConfig *Configuration
|
||||||
RPCMarshaler RPCMarshaler
|
RPCMarshaler RPCMarshaler
|
||||||
golombFilterP uint8
|
golombFilterP uint8
|
||||||
|
golombFilterScripts string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configuration represents json config file
|
// Configuration represents json config file
|
||||||
@ -62,6 +63,7 @@ type Configuration struct {
|
|||||||
AlternativeEstimateFeeParams string `json:"alternative_estimate_fee_params,omitempty"`
|
AlternativeEstimateFeeParams string `json:"alternative_estimate_fee_params,omitempty"`
|
||||||
MinimumCoinbaseConfirmations int `json:"minimumCoinbaseConfirmations,omitempty"`
|
MinimumCoinbaseConfirmations int `json:"minimumCoinbaseConfirmations,omitempty"`
|
||||||
GolombFilterP uint8 `json:"golomb_filter_p,omitempty"`
|
GolombFilterP uint8 `json:"golomb_filter_p,omitempty"`
|
||||||
|
GolombFilterScripts string `json:"golomb_filter_scripts,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBitcoinRPC returns new BitcoinRPC instance.
|
// NewBitcoinRPC returns new BitcoinRPC instance.
|
||||||
@ -98,16 +100,17 @@ func NewBitcoinRPC(config json.RawMessage, pushHandler func(bchain.NotificationT
|
|||||||
}
|
}
|
||||||
|
|
||||||
s := &BitcoinRPC{
|
s := &BitcoinRPC{
|
||||||
BaseChain: &bchain.BaseChain{},
|
BaseChain: &bchain.BaseChain{},
|
||||||
client: http.Client{Timeout: time.Duration(c.RPCTimeout) * time.Second, Transport: transport},
|
client: http.Client{Timeout: time.Duration(c.RPCTimeout) * time.Second, Transport: transport},
|
||||||
rpcURL: c.RPCURL,
|
rpcURL: c.RPCURL,
|
||||||
user: c.RPCUser,
|
user: c.RPCUser,
|
||||||
password: c.RPCPass,
|
password: c.RPCPass,
|
||||||
ParseBlocks: c.Parse,
|
ParseBlocks: c.Parse,
|
||||||
ChainConfig: &c,
|
ChainConfig: &c,
|
||||||
pushHandler: pushHandler,
|
pushHandler: pushHandler,
|
||||||
RPCMarshaler: JSONMarshalerV2{},
|
RPCMarshaler: JSONMarshalerV2{},
|
||||||
golombFilterP: c.GolombFilterP,
|
golombFilterP: c.GolombFilterP,
|
||||||
|
golombFilterScripts: c.GolombFilterScripts,
|
||||||
}
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
@ -153,7 +156,7 @@ func (b *BitcoinRPC) Initialize() error {
|
|||||||
// CreateMempool creates mempool if not already created, however does not initialize it
|
// CreateMempool creates mempool if not already created, however does not initialize it
|
||||||
func (b *BitcoinRPC) CreateMempool(chain bchain.BlockChain) (bchain.Mempool, error) {
|
func (b *BitcoinRPC) CreateMempool(chain bchain.BlockChain) (bchain.Mempool, error) {
|
||||||
if b.Mempool == nil {
|
if b.Mempool == nil {
|
||||||
b.Mempool = bchain.NewMempoolBitcoinType(chain, b.ChainConfig.MempoolWorkers, b.ChainConfig.MempoolSubWorkers, b.golombFilterP)
|
b.Mempool = bchain.NewMempoolBitcoinType(chain, b.ChainConfig.MempoolWorkers, b.ChainConfig.MempoolSubWorkers, b.golombFilterP, b.golombFilterScripts)
|
||||||
}
|
}
|
||||||
return b.Mempool, nil
|
return b.Mempool, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,6 +14,11 @@ type chanInputPayload struct {
|
|||||||
index int
|
index int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type golombFilterScriptsType int
|
||||||
|
|
||||||
|
const golombFilterScriptsAll = golombFilterScriptsType(0)
|
||||||
|
const golombFilterScriptsTaproot = golombFilterScriptsType(1)
|
||||||
|
|
||||||
// MempoolBitcoinType is mempool handle.
|
// MempoolBitcoinType is mempool handle.
|
||||||
type MempoolBitcoinType struct {
|
type MempoolBitcoinType struct {
|
||||||
BaseMempool
|
BaseMempool
|
||||||
@ -22,11 +27,22 @@ type MempoolBitcoinType struct {
|
|||||||
AddrDescForOutpoint AddrDescForOutpointFunc
|
AddrDescForOutpoint AddrDescForOutpointFunc
|
||||||
golombFilterP uint8
|
golombFilterP uint8
|
||||||
golombFilterM uint64
|
golombFilterM uint64
|
||||||
|
golombFilterScripts golombFilterScriptsType
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMempoolBitcoinType creates new mempool handler.
|
// NewMempoolBitcoinType creates new mempool handler.
|
||||||
// For now there is no cleanup of sync routines, the expectation is that the mempool is created only once per process
|
// For now there is no cleanup of sync routines, the expectation is that the mempool is created only once per process
|
||||||
func NewMempoolBitcoinType(chain BlockChain, workers int, subworkers int, golombFilterP uint8) *MempoolBitcoinType {
|
func NewMempoolBitcoinType(chain BlockChain, workers int, subworkers int, golombFilterP uint8, golombFilterScripts string) *MempoolBitcoinType {
|
||||||
|
var filterScripts golombFilterScriptsType
|
||||||
|
switch golombFilterScripts {
|
||||||
|
case "":
|
||||||
|
filterScripts = golombFilterScriptsAll
|
||||||
|
case "taproot":
|
||||||
|
filterScripts = golombFilterScriptsTaproot
|
||||||
|
default:
|
||||||
|
glog.Error("Invalid golombFilterScripts ", golombFilterScripts, ", switching off golomb filter")
|
||||||
|
golombFilterP = 0
|
||||||
|
}
|
||||||
golombFilterM := uint64(1 << golombFilterP)
|
golombFilterM := uint64(1 << golombFilterP)
|
||||||
m := &MempoolBitcoinType{
|
m := &MempoolBitcoinType{
|
||||||
BaseMempool: BaseMempool{
|
BaseMempool: BaseMempool{
|
||||||
@ -34,10 +50,11 @@ func NewMempoolBitcoinType(chain BlockChain, workers int, subworkers int, golomb
|
|||||||
txEntries: make(map[string]txEntry),
|
txEntries: make(map[string]txEntry),
|
||||||
addrDescToTx: make(map[string][]Outpoint),
|
addrDescToTx: make(map[string][]Outpoint),
|
||||||
},
|
},
|
||||||
chanTxid: make(chan string, 1),
|
chanTxid: make(chan string, 1),
|
||||||
chanAddrIndex: make(chan txidio, 1),
|
chanAddrIndex: make(chan txidio, 1),
|
||||||
golombFilterP: golombFilterP,
|
golombFilterP: golombFilterP,
|
||||||
golombFilterM: golombFilterM,
|
golombFilterM: golombFilterM,
|
||||||
|
golombFilterScripts: filterScripts,
|
||||||
}
|
}
|
||||||
for i := 0; i < workers; i++ {
|
for i := 0; i < workers; i++ {
|
||||||
go func(i int) {
|
go func(i int) {
|
||||||
@ -98,17 +115,28 @@ func (m *MempoolBitcoinType) getInputAddress(payload *chanInputPayload) *addrInd
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isTaproot(addrDesc AddressDescriptor) bool {
|
||||||
|
if len(addrDesc) == 34 && addrDesc[0] == 0x51 && addrDesc[1] == 0x20 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (m *MempoolBitcoinType) computeGolombFilter(mtx *MempoolTx) string {
|
func (m *MempoolBitcoinType) computeGolombFilter(mtx *MempoolTx) string {
|
||||||
filterData := make([][]byte, 0)
|
filterData := make([][]byte, 0)
|
||||||
for i := range mtx.Vin {
|
for i := range mtx.Vin {
|
||||||
vin := &mtx.Vin[i]
|
vin := &mtx.Vin[i]
|
||||||
filterData = append(filterData, vin.AddrDesc)
|
if m.golombFilterScripts == golombFilterScriptsAll || (m.golombFilterScripts == golombFilterScriptsTaproot && isTaproot(vin.AddrDesc)) {
|
||||||
|
filterData = append(filterData, vin.AddrDesc)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for i := range mtx.Vout {
|
for i := range mtx.Vout {
|
||||||
vout := &mtx.Vout[i]
|
vout := &mtx.Vout[i]
|
||||||
b, err := hex.DecodeString(vout.ScriptPubKey.Hex)
|
b, err := hex.DecodeString(vout.ScriptPubKey.Hex)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
filterData = append(filterData, b)
|
if m.golombFilterScripts == golombFilterScriptsAll || (m.golombFilterScripts == golombFilterScriptsTaproot && isTaproot(b)) {
|
||||||
|
filterData = append(filterData, b)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(filterData) == 0 {
|
if len(filterData) == 0 {
|
||||||
|
|||||||
@ -12,19 +12,22 @@ func hexToBytes(h string) []byte {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMempoolBitcoinType_computeGolombFilter(t *testing.T) {
|
func TestMempoolBitcoinType_computeGolombFilter_taproot(t *testing.T) {
|
||||||
randomScript := hexToBytes("a914ff074800343a81ada8fe86c2d5d5a0e55b93dd7a87")
|
randomScript := hexToBytes("a914ff074800343a81ada8fe86c2d5d5a0e55b93dd7a87")
|
||||||
m := &MempoolBitcoinType{
|
m := &MempoolBitcoinType{
|
||||||
golombFilterP: 20,
|
golombFilterP: 20,
|
||||||
golombFilterM: uint64(1 << 20),
|
golombFilterM: uint64(1 << 20),
|
||||||
|
golombFilterScripts: golombFilterScriptsTaproot,
|
||||||
}
|
}
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
N uint32
|
||||||
mtx MempoolTx
|
mtx MempoolTx
|
||||||
want string
|
want string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "taproot",
|
name: "taproot",
|
||||||
|
N: 2,
|
||||||
mtx: MempoolTx{
|
mtx: MempoolTx{
|
||||||
Txid: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
Txid: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||||
Vin: []MempoolVin{
|
Vin: []MempoolVin{
|
||||||
@ -46,34 +49,154 @@ func TestMempoolBitcoinType_computeGolombFilter(t *testing.T) {
|
|||||||
},
|
},
|
||||||
want: "35dddcce5d60",
|
want: "35dddcce5d60",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "taproot multiple",
|
||||||
|
N: 7,
|
||||||
|
mtx: MempoolTx{
|
||||||
|
Txid: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||||
|
Vin: []MempoolVin{
|
||||||
|
{
|
||||||
|
// bc1pp3752xgfy39w30kggy8vvn0u68x8afwqmq6p96jzr8ffrcvjxgrqrny93y
|
||||||
|
AddrDesc: hexToBytes("51200c7d451909244ae8bec8410ec64dfcd1cc7ea5c0d83412ea4219d291e1923206"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// bc1p5ldsz3zxnjxrwf4xluf4qu7u839c204ptacwe2k0vzfk8s63mwts3njuwr
|
||||||
|
AddrDesc: hexToBytes("5120a7db0144469c8c3726a6ff135073dc3c4b853ea15f70ecaacf609363c351db97"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// bc1pgeqrcq5capal83ypxczmypjdhk4d9wwcea4k66c7ghe07p2qt97sqh8sy5
|
||||||
|
AddrDesc: hexToBytes("512046403c0298e87bf3c4813605b2064dbdaad2b9d8cf6b6d6b1e45f2ff0540597d"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Vout: []Vout{
|
||||||
|
{
|
||||||
|
ScriptPubKey: ScriptPubKey{
|
||||||
|
Hex: "51209ab20580f77e7cd676f896fc1794f7e8061efc1ce7494f2bb16205262aa12bdb",
|
||||||
|
Addresses: []string{
|
||||||
|
"bc1pn2eqtq8h0e7dvahcjm7p098haqrpalquuay572a3vgzjv24p90dszxzg40",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ScriptPubKey: ScriptPubKey{
|
||||||
|
Hex: "5120f667578b85bed256c7fcb9f2cda488d5281e52ca42e7dd4bc21e95149562f09f",
|
||||||
|
Addresses: []string{
|
||||||
|
"bc1p7en40zu9hmf9d3luh8evmfyg655pu5k2gtna6j7zr623f9tz7z0stfnwav",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ScriptPubKey: ScriptPubKey{
|
||||||
|
Hex: "51201341e5a58314d89bcf5add2b2a68f109add5efb1ae774fa33c612da311f25904",
|
||||||
|
Addresses: []string{
|
||||||
|
"bc1pzdq7tfvrznvfhn66m54j5683pxkatma34em5lgeuvyk6xy0jtyzqjt48z3",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ScriptPubKey: ScriptPubKey{
|
||||||
|
Hex: "512042b2d5c032b68220bfd6d4e26bc015129e168e87e22af743ffdc736708b7d342",
|
||||||
|
Addresses: []string{
|
||||||
|
"bc1pg2edtspjk6pzp07k6n3xhsq4z20pdr58ug40wsllm3ekwz9h6dpq77lhu9",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: "1143e4ad12730965a5247ac15db8c81c89b0bc",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "partial taproot",
|
||||||
|
N: 1,
|
||||||
|
mtx: MempoolTx{
|
||||||
|
Txid: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||||
|
Vin: []MempoolVin{
|
||||||
|
{
|
||||||
|
// bc1pgeqrcq5capal83ypxczmypjdhk4d9wwcea4k66c7ghe07p2qt97sqh8sy5
|
||||||
|
AddrDesc: hexToBytes("512046403c0298e87bf3c4813605b2064dbdaad2b9d8cf6b6d6b1e45f2ff0540597d"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Vout: []Vout{
|
||||||
|
{
|
||||||
|
ScriptPubKey: ScriptPubKey{
|
||||||
|
Hex: "00145f997834e1135e893b7707ba1b12bcb8d74b821d",
|
||||||
|
Addresses: []string{
|
||||||
|
"bc1qt7vhsd8pzd0gjwmhq7apky4uhrt5hqsa2y58nl",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: "1aeee8",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no taproot",
|
||||||
|
N: 0,
|
||||||
|
mtx: MempoolTx{
|
||||||
|
Txid: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||||
|
Vin: []MempoolVin{
|
||||||
|
{
|
||||||
|
// 39ECUF8YaFRX7XfttfAiLa5ir43bsrQUZJ
|
||||||
|
AddrDesc: hexToBytes("a91452ae9441d9920d9eb4a3c0a877ca8d8de547ce6587"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Vout: []Vout{
|
||||||
|
{
|
||||||
|
ScriptPubKey: ScriptPubKey{
|
||||||
|
Hex: "00145f997834e1135e893b7707ba1b12bcb8d74b821d",
|
||||||
|
Addresses: []string{
|
||||||
|
"bc1qt7vhsd8pzd0gjwmhq7apky4uhrt5hqsa2y58nl",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: "",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
if got := m.computeGolombFilter(&tt.mtx); got != tt.want {
|
got := m.computeGolombFilter(&tt.mtx)
|
||||||
|
if got != tt.want {
|
||||||
t.Errorf("MempoolBitcoinType.computeGolombFilter() = %v, want %v", got, tt.want)
|
t.Errorf("MempoolBitcoinType.computeGolombFilter() = %v, want %v", got, tt.want)
|
||||||
}
|
}
|
||||||
// check that the vin script matches the filter
|
if got != "" {
|
||||||
b, _ := hex.DecodeString(tt.mtx.Txid)
|
// build the filter from computed value
|
||||||
filter, err := gcs.BuildGCSFilter(m.golombFilterP, m.golombFilterM, *(*[gcs.KeySize]byte)(b[:gcs.KeySize]), [][]byte{tt.mtx.Vin[0].AddrDesc})
|
filter, err := gcs.FromBytes(tt.N, m.golombFilterP, m.golombFilterM, hexToBytes(got))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("gcs.BuildGCSFilter() unexpected error %v", err)
|
t.Errorf("gcs.BuildGCSFilter() unexpected error %v", err)
|
||||||
|
}
|
||||||
|
// check that the vin scripts match the filter
|
||||||
|
b, _ := hex.DecodeString(tt.mtx.Txid)
|
||||||
|
for i := range tt.mtx.Vin {
|
||||||
|
match, err := filter.Match(*(*[gcs.KeySize]byte)(b[:gcs.KeySize]), tt.mtx.Vin[i].AddrDesc)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("filter.Match vin[%d] unexpected error %v", i, err)
|
||||||
|
}
|
||||||
|
if match != isTaproot(tt.mtx.Vin[i].AddrDesc) {
|
||||||
|
t.Errorf("filter.Match vin[%d] got %v, want %v", i, match, isTaproot(tt.mtx.Vin[i].AddrDesc))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// check that the vout scripts match the filter
|
||||||
|
for i := range tt.mtx.Vout {
|
||||||
|
s := hexToBytes(tt.mtx.Vout[i].ScriptPubKey.Hex)
|
||||||
|
match, err := filter.Match(*(*[gcs.KeySize]byte)(b[:gcs.KeySize]), s)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("filter.Match vout[%d] unexpected error %v", i, err)
|
||||||
|
}
|
||||||
|
if match != isTaproot(s) {
|
||||||
|
t.Errorf("filter.Match vout[%d] got %v, want %v", i, match, isTaproot(s))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// check that a random script does not match the filter
|
||||||
|
match, err := filter.Match(*(*[gcs.KeySize]byte)(b[:gcs.KeySize]), randomScript)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("filter.Match randomScript unexpected error %v", err)
|
||||||
|
}
|
||||||
|
if match != false {
|
||||||
|
t.Errorf("filter.Match randomScript got true, want false")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
match, err := filter.Match(*(*[gcs.KeySize]byte)(b[:gcs.KeySize]), tt.mtx.Vin[0].AddrDesc)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("filter.Match vin[0] unexpected error %v", err)
|
|
||||||
}
|
|
||||||
if match != true {
|
|
||||||
t.Errorf("filter.Match vin[0] expected true, got false")
|
|
||||||
}
|
|
||||||
// check that a random script does not match the filter
|
|
||||||
match, err = filter.Match(*(*[gcs.KeySize]byte)(b[:gcs.KeySize]), randomScript)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("filter.Match randomScript unexpected error %v", err)
|
|
||||||
}
|
|
||||||
if match != false {
|
|
||||||
t.Errorf("filter.Match randomScript expected false, got true")
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,7 +67,9 @@
|
|||||||
"alternative_estimate_fee_params": "{\"url\": \"https://whatthefee.io/data.json\", \"periodSeconds\": 60}",
|
"alternative_estimate_fee_params": "{\"url\": \"https://whatthefee.io/data.json\", \"periodSeconds\": 60}",
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"coin\": \"bitcoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"coin\": \"bitcoin\", \"periodSeconds\": 900}",
|
||||||
|
"golomb_filter_p": 20,
|
||||||
|
"golomb_filter_scripts": "taproot"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,73 +1,76 @@
|
|||||||
{
|
{
|
||||||
"coin": {
|
"coin": {
|
||||||
"name": "Testnet",
|
"name": "Testnet",
|
||||||
"shortcut": "TEST",
|
"shortcut": "TEST",
|
||||||
"label": "Bitcoin Testnet",
|
"label": "Bitcoin Testnet",
|
||||||
"alias": "bitcoin_testnet"
|
"alias": "bitcoin_testnet"
|
||||||
},
|
|
||||||
"ports": {
|
|
||||||
"backend_rpc": 18030,
|
|
||||||
"backend_message_queue": 48330,
|
|
||||||
"blockbook_internal": 19030,
|
|
||||||
"blockbook_public": 19130
|
|
||||||
},
|
|
||||||
"ipc": {
|
|
||||||
"rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}",
|
|
||||||
"rpc_user": "rpc",
|
|
||||||
"rpc_pass": "rpc",
|
|
||||||
"rpc_timeout": 25,
|
|
||||||
"message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}"
|
|
||||||
},
|
|
||||||
"backend": {
|
|
||||||
"package_name": "backend-bitcoin-testnet",
|
|
||||||
"package_revision": "satoshilabs-1",
|
|
||||||
"system_user": "bitcoin",
|
|
||||||
"version": "24.0.1",
|
|
||||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-24.0.1/bitcoin-24.0.1-x86_64-linux-gnu.tar.gz",
|
|
||||||
"verification_type": "sha256",
|
|
||||||
"verification_source": "49df6e444515d457ea0b885d66f521f2a26ca92ccf73d5296082e633544253bf",
|
|
||||||
"extract_command": "tar -C backend --strip 1 -xf",
|
|
||||||
"exclude_files": ["bin/bitcoin-qt"],
|
|
||||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/bitcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
|
||||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/testnet3/*.log",
|
|
||||||
"postinst_script_template": "",
|
|
||||||
"service_type": "forking",
|
|
||||||
"service_additional_params_template": "",
|
|
||||||
"protect_memory": true,
|
|
||||||
"mainnet": false,
|
|
||||||
"server_config_file": "bitcoin.conf",
|
|
||||||
"client_config_file": "bitcoin_client.conf",
|
|
||||||
"additional_params": {
|
|
||||||
"deprecatedrpc": "estimatefee"
|
|
||||||
},
|
},
|
||||||
"platforms": {
|
"ports": {
|
||||||
"arm64": {
|
"backend_rpc": 18030,
|
||||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-23.0/bitcoin-23.0-aarch64-linux-gnu.tar.gz",
|
"backend_message_queue": 48330,
|
||||||
"verification_source": "06f4c78271a77752ba5990d60d81b1751507f77efda1e5981b4e92fd4d9969fb"
|
"blockbook_internal": 19030,
|
||||||
}
|
"blockbook_public": 19130
|
||||||
|
},
|
||||||
|
"ipc": {
|
||||||
|
"rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||||
|
"rpc_user": "rpc",
|
||||||
|
"rpc_pass": "rpc",
|
||||||
|
"rpc_timeout": 25,
|
||||||
|
"message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}"
|
||||||
|
},
|
||||||
|
"backend": {
|
||||||
|
"package_name": "backend-bitcoin-testnet",
|
||||||
|
"package_revision": "satoshilabs-1",
|
||||||
|
"system_user": "bitcoin",
|
||||||
|
"version": "24.0.1",
|
||||||
|
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-24.0.1/bitcoin-24.0.1-x86_64-linux-gnu.tar.gz",
|
||||||
|
"verification_type": "sha256",
|
||||||
|
"verification_source": "49df6e444515d457ea0b885d66f521f2a26ca92ccf73d5296082e633544253bf",
|
||||||
|
"extract_command": "tar -C backend --strip 1 -xf",
|
||||||
|
"exclude_files": ["bin/bitcoin-qt"],
|
||||||
|
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/bitcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||||
|
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/testnet3/*.log",
|
||||||
|
"postinst_script_template": "",
|
||||||
|
"service_type": "forking",
|
||||||
|
"service_additional_params_template": "",
|
||||||
|
"protect_memory": true,
|
||||||
|
"mainnet": false,
|
||||||
|
"server_config_file": "bitcoin.conf",
|
||||||
|
"client_config_file": "bitcoin_client.conf",
|
||||||
|
"additional_params": {
|
||||||
|
"deprecatedrpc": "estimatefee"
|
||||||
|
},
|
||||||
|
"platforms": {
|
||||||
|
"arm64": {
|
||||||
|
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-23.0/bitcoin-23.0-aarch64-linux-gnu.tar.gz",
|
||||||
|
"verification_source": "06f4c78271a77752ba5990d60d81b1751507f77efda1e5981b4e92fd4d9969fb"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blockbook": {
|
||||||
|
"package_name": "blockbook-bitcoin-testnet",
|
||||||
|
"system_user": "blockbook-bitcoin",
|
||||||
|
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||||
|
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||||
|
"explorer_url": "",
|
||||||
|
"additional_params": "-enablesubnewtx -extendedindex",
|
||||||
|
"block_chain": {
|
||||||
|
"parse": true,
|
||||||
|
"mempool_workers": 8,
|
||||||
|
"mempool_sub_workers": 2,
|
||||||
|
"block_addresses_to_keep": 300,
|
||||||
|
"xpub_magic": 70617039,
|
||||||
|
"xpub_magic_segwit_p2sh": 71979618,
|
||||||
|
"xpub_magic_segwit_native": 73342198,
|
||||||
|
"slip44": 1,
|
||||||
|
"additional_params": {
|
||||||
|
"golomb_filter_p": 20,
|
||||||
|
"golomb_filter_scripts": "taproot"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"package_maintainer": "IT",
|
||||||
|
"package_maintainer_email": "it@satoshilabs.com"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"blockbook": {
|
|
||||||
"package_name": "blockbook-bitcoin-testnet",
|
|
||||||
"system_user": "blockbook-bitcoin",
|
|
||||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
|
||||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
|
||||||
"explorer_url": "",
|
|
||||||
"additional_params": "-enablesubnewtx -extendedindex",
|
|
||||||
"block_chain": {
|
|
||||||
"parse": true,
|
|
||||||
"mempool_workers": 8,
|
|
||||||
"mempool_sub_workers": 2,
|
|
||||||
"block_addresses_to_keep": 300,
|
|
||||||
"xpub_magic": 70617039,
|
|
||||||
"xpub_magic_segwit_p2sh": 71979618,
|
|
||||||
"xpub_magic_segwit_native": 73342198,
|
|
||||||
"slip44": 1,
|
|
||||||
"additional_params": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
"package_maintainer": "IT",
|
|
||||||
"package_maintainer_email": "it@satoshilabs.com"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,7 @@ func NewFakeBlockChain(parser bchain.BlockChainParser) (bchain.BlockChain, error
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *fakeBlockChain) CreateMempool(chain bchain.BlockChain) (bchain.Mempool, error) {
|
func (c *fakeBlockChain) CreateMempool(chain bchain.BlockChain) (bchain.Mempool, error) {
|
||||||
return bchain.NewMempoolBitcoinType(chain, 1, 1, 0), nil
|
return bchain.NewMempoolBitcoinType(chain, 1, 1, 0, ""), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *fakeBlockChain) Initialize() error {
|
func (c *fakeBlockChain) Initialize() error {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user