Merge pull request #1 from ranchimall/dev
Some checks failed
Create Release / build-and-release-flo-deb (push) Has been cancelled
Some checks failed
Create Release / build-and-release-flo-deb (push) Has been cancelled
Merge from trezor/blockbook
This commit is contained in:
commit
45c778a14a
@ -157,15 +157,4 @@ backend-deploy-and-test-zcash_testnet:
|
||||
- configs/coins/zcash_testnet.json
|
||||
tags:
|
||||
- blockbook
|
||||
script: ./contrib/scripts/backend-deploy-and-test.sh zcash_testnet zcash-testnet zcash=test testnet3/debug.log
|
||||
|
||||
backend-deploy-and-test-goerli-archive:
|
||||
stage: backend-deploy-and-test
|
||||
only:
|
||||
refs:
|
||||
- master
|
||||
changes:
|
||||
- configs/coins/ethereum_testnet_goerli_archive.json
|
||||
tags:
|
||||
- blockbook
|
||||
script: ./contrib/scripts/backend-deploy-and-test.sh ethereum_testnet_goerli_archive ethereum-testnet-goerli-archive ethereum=test ethereum_testnet_goerli_archive.log
|
||||
script: ./contrib/scripts/backend-deploy-and-test.sh zcash_testnet zcash-testnet zcash=test testnet3/debug.log
|
||||
@ -148,7 +148,7 @@ function broadcastTx(signedTxHash) {
|
||||
|
||||
# Blockbook
|
||||
|
||||
**Blockbook** is back-end service for Trezor wallet. Main features of **Blockbook** are:
|
||||
**Blockbook** is a back-end service for Trezor Suite. The main features of **Blockbook** are:
|
||||
|
||||
- index of addresses and address balances of the connected block chain
|
||||
- fast index search
|
||||
@ -181,7 +181,7 @@ the rest of coins were implemented by the community.
|
||||
|
||||
Testnets for some coins are also supported, for example:
|
||||
|
||||
- Bitcoin Testnet, Bitcoin Cash Testnet, ZCash Testnet, Ethereum Testnets (Goerli, Sepolia)
|
||||
- Bitcoin Testnet, Bitcoin Cash Testnet, ZCash Testnet, Ethereum Testnets (Sepolia, Holesky)
|
||||
|
||||
List of all implemented coins is in [the registry of ports](/docs/ports.md).
|
||||
|
||||
|
||||
23
api/types.go
23
api/types.go
@ -208,9 +208,9 @@ type TokenTransfer struct {
|
||||
From string `json:"from"`
|
||||
To string `json:"to"`
|
||||
Contract string `json:"contract"`
|
||||
Name string `json:"name"`
|
||||
Symbol string `json:"symbol"`
|
||||
Decimals int `json:"decimals"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Symbol string `json:"symbol,omitempty"`
|
||||
Decimals int `json:"decimals,omitempty"`
|
||||
Value *Amount `json:"value,omitempty"`
|
||||
MultiTokenValues []MultiTokenValue `json:"multiTokenValues,omitempty"`
|
||||
}
|
||||
@ -231,7 +231,7 @@ type EthereumSpecific struct {
|
||||
Nonce uint64 `json:"nonce"`
|
||||
GasLimit *big.Int `json:"gasLimit"`
|
||||
GasUsed *big.Int `json:"gasUsed,omitempty"`
|
||||
GasPrice *Amount `json:"gasPrice"`
|
||||
GasPrice *Amount `json:"gasPrice,omitempty"`
|
||||
Data string `json:"data,omitempty"`
|
||||
ParsedData *bchain.EthereumParsedInputData `json:"parsedData,omitempty"`
|
||||
InternalTransfers []EthereumInternalTransfer `json:"internalTransfers,omitempty"`
|
||||
@ -316,6 +316,19 @@ type AddressFilter struct {
|
||||
OnlyConfirmed bool
|
||||
}
|
||||
|
||||
// StakingPool holds data about address participation in a staking pool contract
|
||||
type StakingPool struct {
|
||||
Contract string `json:"contract"`
|
||||
Name string `json:"name"`
|
||||
PendingBalance *Amount `json:"pendingBalance"`
|
||||
PendingDepositedBalance *Amount `json:"pendingDepositedBalance"`
|
||||
DepositedBalance *Amount `json:"depositedBalance"`
|
||||
WithdrawTotalAmount *Amount `json:"withdrawTotalAmount"`
|
||||
ClaimableAmount *Amount `json:"claimableAmount"`
|
||||
RestakedReward *Amount `json:"restakedReward"`
|
||||
AutocompoundBalance *Amount `json:"autocompoundBalance"`
|
||||
}
|
||||
|
||||
// Address holds information about address and its transactions
|
||||
type Address struct {
|
||||
Paging
|
||||
@ -342,6 +355,7 @@ type Address struct {
|
||||
ContractInfo *bchain.ContractInfo `json:"contractInfo,omitempty"`
|
||||
Erc20Contract *bchain.ContractInfo `json:"erc20Contract,omitempty"` // deprecated
|
||||
AddressAliases AddressAliasesMap `json:"addressAliases,omitempty"`
|
||||
StakingPools []StakingPool `json:"stakingPools,omitempty"`
|
||||
// helpers for explorer
|
||||
Filter string `json:"-"`
|
||||
XPubAddresses map[string]struct{} `json:"-"`
|
||||
@ -504,6 +518,7 @@ type BlockbookInfo struct {
|
||||
CurrentFiatRatesTime *time.Time `json:"currentFiatRatesTime,omitempty"`
|
||||
HistoricalFiatRatesTime *time.Time `json:"historicalFiatRatesTime,omitempty"`
|
||||
HistoricalTokenFiatRatesTime *time.Time `json:"historicalTokenFiatRatesTime,omitempty"`
|
||||
SupportedStakingPools []string `json:"supportedStakingPools,omitempty"`
|
||||
DbSizeFromColumns int64 `json:"dbSizeFromColumns,omitempty"`
|
||||
DbColumns []common.InternalStateColumn `json:"dbColumns,omitempty"`
|
||||
About string `json:"about"`
|
||||
|
||||
171
api/worker.go
171
api/worker.go
@ -36,6 +36,9 @@ type Worker struct {
|
||||
metrics *common.Metrics
|
||||
}
|
||||
|
||||
// contractInfoCache is a temporary cache of contract information for ethereum token transfers
|
||||
type contractInfoCache = map[string]*bchain.ContractInfo
|
||||
|
||||
// NewWorker creates new api worker
|
||||
func NewWorker(db *db.RocksDB, chain bchain.BlockChain, mempool bchain.Mempool, txCache *db.TxCache, metrics *common.Metrics, is *common.InternalState, fiatRates *fiat.FiatRates) (*Worker, error) {
|
||||
w := &Worker{
|
||||
@ -666,39 +669,49 @@ func (w *Worker) getContractDescriptorInfo(cd bchain.AddressDescriptor, typeFrom
|
||||
}
|
||||
|
||||
func (w *Worker) getEthereumTokensTransfers(transfers bchain.TokenTransfers, addresses map[string]struct{}) []TokenTransfer {
|
||||
sort.Sort(transfers)
|
||||
tokens := make([]TokenTransfer, len(transfers))
|
||||
for i := range transfers {
|
||||
t := transfers[i]
|
||||
typeName := bchain.EthereumTokenTypeMap[t.Type]
|
||||
contractInfo, _, err := w.getContractInfo(t.Contract, typeName)
|
||||
if err != nil {
|
||||
glog.Errorf("getContractInfo error %v, contract %v", err, t.Contract)
|
||||
continue
|
||||
}
|
||||
var value *Amount
|
||||
var values []MultiTokenValue
|
||||
if t.Type == bchain.MultiToken {
|
||||
values = make([]MultiTokenValue, len(t.MultiTokenValues))
|
||||
for j := range values {
|
||||
values[j].Id = (*Amount)(&t.MultiTokenValues[j].Id)
|
||||
values[j].Value = (*Amount)(&t.MultiTokenValues[j].Value)
|
||||
if len(transfers) > 0 {
|
||||
sort.Sort(transfers)
|
||||
contractCache := make(contractInfoCache)
|
||||
for i := range transfers {
|
||||
t := transfers[i]
|
||||
typeName := bchain.EthereumTokenTypeMap[t.Type]
|
||||
var contractInfo *bchain.ContractInfo
|
||||
if info, ok := contractCache[t.Contract]; ok {
|
||||
contractInfo = info
|
||||
} else {
|
||||
info, _, err := w.getContractInfo(t.Contract, typeName)
|
||||
if err != nil {
|
||||
glog.Errorf("getContractInfo error %v, contract %v", err, t.Contract)
|
||||
continue
|
||||
}
|
||||
contractInfo = info
|
||||
contractCache[t.Contract] = info
|
||||
}
|
||||
var value *Amount
|
||||
var values []MultiTokenValue
|
||||
if t.Type == bchain.MultiToken {
|
||||
values = make([]MultiTokenValue, len(t.MultiTokenValues))
|
||||
for j := range values {
|
||||
values[j].Id = (*Amount)(&t.MultiTokenValues[j].Id)
|
||||
values[j].Value = (*Amount)(&t.MultiTokenValues[j].Value)
|
||||
}
|
||||
} else {
|
||||
value = (*Amount)(&t.Value)
|
||||
}
|
||||
aggregateAddress(addresses, t.From)
|
||||
aggregateAddress(addresses, t.To)
|
||||
tokens[i] = TokenTransfer{
|
||||
Type: typeName,
|
||||
Contract: t.Contract,
|
||||
From: t.From,
|
||||
To: t.To,
|
||||
Value: value,
|
||||
MultiTokenValues: values,
|
||||
Decimals: contractInfo.Decimals,
|
||||
Name: contractInfo.Name,
|
||||
Symbol: contractInfo.Symbol,
|
||||
}
|
||||
} else {
|
||||
value = (*Amount)(&t.Value)
|
||||
}
|
||||
aggregateAddress(addresses, t.From)
|
||||
aggregateAddress(addresses, t.To)
|
||||
tokens[i] = TokenTransfer{
|
||||
Type: typeName,
|
||||
Contract: t.Contract,
|
||||
From: t.From,
|
||||
To: t.To,
|
||||
Value: value,
|
||||
MultiTokenValues: values,
|
||||
Decimals: contractInfo.Decimals,
|
||||
Name: contractInfo.Name,
|
||||
Symbol: contractInfo.Symbol,
|
||||
}
|
||||
}
|
||||
return tokens
|
||||
@ -1045,6 +1058,7 @@ type ethereumTypeAddressData struct {
|
||||
totalResults int
|
||||
tokensBaseValue float64
|
||||
tokensSecondaryValue float64
|
||||
stakingPools []StakingPool
|
||||
}
|
||||
|
||||
func (w *Worker) getEthereumTypeAddressBalances(addrDesc bchain.AddressDescriptor, details AccountDetails, filter *AddressFilter, secondaryCoin string) (*db.AddrBalance, *ethereumTypeAddressData, error) {
|
||||
@ -1144,9 +1158,41 @@ func (w *Worker) getEthereumTypeAddressBalances(addrDesc bchain.AddressDescripto
|
||||
filter.Vout = AddressFilterVoutQueryNotNecessary
|
||||
d.totalResults = -1
|
||||
}
|
||||
// if staking pool enabled, fetch the staking pool details
|
||||
if details >= AccountDetailsTokenBalances {
|
||||
d.stakingPools, err = w.getStakingPoolsData(addrDesc)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
return ba, &d, nil
|
||||
}
|
||||
|
||||
func (w *Worker) getStakingPoolsData(addrDesc bchain.AddressDescriptor) ([]StakingPool, error) {
|
||||
var pools []StakingPool
|
||||
if len(w.chain.EthereumTypeGetSupportedStakingPools()) > 0 {
|
||||
sp, err := w.chain.EthereumTypeGetStakingPoolsData(addrDesc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i := range sp {
|
||||
p := &sp[i]
|
||||
pools = append(pools, StakingPool{
|
||||
Contract: p.Contract,
|
||||
Name: p.Name,
|
||||
PendingBalance: (*Amount)(&p.PendingBalance),
|
||||
PendingDepositedBalance: (*Amount)(&p.PendingDepositedBalance),
|
||||
DepositedBalance: (*Amount)(&p.DepositedBalance),
|
||||
WithdrawTotalAmount: (*Amount)(&p.WithdrawTotalAmount),
|
||||
ClaimableAmount: (*Amount)(&p.ClaimableAmount),
|
||||
RestakedReward: (*Amount)(&p.RestakedReward),
|
||||
AutocompoundBalance: (*Amount)(&p.AutocompoundBalance),
|
||||
})
|
||||
}
|
||||
}
|
||||
return pools, nil
|
||||
}
|
||||
|
||||
func (w *Worker) txFromTxid(txid string, bestHeight uint32, option AccountDetails, blockInfo *db.BlockInfo, addresses map[string]struct{}) (*Tx, error) {
|
||||
var tx *Tx
|
||||
var err error
|
||||
@ -1388,12 +1434,13 @@ func (w *Worker) GetAddress(address string, page int, txsOnPage int, option Acco
|
||||
ContractInfo: ed.contractInfo,
|
||||
Nonce: ed.nonce,
|
||||
AddressAliases: w.getAddressAliases(addresses),
|
||||
StakingPools: ed.stakingPools,
|
||||
}
|
||||
// keep address backward compatible, set deprecated Erc20Contract value if ERC20 token
|
||||
if ed.contractInfo != nil && ed.contractInfo.Type == bchain.ERC20TokenType {
|
||||
r.Erc20Contract = ed.contractInfo
|
||||
}
|
||||
glog.Info("GetAddress ", address, ", ", time.Since(start))
|
||||
glog.Info("GetAddress-", option, " ", address, ", ", time.Since(start))
|
||||
return r, nil
|
||||
}
|
||||
|
||||
@ -1603,6 +1650,17 @@ func (w *Worker) GetBalanceHistory(address string, fromTimestamp, toTimestamp in
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// do not get balance history for contracts
|
||||
if w.chainType == bchain.ChainEthereumType {
|
||||
ci, err := w.db.GetContractInfo(addrDesc, bchain.UnknownTokenType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if ci != nil {
|
||||
glog.Info("GetBalanceHistory ", address, " is a contract, skipping")
|
||||
return nil, NewAPIError("GetBalanceHistory for a contract not allowed", true)
|
||||
}
|
||||
}
|
||||
fromUnix, fromHeight, toUnix, toHeight := w.balanceHistoryHeightsFromTo(fromTimestamp, toTimestamp)
|
||||
if fromHeight >= toHeight {
|
||||
return bhs, nil
|
||||
@ -1880,7 +1938,11 @@ func (w *Worker) GetCurrentFiatRates(currencies []string, token string) (*FiatTi
|
||||
ticker := w.fiatRates.GetCurrentTicker(vsCurrency, token)
|
||||
var err error
|
||||
if ticker == nil {
|
||||
ticker, err = w.db.FiatRatesFindLastTicker(vsCurrency, token)
|
||||
if token == "" {
|
||||
// fallback - get last fiat rate from db if not in current ticker
|
||||
// not for tokens, many tokens do not have fiat rates at all and it is very costly to do DB search for token without an exchange rate
|
||||
ticker, err = w.db.FiatRatesFindLastTicker(vsCurrency, token)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, NewAPIError(fmt.Sprintf("Error finding ticker: %v", err), false)
|
||||
} else if ticker == nil {
|
||||
@ -2200,6 +2262,48 @@ func (w *Worker) GetBlockRaw(bid string) (*BlockRaw, error) {
|
||||
return &BlockRaw{Hex: hex}, err
|
||||
}
|
||||
|
||||
// GetBlockFiltersBatch returns array of block filter data in the format ["height:hash:filter",...] if blocks greater than bestKnownBlockHash
|
||||
func (w *Worker) GetBlockFiltersBatch(bestKnownBlockHash string, pageSize int) ([]string, error) {
|
||||
if w.is.BlockGolombFilterP == 0 {
|
||||
return nil, NewAPIError("Not supported", true)
|
||||
}
|
||||
if pageSize > 10000 {
|
||||
return nil, NewAPIError("pageSize max 10000", true)
|
||||
}
|
||||
if pageSize <= 0 {
|
||||
pageSize = 1000
|
||||
}
|
||||
bi, err := w.chain.GetBlockInfo(bestKnownBlockHash)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
bestHeight, _, err := w.db.GetBestBlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
from := bi.Height + 1
|
||||
to := bestHeight + 1
|
||||
if from >= to {
|
||||
return []string{}, nil
|
||||
}
|
||||
if to-from > uint32(pageSize) {
|
||||
to = from + uint32(pageSize)
|
||||
}
|
||||
r := make([]string, 0, to-from)
|
||||
for i := from; i < to; i++ {
|
||||
blockHash, err := w.db.GetBlockHash(uint32(i))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
blockFilter, err := w.db.GetBlockFilter(blockHash)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r = append(r, fmt.Sprintf("%d:%s:%s", i, blockHash, blockFilter))
|
||||
}
|
||||
return r, err
|
||||
}
|
||||
|
||||
// ComputeFeeStats computes fee distribution in defined blocks and logs them to log
|
||||
func (w *Worker) ComputeFeeStats(blockFrom, blockTo int, stopCompute chan os.Signal) error {
|
||||
bestheight, _, err := w.db.GetBestBlock()
|
||||
@ -2320,6 +2424,7 @@ func (w *Worker) GetSystemInfo(internal bool) (*SystemInfo, error) {
|
||||
CurrentFiatRatesTime: nonZeroTime(currentFiatRatesTime),
|
||||
HistoricalFiatRatesTime: nonZeroTime(w.is.HistoricalFiatRatesTime),
|
||||
HistoricalTokenFiatRatesTime: nonZeroTime(w.is.HistoricalTokenFiatRatesTime),
|
||||
SupportedStakingPools: w.chain.EthereumTypeGetSupportedStakingPools(),
|
||||
DbSize: w.db.DatabaseSizeOnDisk(),
|
||||
DbSizeFromColumns: internalDBSize,
|
||||
DbColumns: columnStats,
|
||||
|
||||
@ -556,7 +556,7 @@ func (w *Worker) GetXpubAddress(xpub string, page int, txsOnPage int, option Acc
|
||||
usedTokens++
|
||||
}
|
||||
if option > AccountDetailsBasic {
|
||||
token := w.tokenFromXpubAddress(data, ad, ci, i, option)
|
||||
token := w.tokenFromXpubAddress(data, ad, int(xd.ChangeIndexes[ci]), i, option)
|
||||
if filter.TokensToReturn == TokensToReturnDerived ||
|
||||
filter.TokensToReturn == TokensToReturnUsed && ad.balance != nil ||
|
||||
filter.TokensToReturn == TokensToReturnNonzeroBalance && ad.balance != nil && !IsZeroBigInt(&ad.balance.BalanceSat) {
|
||||
|
||||
@ -41,30 +41,38 @@ func (b *BaseChain) GetMempoolEntry(txid string) (*MempoolEntry, error) {
|
||||
|
||||
// EthereumTypeGetBalance is not supported
|
||||
func (b *BaseChain) EthereumTypeGetBalance(addrDesc AddressDescriptor) (*big.Int, error) {
|
||||
return nil, errors.New("Not supported")
|
||||
return nil, errors.New("not supported")
|
||||
}
|
||||
|
||||
// EthereumTypeGetNonce is not supported
|
||||
func (b *BaseChain) EthereumTypeGetNonce(addrDesc AddressDescriptor) (uint64, error) {
|
||||
return 0, errors.New("Not supported")
|
||||
return 0, errors.New("not supported")
|
||||
}
|
||||
|
||||
// EthereumTypeEstimateGas is not supported
|
||||
func (b *BaseChain) EthereumTypeEstimateGas(params map[string]interface{}) (uint64, error) {
|
||||
return 0, errors.New("Not supported")
|
||||
return 0, errors.New("not supported")
|
||||
}
|
||||
|
||||
// GetContractInfo is not supported
|
||||
func (b *BaseChain) GetContractInfo(contractDesc AddressDescriptor) (*ContractInfo, error) {
|
||||
return nil, errors.New("Not supported")
|
||||
return nil, errors.New("not supported")
|
||||
}
|
||||
|
||||
// EthereumTypeGetErc20ContractBalance is not supported
|
||||
func (b *BaseChain) EthereumTypeGetErc20ContractBalance(addrDesc, contractDesc AddressDescriptor) (*big.Int, error) {
|
||||
return nil, errors.New("Not supported")
|
||||
return nil, errors.New("not supported")
|
||||
}
|
||||
|
||||
// GetContractInfo returns URI of non fungible or multi token defined by token id
|
||||
func (p *BaseChain) GetTokenURI(contractDesc AddressDescriptor, tokenID *big.Int) (string, error) {
|
||||
return "", errors.New("Not supported")
|
||||
return "", errors.New("not supported")
|
||||
}
|
||||
|
||||
func (b *BaseChain) EthereumTypeGetSupportedStakingPools() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *BaseChain) EthereumTypeGetStakingPoolsData(addrDesc AddressDescriptor) ([]StakingPoolData, error) {
|
||||
return nil, errors.New("not supported")
|
||||
}
|
||||
|
||||
@ -337,10 +337,15 @@ func Test_UnpackTx(t *testing.T) {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
b, _ := hex.DecodeString(tt.args.packedTx)
|
||||
got, got1, err := tt.args.parser.UnpackTx(b)
|
||||
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
// ignore witness unpacking
|
||||
for i := range got.Vin {
|
||||
got.Vin[i].Witness = nil
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("unpackTx() got = %v, want %v", got, tt.want)
|
||||
}
|
||||
|
||||
@ -316,6 +316,10 @@ func Test_UnpackTx(t *testing.T) {
|
||||
t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
// ignore witness unpacking
|
||||
for i := range got.Vin {
|
||||
got.Vin[i].Witness = nil
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("unpackTx() got = %v, want %v", got, tt.want)
|
||||
}
|
||||
|
||||
@ -4,8 +4,8 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"math/big"
|
||||
"os"
|
||||
"reflect"
|
||||
"time"
|
||||
|
||||
@ -44,6 +44,7 @@ import (
|
||||
"github.com/trezor/blockbook/bchain/coins/omotenashicoin"
|
||||
"github.com/trezor/blockbook/bchain/coins/pivx"
|
||||
"github.com/trezor/blockbook/bchain/coins/polis"
|
||||
"github.com/trezor/blockbook/bchain/coins/polygon"
|
||||
"github.com/trezor/blockbook/bchain/coins/qtum"
|
||||
"github.com/trezor/blockbook/bchain/coins/ravencoin"
|
||||
"github.com/trezor/blockbook/bchain/coins/ritocoin"
|
||||
@ -72,12 +73,10 @@ func init() {
|
||||
BlockChainFactories["Ethereum"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Archive"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Classic"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Testnet Ropsten"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Testnet Ropsten Archive"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Testnet Goerli"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Testnet Goerli Archive"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Testnet Sepolia"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Testnet Sepolia Archive"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Testnet Holesky"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Ethereum Testnet Holesky Archive"] = eth.NewEthereumRPC
|
||||
BlockChainFactories["Bcash"] = bch.NewBCashRPC
|
||||
BlockChainFactories["Bcash Testnet"] = bch.NewBCashRPC
|
||||
BlockChainFactories["Bgold"] = btg.NewBGoldRPC
|
||||
@ -138,25 +137,13 @@ func init() {
|
||||
BlockChainFactories["Avalanche Archive"] = avalanche.NewAvalancheRPC
|
||||
BlockChainFactories["BNB Smart Chain"] = bsc.NewBNBSmartChainRPC
|
||||
BlockChainFactories["BNB Smart Chain Archive"] = bsc.NewBNBSmartChainRPC
|
||||
}
|
||||
|
||||
// GetCoinNameFromConfig gets coin name and coin shortcut from config file
|
||||
func GetCoinNameFromConfig(configFileContent []byte) (string, string, string, error) {
|
||||
var cn struct {
|
||||
CoinName string `json:"coin_name"`
|
||||
CoinShortcut string `json:"coin_shortcut"`
|
||||
CoinLabel string `json:"coin_label"`
|
||||
}
|
||||
err := json.Unmarshal(configFileContent, &cn)
|
||||
if err != nil {
|
||||
return "", "", "", errors.Annotatef(err, "Error parsing config file ")
|
||||
}
|
||||
return cn.CoinName, cn.CoinShortcut, cn.CoinLabel, nil
|
||||
BlockChainFactories["Polygon"] = polygon.NewPolygonRPC
|
||||
BlockChainFactories["Polygon Archive"] = polygon.NewPolygonRPC
|
||||
}
|
||||
|
||||
// NewBlockChain creates bchain.BlockChain and bchain.Mempool for the coin passed by the parameter coin
|
||||
func NewBlockChain(coin string, configfile string, pushHandler func(bchain.NotificationType), metrics *common.Metrics) (bchain.BlockChain, bchain.Mempool, error) {
|
||||
data, err := ioutil.ReadFile(configfile)
|
||||
data, err := os.ReadFile(configfile)
|
||||
if err != nil {
|
||||
return nil, nil, errors.Annotatef(err, "Error reading file %v", configfile)
|
||||
}
|
||||
@ -344,6 +331,15 @@ func (c *blockChainWithMetrics) GetTokenURI(contractDesc bchain.AddressDescripto
|
||||
return c.b.GetTokenURI(contractDesc, tokenID)
|
||||
}
|
||||
|
||||
func (c *blockChainWithMetrics) EthereumTypeGetSupportedStakingPools() []string {
|
||||
return c.b.EthereumTypeGetSupportedStakingPools()
|
||||
}
|
||||
|
||||
func (c *blockChainWithMetrics) EthereumTypeGetStakingPoolsData(addrDesc bchain.AddressDescriptor) (v []bchain.StakingPoolData, err error) {
|
||||
defer func(s time.Time) { c.observeRPCLatency("EthereumTypeStakingPoolsData", s, err) }(time.Now())
|
||||
return c.b.EthereumTypeGetStakingPoolsData(addrDesc)
|
||||
}
|
||||
|
||||
type mempoolWithMetrics struct {
|
||||
mempool bchain.Mempool
|
||||
m *common.Metrics
|
||||
|
||||
@ -4,8 +4,6 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/ethereum/go-ethereum/ethclient"
|
||||
"github.com/ethereum/go-ethereum/rpc"
|
||||
"github.com/golang/glog"
|
||||
"github.com/juju/errors"
|
||||
"github.com/trezor/blockbook/bchain"
|
||||
@ -46,15 +44,7 @@ func NewBNBSmartChainRPC(config json.RawMessage, pushHandler func(bchain.Notific
|
||||
|
||||
// Initialize bnb smart chain rpc interface
|
||||
func (b *BNBSmartChainRPC) Initialize() error {
|
||||
b.OpenRPC = func(url string) (bchain.EVMRPCClient, bchain.EVMClient, error) {
|
||||
r, err := rpc.Dial(url)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
rc := ð.EthereumRPCClient{Client: r}
|
||||
ec := ð.EthereumClient{Client: ethclient.NewClient(r)}
|
||||
return rc, ec, nil
|
||||
}
|
||||
b.OpenRPC = eth.OpenRPC
|
||||
|
||||
rc, ec, err := b.OpenRPC(b.ChainConfig.RPCURL)
|
||||
if err != nil {
|
||||
|
||||
68
bchain/coins/btc/alternativefeeprovider.go
Normal file
68
bchain/coins/btc/alternativefeeprovider.go
Normal file
@ -0,0 +1,68 @@
|
||||
package btc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/juju/errors"
|
||||
"github.com/trezor/blockbook/bchain"
|
||||
)
|
||||
|
||||
type alternativeFeeProviderFee struct {
|
||||
blocks int
|
||||
feePerKB int
|
||||
}
|
||||
|
||||
type alternativeFeeProvider struct {
|
||||
fees []alternativeFeeProviderFee
|
||||
lastSync time.Time
|
||||
chain bchain.BlockChain
|
||||
mux sync.Mutex
|
||||
}
|
||||
|
||||
type alternativeFeeProviderInterface interface {
|
||||
compareToDefault()
|
||||
estimateFee(blocks int) (big.Int, error)
|
||||
}
|
||||
|
||||
func (p *alternativeFeeProvider) compareToDefault() {
|
||||
output := ""
|
||||
for _, fee := range p.fees {
|
||||
conservative, err := p.chain.(*BitcoinRPC).blockchainEstimateSmartFee(fee.blocks, true)
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
return
|
||||
}
|
||||
economical, err := p.chain.(*BitcoinRPC).blockchainEstimateSmartFee(fee.blocks, false)
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
return
|
||||
}
|
||||
output += fmt.Sprintf("Blocks %d: alternative %d, conservative %s, economical %s\n", fee.blocks, fee.feePerKB, conservative.String(), economical.String())
|
||||
}
|
||||
glog.Info("alternativeFeeProviderCompareToDefault\n", output)
|
||||
}
|
||||
|
||||
func (p *alternativeFeeProvider) estimateFee(blocks int) (big.Int, error) {
|
||||
var r big.Int
|
||||
p.mux.Lock()
|
||||
defer p.mux.Unlock()
|
||||
if len(p.fees) == 0 {
|
||||
return r, errors.New("alternativeFeeProvider: no fees")
|
||||
}
|
||||
if p.lastSync.Before(time.Now().Add(time.Duration(-10) * time.Minute)) {
|
||||
return r, errors.Errorf("alternativeFeeProvider: Missing recent value, last sync at %v", p.lastSync)
|
||||
}
|
||||
for i := range p.fees {
|
||||
if p.fees[i].blocks >= blocks {
|
||||
r = *big.NewInt(int64(p.fees[i].feePerKB))
|
||||
return r, nil
|
||||
}
|
||||
}
|
||||
// use the last value as fallback
|
||||
r = *big.NewInt(int64(p.fees[len(p.fees)-1].feePerKB))
|
||||
return r, nil
|
||||
}
|
||||
@ -231,6 +231,7 @@ func (p *BitcoinLikeParser) TxFromMsgTx(t *wire.MsgTx, parseAddresses bool) bcha
|
||||
Vout: in.PreviousOutPoint.Index,
|
||||
Sequence: in.Sequence,
|
||||
ScriptSig: s,
|
||||
Witness: in.Witness,
|
||||
}
|
||||
}
|
||||
vout := make([]bchain.Vout, len(t.TxOut))
|
||||
|
||||
@ -710,6 +710,10 @@ func TestUnpackTx(t *testing.T) {
|
||||
t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
// ignore witness unpacking
|
||||
for i := range got.Vin {
|
||||
got.Vin[i].Witness = nil
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("unpackTx() got = %v, want %v", got, tt.want)
|
||||
}
|
||||
|
||||
@ -6,7 +6,6 @@ import (
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"math/big"
|
||||
"net"
|
||||
"net/http"
|
||||
@ -23,18 +22,20 @@ import (
|
||||
// BitcoinRPC is an interface to JSON-RPC bitcoind service.
|
||||
type BitcoinRPC struct {
|
||||
*bchain.BaseChain
|
||||
client http.Client
|
||||
rpcURL string
|
||||
user string
|
||||
password string
|
||||
Mempool *bchain.MempoolBitcoinType
|
||||
ParseBlocks bool
|
||||
pushHandler func(bchain.NotificationType)
|
||||
mq *bchain.MQ
|
||||
ChainConfig *Configuration
|
||||
RPCMarshaler RPCMarshaler
|
||||
golombFilterP uint8
|
||||
mempoolFilterScripts string
|
||||
client http.Client
|
||||
rpcURL string
|
||||
user string
|
||||
password string
|
||||
Mempool *bchain.MempoolBitcoinType
|
||||
ParseBlocks bool
|
||||
pushHandler func(bchain.NotificationType)
|
||||
mq *bchain.MQ
|
||||
ChainConfig *Configuration
|
||||
RPCMarshaler RPCMarshaler
|
||||
mempoolGolombFilterP uint8
|
||||
mempoolFilterScripts string
|
||||
mempoolUseZeroedKey bool
|
||||
alternativeFeeProvider alternativeFeeProviderInterface
|
||||
}
|
||||
|
||||
// Configuration represents json config file
|
||||
@ -62,8 +63,9 @@ type Configuration struct {
|
||||
AlternativeEstimateFee string `json:"alternative_estimate_fee,omitempty"`
|
||||
AlternativeEstimateFeeParams string `json:"alternative_estimate_fee_params,omitempty"`
|
||||
MinimumCoinbaseConfirmations int `json:"minimumCoinbaseConfirmations,omitempty"`
|
||||
GolombFilterP uint8 `json:"golomb_filter_p,omitempty"`
|
||||
MempoolGolombFilterP uint8 `json:"mempool_golomb_filter_p,omitempty"`
|
||||
MempoolFilterScripts string `json:"mempool_filter_scripts,omitempty"`
|
||||
MempoolFilterUseZeroedKey bool `json:"mempool_filter_use_zeroed_key,omitempty"`
|
||||
}
|
||||
|
||||
// NewBitcoinRPC returns new BitcoinRPC instance.
|
||||
@ -109,8 +111,9 @@ func NewBitcoinRPC(config json.RawMessage, pushHandler func(bchain.NotificationT
|
||||
ChainConfig: &c,
|
||||
pushHandler: pushHandler,
|
||||
RPCMarshaler: JSONMarshalerV2{},
|
||||
golombFilterP: c.GolombFilterP,
|
||||
mempoolGolombFilterP: c.MempoolGolombFilterP,
|
||||
mempoolFilterScripts: c.MempoolFilterScripts,
|
||||
mempoolUseZeroedKey: c.MempoolFilterUseZeroedKey,
|
||||
}
|
||||
|
||||
return s, nil
|
||||
@ -143,10 +146,16 @@ func (b *BitcoinRPC) Initialize() error {
|
||||
glog.Info("rpc: block chain ", params.Name)
|
||||
|
||||
if b.ChainConfig.AlternativeEstimateFee == "whatthefee" {
|
||||
if err = InitWhatTheFee(b, b.ChainConfig.AlternativeEstimateFeeParams); err != nil {
|
||||
glog.Error("InitWhatTheFee error ", err, " Reverting to default estimateFee functionality")
|
||||
if b.alternativeFeeProvider, err = NewWhatTheFee(b, b.ChainConfig.AlternativeEstimateFeeParams); err != nil {
|
||||
glog.Error("NewWhatTheFee error ", err, " Reverting to default estimateFee functionality")
|
||||
// disable AlternativeEstimateFee logic
|
||||
b.ChainConfig.AlternativeEstimateFee = ""
|
||||
b.alternativeFeeProvider = nil
|
||||
}
|
||||
} else if b.ChainConfig.AlternativeEstimateFee == "mempoolspace" {
|
||||
if b.alternativeFeeProvider, err = NewMempoolSpaceFee(b, b.ChainConfig.AlternativeEstimateFeeParams); err != nil {
|
||||
glog.Error("MempoolSpaceFee error ", err, " Reverting to default estimateFee functionality")
|
||||
// disable AlternativeEstimateFee logic
|
||||
b.alternativeFeeProvider = nil
|
||||
}
|
||||
}
|
||||
|
||||
@ -156,7 +165,7 @@ func (b *BitcoinRPC) Initialize() error {
|
||||
// CreateMempool creates mempool if not already created, however does not initialize it
|
||||
func (b *BitcoinRPC) CreateMempool(chain bchain.BlockChain) (bchain.Mempool, error) {
|
||||
if b.Mempool == nil {
|
||||
b.Mempool = bchain.NewMempoolBitcoinType(chain, b.ChainConfig.MempoolWorkers, b.ChainConfig.MempoolSubWorkers, b.golombFilterP, b.mempoolFilterScripts)
|
||||
b.Mempool = bchain.NewMempoolBitcoinType(chain, b.ChainConfig.MempoolWorkers, b.ChainConfig.MempoolSubWorkers, b.mempoolGolombFilterP, b.mempoolFilterScripts, b.mempoolUseZeroedKey)
|
||||
}
|
||||
return b.Mempool, nil
|
||||
}
|
||||
@ -772,8 +781,7 @@ func (b *BitcoinRPC) getRawTransaction(txid string) (json.RawMessage, error) {
|
||||
return res.Result, nil
|
||||
}
|
||||
|
||||
// EstimateSmartFee returns fee estimation
|
||||
func (b *BitcoinRPC) EstimateSmartFee(blocks int, conservative bool) (big.Int, error) {
|
||||
func (b *BitcoinRPC) blockchainEstimateSmartFee(blocks int, conservative bool) (big.Int, error) {
|
||||
// use EstimateFee if EstimateSmartFee is not supported
|
||||
if !b.ChainConfig.SupportsEstimateSmartFee && b.ChainConfig.SupportsEstimateFee {
|
||||
return b.EstimateFee(blocks)
|
||||
@ -790,7 +798,6 @@ func (b *BitcoinRPC) EstimateSmartFee(blocks int, conservative bool) (big.Int, e
|
||||
req.Params.EstimateMode = "ECONOMICAL"
|
||||
}
|
||||
err := b.Call(&req, &res)
|
||||
|
||||
var r big.Int
|
||||
if err != nil {
|
||||
return r, err
|
||||
@ -805,8 +812,31 @@ func (b *BitcoinRPC) EstimateSmartFee(blocks int, conservative bool) (big.Int, e
|
||||
return r, nil
|
||||
}
|
||||
|
||||
// EstimateSmartFee returns fee estimation
|
||||
func (b *BitcoinRPC) EstimateSmartFee(blocks int, conservative bool) (big.Int, error) {
|
||||
// use alternative estimator if enabled
|
||||
if b.alternativeFeeProvider != nil {
|
||||
r, err := b.alternativeFeeProvider.estimateFee(blocks)
|
||||
// in case of error, fallback to default estimator
|
||||
if err == nil {
|
||||
return r, nil
|
||||
}
|
||||
}
|
||||
return b.blockchainEstimateSmartFee(blocks, conservative)
|
||||
}
|
||||
|
||||
// EstimateFee returns fee estimation.
|
||||
func (b *BitcoinRPC) EstimateFee(blocks int) (big.Int, error) {
|
||||
var r big.Int
|
||||
var err error
|
||||
// use alternative estimator if enabled
|
||||
if b.alternativeFeeProvider != nil {
|
||||
r, err = b.alternativeFeeProvider.estimateFee(blocks)
|
||||
// in case of error, fallback to default estimator
|
||||
if err == nil {
|
||||
return r, nil
|
||||
}
|
||||
}
|
||||
// use EstimateSmartFee if EstimateFee is not supported
|
||||
if !b.ChainConfig.SupportsEstimateFee && b.ChainConfig.SupportsEstimateSmartFee {
|
||||
return b.EstimateSmartFee(blocks, true)
|
||||
@ -817,9 +847,8 @@ func (b *BitcoinRPC) EstimateFee(blocks int) (big.Int, error) {
|
||||
res := ResEstimateFee{}
|
||||
req := CmdEstimateFee{Method: "estimatefee"}
|
||||
req.Params.Blocks = blocks
|
||||
err := b.Call(&req, &res)
|
||||
err = b.Call(&req, &res)
|
||||
|
||||
var r big.Int
|
||||
if err != nil {
|
||||
return r, err
|
||||
}
|
||||
@ -891,7 +920,7 @@ func safeDecodeResponse(body io.ReadCloser, res interface{}) (err error) {
|
||||
}
|
||||
}
|
||||
}()
|
||||
data, err = ioutil.ReadAll(body)
|
||||
data, err = io.ReadAll(body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
135
bchain/coins/btc/mempoolspace.go
Normal file
135
bchain/coins/btc/mempoolspace.go
Normal file
@ -0,0 +1,135 @@
|
||||
package btc
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/juju/errors"
|
||||
"github.com/trezor/blockbook/bchain"
|
||||
)
|
||||
|
||||
// https://mempool.space/api/v1/fees/recommended returns
|
||||
// {"fastestFee":41,"halfHourFee":39,"hourFee":36,"economyFee":36,"minimumFee":20}
|
||||
|
||||
type mempoolSpaceFeeResult struct {
|
||||
FastestFee int `json:"fastestFee"`
|
||||
HalfHourFee int `json:"halfHourFee"`
|
||||
HourFee int `json:"hourFee"`
|
||||
EconomyFee int `json:"economyFee"`
|
||||
MinimumFee int `json:"minimumFee"`
|
||||
}
|
||||
|
||||
type mempoolSpaceFeeParams struct {
|
||||
URL string `json:"url"`
|
||||
PeriodSeconds int `periodSeconds:"url"`
|
||||
}
|
||||
|
||||
type mempoolSpaceFeeProvider struct {
|
||||
*alternativeFeeProvider
|
||||
params mempoolSpaceFeeParams
|
||||
}
|
||||
|
||||
// NewMempoolSpaceFee initializes https://mempool.space provider
|
||||
func NewMempoolSpaceFee(chain bchain.BlockChain, params string) (alternativeFeeProviderInterface, error) {
|
||||
p := &mempoolSpaceFeeProvider{alternativeFeeProvider: &alternativeFeeProvider{}}
|
||||
err := json.Unmarshal([]byte(params), &p.params)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if p.params.URL == "" || p.params.PeriodSeconds == 0 {
|
||||
return nil, errors.New("NewWhatTheFee: Missing parameters")
|
||||
}
|
||||
p.chain = chain
|
||||
go p.mempoolSpaceFeeDownloader()
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (p *mempoolSpaceFeeProvider) mempoolSpaceFeeDownloader() {
|
||||
period := time.Duration(p.params.PeriodSeconds) * time.Second
|
||||
timer := time.NewTimer(period)
|
||||
counter := 0
|
||||
for {
|
||||
var data mempoolSpaceFeeResult
|
||||
err := p.mempoolSpaceFeeGetData(&data)
|
||||
if err != nil {
|
||||
glog.Error("mempoolSpaceFeeGetData ", err)
|
||||
} else {
|
||||
if p.mempoolSpaceFeeProcessData(&data) {
|
||||
if counter%60 == 0 {
|
||||
p.compareToDefault()
|
||||
}
|
||||
counter++
|
||||
}
|
||||
}
|
||||
<-timer.C
|
||||
timer.Reset(period)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *mempoolSpaceFeeProvider) mempoolSpaceFeeProcessData(data *mempoolSpaceFeeResult) bool {
|
||||
if data.MinimumFee == 0 || data.EconomyFee == 0 || data.HourFee == 0 || data.HalfHourFee == 0 || data.FastestFee == 0 {
|
||||
glog.Errorf("mempoolSpaceFeeProcessData: invalid data %+v", data)
|
||||
return false
|
||||
}
|
||||
p.mux.Lock()
|
||||
defer p.mux.Unlock()
|
||||
p.fees = make([]alternativeFeeProviderFee, 5)
|
||||
// map mempoool.space fees to blocks
|
||||
|
||||
// FastestFee is for 1 block
|
||||
p.fees[0] = alternativeFeeProviderFee{
|
||||
blocks: 1,
|
||||
feePerKB: data.FastestFee * 1000,
|
||||
}
|
||||
|
||||
// HalfHourFee is for 2-6 blocks
|
||||
p.fees[1] = alternativeFeeProviderFee{
|
||||
blocks: 6,
|
||||
feePerKB: data.HalfHourFee * 1000,
|
||||
}
|
||||
|
||||
// HourFee is for 7-36 blocks
|
||||
p.fees[2] = alternativeFeeProviderFee{
|
||||
blocks: 36,
|
||||
feePerKB: data.HourFee * 1000,
|
||||
}
|
||||
|
||||
// EconomyFee is for 37-200 blocks
|
||||
p.fees[3] = alternativeFeeProviderFee{
|
||||
blocks: 500,
|
||||
feePerKB: data.EconomyFee * 1000,
|
||||
}
|
||||
|
||||
// MinimumFee is for over 500 blocks
|
||||
p.fees[4] = alternativeFeeProviderFee{
|
||||
blocks: 1000,
|
||||
feePerKB: data.MinimumFee * 1000,
|
||||
}
|
||||
|
||||
p.lastSync = time.Now()
|
||||
// glog.Infof("mempoolSpaceFees: %+v", p.fees)
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *mempoolSpaceFeeProvider) mempoolSpaceFeeGetData(res interface{}) error {
|
||||
var httpData []byte
|
||||
httpReq, err := http.NewRequest("GET", p.params.URL, bytes.NewBuffer(httpData))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
httpRes, err := http.DefaultClient.Do(httpReq)
|
||||
if httpRes != nil {
|
||||
defer httpRes.Body.Close()
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if httpRes.StatusCode != http.StatusOK {
|
||||
return errors.New(p.params.URL + " returned status " + strconv.Itoa(httpRes.StatusCode))
|
||||
}
|
||||
return safeDecodeResponse(httpRes.Body, &res)
|
||||
}
|
||||
53
bchain/coins/btc/mempoolspace_test.go
Normal file
53
bchain/coins/btc/mempoolspace_test.go
Normal file
@ -0,0 +1,53 @@
|
||||
package btc
|
||||
|
||||
import (
|
||||
"math/big"
|
||||
"strconv"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func Test_mempoolSpaceFeeProvider(t *testing.T) {
|
||||
m := &mempoolSpaceFeeProvider{alternativeFeeProvider: &alternativeFeeProvider{}}
|
||||
m.mempoolSpaceFeeProcessData(&mempoolSpaceFeeResult{
|
||||
MinimumFee: 10,
|
||||
EconomyFee: 20,
|
||||
HourFee: 30,
|
||||
HalfHourFee: 40,
|
||||
FastestFee: 50,
|
||||
})
|
||||
|
||||
tests := []struct {
|
||||
blocks int
|
||||
want big.Int
|
||||
}{
|
||||
{0, *big.NewInt(50000)},
|
||||
{1, *big.NewInt(50000)},
|
||||
{2, *big.NewInt(40000)},
|
||||
{5, *big.NewInt(40000)},
|
||||
{6, *big.NewInt(40000)},
|
||||
{7, *big.NewInt(30000)},
|
||||
{10, *big.NewInt(30000)},
|
||||
{18, *big.NewInt(30000)},
|
||||
{19, *big.NewInt(30000)},
|
||||
{36, *big.NewInt(30000)},
|
||||
{37, *big.NewInt(20000)},
|
||||
{100, *big.NewInt(20000)},
|
||||
{101, *big.NewInt(20000)},
|
||||
{200, *big.NewInt(20000)},
|
||||
{201, *big.NewInt(20000)},
|
||||
{500, *big.NewInt(20000)},
|
||||
{501, *big.NewInt(10000)},
|
||||
{5000000, *big.NewInt(10000)},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(strconv.Itoa(tt.blocks), func(t *testing.T) {
|
||||
got, err := m.estimateFee(tt.blocks)
|
||||
if err != nil {
|
||||
t.Error("estimateFee returned error ", err)
|
||||
}
|
||||
if got.Cmp(&tt.want) != 0 {
|
||||
t.Errorf("estimateFee(%d) = %v, want %v", tt.blocks, got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -3,11 +3,9 @@ package btc
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/golang/glog"
|
||||
@ -34,49 +32,40 @@ type whatTheFeeParams struct {
|
||||
PeriodSeconds int `periodSeconds:"url"`
|
||||
}
|
||||
|
||||
type whatTheFeeFee struct {
|
||||
blocks int
|
||||
feesPerKB []int
|
||||
}
|
||||
|
||||
type whatTheFeeData struct {
|
||||
type whatTheFeeProvider struct {
|
||||
*alternativeFeeProvider
|
||||
params whatTheFeeParams
|
||||
probabilities []string
|
||||
fees []whatTheFeeFee
|
||||
lastSync time.Time
|
||||
chain bchain.BlockChain
|
||||
mux sync.Mutex
|
||||
}
|
||||
|
||||
var whatTheFee whatTheFeeData
|
||||
|
||||
// InitWhatTheFee initializes https://whatthefee.io handler
|
||||
func InitWhatTheFee(chain bchain.BlockChain, params string) error {
|
||||
err := json.Unmarshal([]byte(params), &whatTheFee.params)
|
||||
// NewWhatTheFee initializes https://whatthefee.io provider
|
||||
func NewWhatTheFee(chain bchain.BlockChain, params string) (alternativeFeeProviderInterface, error) {
|
||||
var p whatTheFeeProvider
|
||||
err := json.Unmarshal([]byte(params), &p.params)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
if whatTheFee.params.URL == "" || whatTheFee.params.PeriodSeconds == 0 {
|
||||
return errors.New("Missing parameters")
|
||||
if p.params.URL == "" || p.params.PeriodSeconds == 0 {
|
||||
return nil, errors.New("NewWhatTheFee: Missing parameters")
|
||||
}
|
||||
whatTheFee.chain = chain
|
||||
go whatTheFeeDownloader()
|
||||
return nil
|
||||
p.chain = chain
|
||||
go p.whatTheFeeDownloader()
|
||||
return &p, nil
|
||||
}
|
||||
|
||||
func whatTheFeeDownloader() {
|
||||
period := time.Duration(whatTheFee.params.PeriodSeconds) * time.Second
|
||||
func (p *whatTheFeeProvider) whatTheFeeDownloader() {
|
||||
period := time.Duration(p.params.PeriodSeconds) * time.Second
|
||||
timer := time.NewTimer(period)
|
||||
counter := 0
|
||||
for {
|
||||
var data whatTheFeeServiceResult
|
||||
err := whatTheFeeGetData(&data)
|
||||
err := p.whatTheFeeGetData(&data)
|
||||
if err != nil {
|
||||
glog.Error("whatTheFeeGetData ", err)
|
||||
} else {
|
||||
if whatTheFeeProcessData(&data) {
|
||||
if p.whatTheFeeProcessData(&data) {
|
||||
if counter%60 == 0 {
|
||||
whatTheFeeCompareToDefault()
|
||||
p.compareToDefault()
|
||||
}
|
||||
counter++
|
||||
}
|
||||
@ -86,15 +75,15 @@ func whatTheFeeDownloader() {
|
||||
}
|
||||
}
|
||||
|
||||
func whatTheFeeProcessData(data *whatTheFeeServiceResult) bool {
|
||||
func (p *whatTheFeeProvider) whatTheFeeProcessData(data *whatTheFeeServiceResult) bool {
|
||||
if len(data.Index) == 0 || len(data.Index) != len(data.Data) || len(data.Columns) == 0 {
|
||||
glog.Errorf("invalid data %+v", data)
|
||||
return false
|
||||
}
|
||||
whatTheFee.mux.Lock()
|
||||
defer whatTheFee.mux.Unlock()
|
||||
whatTheFee.probabilities = data.Columns
|
||||
whatTheFee.fees = make([]whatTheFeeFee, len(data.Index))
|
||||
p.mux.Lock()
|
||||
defer p.mux.Unlock()
|
||||
p.probabilities = data.Columns
|
||||
p.fees = make([]alternativeFeeProviderFee, len(data.Index))
|
||||
for i, blocks := range data.Index {
|
||||
if len(data.Columns) != len(data.Data[i]) {
|
||||
glog.Errorf("invalid data %+v", data)
|
||||
@ -104,19 +93,19 @@ func whatTheFeeProcessData(data *whatTheFeeServiceResult) bool {
|
||||
for j, l := range data.Data[i] {
|
||||
fees[j] = int(1000 * math.Exp(float64(l)/100))
|
||||
}
|
||||
whatTheFee.fees[i] = whatTheFeeFee{
|
||||
blocks: blocks,
|
||||
feesPerKB: fees,
|
||||
p.fees[i] = alternativeFeeProviderFee{
|
||||
blocks: blocks,
|
||||
feePerKB: fees[len(fees)/2],
|
||||
}
|
||||
}
|
||||
whatTheFee.lastSync = time.Now()
|
||||
glog.Infof("%+v", whatTheFee.fees)
|
||||
p.lastSync = time.Now()
|
||||
glog.Infof("whatTheFees: %+v", p.fees)
|
||||
return true
|
||||
}
|
||||
|
||||
func whatTheFeeGetData(res interface{}) error {
|
||||
func (p *whatTheFeeProvider) whatTheFeeGetData(res interface{}) error {
|
||||
var httpData []byte
|
||||
httpReq, err := http.NewRequest("GET", whatTheFee.params.URL, bytes.NewBuffer(httpData))
|
||||
httpReq, err := http.NewRequest("GET", p.params.URL, bytes.NewBuffer(httpData))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -132,25 +121,3 @@ func whatTheFeeGetData(res interface{}) error {
|
||||
}
|
||||
return safeDecodeResponse(httpRes.Body, &res)
|
||||
}
|
||||
|
||||
func whatTheFeeCompareToDefault() {
|
||||
output := ""
|
||||
for _, fee := range whatTheFee.fees {
|
||||
output += fmt.Sprint(fee.blocks, ",")
|
||||
for _, wtf := range fee.feesPerKB {
|
||||
output += fmt.Sprint(wtf, ",")
|
||||
}
|
||||
conservative, err := whatTheFee.chain.EstimateSmartFee(fee.blocks, true)
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
return
|
||||
}
|
||||
economical, err := whatTheFee.chain.EstimateSmartFee(fee.blocks, false)
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
return
|
||||
}
|
||||
output += fmt.Sprint(conservative.String(), ",", economical.String(), "\n")
|
||||
}
|
||||
glog.Info("whatTheFeeCompareToDefault\n", output)
|
||||
}
|
||||
|
||||
@ -342,6 +342,10 @@ func Test_UnpackTx(t *testing.T) {
|
||||
t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
// ignore witness unpacking
|
||||
for i := range got.Vin {
|
||||
got.Vin[i].Witness = nil
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("unpackTx() got = %v, want %v", got, tt.want)
|
||||
}
|
||||
|
||||
@ -337,9 +337,9 @@ func (b *EthereumRPC) GetContractInfo(contractDesc bchain.AddressDescriptor) (*b
|
||||
|
||||
// EthereumTypeGetErc20ContractBalance returns balance of ERC20 contract for given address
|
||||
func (b *EthereumRPC) EthereumTypeGetErc20ContractBalance(addrDesc, contractDesc bchain.AddressDescriptor) (*big.Int, error) {
|
||||
addr := hexutil.Encode(addrDesc)
|
||||
addr := hexutil.Encode(addrDesc)[2:]
|
||||
contract := hexutil.Encode(contractDesc)
|
||||
req := contractBalanceOfSignature + "0000000000000000000000000000000000000000000000000000000000000000"[len(addr)-2:] + addr[2:]
|
||||
req := contractBalanceOfSignature + "0000000000000000000000000000000000000000000000000000000000000000"[len(addr):] + addr
|
||||
data, err := b.ethCall(req, contract)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@ -30,12 +30,10 @@ type Network uint32
|
||||
const (
|
||||
// MainNet is production network
|
||||
MainNet Network = 1
|
||||
// TestNet is Ropsten test network
|
||||
TestNet Network = 3
|
||||
// TestNetGoerli is Goerli test network
|
||||
TestNetGoerli Network = 5
|
||||
// TestNetSepolia is Sepolia test network
|
||||
TestNetSepolia Network = 11155111
|
||||
// TestNetHolesky is Holesky test network
|
||||
TestNetHolesky Network = 17000
|
||||
)
|
||||
|
||||
// Configuration represents json config file
|
||||
@ -56,23 +54,26 @@ type Configuration struct {
|
||||
// EthereumRPC is an interface to JSON-RPC eth service.
|
||||
type EthereumRPC struct {
|
||||
*bchain.BaseChain
|
||||
Client bchain.EVMClient
|
||||
RPC bchain.EVMRPCClient
|
||||
MainNetChainID Network
|
||||
Timeout time.Duration
|
||||
Parser *EthereumParser
|
||||
PushHandler func(bchain.NotificationType)
|
||||
OpenRPC func(string) (bchain.EVMRPCClient, bchain.EVMClient, error)
|
||||
Mempool *bchain.MempoolEthereumType
|
||||
mempoolInitialized bool
|
||||
bestHeaderLock sync.Mutex
|
||||
bestHeader bchain.EVMHeader
|
||||
bestHeaderTime time.Time
|
||||
NewBlock bchain.EVMNewBlockSubscriber
|
||||
newBlockSubscription bchain.EVMClientSubscription
|
||||
NewTx bchain.EVMNewTxSubscriber
|
||||
newTxSubscription bchain.EVMClientSubscription
|
||||
ChainConfig *Configuration
|
||||
Client bchain.EVMClient
|
||||
RPC bchain.EVMRPCClient
|
||||
MainNetChainID Network
|
||||
Timeout time.Duration
|
||||
Parser *EthereumParser
|
||||
PushHandler func(bchain.NotificationType)
|
||||
OpenRPC func(string) (bchain.EVMRPCClient, bchain.EVMClient, error)
|
||||
Mempool *bchain.MempoolEthereumType
|
||||
mempoolInitialized bool
|
||||
bestHeaderLock sync.Mutex
|
||||
bestHeader bchain.EVMHeader
|
||||
bestHeaderTime time.Time
|
||||
NewBlock bchain.EVMNewBlockSubscriber
|
||||
newBlockSubscription bchain.EVMClientSubscription
|
||||
NewTx bchain.EVMNewTxSubscriber
|
||||
newTxSubscription bchain.EVMClientSubscription
|
||||
ChainConfig *Configuration
|
||||
supportedStakingPools []string
|
||||
stakingPoolNames []string
|
||||
stakingPoolContracts []string
|
||||
}
|
||||
|
||||
// ProcessInternalTransactions specifies if internal transactions are processed
|
||||
@ -106,17 +107,22 @@ func NewEthereumRPC(config json.RawMessage, pushHandler func(bchain.Notification
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// OpenRPC opens RPC connection to ETH backend
|
||||
var OpenRPC = func(url string) (bchain.EVMRPCClient, bchain.EVMClient, error) {
|
||||
opts := []rpc.ClientOption{}
|
||||
opts = append(opts, rpc.WithWebsocketMessageSizeLimit(0))
|
||||
r, err := rpc.DialOptions(context.Background(), url, opts...)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
rc := &EthereumRPCClient{Client: r}
|
||||
ec := &EthereumClient{Client: ethclient.NewClient(r)}
|
||||
return rc, ec, nil
|
||||
}
|
||||
|
||||
// Initialize initializes ethereum rpc interface
|
||||
func (b *EthereumRPC) Initialize() error {
|
||||
b.OpenRPC = func(url string) (bchain.EVMRPCClient, bchain.EVMClient, error) {
|
||||
r, err := rpc.Dial(url)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
rc := &EthereumRPCClient{Client: r}
|
||||
ec := &EthereumClient{Client: ethclient.NewClient(r)}
|
||||
return rc, ec, nil
|
||||
}
|
||||
b.OpenRPC = OpenRPC
|
||||
|
||||
rc, ec, err := b.OpenRPC(b.ChainConfig.RPCURL)
|
||||
if err != nil {
|
||||
@ -143,18 +149,21 @@ func (b *EthereumRPC) Initialize() error {
|
||||
case MainNet:
|
||||
b.Testnet = false
|
||||
b.Network = "livenet"
|
||||
case TestNet:
|
||||
b.Testnet = true
|
||||
b.Network = "testnet"
|
||||
case TestNetGoerli:
|
||||
b.Testnet = true
|
||||
b.Network = "goerli"
|
||||
case TestNetSepolia:
|
||||
b.Testnet = true
|
||||
b.Network = "sepolia"
|
||||
case TestNetHolesky:
|
||||
b.Testnet = true
|
||||
b.Network = "holesky"
|
||||
default:
|
||||
return errors.Errorf("Unknown network id %v", id)
|
||||
}
|
||||
|
||||
err = b.initStakingPools(b.ChainConfig.CoinShortcut)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
glog.Info("rpc: block chain ", b.Network)
|
||||
|
||||
return nil
|
||||
@ -175,11 +184,19 @@ func (b *EthereumRPC) InitializeMempool(addrDescForOutpoint bchain.AddrDescForOu
|
||||
return errors.New("Mempool not created")
|
||||
}
|
||||
|
||||
var err error
|
||||
var txs []string
|
||||
// get initial mempool transactions
|
||||
txs, err := b.GetMempoolTransactions()
|
||||
if err != nil {
|
||||
return err
|
||||
// workaround for an occasional `decoding block` error from getBlockRaw - try 3 times with a delay and then proceed
|
||||
for i := 0; i < 3; i++ {
|
||||
txs, err = b.GetMempoolTransactions()
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
glog.Error("GetMempoolTransaction ", err)
|
||||
time.Sleep(time.Second * 5)
|
||||
}
|
||||
|
||||
for _, txid := range txs {
|
||||
b.Mempool.AddTransactionToMempool(txid)
|
||||
}
|
||||
@ -238,8 +255,10 @@ func (b *EthereumRPC) subscribeEvents() error {
|
||||
if glog.V(2) {
|
||||
glog.Info("rpc: new tx ", hex)
|
||||
}
|
||||
b.Mempool.AddTransactionToMempool(hex)
|
||||
b.PushHandler(bchain.NotificationNewTx)
|
||||
added := b.Mempool.AddTransactionToMempool(hex)
|
||||
if added {
|
||||
b.PushHandler(bchain.NotificationNewTx)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
@ -653,8 +672,28 @@ func (b *EthereumRPC) getInternalDataForBlock(blockHash string, blockHeight uint
|
||||
return data, contracts, err
|
||||
}
|
||||
if len(trace) != len(data) {
|
||||
glog.Error("debug_traceBlockByHash block ", blockHash, ", error: trace length does not match block length ", len(trace), "!=", len(data))
|
||||
return data, contracts, err
|
||||
if len(trace) < len(data) {
|
||||
for i := range transactions {
|
||||
tx := &transactions[i]
|
||||
// bridging transactions in Polygon do not create trace and cause mismatch between the trace size and block size, it is necessary to adjust the trace size
|
||||
// bridging transaction that from and to zero address
|
||||
if tx.To == "0x0000000000000000000000000000000000000000" && tx.From == "0x0000000000000000000000000000000000000000" {
|
||||
if i >= len(trace) {
|
||||
trace = append(trace, rpcTraceResult{})
|
||||
} else {
|
||||
trace = append(trace[:i+1], trace[i:]...)
|
||||
trace[i] = rpcTraceResult{}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(trace) != len(data) {
|
||||
e := fmt.Sprint("trace length does not match block length ", len(trace), "!=", len(data))
|
||||
glog.Error("debug_traceBlockByHash block ", blockHash, ", error: ", e)
|
||||
return data, contracts, errors.New(e)
|
||||
} else {
|
||||
glog.Warning("debug_traceBlockByHash block ", blockHash, ", trace adjusted to match the number of transactions in block")
|
||||
}
|
||||
}
|
||||
for i, result := range trace {
|
||||
r := &result.Result
|
||||
|
||||
142
bchain/coins/eth/stakingpool.go
Normal file
142
bchain/coins/eth/stakingpool.go
Normal file
@ -0,0 +1,142 @@
|
||||
package eth
|
||||
|
||||
import (
|
||||
"math/big"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||
"github.com/golang/glog"
|
||||
"github.com/juju/errors"
|
||||
"github.com/trezor/blockbook/bchain"
|
||||
)
|
||||
|
||||
func (b *EthereumRPC) initStakingPools(coinShortcut string) error {
|
||||
// for now only single staking pool
|
||||
envVar := strings.ToUpper(coinShortcut) + "_STAKING_POOL_CONTRACT"
|
||||
envValue := os.Getenv(envVar)
|
||||
if envValue != "" {
|
||||
parts := strings.Split(envValue, "/")
|
||||
if len(parts) != 2 {
|
||||
glog.Errorf("Wrong format of environment variable %s=%s, expecting value '<pool name>/<pool contract>', staking pools not enabled", envVar, envValue)
|
||||
return nil
|
||||
}
|
||||
b.supportedStakingPools = []string{envValue}
|
||||
b.stakingPoolNames = []string{parts[0]}
|
||||
b.stakingPoolContracts = []string{parts[1]}
|
||||
glog.Info("Support of staking pools enabled with these pools: ", b.supportedStakingPools)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *EthereumRPC) EthereumTypeGetSupportedStakingPools() []string {
|
||||
return b.supportedStakingPools
|
||||
}
|
||||
|
||||
func (b *EthereumRPC) EthereumTypeGetStakingPoolsData(addrDesc bchain.AddressDescriptor) ([]bchain.StakingPoolData, error) {
|
||||
// for now only single staking pool - Everstake
|
||||
addr := hexutil.Encode(addrDesc)[2:]
|
||||
if len(b.supportedStakingPools) == 1 {
|
||||
data, err := b.everstakePoolData(addr, b.stakingPoolContracts[0], b.stakingPoolNames[0])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if data != nil {
|
||||
return []bchain.StakingPoolData{*data}, nil
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
const everstakePendingBalanceOfMethodSignature = "0x59b8c763" // pendingBalanceOf(address)
|
||||
const everstakePendingDepositedBalanceOfMethodSignature = "0x80f14ecc" // pendingDepositedBalanceOf(address)
|
||||
const everstakeDepositedBalanceOfMethodSignature = "0x68b48254" // depositedBalanceOf(address)
|
||||
const everstakeWithdrawRequestMethodSignature = "0x14cbc46a" // withdrawRequest(address)
|
||||
const everstakeRestakedRewardOfMethodSignature = "0x0c98929a" // restakedRewardOf(address)
|
||||
const everstakeAutocompoundBalanceOfMethodSignature = "0x2fec7966" // autocompoundBalanceOf(address)
|
||||
|
||||
func isZeroBigInt(b *big.Int) bool {
|
||||
return len(b.Bits()) == 0
|
||||
}
|
||||
|
||||
func (b *EthereumRPC) everstakeBalanceTypeContractCall(signature, addr, contract string) (string, error) {
|
||||
req := signature + "0000000000000000000000000000000000000000000000000000000000000000"[len(addr):] + addr
|
||||
return b.ethCall(req, contract)
|
||||
}
|
||||
|
||||
func (b *EthereumRPC) everstakeContractCallSimpleNumeric(signature, addr, contract string) (*big.Int, error) {
|
||||
data, err := b.everstakeBalanceTypeContractCall(signature, addr, contract)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r := parseSimpleNumericProperty(data)
|
||||
if r == nil {
|
||||
return nil, errors.New("Invalid balance")
|
||||
}
|
||||
return r, nil
|
||||
}
|
||||
|
||||
func (b *EthereumRPC) everstakePoolData(addr, contract, name string) (*bchain.StakingPoolData, error) {
|
||||
poolData := bchain.StakingPoolData{
|
||||
Contract: contract,
|
||||
Name: name,
|
||||
}
|
||||
allZeros := true
|
||||
|
||||
value, err := b.everstakeContractCallSimpleNumeric(everstakePendingBalanceOfMethodSignature, addr, contract)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
poolData.PendingBalance = *value
|
||||
allZeros = allZeros && isZeroBigInt(value)
|
||||
|
||||
value, err = b.everstakeContractCallSimpleNumeric(everstakePendingDepositedBalanceOfMethodSignature, addr, contract)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
poolData.PendingDepositedBalance = *value
|
||||
allZeros = allZeros && isZeroBigInt(value)
|
||||
|
||||
value, err = b.everstakeContractCallSimpleNumeric(everstakeDepositedBalanceOfMethodSignature, addr, contract)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
poolData.DepositedBalance = *value
|
||||
allZeros = allZeros && isZeroBigInt(value)
|
||||
|
||||
data, err := b.everstakeBalanceTypeContractCall(everstakeWithdrawRequestMethodSignature, addr, contract)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
value = parseSimpleNumericProperty(data)
|
||||
if value == nil {
|
||||
return nil, errors.New("Invalid balance")
|
||||
}
|
||||
poolData.WithdrawTotalAmount = *value
|
||||
allZeros = allZeros && isZeroBigInt(value)
|
||||
value = parseSimpleNumericProperty(data[64+2:])
|
||||
if value == nil {
|
||||
return nil, errors.New("Invalid balance")
|
||||
}
|
||||
poolData.ClaimableAmount = *value
|
||||
allZeros = allZeros && isZeroBigInt(value)
|
||||
|
||||
value, err = b.everstakeContractCallSimpleNumeric(everstakeRestakedRewardOfMethodSignature, addr, contract)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
poolData.RestakedReward = *value
|
||||
allZeros = allZeros && isZeroBigInt(value)
|
||||
|
||||
value, err = b.everstakeContractCallSimpleNumeric(everstakeAutocompoundBalanceOfMethodSignature, addr, contract)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
poolData.AutocompoundBalance = *value
|
||||
allZeros = allZeros && isZeroBigInt(value)
|
||||
|
||||
if allZeros {
|
||||
return nil, nil
|
||||
}
|
||||
return &poolData, nil
|
||||
}
|
||||
@ -2,8 +2,10 @@ package pivx
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/big"
|
||||
|
||||
@ -13,7 +15,6 @@ import (
|
||||
"github.com/martinboehm/btcutil/chaincfg"
|
||||
"github.com/trezor/blockbook/bchain"
|
||||
"github.com/trezor/blockbook/bchain/coins/btc"
|
||||
"github.com/trezor/blockbook/bchain/coins/utils"
|
||||
)
|
||||
|
||||
// magic numbers
|
||||
@ -100,7 +101,12 @@ func (p *PivXParser) ParseBlock(b []byte) (*bchain.Block, error) {
|
||||
r.Seek(32, io.SeekCurrent)
|
||||
}
|
||||
|
||||
err = utils.DecodeTransactions(r, 0, wire.WitnessEncoding, &w)
|
||||
if h.Version > 7 {
|
||||
// Skip new hashFinalSaplingRoot (block version 8 or newer)
|
||||
r.Seek(32, io.SeekCurrent)
|
||||
}
|
||||
|
||||
err = p.PivxDecodeTransactions(r, 0, &w)
|
||||
if err != nil {
|
||||
return nil, errors.Annotatef(err, "DecodeTransactions")
|
||||
}
|
||||
@ -255,6 +261,90 @@ func (p *PivXParser) GetAddrDescForUnknownInput(tx *bchain.Tx, input int) bchain
|
||||
return s
|
||||
}
|
||||
|
||||
func (p *PivXParser) PivxDecodeTransactions(r *bytes.Reader, pver uint32, blk *wire.MsgBlock) error {
|
||||
maxTxPerBlock := uint64((wire.MaxBlockPayload / 10) + 1)
|
||||
|
||||
txCount, err := wire.ReadVarInt(r, pver)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Prevent more transactions than could possibly fit into a block.
|
||||
// It would be possible to cause memory exhaustion and panics without
|
||||
// a sane upper bound on this count.
|
||||
if txCount > maxTxPerBlock {
|
||||
str := fmt.Sprintf("too many transactions to fit into a block "+
|
||||
"[count %d, max %d]", txCount, maxTxPerBlock)
|
||||
return &wire.MessageError{Func: "utils.decodeTransactions", Description: str}
|
||||
}
|
||||
|
||||
blk.Transactions = make([]*wire.MsgTx, 0, txCount)
|
||||
for i := uint64(0); i < txCount; i++ {
|
||||
tx := wire.MsgTx{}
|
||||
|
||||
// read version & seek back to original state
|
||||
var version uint32 = 0
|
||||
if err = binary.Read(r, binary.LittleEndian, &version); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err = r.Seek(-4, io.SeekCurrent); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
txVersion := version & 0xffff
|
||||
enc := wire.WitnessEncoding
|
||||
|
||||
// shielded transactions
|
||||
if txVersion >= 3 {
|
||||
enc = wire.BaseEncoding
|
||||
}
|
||||
|
||||
err := p.PivxDecode(&tx, r, pver, enc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
blk.Transactions = append(blk.Transactions, &tx)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PivXParser) PivxDecode(MsgTx *wire.MsgTx, r *bytes.Reader, pver uint32, enc wire.MessageEncoding) error {
|
||||
if err := MsgTx.BtcDecode(r, pver, enc); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// extra
|
||||
version := uint32(MsgTx.Version)
|
||||
txVersion := version & 0xffff
|
||||
|
||||
if txVersion >= 3 {
|
||||
// valueBalance
|
||||
r.Seek(9, io.SeekCurrent)
|
||||
|
||||
vShieldedSpend, err := wire.ReadVarInt(r, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if vShieldedSpend > 0 {
|
||||
r.Seek(int64(vShieldedSpend*384), io.SeekCurrent)
|
||||
}
|
||||
|
||||
vShieldOutput, err := wire.ReadVarInt(r, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if vShieldOutput > 0 {
|
||||
r.Seek(int64(vShieldOutput*948), io.SeekCurrent)
|
||||
}
|
||||
|
||||
// bindingSig
|
||||
r.Seek(64, io.SeekCurrent)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Checks if script is OP_ZEROCOINMINT
|
||||
func isZeroCoinMintScript(signatureScript []byte) bool {
|
||||
return len(signatureScript) > 1 && signatureScript[0] == OP_ZEROCOINMINT
|
||||
|
||||
73
bchain/coins/polygon/polygonrpc.go
Normal file
73
bchain/coins/polygon/polygonrpc.go
Normal file
@ -0,0 +1,73 @@
|
||||
package polygon
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/juju/errors"
|
||||
"github.com/trezor/blockbook/bchain"
|
||||
"github.com/trezor/blockbook/bchain/coins/eth"
|
||||
)
|
||||
|
||||
const (
|
||||
// MainNet is production network
|
||||
MainNet eth.Network = 137
|
||||
)
|
||||
|
||||
// PolygonRPC is an interface to JSON-RPC polygon service.
|
||||
type PolygonRPC struct {
|
||||
*eth.EthereumRPC
|
||||
}
|
||||
|
||||
// NewPolygonRPC returns new PolygonRPC instance.
|
||||
func NewPolygonRPC(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) {
|
||||
c, err := eth.NewEthereumRPC(config, pushHandler)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s := &PolygonRPC{
|
||||
EthereumRPC: c.(*eth.EthereumRPC),
|
||||
}
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// Initialize polygon rpc interface
|
||||
func (b *PolygonRPC) Initialize() error {
|
||||
b.OpenRPC = eth.OpenRPC
|
||||
|
||||
rc, ec, err := b.OpenRPC(b.ChainConfig.RPCURL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// set chain specific
|
||||
b.Client = ec
|
||||
b.RPC = rc
|
||||
b.MainNetChainID = MainNet
|
||||
b.NewBlock = eth.NewEthereumNewBlock()
|
||||
b.NewTx = eth.NewEthereumNewTx()
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), b.Timeout)
|
||||
defer cancel()
|
||||
|
||||
id, err := b.Client.NetworkID(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// parameters for getInfo request
|
||||
switch eth.Network(id.Uint64()) {
|
||||
case MainNet:
|
||||
b.Testnet = false
|
||||
b.Network = "livenet"
|
||||
default:
|
||||
return errors.Errorf("Unknown network id %v", id)
|
||||
}
|
||||
|
||||
glog.Info("rpc: block chain ", b.Network)
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -294,6 +294,10 @@ func Test_UnpackTx(t *testing.T) {
|
||||
t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
// ignore witness unpacking
|
||||
for i := range got.Vin {
|
||||
got.Vin[i].Witness = nil
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("unpackTx() got = %v, want %v", got, tt.want)
|
||||
}
|
||||
|
||||
217
bchain/golomb.go
Normal file
217
bchain/golomb.go
Normal file
@ -0,0 +1,217 @@
|
||||
package bchain
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/juju/errors"
|
||||
"github.com/martinboehm/btcutil/gcs"
|
||||
)
|
||||
|
||||
type FilterScriptsType int
|
||||
|
||||
const (
|
||||
FilterScriptsInvalid = FilterScriptsType(iota)
|
||||
FilterScriptsAll
|
||||
FilterScriptsTaproot
|
||||
FilterScriptsTaprootNoOrdinals
|
||||
)
|
||||
|
||||
// GolombFilter is computing golomb filter of address descriptors
|
||||
type GolombFilter struct {
|
||||
Enabled bool
|
||||
UseZeroedKey bool
|
||||
p uint8
|
||||
key string
|
||||
filterScripts string
|
||||
filterScriptsType FilterScriptsType
|
||||
filterData [][]byte
|
||||
uniqueData map[string]struct{}
|
||||
// All the unique txids that contain ordinal data
|
||||
ordinalTxIds map[string]struct{}
|
||||
// Mapping of txid to address descriptors - only used in case of taproot-noordinals
|
||||
allAddressDescriptors map[string][]AddressDescriptor
|
||||
}
|
||||
|
||||
// NewGolombFilter initializes the GolombFilter handler
|
||||
func NewGolombFilter(p uint8, filterScripts string, key string, useZeroedKey bool) (*GolombFilter, error) {
|
||||
if p == 0 {
|
||||
return &GolombFilter{Enabled: false}, nil
|
||||
}
|
||||
gf := GolombFilter{
|
||||
Enabled: true,
|
||||
UseZeroedKey: useZeroedKey,
|
||||
p: p,
|
||||
key: key,
|
||||
filterScripts: filterScripts,
|
||||
filterScriptsType: filterScriptsToScriptsType(filterScripts),
|
||||
filterData: make([][]byte, 0),
|
||||
uniqueData: make(map[string]struct{}),
|
||||
}
|
||||
// reject invalid filterScripts
|
||||
if gf.filterScriptsType == FilterScriptsInvalid {
|
||||
return nil, errors.Errorf("Invalid/unsupported filterScripts parameter %s", filterScripts)
|
||||
}
|
||||
// set ordinal-related fields if needed
|
||||
if gf.ignoreOrdinals() {
|
||||
gf.ordinalTxIds = make(map[string]struct{})
|
||||
gf.allAddressDescriptors = make(map[string][]AddressDescriptor)
|
||||
}
|
||||
return &gf, nil
|
||||
}
|
||||
|
||||
// Gets the M parameter that we are using for the filter
|
||||
// Currently it relies on P parameter, but that can change
|
||||
func GetGolombParamM(p uint8) uint64 {
|
||||
return uint64(1 << uint64(p))
|
||||
}
|
||||
|
||||
// Checks whether this input contains ordinal data
|
||||
func isInputOrdinal(vin Vin) bool {
|
||||
byte_pattern := []byte{
|
||||
0x00, // OP_0, OP_FALSE
|
||||
0x63, // OP_IF
|
||||
0x03, // OP_PUSHBYTES_3
|
||||
0x6f, // "o"
|
||||
0x72, // "r"
|
||||
0x64, // "d"
|
||||
0x01, // OP_PUSHBYTES_1
|
||||
}
|
||||
// Witness needs to have at least 3 items and the second one needs to contain certain pattern
|
||||
return len(vin.Witness) > 2 && bytes.Contains(vin.Witness[1], byte_pattern)
|
||||
}
|
||||
|
||||
// Whether a transaction contains any ordinal data
|
||||
func txContainsOrdinal(tx *Tx) bool {
|
||||
for _, vin := range tx.Vin {
|
||||
if isInputOrdinal(vin) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Saving all the ordinal-related txIds so we can later ignore their address descriptors
|
||||
func (f *GolombFilter) markTxAndParentsAsOrdinals(tx *Tx) {
|
||||
f.ordinalTxIds[tx.Txid] = struct{}{}
|
||||
for _, vin := range tx.Vin {
|
||||
f.ordinalTxIds[vin.Txid] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
// Adding a new address descriptor mapped to a txid
|
||||
func (f *GolombFilter) addTxIdMapping(ad AddressDescriptor, tx *Tx) {
|
||||
f.allAddressDescriptors[tx.Txid] = append(f.allAddressDescriptors[tx.Txid], ad)
|
||||
}
|
||||
|
||||
// AddAddrDesc adds taproot address descriptor to the data for the filter
|
||||
func (f *GolombFilter) AddAddrDesc(ad AddressDescriptor, tx *Tx) {
|
||||
if f.ignoreNonTaproot() && !ad.IsTaproot() {
|
||||
return
|
||||
}
|
||||
if f.ignoreOrdinals() && tx != nil && txContainsOrdinal(tx) {
|
||||
f.markTxAndParentsAsOrdinals(tx)
|
||||
return
|
||||
}
|
||||
if len(ad) == 0 {
|
||||
return
|
||||
}
|
||||
// When ignoring ordinals, we need to save all the address descriptors before
|
||||
// filtering out the "invalid" ones.
|
||||
if f.ignoreOrdinals() && tx != nil {
|
||||
f.addTxIdMapping(ad, tx)
|
||||
return
|
||||
}
|
||||
f.includeAddrDesc(ad)
|
||||
}
|
||||
|
||||
// Private function to be called with descriptors that were already validated
|
||||
func (f *GolombFilter) includeAddrDesc(ad AddressDescriptor) {
|
||||
s := string(ad)
|
||||
if _, found := f.uniqueData[s]; !found {
|
||||
f.filterData = append(f.filterData, ad)
|
||||
f.uniqueData[s] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
// Including all the address descriptors from non-ordinal transactions
|
||||
func (f *GolombFilter) includeAllAddressDescriptorsOrdinals() {
|
||||
for txid, ads := range f.allAddressDescriptors {
|
||||
// Ignoring the txids that contain ordinal data
|
||||
if _, found := f.ordinalTxIds[txid]; found {
|
||||
continue
|
||||
}
|
||||
for _, ad := range ads {
|
||||
f.includeAddrDesc(ad)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Compute computes golomb filter from the data
|
||||
func (f *GolombFilter) Compute() []byte {
|
||||
m := GetGolombParamM(f.p)
|
||||
|
||||
// In case of ignoring the ordinals, we still need to assemble the filter data
|
||||
if f.ignoreOrdinals() {
|
||||
f.includeAllAddressDescriptorsOrdinals()
|
||||
}
|
||||
|
||||
if len(f.filterData) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Used key is possibly just zeroes, otherwise get it from the supplied key
|
||||
var key [gcs.KeySize]byte
|
||||
if f.UseZeroedKey {
|
||||
key = [gcs.KeySize]byte{}
|
||||
} else {
|
||||
b, _ := hex.DecodeString(f.key)
|
||||
if len(b) < gcs.KeySize {
|
||||
return nil
|
||||
}
|
||||
copy(key[:], b[:gcs.KeySize])
|
||||
}
|
||||
|
||||
filter, err := gcs.BuildGCSFilter(f.p, m, key, f.filterData)
|
||||
if err != nil {
|
||||
glog.Error("Cannot create golomb filter for ", f.key, ", ", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
fb, err := filter.NBytes()
|
||||
if err != nil {
|
||||
glog.Error("Error getting NBytes from golomb filter for ", f.key, ", ", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
return fb
|
||||
}
|
||||
|
||||
func (f *GolombFilter) ignoreNonTaproot() bool {
|
||||
switch f.filterScriptsType {
|
||||
case FilterScriptsTaproot, FilterScriptsTaprootNoOrdinals:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (f *GolombFilter) ignoreOrdinals() bool {
|
||||
switch f.filterScriptsType {
|
||||
case FilterScriptsTaprootNoOrdinals:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func filterScriptsToScriptsType(filterScripts string) FilterScriptsType {
|
||||
switch filterScripts {
|
||||
case "":
|
||||
return FilterScriptsAll
|
||||
case "taproot":
|
||||
return FilterScriptsTaproot
|
||||
case "taproot-noordinals":
|
||||
return FilterScriptsTaprootNoOrdinals
|
||||
}
|
||||
return FilterScriptsInvalid
|
||||
}
|
||||
282
bchain/golomb_test.go
Normal file
282
bchain/golomb_test.go
Normal file
@ -0,0 +1,282 @@
|
||||
// //go:build unittest
|
||||
|
||||
package bchain
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func getCommonAddressDescriptors() []AddressDescriptor {
|
||||
return []AddressDescriptor{
|
||||
// bc1pgeqrcq5capal83ypxczmypjdhk4d9wwcea4k66c7ghe07p2qt97sqh8sy5
|
||||
hexToBytes("512046403c0298e87bf3c4813605b2064dbdaad2b9d8cf6b6d6b1e45f2ff0540597d"),
|
||||
// bc1p7en40zu9hmf9d3luh8evmfyg655pu5k2gtna6j7zr623f9tz7z0stfnwav
|
||||
hexToBytes("5120f667578b85bed256c7fcb9f2cda488d5281e52ca42e7dd4bc21e95149562f09f"),
|
||||
// 39ECUF8YaFRX7XfttfAiLa5ir43bsrQUZJ
|
||||
hexToBytes("a91452ae9441d9920d9eb4a3c0a877ca8d8de547ce6587"),
|
||||
}
|
||||
}
|
||||
|
||||
func TestGolombFilter(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
p uint8
|
||||
useZeroedKey bool
|
||||
filterScripts string
|
||||
key string
|
||||
addressDescriptors []AddressDescriptor
|
||||
wantError bool
|
||||
wantEnabled bool
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "taproot",
|
||||
p: 20,
|
||||
useZeroedKey: false,
|
||||
filterScripts: "taproot",
|
||||
key: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||
addressDescriptors: getCommonAddressDescriptors(),
|
||||
wantEnabled: true,
|
||||
wantError: false,
|
||||
want: "0235dddcce5d60",
|
||||
},
|
||||
{
|
||||
name: "taproot-zeroed-key",
|
||||
p: 20,
|
||||
useZeroedKey: true,
|
||||
filterScripts: "taproot",
|
||||
key: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||
addressDescriptors: getCommonAddressDescriptors(),
|
||||
wantEnabled: true,
|
||||
wantError: false,
|
||||
want: "0218c23a013600",
|
||||
},
|
||||
{
|
||||
name: "taproot p=21",
|
||||
p: 21,
|
||||
useZeroedKey: false,
|
||||
filterScripts: "taproot",
|
||||
key: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||
addressDescriptors: getCommonAddressDescriptors(),
|
||||
wantEnabled: true,
|
||||
wantError: false,
|
||||
want: "0235ddda672eb0",
|
||||
},
|
||||
{
|
||||
name: "all",
|
||||
p: 20,
|
||||
useZeroedKey: false,
|
||||
filterScripts: "",
|
||||
key: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||
addressDescriptors: getCommonAddressDescriptors(),
|
||||
wantEnabled: true,
|
||||
wantError: false,
|
||||
want: "0350ccc61ac611976c80",
|
||||
},
|
||||
{
|
||||
name: "taproot-noordinals",
|
||||
p: 20,
|
||||
useZeroedKey: false,
|
||||
filterScripts: "taproot-noordinals",
|
||||
key: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||
addressDescriptors: getCommonAddressDescriptors(),
|
||||
wantEnabled: true,
|
||||
wantError: false,
|
||||
want: "0235dddcce5d60",
|
||||
},
|
||||
{
|
||||
name: "not supported filter",
|
||||
p: 20,
|
||||
useZeroedKey: false,
|
||||
filterScripts: "notsupported",
|
||||
wantEnabled: false,
|
||||
wantError: true,
|
||||
want: "",
|
||||
},
|
||||
{
|
||||
name: "not enabled",
|
||||
p: 0,
|
||||
useZeroedKey: false,
|
||||
filterScripts: "",
|
||||
wantEnabled: false,
|
||||
wantError: false,
|
||||
want: "",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
gf, err := NewGolombFilter(tt.p, tt.filterScripts, tt.key, tt.useZeroedKey)
|
||||
if err != nil && !tt.wantError {
|
||||
t.Errorf("TestGolombFilter.NewGolombFilter() got unexpected error '%v'", err)
|
||||
return
|
||||
}
|
||||
if err == nil && tt.wantError {
|
||||
t.Errorf("TestGolombFilter.NewGolombFilter() wanted error, got none")
|
||||
return
|
||||
}
|
||||
if gf == nil && tt.wantError {
|
||||
return
|
||||
}
|
||||
if gf.Enabled != tt.wantEnabled {
|
||||
t.Errorf("TestGolombFilter.NewGolombFilter() got gf.Enabled %v, want %v", gf.Enabled, tt.wantEnabled)
|
||||
return
|
||||
}
|
||||
for _, ad := range tt.addressDescriptors {
|
||||
gf.AddAddrDesc(ad, nil)
|
||||
}
|
||||
f := gf.Compute()
|
||||
got := hex.EncodeToString(f)
|
||||
if got != tt.want {
|
||||
t.Errorf("TestGolombFilter Compute() got %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Preparation transaction, locking BTC redeemable by ordinal witness - parent of the reveal transaction
|
||||
func getOrdinalCommitTx() (Tx, []AddressDescriptor) {
|
||||
tx := Tx{
|
||||
// https://mempool.space/tx/11111c17cbe86aebab146ee039d4e354cb55a9fb226ebdd2e30948630e7710ad
|
||||
Txid: "11111c17cbe86aebab146ee039d4e354cb55a9fb226ebdd2e30948630e7710ad",
|
||||
Vin: []Vin{
|
||||
{
|
||||
// https://mempool.space/tx/c4cae52a6e681b66c85c12feafb42f3617f34977032df1ee139eae07370863ef
|
||||
Txid: "c163fe1fdc21269cb05621adec38045e46a65289a356f9354df6010bce064916",
|
||||
Vout: 0,
|
||||
Witness: [][]byte{
|
||||
hexToBytes("0371633164dd16345c02e80c9963042f9a502aa2c8109c0f61da333ac1503c3ce2a1b79895359bbdee5979ab2cb44f3395892e1c419c3a8f67d31d33d7e764c9"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Vout: []Vout{
|
||||
{
|
||||
ScriptPubKey: ScriptPubKey{
|
||||
Hex: "51206a711358bac6ca8f7ddfdf8f733546e658208122939f0bf7a3727f8143dfbbff",
|
||||
Addresses: []string{
|
||||
"bc1pdfc3xk96cm9g7lwlm78hxd2xuevzpqfzjw0shaarwflczs7lh0lstksdn0",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
ScriptPubKey: ScriptPubKey{
|
||||
Hex: "a9144390d0b3d2b6d48b8c205ffbe40b2d84c40de07f87",
|
||||
Addresses: []string{
|
||||
"37rGgLSLX6C6LS9am4KWd6GT1QCEP4H4py",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
ScriptPubKey: ScriptPubKey{
|
||||
Hex: "76a914ba6b046dd832aa8bc41c158232bcc18211387c4388ac",
|
||||
Addresses: []string{
|
||||
"1HzgtNdRCXszf95rFYemsDSHJQBbs9rbZf",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
addressDescriptors := []AddressDescriptor{
|
||||
// bc1pdfc3xk96cm9g7lwlm78hxd2xuevzpqfzjw0shaarwflczs7lh0lstksdn0
|
||||
hexToBytes("51206a711358bac6ca8f7ddfdf8f733546e658208122939f0bf7a3727f8143dfbbff"),
|
||||
// 37rGgLSLX6C6LS9am4KWd6GT1QCEP4H4py
|
||||
hexToBytes("a9144390d0b3d2b6d48b8c205ffbe40b2d84c40de07f87"),
|
||||
// 1HzgtNdRCXszf95rFYemsDSHJQBbs9rbZf
|
||||
hexToBytes("76a914ba6b046dd832aa8bc41c158232bcc18211387c4388ac"),
|
||||
}
|
||||
return tx, addressDescriptors
|
||||
}
|
||||
|
||||
// Transaction containing the actual ordinal data in witness - child of the commit transaction
|
||||
func getOrdinalRevealTx() (Tx, []AddressDescriptor) {
|
||||
tx := Tx{
|
||||
// https://mempool.space/tx/c4cae52a6e681b66c85c12feafb42f3617f34977032df1ee139eae07370863ef
|
||||
Txid: "c4cae52a6e681b66c85c12feafb42f3617f34977032df1ee139eae07370863ef",
|
||||
Vin: []Vin{
|
||||
{
|
||||
Txid: "11111c17cbe86aebab146ee039d4e354cb55a9fb226ebdd2e30948630e7710ad",
|
||||
Vout: 0,
|
||||
Witness: [][]byte{
|
||||
hexToBytes("737ad2835962e3d147cd74a578f1109e9314eac9d00c9fad304ce2050b78fac21a2d124fd886d1d646cf1de5d5c9754b0415b960b1319526fa25e36ca1f650ce"),
|
||||
hexToBytes("2029f34532e043fade4471779b4955005db8fa9b64c9e8d0a2dae4a38bbca23328ac0063036f726401010a696d6167652f77656270004d08025249464650020000574542505650384c440200002f57c2950067a026009086939b7785a104699656f4f53388355445b6415d22f8924000fd83bd31d346ca69f8fcfed6d8d18231846083f90f00ffbf203883666c36463c6ba8662257d789935e002192245bd15ac00216b080052cac85b380052c60e1593859f33a7a7abff7ed88feb361db3692341bc83553aef7aec75669ffb1ffd87fec3ff61ffb8ffdc736f20a96a0fba34071d4fdf111c435381df667728f95c4e82b6872d82471bfdc1665107bb80fd46df1686425bcd2e27eb59adc9d17b54b997ee96776a7c37ca2b57b9551bcffeb71d88768765af7384c2e3ba031ca3f19c9ddb0c6ec55223fbfe3731a1e8d7bb010de8532d53293bbbb6145597ee53559a612e6de4f8fc66936ef463eea7498555643ac0dafad6627575f2733b9fb352e411e7d9df8fc80fde75f5f66f5c5381a46b9a697d9c97555c4bf41a4909b9dd071557c3dfe0bfcd6459e06514266c65756ce9f25705230df63d30fef6076b797e1f49d00b41e87b5ccecb1c237f419e4b3ca6876053c14fc979a629459a62f78d735fb078bfa0e7a1fc69ad379447d817e06b3d7f1de820f28534f85fa20469cd6f93ddc6c5f2a94878fc64a98ac336294c99d27d11742268ae1a34cd61f31e2e4aee94b0ff496f55068fa727ace6ad2ec1e6e3f59e6a8bd154f287f652fbfaa05cac067951de1bfacc0e330c3bf6dd2efde4c509646566836eb71986154731daf722a6ff585001e87f9479559a61265d6e330f3682bf87ab2598fc3fca36da778e59cee71584594ef175e6d7d5f70d6deb02c4b371e5063c35669ffb1ffd87ffe0e730068"),
|
||||
hexToBytes("c129f34532e043fade4471779b4955005db8fa9b64c9e8d0a2dae4a38bbca23328"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Vout: []Vout{
|
||||
{
|
||||
ScriptPubKey: ScriptPubKey{
|
||||
Hex: "51206850b179630df0f7012ae2b111bafa52ebb9b54e1435fc4f98fbe0af6f95076a",
|
||||
Addresses: []string{
|
||||
"bc1pdpgtz7trphc0wqf2u2c3rwh62t4mnd2wzs6lcnucl0s27mu4qa4q4md9ta",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
addressDescriptors := []AddressDescriptor{
|
||||
// bc1pdpgtz7trphc0wqf2u2c3rwh62t4mnd2wzs6lcnucl0s27mu4qa4q4md9ta
|
||||
hexToBytes("51206850b179630df0f7012ae2b111bafa52ebb9b54e1435fc4f98fbe0af6f95076a"),
|
||||
}
|
||||
return tx, addressDescriptors
|
||||
}
|
||||
|
||||
func TestGolombIsOrdinal(t *testing.T) {
|
||||
revealTx, _ := getOrdinalRevealTx()
|
||||
if txContainsOrdinal(&revealTx) != true {
|
||||
t.Error("Ordinal not found in reveal Tx")
|
||||
}
|
||||
commitTx, _ := getOrdinalCommitTx()
|
||||
if txContainsOrdinal(&commitTx) != false {
|
||||
t.Error("Ordinal found in commit Tx, but should not be there")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGolombOrdinalTransactions(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
filterScripts string
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "all",
|
||||
filterScripts: "",
|
||||
want: "04256e660160e42ff40ee320", // take all four descriptors
|
||||
},
|
||||
{
|
||||
name: "taproot",
|
||||
filterScripts: "taproot",
|
||||
want: "0212b734c2ebe0", // filter out two non-taproot ones
|
||||
},
|
||||
{
|
||||
name: "taproot-noordinals",
|
||||
filterScripts: "taproot-noordinals",
|
||||
want: "", // ignore everything
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
gf, err := NewGolombFilter(20, tt.filterScripts, "", true)
|
||||
if err != nil {
|
||||
t.Errorf("TestGolombOrdinalTransactions.NewGolombFilter() got unexpected error '%v'", err)
|
||||
return
|
||||
}
|
||||
|
||||
commitTx, addressDescriptorsCommit := getOrdinalCommitTx()
|
||||
revealTx, addressDescriptorsReveal := getOrdinalRevealTx()
|
||||
|
||||
for _, ad := range addressDescriptorsCommit {
|
||||
gf.AddAddrDesc(ad, &commitTx)
|
||||
}
|
||||
for _, ad := range addressDescriptorsReveal {
|
||||
gf.AddAddrDesc(ad, &revealTx)
|
||||
}
|
||||
|
||||
f := gf.Compute()
|
||||
got := hex.EncodeToString(f)
|
||||
if got != tt.want {
|
||||
t.Errorf("TestGolombOrdinalTransactions Compute() got %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -2,13 +2,11 @@ package bchain
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"math/big"
|
||||
"time"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/martinboehm/btcutil/gcs"
|
||||
"github.com/juju/errors"
|
||||
)
|
||||
|
||||
type chanInputPayload struct {
|
||||
@ -16,14 +14,6 @@ type chanInputPayload struct {
|
||||
index int
|
||||
}
|
||||
|
||||
type filterScriptsType int
|
||||
|
||||
const (
|
||||
filterScriptsInvalid = filterScriptsType(iota)
|
||||
filterScriptsAll
|
||||
filterScriptsTaproot
|
||||
)
|
||||
|
||||
// MempoolBitcoinType is mempool handle.
|
||||
type MempoolBitcoinType struct {
|
||||
BaseMempool
|
||||
@ -31,19 +21,13 @@ type MempoolBitcoinType struct {
|
||||
chanAddrIndex chan txidio
|
||||
AddrDescForOutpoint AddrDescForOutpointFunc
|
||||
golombFilterP uint8
|
||||
golombFilterM uint64
|
||||
filterScripts filterScriptsType
|
||||
filterScripts string
|
||||
useZeroedKey bool
|
||||
}
|
||||
|
||||
// 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
|
||||
func NewMempoolBitcoinType(chain BlockChain, workers int, subworkers int, golombFilterP uint8, filterScripts string) *MempoolBitcoinType {
|
||||
filterScriptsType := filterScriptsToScriptsType(filterScripts)
|
||||
if filterScriptsType == filterScriptsInvalid {
|
||||
glog.Error("Invalid filterScripts ", filterScripts, ", switching off golomb filter")
|
||||
golombFilterP = 0
|
||||
}
|
||||
golombFilterM := uint64(1 << golombFilterP)
|
||||
func NewMempoolBitcoinType(chain BlockChain, workers int, subworkers int, golombFilterP uint8, filterScripts string, useZeroedKey bool) *MempoolBitcoinType {
|
||||
m := &MempoolBitcoinType{
|
||||
BaseMempool: BaseMempool{
|
||||
chain: chain,
|
||||
@ -53,8 +37,8 @@ func NewMempoolBitcoinType(chain BlockChain, workers int, subworkers int, golomb
|
||||
chanTxid: make(chan string, 1),
|
||||
chanAddrIndex: make(chan txidio, 1),
|
||||
golombFilterP: golombFilterP,
|
||||
golombFilterM: golombFilterM,
|
||||
filterScripts: filterScriptsType,
|
||||
filterScripts: filterScripts,
|
||||
useZeroedKey: useZeroedKey,
|
||||
}
|
||||
for i := 0; i < workers; i++ {
|
||||
go func(i int) {
|
||||
@ -81,16 +65,6 @@ func NewMempoolBitcoinType(chain BlockChain, workers int, subworkers int, golomb
|
||||
return m
|
||||
}
|
||||
|
||||
func filterScriptsToScriptsType(filterScripts string) filterScriptsType {
|
||||
switch filterScripts {
|
||||
case "":
|
||||
return filterScriptsAll
|
||||
case "taproot":
|
||||
return filterScriptsTaproot
|
||||
}
|
||||
return filterScriptsInvalid
|
||||
}
|
||||
|
||||
func (m *MempoolBitcoinType) getInputAddress(payload *chanInputPayload) *addrIndex {
|
||||
var addrDesc AddressDescriptor
|
||||
var value *big.Int
|
||||
@ -125,56 +99,21 @@ func (m *MempoolBitcoinType) getInputAddress(payload *chanInputPayload) *addrInd
|
||||
|
||||
}
|
||||
|
||||
func isTaproot(addrDesc AddressDescriptor) bool {
|
||||
if len(addrDesc) == 34 && addrDesc[0] == 0x51 && addrDesc[1] == 0x20 {
|
||||
return true
|
||||
func (m *MempoolBitcoinType) computeGolombFilter(mtx *MempoolTx, tx *Tx) string {
|
||||
gf, _ := NewGolombFilter(m.golombFilterP, m.filterScripts, mtx.Txid, m.useZeroedKey)
|
||||
if gf == nil || !gf.Enabled {
|
||||
return ""
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *MempoolBitcoinType) computeGolombFilter(mtx *MempoolTx) string {
|
||||
uniqueScripts := make(map[string]struct{})
|
||||
filterData := make([][]byte, 0)
|
||||
for i := range mtx.Vin {
|
||||
vin := &mtx.Vin[i]
|
||||
if m.filterScripts == filterScriptsAll || (m.filterScripts == filterScriptsTaproot && isTaproot(vin.AddrDesc)) {
|
||||
s := string(vin.AddrDesc)
|
||||
if _, found := uniqueScripts[s]; !found {
|
||||
filterData = append(filterData, vin.AddrDesc)
|
||||
uniqueScripts[s] = struct{}{}
|
||||
}
|
||||
}
|
||||
for _, vin := range mtx.Vin {
|
||||
gf.AddAddrDesc(vin.AddrDesc, tx)
|
||||
}
|
||||
for i := range mtx.Vout {
|
||||
vout := &mtx.Vout[i]
|
||||
for _, vout := range mtx.Vout {
|
||||
b, err := hex.DecodeString(vout.ScriptPubKey.Hex)
|
||||
if err == nil {
|
||||
if m.filterScripts == filterScriptsAll || (m.filterScripts == filterScriptsTaproot && isTaproot(b)) {
|
||||
s := string(b)
|
||||
if _, found := uniqueScripts[s]; !found {
|
||||
filterData = append(filterData, b)
|
||||
uniqueScripts[s] = struct{}{}
|
||||
}
|
||||
}
|
||||
gf.AddAddrDesc(b, tx)
|
||||
}
|
||||
}
|
||||
if len(filterData) == 0 {
|
||||
return ""
|
||||
}
|
||||
b, _ := hex.DecodeString(mtx.Txid)
|
||||
if len(b) < gcs.KeySize {
|
||||
return ""
|
||||
}
|
||||
filter, err := gcs.BuildGCSFilter(m.golombFilterP, m.golombFilterM, *(*[gcs.KeySize]byte)(b[:gcs.KeySize]), filterData)
|
||||
if err != nil {
|
||||
glog.Error("Cannot create golomb filter for ", mtx.Txid, ", ", err)
|
||||
return ""
|
||||
}
|
||||
fb, err := filter.NBytes()
|
||||
if err != nil {
|
||||
glog.Error("Error getting NBytes from golomb filter for ", mtx.Txid, ", ", err)
|
||||
return ""
|
||||
}
|
||||
fb := gf.Compute()
|
||||
return hex.EncodeToString(fb)
|
||||
}
|
||||
|
||||
@ -231,7 +170,7 @@ func (m *MempoolBitcoinType) getTxAddrs(txid string, chanInput chan chanInputPay
|
||||
}
|
||||
var golombFilter string
|
||||
if m.golombFilterP > 0 {
|
||||
golombFilter = m.computeGolombFilter(mtx)
|
||||
golombFilter = m.computeGolombFilter(mtx, tx)
|
||||
}
|
||||
if m.OnNewTx != nil {
|
||||
m.OnNewTx(mtx)
|
||||
@ -301,8 +240,8 @@ func (m *MempoolBitcoinType) Resync() (int, error) {
|
||||
|
||||
// GetTxidFilterEntries returns all mempool entries with golomb filter from
|
||||
func (m *MempoolBitcoinType) GetTxidFilterEntries(filterScripts string, fromTimestamp uint32) (MempoolTxidFilterEntries, error) {
|
||||
if m.filterScripts != filterScriptsToScriptsType(filterScripts) {
|
||||
return MempoolTxidFilterEntries{}, errors.New(fmt.Sprint("Unsupported script filter ", filterScripts))
|
||||
if m.filterScripts != filterScripts {
|
||||
return MempoolTxidFilterEntries{}, errors.Errorf("Unsupported script filter %s", filterScripts)
|
||||
}
|
||||
m.mux.Lock()
|
||||
entries := make(map[string]string)
|
||||
@ -312,5 +251,5 @@ func (m *MempoolBitcoinType) GetTxidFilterEntries(filterScripts string, fromTime
|
||||
}
|
||||
}
|
||||
m.mux.Unlock()
|
||||
return MempoolTxidFilterEntries{entries}, nil
|
||||
return MempoolTxidFilterEntries{entries, m.useZeroedKey}, nil
|
||||
}
|
||||
|
||||
@ -16,9 +16,9 @@ func TestMempoolBitcoinType_computeGolombFilter_taproot(t *testing.T) {
|
||||
randomScript := hexToBytes("a914ff074800343a81ada8fe86c2d5d5a0e55b93dd7a87")
|
||||
m := &MempoolBitcoinType{
|
||||
golombFilterP: 20,
|
||||
golombFilterM: uint64(1 << 20),
|
||||
filterScripts: filterScriptsTaproot,
|
||||
filterScripts: "taproot",
|
||||
}
|
||||
golombFilterM := GetGolombParamM(m.golombFilterP)
|
||||
tests := []struct {
|
||||
name string
|
||||
mtx MempoolTx
|
||||
@ -194,13 +194,13 @@ func TestMempoolBitcoinType_computeGolombFilter_taproot(t *testing.T) {
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := m.computeGolombFilter(&tt.mtx)
|
||||
got := m.computeGolombFilter(&tt.mtx, nil)
|
||||
if got != tt.want {
|
||||
t.Errorf("MempoolBitcoinType.computeGolombFilter() = %v, want %v", got, tt.want)
|
||||
}
|
||||
if got != "" {
|
||||
// build the filter from computed value
|
||||
filter, err := gcs.FromNBytes(m.golombFilterP, m.golombFilterM, hexToBytes(got))
|
||||
filter, err := gcs.FromNBytes(m.golombFilterP, golombFilterM, hexToBytes(got))
|
||||
if err != nil {
|
||||
t.Errorf("gcs.BuildGCSFilter() unexpected error %v", err)
|
||||
}
|
||||
@ -211,8 +211,8 @@ func TestMempoolBitcoinType_computeGolombFilter_taproot(t *testing.T) {
|
||||
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))
|
||||
if match != tt.mtx.Vin[i].AddrDesc.IsTaproot() {
|
||||
t.Errorf("filter.Match vin[%d] got %v, want %v", i, match, tt.mtx.Vin[i].AddrDesc.IsTaproot())
|
||||
}
|
||||
}
|
||||
// check that the vout scripts match the filter
|
||||
@ -222,8 +222,8 @@ func TestMempoolBitcoinType_computeGolombFilter_taproot(t *testing.T) {
|
||||
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))
|
||||
if match != AddressDescriptor(s).IsTaproot() {
|
||||
t.Errorf("filter.Match vout[%d] got %v, want %v", i, match, AddressDescriptor(s).IsTaproot())
|
||||
}
|
||||
}
|
||||
// check that a random script does not match the filter
|
||||
@ -238,3 +238,115 @@ func TestMempoolBitcoinType_computeGolombFilter_taproot(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMempoolBitcoinType_computeGolombFilter_taproot_noordinals(t *testing.T) {
|
||||
m := &MempoolBitcoinType{
|
||||
golombFilterP: 20,
|
||||
filterScripts: "taproot-noordinals",
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
mtx MempoolTx
|
||||
tx Tx
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "taproot-no-ordinals normal taproot tx",
|
||||
mtx: MempoolTx{
|
||||
Txid: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||
Vin: []MempoolVin{
|
||||
{
|
||||
// bc1pdfc3xk96cm9g7lwlm78hxd2xuevzpqfzjw0shaarwflczs7lh0lstksdn0
|
||||
AddrDesc: hexToBytes("51206a711358bac6ca8f7ddfdf8f733546e658208122939f0bf7a3727f8143dfbbff"),
|
||||
},
|
||||
},
|
||||
Vout: []Vout{
|
||||
{
|
||||
ScriptPubKey: ScriptPubKey{
|
||||
Hex: "51206850b179630df0f7012ae2b111bafa52ebb9b54e1435fc4f98fbe0af6f95076a",
|
||||
Addresses: []string{
|
||||
"bc1pdpgtz7trphc0wqf2u2c3rwh62t4mnd2wzs6lcnucl0s27mu4qa4q4md9ta",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
tx: Tx{
|
||||
Vin: []Vin{
|
||||
{
|
||||
Witness: [][]byte{
|
||||
hexToBytes("737ad2835962e3d147cd74a578f1109e9314eac9d00c9fad304ce2050b78fac21a2d124fd886d1d646cf1de5d5c9754b0415b960b1319526fa25e36ca1f650ce"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Vout: []Vout{
|
||||
{
|
||||
ScriptPubKey: ScriptPubKey{
|
||||
Hex: "51206850b179630df0f7012ae2b111bafa52ebb9b54e1435fc4f98fbe0af6f95076a",
|
||||
Addresses: []string{
|
||||
"bc1pdpgtz7trphc0wqf2u2c3rwh62t4mnd2wzs6lcnucl0s27mu4qa4q4md9ta",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
want: "02899e8c952b40",
|
||||
},
|
||||
{
|
||||
name: "taproot-no-ordinals ordinal tx",
|
||||
mtx: MempoolTx{
|
||||
Txid: "86336c62a63f509a278624e3f400cdd50838d035a44e0af8a7d6d133c04cc2d2",
|
||||
Vin: []MempoolVin{
|
||||
{
|
||||
// bc1pdfc3xk96cm9g7lwlm78hxd2xuevzpqfzjw0shaarwflczs7lh0lstksdn0
|
||||
AddrDesc: hexToBytes("51206a711358bac6ca8f7ddfdf8f733546e658208122939f0bf7a3727f8143dfbbff"),
|
||||
},
|
||||
},
|
||||
Vout: []Vout{
|
||||
{
|
||||
ScriptPubKey: ScriptPubKey{
|
||||
Hex: "51206850b179630df0f7012ae2b111bafa52ebb9b54e1435fc4f98fbe0af6f95076a",
|
||||
Addresses: []string{
|
||||
"bc1pdpgtz7trphc0wqf2u2c3rwh62t4mnd2wzs6lcnucl0s27mu4qa4q4md9ta",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
tx: Tx{
|
||||
// https://mempool.space/tx/c4cae52a6e681b66c85c12feafb42f3617f34977032df1ee139eae07370863ef
|
||||
Txid: "c4cae52a6e681b66c85c12feafb42f3617f34977032df1ee139eae07370863ef",
|
||||
Vin: []Vin{
|
||||
{
|
||||
Txid: "11111c17cbe86aebab146ee039d4e354cb55a9fb226ebdd2e30948630e7710ad",
|
||||
Vout: 0,
|
||||
Witness: [][]byte{
|
||||
hexToBytes("737ad2835962e3d147cd74a578f1109e9314eac9d00c9fad304ce2050b78fac21a2d124fd886d1d646cf1de5d5c9754b0415b960b1319526fa25e36ca1f650ce"),
|
||||
hexToBytes("2029f34532e043fade4471779b4955005db8fa9b64c9e8d0a2dae4a38bbca23328ac0063036f726401010a696d6167652f77656270004d08025249464650020000574542505650384c440200002f57c2950067a026009086939b7785a104699656f4f53388355445b6415d22f8924000fd83bd31d346ca69f8fcfed6d8d18231846083f90f00ffbf203883666c36463c6ba8662257d789935e002192245bd15ac00216b080052cac85b380052c60e1593859f33a7a7abff7ed88feb361db3692341bc83553aef7aec75669ffb1ffd87fec3ff61ffb8ffdc736f20a96a0fba34071d4fdf111c435381df667728f95c4e82b6872d82471bfdc1665107bb80fd46df1686425bcd2e27eb59adc9d17b54b997ee96776a7c37ca2b57b9551bcffeb71d88768765af7384c2e3ba031ca3f19c9ddb0c6ec55223fbfe3731a1e8d7bb010de8532d53293bbbb6145597ee53559a612e6de4f8fc66936ef463eea7498555643ac0dafad6627575f2733b9fb352e411e7d9df8fc80fde75f5f66f5c5381a46b9a697d9c97555c4bf41a4909b9dd071557c3dfe0bfcd6459e06514266c65756ce9f25705230df63d30fef6076b797e1f49d00b41e87b5ccecb1c237f419e4b3ca6876053c14fc979a629459a62f78d735fb078bfa0e7a1fc69ad379447d817e06b3d7f1de820f28534f85fa20469cd6f93ddc6c5f2a94878fc64a98ac336294c99d27d11742268ae1a34cd61f31e2e4aee94b0ff496f55068fa727ace6ad2ec1e6e3f59e6a8bd154f287f652fbfaa05cac067951de1bfacc0e330c3bf6dd2efde4c509646566836eb71986154731daf722a6ff585001e87f9479559a61265d6e330f3682bf87ab2598fc3fca36da778e59cee71584594ef175e6d7d5f70d6deb02c4b371e5063c35669ffb1ffd87ffe0e730068"),
|
||||
hexToBytes("c129f34532e043fade4471779b4955005db8fa9b64c9e8d0a2dae4a38bbca23328"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Vout: []Vout{
|
||||
{
|
||||
ScriptPubKey: ScriptPubKey{
|
||||
Hex: "51206850b179630df0f7012ae2b111bafa52ebb9b54e1435fc4f98fbe0af6f95076a",
|
||||
Addresses: []string{
|
||||
"bc1pdpgtz7trphc0wqf2u2c3rwh62t4mnd2wzs6lcnucl0s27mu4qa4q4md9ta",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
want: "",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := m.computeGolombFilter(&tt.mtx, &tt.tx)
|
||||
if got != tt.want {
|
||||
t.Errorf("MempoolBitcoinType.computeGolombFilter() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -132,8 +132,8 @@ func (m *MempoolEthereumType) Resync() (int, error) {
|
||||
return entries, nil
|
||||
}
|
||||
|
||||
// AddTransactionToMempool adds transactions to mempool
|
||||
func (m *MempoolEthereumType) AddTransactionToMempool(txid string) {
|
||||
// AddTransactionToMempool adds transactions to mempool, returns true if tx added to mempool, false if not added (for example duplicate call)
|
||||
func (m *MempoolEthereumType) AddTransactionToMempool(txid string) bool {
|
||||
m.mux.Lock()
|
||||
_, exists := m.txEntries[txid]
|
||||
m.mux.Unlock()
|
||||
@ -143,7 +143,7 @@ func (m *MempoolEthereumType) AddTransactionToMempool(txid string) {
|
||||
if !exists {
|
||||
entry, ok := m.createTxEntry(txid, uint32(time.Now().Unix()))
|
||||
if !ok {
|
||||
return
|
||||
return false
|
||||
}
|
||||
m.mux.Lock()
|
||||
m.txEntries[txid] = entry
|
||||
@ -152,6 +152,7 @@ func (m *MempoolEthereumType) AddTransactionToMempool(txid string) {
|
||||
}
|
||||
m.mux.Unlock()
|
||||
}
|
||||
return !exists
|
||||
}
|
||||
|
||||
// RemoveTransactionFromMempool removes transaction from mempool
|
||||
|
||||
@ -57,6 +57,7 @@ type Vin struct {
|
||||
ScriptSig ScriptSig `json:"scriptSig"`
|
||||
Sequence uint32 `json:"sequence"`
|
||||
Addresses []string `json:"addresses"`
|
||||
Witness [][]byte `json:"-"`
|
||||
}
|
||||
|
||||
// ScriptPubKey contains data about output script
|
||||
@ -226,6 +227,13 @@ func (ad AddressDescriptor) String() string {
|
||||
return "ad:" + hex.EncodeToString(ad)
|
||||
}
|
||||
|
||||
func (ad AddressDescriptor) IsTaproot() bool {
|
||||
if len(ad) == 34 && ad[0] == 0x51 && ad[1] == 0x20 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// AddressDescriptorFromString converts string created by AddressDescriptor.String to AddressDescriptor
|
||||
func AddressDescriptorFromString(s string) (AddressDescriptor, error) {
|
||||
if len(s) > 3 && s[0:3] == "ad:" {
|
||||
@ -266,8 +274,10 @@ type XpubDescriptor struct {
|
||||
type MempoolTxidEntries []MempoolTxidEntry
|
||||
|
||||
// MempoolTxidFilterEntries is a map of txids to mempool golomb filters
|
||||
// Also contains a flag whether constant zeroed key was used when calculating the filters
|
||||
type MempoolTxidFilterEntries struct {
|
||||
Entries map[string]string `json:"entries,omitempty"`
|
||||
Entries map[string]string `json:"entries,omitempty"`
|
||||
UsedZeroedKey bool `json:"usedZeroedKey,omitempty"`
|
||||
}
|
||||
|
||||
// OnNewBlockFunc is used to send notification about a new block
|
||||
@ -323,6 +333,8 @@ type BlockChain interface {
|
||||
EthereumTypeGetNonce(addrDesc AddressDescriptor) (uint64, error)
|
||||
EthereumTypeEstimateGas(params map[string]interface{}) (uint64, error)
|
||||
EthereumTypeGetErc20ContractBalance(addrDesc, contractDesc AddressDescriptor) (*big.Int, error)
|
||||
EthereumTypeGetSupportedStakingPools() []string
|
||||
EthereumTypeGetStakingPoolsData(addrDesc AddressDescriptor) ([]StakingPoolData, error)
|
||||
GetTokenURI(contractDesc AddressDescriptor, tokenID *big.Int) (string, error)
|
||||
}
|
||||
|
||||
|
||||
@ -146,3 +146,16 @@ type EthereumBlockSpecificData struct {
|
||||
AddressAliasRecords []AddressAliasRecord
|
||||
Contracts []ContractInfo
|
||||
}
|
||||
|
||||
// StakingPool holds data about address participation in a staking pool contract
|
||||
type StakingPoolData struct {
|
||||
Contract string `json:"contract"`
|
||||
Name string `json:"name"`
|
||||
PendingBalance big.Int `json:"pendingBalance"` // pendingBalanceOf method
|
||||
PendingDepositedBalance big.Int `json:"pendingDepositedBalance"` // pendingDepositedBalanceOf method
|
||||
DepositedBalance big.Int `json:"depositedBalance"` // depositedBalanceOf method
|
||||
WithdrawTotalAmount big.Int `json:"withdrawTotalAmount"` // withdrawRequest method, return value [0]
|
||||
ClaimableAmount big.Int `json:"claimableAmount"` // withdrawRequest method, return value [1]
|
||||
RestakedReward big.Int `json:"restakedReward"` // restakedRewardOf method
|
||||
AutocompoundBalance big.Int `json:"autocompoundBalance"` // autocompoundBalanceOf method
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@ export interface EthereumSpecific {
|
||||
nonce: number;
|
||||
gasLimit: number;
|
||||
gasUsed?: number;
|
||||
gasPrice: string;
|
||||
gasPrice?: string;
|
||||
data?: string;
|
||||
parsedData?: EthereumParsedInputData;
|
||||
internalTransfers?: EthereumInternalTransfer[];
|
||||
@ -46,9 +46,9 @@ export interface TokenTransfer {
|
||||
from: string;
|
||||
to: string;
|
||||
contract: string;
|
||||
name: string;
|
||||
symbol: string;
|
||||
decimals: number;
|
||||
name?: string;
|
||||
symbol?: string;
|
||||
decimals?: number;
|
||||
value?: string;
|
||||
multiTokenValues?: MultiTokenValue[];
|
||||
}
|
||||
@ -109,6 +109,17 @@ export interface FeeStats {
|
||||
averageFeePerKb: number;
|
||||
decilesFeePerKb: number[];
|
||||
}
|
||||
export interface StakingPool {
|
||||
contract: string;
|
||||
name: string;
|
||||
pendingBalance: string;
|
||||
pendingDepositedBalance: string;
|
||||
depositedBalance: string;
|
||||
withdrawTotalAmount: string;
|
||||
claimableAmount: string;
|
||||
restakedReward: string;
|
||||
autocompoundBalance: string;
|
||||
}
|
||||
export interface ContractInfo {
|
||||
type: string;
|
||||
contract: string;
|
||||
@ -161,6 +172,7 @@ export interface Address {
|
||||
contractInfo?: ContractInfo;
|
||||
erc20Contract?: ContractInfo;
|
||||
addressAliases?: { [key: string]: AddressAlias };
|
||||
stakingPools?: StakingPool[];
|
||||
}
|
||||
export interface Utxo {
|
||||
txid: string;
|
||||
@ -264,6 +276,7 @@ export interface BlockbookInfo {
|
||||
currentFiatRatesTime?: string;
|
||||
historicalFiatRatesTime?: string;
|
||||
historicalTokenFiatRatesTime?: string;
|
||||
supportedStakingPools?: string[];
|
||||
dbSizeFromColumns?: number;
|
||||
dbColumns?: InternalStateColumn[];
|
||||
about: string;
|
||||
@ -357,6 +370,17 @@ export interface WsBlockReq {
|
||||
pageSize?: number;
|
||||
page?: number;
|
||||
}
|
||||
export interface WsBlockFilterReq {
|
||||
scriptType: string;
|
||||
blockHash: string;
|
||||
M?: number;
|
||||
}
|
||||
export interface WsBlockFiltersBatchReq {
|
||||
scriptType: string;
|
||||
bestKnownBlockHash: string;
|
||||
pageSize?: number;
|
||||
M?: number;
|
||||
}
|
||||
export interface WsAccountUtxoReq {
|
||||
descriptor: string;
|
||||
}
|
||||
@ -416,7 +440,9 @@ export interface WsFiatRatesTickersListReq {
|
||||
export interface WsMempoolFiltersReq {
|
||||
scriptType: string;
|
||||
fromTimestamp: number;
|
||||
M?: number;
|
||||
}
|
||||
export interface MempoolTxidFilterEntries {
|
||||
entries?: { [key: string]: string };
|
||||
usedZeroedKey?: boolean;
|
||||
}
|
||||
|
||||
53
blockbook.go
53
blockbook.go
@ -2,7 +2,6 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"log"
|
||||
"math/rand"
|
||||
@ -11,6 +10,7 @@ import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"runtime/debug"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
@ -152,30 +152,19 @@ func mainWithExitCode() int {
|
||||
return exitCodeOK
|
||||
}
|
||||
|
||||
if *configFile == "" {
|
||||
glog.Error("Missing blockchaincfg configuration parameter")
|
||||
return exitCodeFatal
|
||||
}
|
||||
|
||||
configFileContent, err := os.ReadFile(*configFile)
|
||||
if err != nil {
|
||||
glog.Errorf("Error reading file %v, %v", configFile, err)
|
||||
return exitCodeFatal
|
||||
}
|
||||
|
||||
coin, coinShortcut, coinLabel, err := coins.GetCoinNameFromConfig(configFileContent)
|
||||
config, err := common.GetConfig(*configFile)
|
||||
if err != nil {
|
||||
glog.Error("config: ", err)
|
||||
return exitCodeFatal
|
||||
}
|
||||
|
||||
metrics, err = common.GetMetrics(coin)
|
||||
metrics, err = common.GetMetrics(config.CoinName)
|
||||
if err != nil {
|
||||
glog.Error("metrics: ", err)
|
||||
return exitCodeFatal
|
||||
}
|
||||
|
||||
if chain, mempool, err = getBlockChainWithRetry(coin, *configFile, pushSynchronizationHandler, metrics, 120); err != nil {
|
||||
if chain, mempool, err = getBlockChainWithRetry(config.CoinName, *configFile, pushSynchronizationHandler, metrics, 120); err != nil {
|
||||
glog.Error("rpc: ", err)
|
||||
return exitCodeFatal
|
||||
}
|
||||
@ -187,7 +176,7 @@ func mainWithExitCode() int {
|
||||
}
|
||||
defer index.Close()
|
||||
|
||||
internalState, err = newInternalState(coin, coinShortcut, coinLabel, index, *enableSubNewTx)
|
||||
internalState, err = newInternalState(config, index, *enableSubNewTx)
|
||||
if err != nil {
|
||||
glog.Error("internalState: ", err)
|
||||
return exitCodeFatal
|
||||
@ -279,7 +268,7 @@ func mainWithExitCode() int {
|
||||
return exitCodeFatal
|
||||
}
|
||||
|
||||
if fiatRates, err = fiat.NewFiatRates(index, configFileContent, metrics, onNewFiatRatesTicker); err != nil {
|
||||
if fiatRates, err = fiat.NewFiatRates(index, config, metrics, onNewFiatRatesTicker); err != nil {
|
||||
glog.Error("fiatRates ", err)
|
||||
return exitCodeFatal
|
||||
}
|
||||
@ -368,7 +357,7 @@ func mainWithExitCode() int {
|
||||
|
||||
if internalServer != nil || publicServer != nil || chain != nil {
|
||||
// start fiat rates downloader only if not shutting down immediately
|
||||
initDownloaders(index, chain, configFileContent)
|
||||
initDownloaders(index, chain, config)
|
||||
waitForSignalAndShutdown(internalServer, publicServer, chain, 10*time.Second)
|
||||
}
|
||||
|
||||
@ -501,16 +490,12 @@ func blockbookAppInfoMetric(db *db.RocksDB, chain bchain.BlockChain, txCache *db
|
||||
return nil
|
||||
}
|
||||
|
||||
func newInternalState(coin, coinShortcut, coinLabel string, d *db.RocksDB, enableSubNewTx bool) (*common.InternalState, error) {
|
||||
is, err := d.LoadInternalState(coin)
|
||||
func newInternalState(config *common.Config, d *db.RocksDB, enableSubNewTx bool) (*common.InternalState, error) {
|
||||
is, err := d.LoadInternalState(config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
is.CoinShortcut = coinShortcut
|
||||
if coinLabel == "" {
|
||||
coinLabel = coin
|
||||
}
|
||||
is.CoinLabel = coinLabel
|
||||
|
||||
is.EnableSubNewTx = enableSubNewTx
|
||||
name, err := os.Hostname()
|
||||
if err != nil {
|
||||
@ -521,6 +506,12 @@ func newInternalState(coin, coinShortcut, coinLabel string, d *db.RocksDB, enabl
|
||||
}
|
||||
is.Host = name
|
||||
}
|
||||
|
||||
is.WsGetAccountInfoLimit, _ = strconv.Atoi(os.Getenv(strings.ToUpper(is.CoinShortcut) + "_WS_GETACCOUNTINFO_LIMIT"))
|
||||
if is.WsGetAccountInfoLimit > 0 {
|
||||
glog.Info("WsGetAccountInfoLimit enabled with limit ", is.WsGetAccountInfoLimit)
|
||||
is.WsLimitExceedingIPs = make(map[string]int)
|
||||
}
|
||||
return is, nil
|
||||
}
|
||||
|
||||
@ -702,21 +693,11 @@ func computeFeeStats(stopCompute chan os.Signal, blockFrom, blockTo int, db *db.
|
||||
return err
|
||||
}
|
||||
|
||||
func initDownloaders(db *db.RocksDB, chain bchain.BlockChain, configFileContent []byte) {
|
||||
func initDownloaders(db *db.RocksDB, chain bchain.BlockChain, config *common.Config) {
|
||||
if fiatRates.Enabled {
|
||||
go fiatRates.RunDownloader()
|
||||
}
|
||||
|
||||
var config struct {
|
||||
FourByteSignatures string `json:"fourByteSignatures"`
|
||||
}
|
||||
|
||||
err := json.Unmarshal(configFileContent, &config)
|
||||
if err != nil {
|
||||
glog.Errorf("Error parsing config file %v, %v", *configFile, err)
|
||||
return
|
||||
}
|
||||
|
||||
if config.FourByteSignatures != "" && chain.GetChainParser().GetChainType() == bchain.ChainEthereumType {
|
||||
fbsd, err := fourbyte.NewFourByteSignaturesDownloader(db, config.FourByteSignatures)
|
||||
if err != nil {
|
||||
|
||||
@ -11,7 +11,7 @@ RUN apt-get update && \
|
||||
libzstd-dev liblz4-dev graphviz && \
|
||||
apt-get clean
|
||||
ARG GOLANG_VERSION
|
||||
ENV GOLANG_VERSION=go1.19.2
|
||||
ENV GOLANG_VERSION=go1.22.2
|
||||
ENV ROCKSDB_VERSION=v7.7.2
|
||||
ENV GOPATH=/go
|
||||
ENV PATH=$PATH:$GOPATH/bin
|
||||
|
||||
@ -38,5 +38,4 @@ prepare-sources:
|
||||
mkdir -p $(BLOCKBOOK_BASE)
|
||||
cp -r /src $(BLOCKBOOK_SRC)
|
||||
cd $(BLOCKBOOK_SRC) && go mod download
|
||||
sed -i 's/wsMessageSizeLimit\ =\ 15\ \*\ 1024\ \*\ 1024/wsMessageSizeLimit = 80 * 1024 * 1024/g' $(GOPATH)/pkg/mod/github.com/ethereum/go-ethereum*/rpc/websocket.go
|
||||
sed -i 's/wsMessageSizeLimit\ =\ 15\ \*\ 1024\ \*\ 1024/wsMessageSizeLimit = 80 * 1024 * 1024/g' $(GOPATH)/pkg/mod/github.com/ava-labs/coreth*/rpc/websocket.go
|
||||
|
||||
@ -1,5 +1,103 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
MgQQAQgAHRYhBClZA2Lsh4qB/TwgK1JSe+2r6HmEBQJlqfWlAAoJEFJSe+2r6HmE
|
||||
C1QP9Ryh2XiUhQmvtiiDFPxzK0sa9YNAk84nUAOSrRLIQ1Xs3g33cg15kxMvtKf9
|
||||
OIJD14Mu1ypnfa1jsDr6zdy3CQCKAKEBTH41jw3XLa9R9XWaT6+0YV+meIHZ6uVJ
|
||||
3+5M1xZGsnErsTM+iGGmneRIt2L0cZTt7HRJaL0EJrd7PXQb8B9BxgPnRa4UVpqd
|
||||
FlhMhNHad7rz5hFAz8YkYEGX/bctF2y/gmHnu/xKkQsOlV+fQfROOlo/wQ/2vXRY
|
||||
YBqWrVw0gAFDaI4P43CoKlYFzZOxrX+RLSc6eOSgmRkwMx5NzpOvfbypuiXLCmed
|
||||
8pTF9SeXH3LzdO1gJQsKkia04OBohCosmnIjOCjeN3bxf606HZpBgXhj72kXZOX0
|
||||
NeA+yxEh1QIhvjxvD0WyIUChaXYsGy61F16vIUytE319diU/e/KQKnTC+oepiju6
|
||||
N23Iy8c2gRux48ghkmcN58bLOCUUvO+UYb7U9YYsi6HEiL8yd8KVPHVJ293NcMt0
|
||||
FsmxFd4Fddr2HYK0NLtf5MDo4yYMw2PmbQ/1/cy/Sr6BvlHmZ6R9+I9beO5LjPBQ
|
||||
EN62PWWBfl6b2EpYyA9RTFUKFiRhEoqLpmORlzMcUcmIsIYX5ZWanitBnSnIznGe
|
||||
TapoOXPE93OrpDJU9vIcYx7Y4E8drNAdW1zZcFBo9ilNexq0i1Bhc3RhIFl1Ymlr
|
||||
ZXkgKFRoaXMgaXMgYW4gb2ZmbGluZSBvbmx5IGtleSB1c2VkIGZvciB0aGUgaGln
|
||||
aGVzdCBsZXZlbCBvZiB2YWxpZGF0aW9uLiBNeSBtYWluIGtleSBpcyA1MjUyN0JF
|
||||
REFCRTg3OTg0LiBTZWUga2V5YmFzZS5pby9wYXN0YSmJAWUEEwEIAE8CGwMFCwkI
|
||||
BwIGFQoJCAsCBRYCAwEAAh4EFiEEYKz3C/cSZFBJ7m8V7+rxZoYiX2QFAmWp/HEY
|
||||
GGhrcHM6Ly9rZXlzLm9wZW5wZ3Aub3JnAAoJEO/q8WaGIl9kVUYH/2HrXiEHYIZU
|
||||
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
|
||||
gZfWLfoIul+B10SwJHXuoQ==
|
||||
=/A3N
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
mQINBF1ULyUBEADFFliU0Hr+PRCQNT9/9ZEhZtLmMMu7tai3VCxhmrHrOpNJJHqX
|
||||
f1/CeUyBhmCvXpKIpAAbH66l/Uc9GH5UgMZ19gMyGa3q3QJn9A6RR9ud4ALRg60P
|
||||
fmYTAci+6Luko7bqTzkS+fYOUSy/LY57s5ANTpveE+iTsBd5grXczCxaYYnthKKA
|
||||
@ -11,55 +109,317 @@ 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
|
||||
96I=
|
||||
=85Kq
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
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
|
||||
NAgNcAK3mOfpQ/ej25jgI5w=
|
||||
=LIEu
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
=d05p
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
=lTCd
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
@ -12,6 +12,8 @@ zmqpubhashblock={{template "IPC.MessageQueueBindingTemplate" .}}
|
||||
rpcworkqueue=1100
|
||||
maxmempool=4096
|
||||
mempoolexpiry=8760
|
||||
mempoolfullrbf=1
|
||||
|
||||
dbcache=1000
|
||||
|
||||
{{- if .Backend.AdditionalParams}}
|
||||
|
||||
@ -19,7 +19,7 @@ Type=simple
|
||||
{{template "Backend.ServiceAdditionalParamsTemplate" .}}
|
||||
|
||||
# Resource limits
|
||||
LimitNOFILE=500000
|
||||
LimitNOFILE=2000000
|
||||
|
||||
# Hardening measures
|
||||
####################
|
||||
|
||||
35
build/templates/backend/scripts/polygon_archive_bor.sh
Normal file
35
build/templates/backend/scripts/polygon_archive_bor.sh
Normal file
@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
|
||||
{{define "main" -}}
|
||||
|
||||
set -e
|
||||
|
||||
INSTALL_DIR={{.Env.BackendInstallPath}}/{{.Coin.Alias}}
|
||||
DATA_DIR={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend
|
||||
|
||||
BOR_BIN=$INSTALL_DIR/bor
|
||||
|
||||
# --bor.heimdall = backend-polygon-heimdall-archive ports.backend_http
|
||||
$BOR_BIN server \
|
||||
--chain $INSTALL_DIR/genesis.json \
|
||||
--syncmode full \
|
||||
--datadir $DATA_DIR \
|
||||
--bor.heimdall http://127.0.0.1:8173 \
|
||||
--maxpeers 200 \
|
||||
--bootnodes enode://76316d1cb93c8ed407d3332d595233401250d48f8fbb1d9c65bd18c0495eca1b43ec38ee0ea1c257c0abb7d1f25d649d359cdfe5a805842159cfe36c5f66b7e8@52.78.36.216:30303,enode://b8f1cc9c5d4403703fbf377116469667d2b1823c0daf16b7250aa576bacf399e42c3930ccfcb02c5df6879565a2b8931335565f0e8d3f8e72385ecf4a4bf160a@3.36.224.80:30303,enode://8729e0c825f3d9cad382555f3e46dcff21af323e89025a0e6312df541f4a9e73abfa562d64906f5e59c51fe6f0501b3e61b07979606c56329c020ed739910759@54.194.245.5:30303,enode://681ebac58d8dd2d8a6eef15329dfbad0ab960561524cf2dfde40ad646736fe5c244020f20b87e7c1520820bc625cfb487dd71d63a3a3bf0baea2dbb8ec7c79f1@34.240.245.39:30303,enode://93faa5d49ba61fa03f43f7e3c76907a9c72953e8628650eef09f5bddc646d9012916824cdd60da989fd954a852205df9a1fd9661379504c92e103a1ada4c2ceb@148.251.142.52:30314,enode://91f6d9873ee2ceee27b4054ec70844e21fa7c525e8d820d6a09989473f4f883951da75a09ef098d544c0c8a71e9ddd2e649e5b455b137260ba8657b2f96cad2c@178.63.148.12:30308,enode://2776f6f0d1c1e4dfddeb9a4b1c3b1a8777fbb3054b92fc55b405d35603667e974e9cad4408f1036cfc17af03dd1a6270c5cb40f854b94760474516b2d8c0f185@88.198.101.172:30308,enode://157321664e79855ee0f914fd05b21cc29ae3a7e805114d1c26efa1d4d2781f5d5bc4e76ed9d00f26d6138f80cc84ea183894c390fcb0e07100a845aed02f6f40@136.243.210.177:30303,enode://6a5e65c6ef3356bc79a780cf0c7534c299fb8cd7b37db80155830478c1e29d35336fe52a888efdf53c0e9bb9b94e20b5349d68798860f1cf36ae96da2b3826cc@178.63.247.234:30304,enode://d6da5ad18e51d492481b29443bd0f588b59d3f72f0da43a722b07fe2a9223a717c976a1cfe00ad86c557756b2bf297ea56c64a1f3d09bebcb9b81290689d8e33@178.63.197.250:30320,enode://51cbc8b750e28d5a4f250d141c032cf282ea873eb1c533c5156cfc51e6a5117d465b7b39b4e0088ee597ee87b89e06cc6c1ed5e6e050b1c3f638765ee584c4f4@178.63.163.68:30310,enode://6484d4394215c222257c97ac74fdcd6f77ecf00e896c38ef35cc41a44add96da64649139b37cc094e88bb985eb84b04d4c6c78f86bf205c9e112c31254cdc443@54.38.217.112:30303?discport=30346,enode://eb3b67d68daef47badfa683c8b04a1cba6a7c431613b8d7619a013aad38bd8d405eb1d0e41279b4f6fe15b264bd388e88282a77a908247b2d1e0198bd4def57b@148.251.224.230:30315,enode://aa228d96217dd91564e13536f3c2808d2040115c7c50509f26f836275e8e65d1bf9400bce3294760be18c9e00a4bf47026e661ba8d8ce1cf2ced30f0a70e5da8@89.187.163.132:30303?discport=30356,enode://c10ab147ba266a80f34dbc423cd12689434cb2cc1f18ced8f4e5828e23d6943a666c2db0f8464983ccc95666b36099b513d1e45d5df94139e42fbecde25832fa@87.249.137.89:30303?discport=30436,enode://e68049c37b182a36c8913fc0780aea5196c1841c917cbd76f83f1a3a8ae99fcfbd2dfa44e36081668120354439008fe4325ffc0d0176771ec2c1863033d4769e@65.108.199.236:30303,enode://a4c74da28447bacd2b3e8443d0917cca7798bca39dbb48b0e210f0fb6685538ba9d1608a2493424086363f04be5e6a99e6eabb70946ed503448d6b282056f87a@198.244.213.85:30303?discport=30315,enode://e28fce95f52cf3368b7b624c6f83379dec858fcebf6a7ff07e97aa9b9445736a165bf1c51cad7bdf6e3167e2b00b11c7911fc330dabb484998d899a1b01d75cf@148.251.194.252:30303?discport=30892,enode://412fdb01125f6868a188f472cf15f07c8f93d606395b909dd5010f2a4a2702739102cea18abb6437fbacd12e695982a77f28edd9bbdd36635b04e9b3c2948f8d@34.203.27.246:30303?discport=30388,enode://9703d9591cb1013b4fa6ea889e8effe7579aa59c324a6e019d690a13e108ef9b4419698347e4305f05291e644a713518a91b0fc32a3442c1394619e2a9b8251e@79.127.216.33:30303?discport=30349 \
|
||||
--port {{.Ports.BackendP2P}} \
|
||||
--http \
|
||||
--http.addr 0.0.0.0 \
|
||||
--http.port {{.Ports.BackendHttp}} \
|
||||
--http.api eth,net,web3,debug,txpool,bor \
|
||||
--http.vhosts '*' \
|
||||
--http.corsdomain '*' \
|
||||
--ws \
|
||||
--ws.addr 0.0.0.0 \
|
||||
--ws.port {{.Ports.BackendRPC}} \
|
||||
--ws.api eth,net,web3,debug,txpool,bor \
|
||||
--ws.origins '*' \
|
||||
--gcmode archive \
|
||||
--txlookuplimit 0 \
|
||||
--cache 4096
|
||||
{{end}}
|
||||
36
build/templates/backend/scripts/polygon_archive_heimdall.sh
Normal file
36
build/templates/backend/scripts/polygon_archive_heimdall.sh
Normal file
@ -0,0 +1,36 @@
|
||||
#!/bin/sh
|
||||
|
||||
{{define "main" -}}
|
||||
|
||||
set -e
|
||||
|
||||
INSTALL_DIR={{.Env.BackendInstallPath}}/{{.Coin.Alias}}
|
||||
DATA_DIR={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend
|
||||
|
||||
HEIMDALL_BIN=$INSTALL_DIR/heimdalld
|
||||
HOME_DIR=$DATA_DIR/heimdalld
|
||||
CONFIG_DIR=$HOME_DIR/config
|
||||
|
||||
if [ ! -d "$CONFIG_DIR" ]; then
|
||||
# init chain
|
||||
$HEIMDALL_BIN init --home $HOME_DIR
|
||||
|
||||
# overwrite genesis file
|
||||
cp $INSTALL_DIR/genesis.json $CONFIG_DIR/genesis.json
|
||||
fi
|
||||
|
||||
# --bor_rpc_url: backend-polygon-bor-archive ports.backend_http
|
||||
# --eth_rpc_url: backend-ethereum-archive ports.backend_http
|
||||
$HEIMDALL_BIN start \
|
||||
--home $HOME_DIR \
|
||||
--chain=mainnet \
|
||||
--rpc.laddr tcp://127.0.0.1:{{.Ports.BackendRPC}} \
|
||||
--p2p.laddr tcp://0.0.0.0:{{.Ports.BackendP2P}} \
|
||||
--laddr tcp://127.0.0.1:{{.Ports.BackendHttp}} \
|
||||
--p2p.seeds "f4f605d60b8ffaaf15240564e58a81103510631c@159.203.9.164:26656,4fb1bc820088764a564d4f66bba1963d47d82329@44.232.55.71:26656,2eadba4be3ce47ac8db0a3538cb923b57b41c927@35.199.4.13:26656,3b23b20017a6f348d329c102ddc0088f0a10a444@35.221.13.28:26656,25f5f65a09c56e9f1d2d90618aa70cd358aa68da@35.230.116.151:26656,4cd60c1d76e44b05f7dfd8bab3f447b119e87042@54.147.31.250:26656,b18bbe1f3d8576f4b73d9b18976e71c65e839149@34.226.134.117:26656,1500161dd491b67fb1ac81868952be49e2509c9f@52.78.36.216:26656,dd4a3f1750af5765266231b9d8ac764599921736@3.36.224.80:26656,8ea4f592ad6cc38d7532aff418d1fb97052463af@34.240.245.39:26656,e772e1fb8c3492a9570a377a5eafdb1dc53cd778@54.194.245.5:26656,6726b826df45ac8e9afb4bdb2469c7771bd797f1@52.209.21.164:26656" \
|
||||
--node tcp://127.0.0.1:{{.Ports.BackendRPC}} \
|
||||
--bor_rpc_url http://127.0.0.1:8172 \
|
||||
--eth_rpc_url http://127.0.0.1:8116 \
|
||||
--rest-server
|
||||
|
||||
{{end}}
|
||||
35
build/templates/backend/scripts/polygon_bor.sh
Normal file
35
build/templates/backend/scripts/polygon_bor.sh
Normal file
@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
|
||||
{{define "main" -}}
|
||||
|
||||
set -e
|
||||
|
||||
INSTALL_DIR={{.Env.BackendInstallPath}}/{{.Coin.Alias}}
|
||||
DATA_DIR={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend
|
||||
|
||||
BOR_BIN=$INSTALL_DIR/bor
|
||||
|
||||
# --bor.heimdall = backend-polygon-heimdall ports.backend_http
|
||||
$BOR_BIN server \
|
||||
--chain $INSTALL_DIR/genesis.json \
|
||||
--syncmode full \
|
||||
--datadir $DATA_DIR \
|
||||
--bor.heimdall http://127.0.0.1:8171 \
|
||||
--maxpeers 200 \
|
||||
--bootnodes enode://76316d1cb93c8ed407d3332d595233401250d48f8fbb1d9c65bd18c0495eca1b43ec38ee0ea1c257c0abb7d1f25d649d359cdfe5a805842159cfe36c5f66b7e8@52.78.36.216:30303,enode://b8f1cc9c5d4403703fbf377116469667d2b1823c0daf16b7250aa576bacf399e42c3930ccfcb02c5df6879565a2b8931335565f0e8d3f8e72385ecf4a4bf160a@3.36.224.80:30303,enode://8729e0c825f3d9cad382555f3e46dcff21af323e89025a0e6312df541f4a9e73abfa562d64906f5e59c51fe6f0501b3e61b07979606c56329c020ed739910759@54.194.245.5:30303,enode://681ebac58d8dd2d8a6eef15329dfbad0ab960561524cf2dfde40ad646736fe5c244020f20b87e7c1520820bc625cfb487dd71d63a3a3bf0baea2dbb8ec7c79f1@34.240.245.39:30303,enode://93faa5d49ba61fa03f43f7e3c76907a9c72953e8628650eef09f5bddc646d9012916824cdd60da989fd954a852205df9a1fd9661379504c92e103a1ada4c2ceb@148.251.142.52:30314,enode://91f6d9873ee2ceee27b4054ec70844e21fa7c525e8d820d6a09989473f4f883951da75a09ef098d544c0c8a71e9ddd2e649e5b455b137260ba8657b2f96cad2c@178.63.148.12:30308,enode://2776f6f0d1c1e4dfddeb9a4b1c3b1a8777fbb3054b92fc55b405d35603667e974e9cad4408f1036cfc17af03dd1a6270c5cb40f854b94760474516b2d8c0f185@88.198.101.172:30308,enode://157321664e79855ee0f914fd05b21cc29ae3a7e805114d1c26efa1d4d2781f5d5bc4e76ed9d00f26d6138f80cc84ea183894c390fcb0e07100a845aed02f6f40@136.243.210.177:30303,enode://6a5e65c6ef3356bc79a780cf0c7534c299fb8cd7b37db80155830478c1e29d35336fe52a888efdf53c0e9bb9b94e20b5349d68798860f1cf36ae96da2b3826cc@178.63.247.234:30304,enode://d6da5ad18e51d492481b29443bd0f588b59d3f72f0da43a722b07fe2a9223a717c976a1cfe00ad86c557756b2bf297ea56c64a1f3d09bebcb9b81290689d8e33@178.63.197.250:30320,enode://51cbc8b750e28d5a4f250d141c032cf282ea873eb1c533c5156cfc51e6a5117d465b7b39b4e0088ee597ee87b89e06cc6c1ed5e6e050b1c3f638765ee584c4f4@178.63.163.68:30310,enode://6484d4394215c222257c97ac74fdcd6f77ecf00e896c38ef35cc41a44add96da64649139b37cc094e88bb985eb84b04d4c6c78f86bf205c9e112c31254cdc443@54.38.217.112:30303?discport=30346,enode://eb3b67d68daef47badfa683c8b04a1cba6a7c431613b8d7619a013aad38bd8d405eb1d0e41279b4f6fe15b264bd388e88282a77a908247b2d1e0198bd4def57b@148.251.224.230:30315,enode://aa228d96217dd91564e13536f3c2808d2040115c7c50509f26f836275e8e65d1bf9400bce3294760be18c9e00a4bf47026e661ba8d8ce1cf2ced30f0a70e5da8@89.187.163.132:30303?discport=30356,enode://c10ab147ba266a80f34dbc423cd12689434cb2cc1f18ced8f4e5828e23d6943a666c2db0f8464983ccc95666b36099b513d1e45d5df94139e42fbecde25832fa@87.249.137.89:30303?discport=30436,enode://e68049c37b182a36c8913fc0780aea5196c1841c917cbd76f83f1a3a8ae99fcfbd2dfa44e36081668120354439008fe4325ffc0d0176771ec2c1863033d4769e@65.108.199.236:30303,enode://a4c74da28447bacd2b3e8443d0917cca7798bca39dbb48b0e210f0fb6685538ba9d1608a2493424086363f04be5e6a99e6eabb70946ed503448d6b282056f87a@198.244.213.85:30303?discport=30315,enode://e28fce95f52cf3368b7b624c6f83379dec858fcebf6a7ff07e97aa9b9445736a165bf1c51cad7bdf6e3167e2b00b11c7911fc330dabb484998d899a1b01d75cf@148.251.194.252:30303?discport=30892,enode://412fdb01125f6868a188f472cf15f07c8f93d606395b909dd5010f2a4a2702739102cea18abb6437fbacd12e695982a77f28edd9bbdd36635b04e9b3c2948f8d@34.203.27.246:30303?discport=30388,enode://9703d9591cb1013b4fa6ea889e8effe7579aa59c324a6e019d690a13e108ef9b4419698347e4305f05291e644a713518a91b0fc32a3442c1394619e2a9b8251e@79.127.216.33:30303?discport=30349 \
|
||||
--port {{.Ports.BackendP2P}} \
|
||||
--http \
|
||||
--http.addr 127.0.0.1 \
|
||||
--http.port {{.Ports.BackendHttp}} \
|
||||
--http.api eth,net,web3,debug,txpool,bor \
|
||||
--http.vhosts '*' \
|
||||
--http.corsdomain '*' \
|
||||
--ws \
|
||||
--ws.addr 127.0.0.1 \
|
||||
--ws.port {{.Ports.BackendRPC}} \
|
||||
--ws.api eth,net,web3,debug,txpool,bor \
|
||||
--ws.origins '*' \
|
||||
--txlookuplimit 0 \
|
||||
--cache 4096
|
||||
|
||||
{{end}}
|
||||
36
build/templates/backend/scripts/polygon_heimdall.sh
Normal file
36
build/templates/backend/scripts/polygon_heimdall.sh
Normal file
@ -0,0 +1,36 @@
|
||||
#!/bin/sh
|
||||
|
||||
{{define "main" -}}
|
||||
|
||||
set -e
|
||||
|
||||
INSTALL_DIR={{.Env.BackendInstallPath}}/{{.Coin.Alias}}
|
||||
DATA_DIR={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend
|
||||
|
||||
HEIMDALL_BIN=$INSTALL_DIR/heimdalld
|
||||
HOME_DIR=$DATA_DIR/heimdalld
|
||||
CONFIG_DIR=$HOME_DIR/config
|
||||
|
||||
if [ ! -d "$CONFIG_DIR" ]; then
|
||||
# init chain
|
||||
$HEIMDALL_BIN init --home $HOME_DIR
|
||||
|
||||
# overwrite genesis file
|
||||
cp $INSTALL_DIR/genesis.json $CONFIG_DIR/genesis.json
|
||||
fi
|
||||
|
||||
# --bor_rpc_url: backend-polygon-bor ports.backend_http
|
||||
# --eth_rpc_url: backend-ethereum ports.backend_http
|
||||
$HEIMDALL_BIN start \
|
||||
--home $HOME_DIR \
|
||||
--chain=mainnet \
|
||||
--rpc.laddr tcp://127.0.0.1:{{.Ports.BackendRPC}} \
|
||||
--p2p.laddr tcp://0.0.0.0:{{.Ports.BackendP2P}} \
|
||||
--laddr tcp://127.0.0.1:{{.Ports.BackendHttp}} \
|
||||
--p2p.seeds "f4f605d60b8ffaaf15240564e58a81103510631c@159.203.9.164:26656,4fb1bc820088764a564d4f66bba1963d47d82329@44.232.55.71:26656,2eadba4be3ce47ac8db0a3538cb923b57b41c927@35.199.4.13:26656,3b23b20017a6f348d329c102ddc0088f0a10a444@35.221.13.28:26656,25f5f65a09c56e9f1d2d90618aa70cd358aa68da@35.230.116.151:26656,4cd60c1d76e44b05f7dfd8bab3f447b119e87042@54.147.31.250:26656,b18bbe1f3d8576f4b73d9b18976e71c65e839149@34.226.134.117:26656,1500161dd491b67fb1ac81868952be49e2509c9f@52.78.36.216:26656,dd4a3f1750af5765266231b9d8ac764599921736@3.36.224.80:26656,8ea4f592ad6cc38d7532aff418d1fb97052463af@34.240.245.39:26656,e772e1fb8c3492a9570a377a5eafdb1dc53cd778@54.194.245.5:26656,6726b826df45ac8e9afb4bdb2469c7771bd797f1@52.209.21.164:26656" \
|
||||
--node tcp://127.0.0.1:{{.Ports.BackendRPC}} \
|
||||
--bor_rpc_url http://127.0.0.1:8170 \
|
||||
--eth_rpc_url http://127.0.0.1:8136 \
|
||||
--rest-server
|
||||
|
||||
{{end}}
|
||||
@ -45,6 +45,8 @@ func main() {
|
||||
t.Add(server.WsBlockHashReq{})
|
||||
t.Add(server.WsBlockHashRes{})
|
||||
t.Add(server.WsBlockReq{})
|
||||
t.Add(server.WsBlockFilterReq{})
|
||||
t.Add(server.WsBlockFiltersBatchReq{})
|
||||
t.Add(server.WsAccountUtxoReq{})
|
||||
t.Add(server.WsBalanceHistoryReq{})
|
||||
t.Add(server.WsTransactionReq{})
|
||||
|
||||
41
common/config.go
Normal file
41
common/config.go
Normal file
@ -0,0 +1,41 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
|
||||
"github.com/juju/errors"
|
||||
)
|
||||
|
||||
// Config struct
|
||||
type Config struct {
|
||||
CoinName string `json:"coin_name"`
|
||||
CoinShortcut string `json:"coin_shortcut"`
|
||||
CoinLabel string `json:"coin_label"`
|
||||
FourByteSignatures string `json:"fourByteSignatures"`
|
||||
FiatRates string `json:"fiat_rates"`
|
||||
FiatRatesParams string `json:"fiat_rates_params"`
|
||||
FiatRatesVsCurrencies string `json:"fiat_rates_vs_currencies"`
|
||||
BlockGolombFilterP uint8 `json:"block_golomb_filter_p"`
|
||||
BlockFilterScripts string `json:"block_filter_scripts"`
|
||||
BlockFilterUseZeroedKey bool `json:"block_filter_use_zeroed_key"`
|
||||
}
|
||||
|
||||
// GetConfig loads and parses the config file and returns Config struct
|
||||
func GetConfig(configFile string) (*Config, error) {
|
||||
if configFile == "" {
|
||||
return nil, errors.New("Missing blockchaincfg configuration parameter")
|
||||
}
|
||||
|
||||
configFileContent, err := os.ReadFile(configFile)
|
||||
if err != nil {
|
||||
return nil, errors.Errorf("Error reading file %v, %v", configFile, err)
|
||||
}
|
||||
|
||||
var cn Config
|
||||
err = json.Unmarshal(configFileContent, &cn)
|
||||
if err != nil {
|
||||
return nil, errors.Annotatef(err, "Error parsing config file ")
|
||||
}
|
||||
return &cn, nil
|
||||
}
|
||||
@ -92,6 +92,15 @@ type InternalState struct {
|
||||
// database migrations
|
||||
UtxoChecked bool `json:"utxoChecked"`
|
||||
SortedAddressContracts bool `json:"sortedAddressContracts"`
|
||||
|
||||
// golomb filter settings
|
||||
BlockGolombFilterP uint8 `json:"block_golomb_filter_p"`
|
||||
BlockFilterScripts string `json:"block_filter_scripts"`
|
||||
BlockFilterUseZeroedKey bool `json:"block_filter_use_zeroed_key"`
|
||||
|
||||
// allowed number of fetched accounts over websocket
|
||||
WsGetAccountInfoLimit int `json:"-"`
|
||||
WsLimitExceedingIPs map[string]int `json:"-"`
|
||||
}
|
||||
|
||||
// StartedSync signals start of synchronization
|
||||
@ -336,3 +345,15 @@ func SetInShutdown() {
|
||||
func IsInShutdown() bool {
|
||||
return atomic.LoadInt32(&inShutdown) != 0
|
||||
}
|
||||
|
||||
func (is *InternalState) AddWsLimitExceedingIP(ip string) {
|
||||
is.mux.Lock()
|
||||
defer is.mux.Unlock()
|
||||
is.WsLimitExceedingIPs[ip] = is.WsLimitExceedingIPs[ip] + 1
|
||||
}
|
||||
|
||||
func (is *InternalState) ResetWsLimitExceedingIPs() {
|
||||
is.mux.Lock()
|
||||
defer is.mux.Unlock()
|
||||
is.WsLimitExceedingIPs = make(map[string]int)
|
||||
}
|
||||
|
||||
@ -72,7 +72,7 @@ func GetMetrics(coin string) (*Metrics, error) {
|
||||
prometheus.HistogramOpts{
|
||||
Name: "blockbook_socketio_req_duration",
|
||||
Help: "Socketio request duration by method (in microseconds)",
|
||||
Buckets: []float64{1, 5, 10, 25, 50, 75, 100, 250},
|
||||
Buckets: []float64{10, 100, 1_000, 10_000, 100_000, 1_000_000, 10_0000_000},
|
||||
ConstLabels: Labels{"coin": coin},
|
||||
},
|
||||
[]string{"method"},
|
||||
@ -104,7 +104,7 @@ func GetMetrics(coin string) (*Metrics, error) {
|
||||
prometheus.HistogramOpts{
|
||||
Name: "blockbook_websocket_req_duration",
|
||||
Help: "Websocket request duration by method (in microseconds)",
|
||||
Buckets: []float64{1, 5, 10, 25, 50, 75, 100, 250},
|
||||
Buckets: []float64{10, 100, 1_000, 10_000, 100_000, 1_000_000, 10_0000_000},
|
||||
ConstLabels: Labels{"coin": coin},
|
||||
},
|
||||
[]string{"method"},
|
||||
@ -113,7 +113,7 @@ func GetMetrics(coin string) (*Metrics, error) {
|
||||
prometheus.HistogramOpts{
|
||||
Name: "blockbook_index_resync_duration",
|
||||
Help: "Duration of index resync operation (in milliseconds)",
|
||||
Buckets: []float64{50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 600, 700, 1000, 2000, 5000},
|
||||
Buckets: []float64{10, 100, 500, 1000, 2000, 5000, 10000},
|
||||
ConstLabels: Labels{"coin": coin},
|
||||
},
|
||||
)
|
||||
@ -121,7 +121,7 @@ func GetMetrics(coin string) (*Metrics, error) {
|
||||
prometheus.HistogramOpts{
|
||||
Name: "blockbook_mempool_resync_duration",
|
||||
Help: "Duration of mempool resync operation (in milliseconds)",
|
||||
Buckets: []float64{10, 25, 50, 75, 100, 150, 250, 500, 750, 1000, 2000, 5000},
|
||||
Buckets: []float64{10, 100, 500, 1000, 2000, 5000, 10000},
|
||||
ConstLabels: Labels{"coin": coin},
|
||||
},
|
||||
)
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-bcash",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "bcash",
|
||||
"version": "26.1.0",
|
||||
"binary_url": "https://github.com/bitcoin-cash-node/bitcoin-cash-node/releases/download/v26.1.0/bitcoin-cash-node-26.1.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "27.0.0",
|
||||
"binary_url": "https://github.com/bitcoin-cash-node/bitcoin-cash-node/releases/download/v27.0.0/bitcoin-cash-node-27.0.0-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "68cb24d57898d5b47a1162a9683d0b0e36c6701b5a16b93edc94bbd82113c04b",
|
||||
"verification_source": "2ab81515a763162435f7ea28bb1f10f69b6143f469278fc52c0b8cbaec6cf238",
|
||||
"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",
|
||||
|
||||
@ -1,66 +1,64 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Bcash Testnet",
|
||||
"shortcut": "TBCH",
|
||||
"label": "Bitcoin Cash Testnet",
|
||||
"alias": "bcash_testnet"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18031,
|
||||
"backend_message_queue": 48331,
|
||||
"blockbook_internal": 19031,
|
||||
"blockbook_public": 19131
|
||||
},
|
||||
"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-bcash-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "bcash",
|
||||
"version": "26.1.0",
|
||||
"binary_url": "https://github.com/bitcoin-cash-node/bitcoin-cash-node/releases/download/v26.1.0/bitcoin-cash-node-26.1.0-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "68cb24d57898d5b47a1162a9683d0b0e36c6701b5a16b93edc94bbd82113c04b",
|
||||
"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"
|
||||
},
|
||||
"blockbook": {
|
||||
"package_name": "blockbook-bcash-testnet",
|
||||
"system_user": "blockbook-bcash",
|
||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||
"explorer_url": "",
|
||||
"additional_params": "",
|
||||
"block_chain": {
|
||||
"parse": true,
|
||||
"subversion": "/Bitcoin ABC Cash Node:22.1.0/",
|
||||
"address_format": "cashaddr",
|
||||
"mempool_workers": 8,
|
||||
"mempool_sub_workers": 2,
|
||||
"block_addresses_to_keep": 300,
|
||||
"xpub_magic": 70617039,
|
||||
"slip44": 1,
|
||||
"additional_params": {}
|
||||
"coin": {
|
||||
"name": "Bcash Testnet",
|
||||
"shortcut": "TBCH",
|
||||
"label": "Bitcoin Cash Testnet",
|
||||
"alias": "bcash_testnet"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18031,
|
||||
"backend_message_queue": 48331,
|
||||
"blockbook_internal": 19031,
|
||||
"blockbook_public": 19131
|
||||
},
|
||||
"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-bcash-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "bcash",
|
||||
"version": "27.0.0",
|
||||
"binary_url": "https://github.com/bitcoin-cash-node/bitcoin-cash-node/releases/download/v27.0.0/bitcoin-cash-node-27.0.0-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "2ab81515a763162435f7ea28bb1f10f69b6143f469278fc52c0b8cbaec6cf238",
|
||||
"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": "bcash.conf",
|
||||
"client_config_file": "bitcoin_client.conf"
|
||||
},
|
||||
"blockbook": {
|
||||
"package_name": "blockbook-bcash-testnet",
|
||||
"system_user": "blockbook-bcash",
|
||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||
"explorer_url": "",
|
||||
"additional_params": "",
|
||||
"block_chain": {
|
||||
"parse": true,
|
||||
"subversion": "/Bitcoin ABC Cash Node:22.1.0/",
|
||||
"address_format": "cashaddr",
|
||||
"mempool_workers": 8,
|
||||
"mempool_sub_workers": 2,
|
||||
"block_addresses_to_keep": 300,
|
||||
"xpub_magic": 70617039,
|
||||
"slip44": 1,
|
||||
"additional_params": {}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-bitcoin",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "bitcoin",
|
||||
"version": "25.0",
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-25.0/bitcoin-25.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "27.1",
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-27.1/bitcoin-27.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "33930d432593e49d58a9bff4c30078823e9af5d98594d2935862788ce8a20aec",
|
||||
"verification_source": "c9840607d230d65f6938b81deaec0b98fe9cb14c3a41a5b13b2c05d044a48422",
|
||||
"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",
|
||||
@ -38,12 +38,13 @@
|
||||
"server_config_file": "bitcoin.conf",
|
||||
"client_config_file": "bitcoin_client.conf",
|
||||
"additional_params": {
|
||||
"deprecatedrpc": "estimatefee"
|
||||
"deprecatedrpc": "estimatefee",
|
||||
"addnode": ["ove.palatinus.cz"]
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-25.0/bitcoin-25.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "3a7bdd959a0b426624f63f394f25e5b7769a5a2f96f8126dcc2ea53f3fa5212b"
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-27.1/bitcoin-27.1-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "bb878df4f8ff8fb8acfb94207c50f959c462c39e652f507c2a2db20acc6a1eee"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -63,13 +64,17 @@
|
||||
"xpub_magic_segwit_p2sh": 77429938,
|
||||
"xpub_magic_segwit_native": 78792518,
|
||||
"additional_params": {
|
||||
"alternative_estimate_fee": "whatthefee-disabled",
|
||||
"alternative_estimate_fee_params": "{\"url\": \"https://whatthefee.io/data.json\", \"periodSeconds\": 60}",
|
||||
"alternative_estimate_fee": "mempoolspace",
|
||||
"alternative_estimate_fee_params": "{\"url\": \"https://mempool.space/api/v1/fees/recommended\", \"periodSeconds\": 20}",
|
||||
"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_params": "{\"coin\": \"bitcoin\", \"periodSeconds\": 900}",
|
||||
"golomb_filter_p": 20,
|
||||
"mempool_filter_scripts": "taproot"
|
||||
"fiat_rates_params": "{\"coin\": \"bitcoin\", \"periodSeconds\": 60}",
|
||||
"block_golomb_filter_p": 20,
|
||||
"block_filter_scripts": "taproot-noordinals",
|
||||
"block_filter_use_zeroed_key": true,
|
||||
"mempool_golomb_filter_p": 20,
|
||||
"mempool_filter_scripts": "taproot",
|
||||
"mempool_filter_use_zeroed_key": false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-bitcoin-regtest",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "bitcoin",
|
||||
"version": "25.0",
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-25.0/bitcoin-25.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "27.1",
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-27.1/bitcoin-27.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "33930d432593e49d58a9bff4c30078823e9af5d98594d2935862788ce8a20aec",
|
||||
"verification_source": "c9840607d230d65f6938b81deaec0b98fe9cb14c3a41a5b13b2c05d044a48422",
|
||||
"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",
|
||||
@ -42,8 +42,8 @@
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-25.0/bitcoin-25.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "3a7bdd959a0b426624f63f394f25e5b7769a5a2f96f8126dcc2ea53f3fa5212b"
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-27.1/bitcoin-27.1-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "bb878df4f8ff8fb8acfb94207c50f959c462c39e652f507c2a2db20acc6a1eee"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -63,7 +63,14 @@
|
||||
"xpub_magic_segwit_p2sh": 71979618,
|
||||
"xpub_magic_segwit_native": 73342198,
|
||||
"slip44": 1,
|
||||
"additional_params": {}
|
||||
"additional_params": {
|
||||
"block_golomb_filter_p": 20,
|
||||
"block_filter_scripts": "taproot-noordinals",
|
||||
"block_filter_use_zeroed_key": true,
|
||||
"mempool_golomb_filter_p": 20,
|
||||
"mempool_filter_scripts": "taproot",
|
||||
"mempool_filter_use_zeroed_key": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-bitcoin-signet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "bitcoin",
|
||||
"version": "25.0",
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-25.0/bitcoin-25.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "27.1",
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-27.1/bitcoin-27.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "33930d432593e49d58a9bff4c30078823e9af5d98594d2935862788ce8a20aec",
|
||||
"verification_source": "c9840607d230d65f6938b81deaec0b98fe9cb14c3a41a5b13b2c05d044a48422",
|
||||
"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",
|
||||
@ -42,8 +42,8 @@
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-25.0/bitcoin-25.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "3a7bdd959a0b426624f63f394f25e5b7769a5a2f96f8126dcc2ea53f3fa5212b"
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-27.1/bitcoin-27.1-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "bb878df4f8ff8fb8acfb94207c50f959c462c39e652f507c2a2db20acc6a1eee"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-bitcoin-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "bitcoin",
|
||||
"version": "25.0",
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-25.0/bitcoin-25.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "27.1",
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-27.1/bitcoin-27.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "33930d432593e49d58a9bff4c30078823e9af5d98594d2935862788ce8a20aec",
|
||||
"verification_source": "c9840607d230d65f6938b81deaec0b98fe9cb14c3a41a5b13b2c05d044a48422",
|
||||
"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",
|
||||
@ -42,8 +42,8 @@
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-25.0/bitcoin-25.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "3a7bdd959a0b426624f63f394f25e5b7769a5a2f96f8126dcc2ea53f3fa5212b"
|
||||
"binary_url": "https://bitcoincore.org/bin/bitcoin-core-27.1/bitcoin-27.1-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "bb878df4f8ff8fb8acfb94207c50f959c462c39e652f507c2a2db20acc6a1eee"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -58,14 +58,18 @@
|
||||
"parse": true,
|
||||
"mempool_workers": 8,
|
||||
"mempool_sub_workers": 2,
|
||||
"block_addresses_to_keep": 300,
|
||||
"block_addresses_to_keep": 10000,
|
||||
"xpub_magic": 70617039,
|
||||
"xpub_magic_segwit_p2sh": 71979618,
|
||||
"xpub_magic_segwit_native": 73342198,
|
||||
"slip44": 1,
|
||||
"additional_params": {
|
||||
"golomb_filter_p": 20,
|
||||
"mempool_filter_scripts": "taproot"
|
||||
"block_golomb_filter_p": 20,
|
||||
"block_filter_scripts": "taproot-noordinals",
|
||||
"block_filter_use_zeroed_key": true,
|
||||
"mempool_golomb_filter_p": 20,
|
||||
"mempool_filter_scripts": "taproot",
|
||||
"mempool_filter_use_zeroed_key": false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-dash",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "dash",
|
||||
"version": "19.2.0",
|
||||
"binary_url": "https://github.com/dashpay/dash/releases/download/v19.2.0/dashcore-19.2.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "20.1.1",
|
||||
"binary_url": "https://github.com/dashpay/dash/releases/download/v20.1.1/dashcore-20.1.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "gpg-sha256",
|
||||
"verification_source": "https://github.com/dashpay/dash/releases/download/v19.2.0/SHA256SUMS.asc",
|
||||
"verification_source": "https://github.com/dashpay/dash/releases/download/v20.1.1/SHA256SUMS.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": ["bin/dash-qt"],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/dashd -deprecatedrpc=estimatefee -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-dash-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "dash",
|
||||
"version": "19.2.0",
|
||||
"binary_url": "https://github.com/dashpay/dash/releases/download/v19.2.0/dashcore-19.2.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "20.1.1",
|
||||
"binary_url": "https://github.com/dashpay/dash/releases/download/v20.1.1/dashcore-20.1.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "gpg-sha256",
|
||||
"verification_source": "https://github.com/dashpay/dash/releases/download/v19.2.0/SHA256SUMS.asc",
|
||||
"verification_source": "https://github.com/dashpay/dash/releases/download/v20.1.1/SHA256SUMS.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/dash-qt"
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-dogecoin",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "dogecoin",
|
||||
"version": "1.14.6",
|
||||
"binary_url": "https://github.com/dogecoin/dogecoin/releases/download/v1.14.6/dogecoin-1.14.6-x86_64-linux-gnu.tar.gz",
|
||||
"version": "1.14.7",
|
||||
"binary_url": "https://github.com/dogecoin/dogecoin/releases/download/v1.14.7/dogecoin-1.14.7-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "fe9c9cdab946155866a5bd5a5127d2971a9eed3e0b65fb553fe393ad1daaebb0",
|
||||
"verification_source": "9cd22fb3ebba4d407c2947f4241b9e78c759f29cdf32de8863aea6aeed21cf8b",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": ["bin/dogecoin-qt"],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/dogecoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
@ -45,8 +45,8 @@
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/dogecoin/dogecoin/releases/download/v1.14.6/dogecoin-1.14.6-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "87419c29607b2612746fccebd694037e4be7600fc32198c4989f919be20952db",
|
||||
"binary_url": "https://github.com/dogecoin/dogecoin/releases/download/v1.14.7/dogecoin-1.14.7-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "b8fb8050b19283d1ab3c261aaca96d84f2a17f93b52fcff9e252f390b0564f31",
|
||||
"exclude_files": []
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-dogecoin-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "dogecoin",
|
||||
"version": "1.14.6",
|
||||
"binary_url": "https://github.com/dogecoin/dogecoin/releases/download/v1.14.6/dogecoin-1.14.6-x86_64-linux-gnu.tar.gz",
|
||||
"version": "1.14.7",
|
||||
"binary_url": "https://github.com/dogecoin/dogecoin/releases/download/v1.14.7/dogecoin-1.14.7-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "fe9c9cdab946155866a5bd5a5127d2971a9eed3e0b65fb553fe393ad1daaebb0",
|
||||
"verification_source": "9cd22fb3ebba4d407c2947f4241b9e78c759f29cdf32de8863aea6aeed21cf8b",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/dogecoin-qt"
|
||||
@ -47,8 +47,8 @@
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/dogecoin/dogecoin/releases/download/v1.14.6/dogecoin-1.14.6-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "87419c29607b2612746fccebd694037e4be7600fc32198c4989f919be20952db",
|
||||
"binary_url": "https://github.com/dogecoin/dogecoin/releases/download/v1.14.7/dogecoin-1.14.7-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "b8fb8050b19283d1ab3c261aaca96d84f2a17f93b52fcff9e252f390b0564f31",
|
||||
"exclude_files": []
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,10 +21,10 @@
|
||||
"package_name": "backend-ethereum-classic",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum-classic",
|
||||
"version": "1.12.11",
|
||||
"binary_url": "https://github.com/etclabscore/core-geth/releases/download/v1.12.11/core-geth-linux-v1.12.11.zip",
|
||||
"version": "1.12.18",
|
||||
"binary_url": "https://github.com/etclabscore/core-geth/releases/download/v1.12.18/core-geth-linux-v1.12.18.zip",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "7a0f84b51b3d9928d255d55ddaf5155814c2d539fd3e53344d2130d969a1fbe8",
|
||||
"verification_source": "2382a15a53ce364cb41d3985ff3c2941392d8898c6f869666a8d7d7914a5748a",
|
||||
"extract_command": "unzip -d backend",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --classic --ipcdisable --txlookuplimit 0 --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port {{.Ports.BackendP2P}} --ws --ws.addr 127.0.0.1 --ws.port {{.Ports.BackendRPC}} --ws.origins \"*\" --http --http.port {{.Ports.BackendHttp}} --http.addr 127.0.0.1 --http.corsdomain \"*\" 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
|
||||
@ -22,13 +22,13 @@
|
||||
"package_name": "backend-ethereum",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "1.12.0-e501b3b0",
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_type": "gpg",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"version": "2.59.1",
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_amd64.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "5800f0da3ec52f8abc414860f4b3c9ac8c46d07c5044b5458820c71fd4b95b38",
|
||||
"extract_command": "tar -C backend -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --syncmode full --txlookuplimit 0 --ipcdisable --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port {{.Ports.BackendP2P}} --ws --ws.addr 127.0.0.1 --ws.port {{.Ports.BackendRPC}} --ws.origins \"*\" --ws.api \"eth,net,web3,debug,txpool\" --http --http.port {{.Ports.BackendHttp}} --http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/erigon --chain mainnet --snap.keepblocks --db.size.limit 15TB --prune c --prune.c.older 1000000 -torrent.download.rate 32mb --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/erigon --port {{.Ports.BackendP2P}} --ws --ws.port {{.Ports.BackendRPC}} --http --http.port {{.Ports.BackendRPC}} --http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} --private.api.addr \"\" --torrent.port {{.Ports.BackendHttp}} --log.dir.path {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --log.dir.prefix {{.Coin.Alias}}'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
@ -39,8 +39,8 @@
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz.asc"
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_arm64.tar.gz",
|
||||
"verification_source": "9d29e04f600111971c56a9c48aa5c7c9e81cd61ad8bb042c240505e4bd93bf88"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -58,11 +58,13 @@
|
||||
"block_addresses_to_keep": 300,
|
||||
"additional_params": {
|
||||
"consensusNodeVersion": "http://localhost:7536/eth/v1/node/version",
|
||||
"address_aliases": true,
|
||||
"mempoolTxTimeoutHours": 48,
|
||||
"queryBackendOnMempoolResync": false,
|
||||
"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_params": "{\"coin\": \"ethereum\",\"platformIdentifier\": \"ethereum\",\"platformVsCurrency\": \"eth\",\"periodSeconds\": 900}"
|
||||
"fiat_rates_params": "{\"coin\": \"ethereum\",\"platformIdentifier\": \"ethereum\",\"platformVsCurrency\": \"eth\",\"periodSeconds\": 900}",
|
||||
"fourByteSignatures": "https://www.4byte.directory/api/v1/signatures/"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -70,4 +72,4 @@
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -22,13 +22,13 @@
|
||||
"package_name": "backend-ethereum-archive",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "1.12.0-e501b3b0",
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_type": "gpg",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"version": "2.59.1",
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_amd64.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "5800f0da3ec52f8abc414860f4b3c9ac8c46d07c5044b5458820c71fd4b95b38",
|
||||
"extract_command": "tar -C backend -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --syncmode full --gcmode archive --txlookuplimit 0 --ipcdisable --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port {{.Ports.BackendP2P}} --ws --ws.addr 127.0.0.1 --ws.port {{.Ports.BackendRPC}} --ws.origins \"*\" --ws.api \"eth,net,web3,debug,txpool\" --http --http.port {{.Ports.BackendHttp}} --http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/erigon --chain mainnet --snap.keepblocks --db.size.limit 15TB --prune c --prune.c.older 1000000 -torrent.download.rate 32mb --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/erigon --port {{.Ports.BackendP2P}} --ws --ws.port {{.Ports.BackendRPC}} --http --http.port {{.Ports.BackendRPC}} --http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} --private.api.addr \"\" --torrent.port {{.Ports.BackendHttp}} --log.dir.path {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --log.dir.prefix {{.Coin.Alias}}'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
@ -39,8 +39,8 @@
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz.asc"
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_arm64.tar.gz",
|
||||
"verification_source": "9d29e04f600111971c56a9c48aa5c7c9e81cd61ad8bb042c240505e4bd93bf88"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -73,4 +73,4 @@
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,48 +1,48 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Archive",
|
||||
"shortcut": "ETH",
|
||||
"label": "Ethereum",
|
||||
"alias": "ethereum_archive_consensus",
|
||||
"execution_alias": "ethereum_archive"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 8016,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 38316,
|
||||
"backend_http": 8116,
|
||||
"backend_authrpc": 8516,
|
||||
"blockbook_internal": 9016,
|
||||
"blockbook_public": 9116
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-archive-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "4.0.6",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "ee21cf51cb702230145bf7d74e02ff99795f8501f10084dea4a79a8dd8e9cdca",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --mainnet --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=7516 --rpc-port=7517 --monitoring-port=7518 --p2p-tcp-port=3516 --p2p-udp-port=2516 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_archive/backend/geth/jwtsecret 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-arm64",
|
||||
"verification_source": "e4975ebfac665e9127f29facaba3a985ba820199b4884812ff52eee6ef9aa1fc"
|
||||
}
|
||||
"coin": {
|
||||
"name": "Ethereum Archive",
|
||||
"shortcut": "ETH",
|
||||
"label": "Ethereum",
|
||||
"alias": "ethereum_archive_consensus",
|
||||
"execution_alias": "ethereum_archive"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 8016,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 38316,
|
||||
"backend_http": 8116,
|
||||
"backend_authrpc": 8516,
|
||||
"blockbook_internal": 9016,
|
||||
"blockbook_public": 9116
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-archive-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "5.0.2",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "f3515bdd216a34e54b178d03ced311e4c86cee1a1d0f84fb8bffa682244916b4",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --mainnet --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=7516 --rpc-port=7517 --monitoring-port=7518 --p2p-tcp-port=3516 --p2p-udp-port=2516 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_archive/backend/erigon/jwt.hex 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-arm64",
|
||||
"verification_source": "dcabf9ecd9e6835f04d81d8317d640fdb3a223cb462c8764f0ea167a3ff3230e"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,48 +1,48 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum",
|
||||
"shortcut": "ETH",
|
||||
"label": "Ethereum",
|
||||
"alias": "ethereum_consensus",
|
||||
"execution_alias": "ethereum"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 8036,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 38336,
|
||||
"backend_http": 8136,
|
||||
"backend_authrpc": 8536,
|
||||
"blockbook_internal": 9036,
|
||||
"blockbook_public": 9136
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "4.0.6",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "ee21cf51cb702230145bf7d74e02ff99795f8501f10084dea4a79a8dd8e9cdca",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --mainnet --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=7536 --rpc-port=7537 --monitoring-port=7538 --p2p-tcp-port=3536 --p2p-udp-port=2536 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum/backend/geth/jwtsecret 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-arm64",
|
||||
"verification_source": "e4975ebfac665e9127f29facaba3a985ba820199b4884812ff52eee6ef9aa1fc"
|
||||
}
|
||||
"coin": {
|
||||
"name": "Ethereum",
|
||||
"shortcut": "ETH",
|
||||
"label": "Ethereum",
|
||||
"alias": "ethereum_consensus",
|
||||
"execution_alias": "ethereum"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 8036,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 38336,
|
||||
"backend_http": 8136,
|
||||
"backend_authrpc": 8536,
|
||||
"blockbook_internal": 9036,
|
||||
"blockbook_public": 9136
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "5.0.2",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "f3515bdd216a34e54b178d03ced311e4c86cee1a1d0f84fb8bffa682244916b4",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --mainnet --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=7536 --rpc-port=7537 --monitoring-port=7538 --p2p-tcp-port=3536 --p2p-udp-port=2536 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum/backend/erigon/jwt.hex 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-arm64",
|
||||
"verification_source": "dcabf9ecd9e6835f04d81d8317d640fdb3a223cb462c8764f0ea167a3ff3230e"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,70 +0,0 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Goerli",
|
||||
"shortcut": "tGOR",
|
||||
"label": "Ethereum Goerli",
|
||||
"alias": "ethereum_testnet_goerli"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18026,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48326,
|
||||
"backend_http": 18126,
|
||||
"backend_authrpc": 18526,
|
||||
"blockbook_internal": 19026,
|
||||
"blockbook_public": 19126
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-goerli",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "1.12.0-e501b3b0",
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_type": "gpg",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --goerli --syncmode full --txlookuplimit 0 --ipcdisable --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port {{.Ports.BackendP2P}} --ws --ws.addr 127.0.0.1 --ws.port {{.Ports.BackendRPC}} --ws.origins \"*\" --ws.api \"eth,net,web3,debug,txpool\" --http --http.port {{.Ports.BackendHttp}} -http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz.asc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blockbook": {
|
||||
"package_name": "blockbook-ethereum-testnet-goerli",
|
||||
"system_user": "blockbook-ethereum",
|
||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||
"explorer_url": "",
|
||||
"additional_params": "",
|
||||
"block_chain": {
|
||||
"parse": true,
|
||||
"mempool_workers": 8,
|
||||
"mempool_sub_workers": 2,
|
||||
"block_addresses_to_keep": 3000,
|
||||
"additional_params": {
|
||||
"consensusNodeVersion": "http://localhost:17526/eth/v1/node/version",
|
||||
"mempoolTxTimeoutHours": 12,
|
||||
"queryBackendOnMempoolResync": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
@ -1,48 +0,0 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Goerli Archive",
|
||||
"shortcut": "tGOR",
|
||||
"label": "Ethereum Goerli",
|
||||
"alias": "ethereum_testnet_goerli_archive_consensus",
|
||||
"execution_alias": "ethereum_testnet_goerli_archive"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18006,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48306,
|
||||
"backend_http": 18106,
|
||||
"backend_authrpc": 18506,
|
||||
"blockbook_internal": 19006,
|
||||
"blockbook_public": 19106
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-goerli-archive-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "4.0.6",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "ee21cf51cb702230145bf7d74e02ff99795f8501f10084dea4a79a8dd8e9cdca",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --prater --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=17506 --rpc-port=17507 --monitoring-port=17508 --p2p-tcp-port=13506 --p2p-udp-port=12506 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_testnet_goerli_archive/backend/geth/jwtsecret --genesis-state={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://github.com/eth-clients/eth2-networks/raw/master/shared/prater/genesis.ssz -O {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-arm64",
|
||||
"verification_source": "e4975ebfac665e9127f29facaba3a985ba820199b4884812ff52eee6ef9aa1fc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
@ -1,48 +0,0 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Goerli",
|
||||
"shortcut": "tGOR",
|
||||
"label": "Ethereum Goerli",
|
||||
"alias": "ethereum_testnet_goerli_consensus",
|
||||
"execution_alias": "ethereum_testnet_goerli"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18026,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48326,
|
||||
"backend_http": 18126,
|
||||
"backend_authrpc": 18526,
|
||||
"blockbook_internal": 19026,
|
||||
"blockbook_public": 19126
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-goerli-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "4.0.6",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "ee21cf51cb702230145bf7d74e02ff99795f8501f10084dea4a79a8dd8e9cdca",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --prater --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=17526 --rpc-port=17527 --monitoring-port=17528 --p2p-tcp-port=13526 --p2p-udp-port=12526 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_testnet_goerli/backend/geth/jwtsecret --genesis-state={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://github.com/eth-clients/eth2-networks/raw/master/shared/prater/genesis.ssz -O {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-arm64",
|
||||
"verification_source": "e4975ebfac665e9127f29facaba3a985ba820199b4884812ff52eee6ef9aa1fc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
70
configs/coins/ethereum_testnet_holesky.json
Normal file
70
configs/coins/ethereum_testnet_holesky.json
Normal file
@ -0,0 +1,70 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Holesky",
|
||||
"shortcut": "tHOL",
|
||||
"label": "Ethereum Holesky",
|
||||
"alias": "ethereum_testnet_holesky"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18016,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48316,
|
||||
"backend_http": 18116,
|
||||
"backend_authrpc": 18516,
|
||||
"blockbook_internal": 19016,
|
||||
"blockbook_public": 19116
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-holesky",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "2.59.1",
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_amd64.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "5800f0da3ec52f8abc414860f4b3c9ac8c46d07c5044b5458820c71fd4b95b38",
|
||||
"extract_command": "tar -C backend -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/erigon --chain holesky --snap.keepblocks --db.size.limit 15TB --prune c --prune.c.older 1000000 -torrent.download.rate 32mb --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/erigon --port {{.Ports.BackendP2P}} --ws --ws.port {{.Ports.BackendRPC}} --http --http.port {{.Ports.BackendRPC}} --http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} --private.api.addr \"\" --torrent.port {{.Ports.BackendHttp}} --log.dir.path {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --log.dir.prefix {{.Coin.Alias}}'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_arm64.tar.gz",
|
||||
"verification_source": "9d29e04f600111971c56a9c48aa5c7c9e81cd61ad8bb042c240505e4bd93bf88"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blockbook": {
|
||||
"package_name": "blockbook-ethereum-testnet-holesky",
|
||||
"system_user": "blockbook-ethereum",
|
||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||
"explorer_url": "",
|
||||
"additional_params": "",
|
||||
"block_chain": {
|
||||
"parse": true,
|
||||
"mempool_workers": 8,
|
||||
"mempool_sub_workers": 2,
|
||||
"block_addresses_to_keep": 3000,
|
||||
"additional_params": {
|
||||
"consensusNodeVersion": "http://localhost:17516/eth/v1/node/version",
|
||||
"mempoolTxTimeoutHours": 12,
|
||||
"queryBackendOnMempoolResync": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
@ -1,34 +1,35 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Goerli Archive",
|
||||
"shortcut": "tGOR",
|
||||
"label": "Ethereum Goerli",
|
||||
"alias": "ethereum_testnet_goerli_archive"
|
||||
"name": "Ethereum Testnet Holesky Archive",
|
||||
"shortcut": "tHOL",
|
||||
"label": "Ethereum Holesky",
|
||||
"alias": "ethereum_testnet_holesky_archive"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18006,
|
||||
"backend_rpc": 18036,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48306,
|
||||
"backend_http": 18106,
|
||||
"backend_authrpc": 18506,
|
||||
"blockbook_internal": 19006,
|
||||
"blockbook_public": 19106
|
||||
"backend_p2p": 48336,
|
||||
"backend_http": 18136,
|
||||
"backend_torrent": 18136,
|
||||
"backend_authrpc": 18536,
|
||||
"blockbook_internal": 19036,
|
||||
"blockbook_public": 19136
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-goerli-archive",
|
||||
"package_name": "backend-ethereum-testnet-holesky-archive",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "1.12.0-e501b3b0",
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_type": "gpg",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"version": "2.59.1",
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_amd64.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "5800f0da3ec52f8abc414860f4b3c9ac8c46d07c5044b5458820c71fd4b95b38",
|
||||
"extract_command": "tar -C backend -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --goerli --syncmode full --gcmode archive --txlookuplimit 0 --ipcdisable --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port {{.Ports.BackendP2P}} --ws --ws.addr 127.0.0.1 --ws.port {{.Ports.BackendRPC}} --ws.origins \"*\" --ws.api \"eth,net,web3,debug,txpool\" --http --http.port {{.Ports.BackendHttp}} -http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/erigon --chain holesky --snap.keepblocks --db.size.limit 15TB --prune c --prune.c.older 1000000 -torrent.download.rate 32mb --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/erigon --port {{.Ports.BackendP2P}} --ws --ws.port {{.Ports.BackendRPC}} --http --http.port {{.Ports.BackendRPC}} --http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} --private.api.addr \"\" --torrent.port {{.Ports.BackendHttp}} --log.dir.path {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --log.dir.prefix {{.Coin.Alias}}'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
@ -39,13 +40,13 @@
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz.asc"
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_arm64.tar.gz",
|
||||
"verification_source": "9d29e04f600111971c56a9c48aa5c7c9e81cd61ad8bb042c240505e4bd93bf88"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blockbook": {
|
||||
"package_name": "blockbook-ethereum-testnet-goerli-archive",
|
||||
"package_name": "blockbook-ethereum-testnet-holesky-archive",
|
||||
"system_user": "blockbook-ethereum",
|
||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||
@ -57,7 +58,7 @@
|
||||
"mempool_sub_workers": 2,
|
||||
"block_addresses_to_keep": 3000,
|
||||
"additional_params": {
|
||||
"consensusNodeVersion": "http://localhost:17506/eth/v1/node/version",
|
||||
"consensusNodeVersion": "http://localhost:17536/eth/v1/node/version",
|
||||
"address_aliases": true,
|
||||
"mempoolTxTimeoutHours": 12,
|
||||
"processInternalTransactions": true,
|
||||
@ -72,4 +73,4 @@
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Holesky Archive",
|
||||
"shortcut": "tHOL",
|
||||
"label": "Ethereum Holesky",
|
||||
"alias": "ethereum_testnet_holesky_archive_consensus",
|
||||
"execution_alias": "ethereum_testnet_holesky_archive"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18036,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48336,
|
||||
"backend_http": 18136,
|
||||
"backend_authrpc": 18536,
|
||||
"blockbook_internal": 19036,
|
||||
"blockbook_public": 19136
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-holesky-archive-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "5.0.2",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "f3515bdd216a34e54b178d03ced311e4c86cee1a1d0f84fb8bffa682244916b4",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --holesky --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=17536 --rpc-port=17537 --monitoring-port=17538 --p2p-tcp-port=13636 --p2p-udp-port=12636 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_testnet_holesky_archive/backend/erigon/jwt.hex --genesis-state={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://github.com/eth-clients/holesky/raw/main/custom_config_data/genesis.ssz -O {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-arm64",
|
||||
"verification_source": "dcabf9ecd9e6835f04d81d8317d640fdb3a223cb462c8764f0ea167a3ff3230e"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
52
configs/coins/ethereum_testnet_holesky_consensus.json
Normal file
52
configs/coins/ethereum_testnet_holesky_consensus.json
Normal file
@ -0,0 +1,52 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Holesky",
|
||||
"shortcut": "tHOL",
|
||||
"label": "Ethereum Holesky",
|
||||
"alias": "ethereum_testnet_holesky_consensus",
|
||||
"execution_alias": "ethereum_testnet_holesky"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18016,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48316,
|
||||
"backend_http": 18116,
|
||||
"backend_authrpc": 18516,
|
||||
"blockbook_internal": 19016,
|
||||
"blockbook_public": 19116
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-holesky-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "5.0.2",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "f3515bdd216a34e54b178d03ced311e4c86cee1a1d0f84fb8bffa682244916b4",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --holesky --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=17516 --rpc-port=17517 --monitoring-port=17518 --p2p-tcp-port=13516 --p2p-udp-port=12516 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_testnet_holesky/backend/erigon/jwt.hex --genesis-state={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://github.com/eth-clients/holesky/raw/main/custom_config_data/genesis.ssz -O {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-arm64",
|
||||
"verification_source": "dcabf9ecd9e6835f04d81d8317d640fdb3a223cb462c8764f0ea167a3ff3230e"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
@ -1,7 +1,7 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Sepolia",
|
||||
"shortcut": "gSEP",
|
||||
"shortcut": "tSEP",
|
||||
"label": "Ethereum Sepolia",
|
||||
"alias": "ethereum_testnet_sepolia"
|
||||
},
|
||||
@ -22,13 +22,13 @@
|
||||
"package_name": "backend-ethereum-testnet-sepolia",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "1.12.0-e501b3b0",
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_type": "gpg",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"version": "2.59.1",
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_amd64.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "5800f0da3ec52f8abc414860f4b3c9ac8c46d07c5044b5458820c71fd4b95b38",
|
||||
"extract_command": "tar -C backend -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --sepolia --syncmode full --txlookuplimit 0 --ipcdisable --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port {{.Ports.BackendP2P}} --ws --ws.addr 127.0.0.1 --ws.port {{.Ports.BackendRPC}} --ws.origins \"*\" --ws.api \"eth,net,web3,debug,txpool\" --http --http.port {{.Ports.BackendHttp}} -http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/erigon --chain sepolia --snap.keepblocks --db.size.limit 15TB --prune c --prune.c.older 1000000 -torrent.download.rate 32mb --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/erigon --port {{.Ports.BackendP2P}} --ws --ws.port {{.Ports.BackendRPC}} --http --http.port {{.Ports.BackendRPC}} --http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} --private.api.addr \"\" --torrent.port {{.Ports.BackendHttp}} --log.dir.path {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --log.dir.prefix {{.Coin.Alias}}'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
@ -39,8 +39,8 @@
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz.asc"
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_arm64.tar.gz",
|
||||
"verification_source": "9d29e04f600111971c56a9c48aa5c7c9e81cd61ad8bb042c240505e4bd93bf88"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -67,4 +67,4 @@
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,7 +1,7 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Sepolia Archive",
|
||||
"shortcut": "gSEP",
|
||||
"shortcut": "tSEP",
|
||||
"label": "Ethereum Sepolia",
|
||||
"alias": "ethereum_testnet_sepolia_archive"
|
||||
},
|
||||
@ -10,6 +10,7 @@
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48386,
|
||||
"backend_http": 18186,
|
||||
"backend_torrent": 18186,
|
||||
"backend_authrpc": 18586,
|
||||
"blockbook_internal": 19086,
|
||||
"blockbook_public": 19186
|
||||
@ -22,13 +23,13 @@
|
||||
"package_name": "backend-ethereum-testnet-sepolia-archive",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "1.12.0-e501b3b0",
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_type": "gpg",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.12.0-e501b3b0.tar.gz.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"version": "2.59.1",
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_amd64.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "5800f0da3ec52f8abc414860f4b3c9ac8c46d07c5044b5458820c71fd4b95b38",
|
||||
"extract_command": "tar -C backend -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --sepolia --syncmode full --gcmode archive --txlookuplimit 0 --ipcdisable --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port {{.Ports.BackendP2P}} --ws --ws.addr 127.0.0.1 --ws.port {{.Ports.BackendRPC}} --ws.origins \"*\" --ws.api \"eth,net,web3,debug,txpool\" --http --http.port {{.Ports.BackendHttp}} -http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/erigon --chain sepolia --snap.keepblocks --db.size.limit 15TB --prune c --prune.c.older 1000000 -torrent.download.rate 32mb --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/erigon --port {{.Ports.BackendP2P}} --ws --ws.port {{.Ports.BackendRPC}} --http --http.port {{.Ports.BackendRPC}} --http.addr 127.0.0.1 --http.corsdomain \"*\" --http.vhosts \"*\" --http.api \"eth,net,web3,debug,txpool\" --authrpc.port {{.Ports.BackendAuthRpc}} --private.api.addr \"\" --torrent.port {{.Ports.BackendHttp}} --log.dir.path {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --log.dir.prefix {{.Coin.Alias}}'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "",
|
||||
"service_type": "simple",
|
||||
@ -39,8 +40,8 @@
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz",
|
||||
"verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-arm64-1.12.0-e501b3b0.tar.gz.asc"
|
||||
"binary_url": "https://github.com/ledgerwatch/erigon/releases/download/v2.59.1/erigon_2.59.1_linux_arm64.tar.gz",
|
||||
"verification_source": "9d29e04f600111971c56a9c48aa5c7c9e81cd61ad8bb042c240505e4bd93bf88"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -72,4 +73,4 @@
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,52 +1,52 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Sepolia Archive",
|
||||
"shortcut": "gSEP",
|
||||
"label": "Ethereum Sepolia",
|
||||
"alias": "ethereum_testnet_sepolia_archive_consensus",
|
||||
"execution_alias": "ethereum_testnet_sepolia_archive"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18086,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48386,
|
||||
"backend_http": 18186,
|
||||
"backend_authrpc": 18586,
|
||||
"blockbook_internal": 19086,
|
||||
"blockbook_public": 19186
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-sepolia-archive-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "4.0.6",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "ee21cf51cb702230145bf7d74e02ff99795f8501f10084dea4a79a8dd8e9cdca",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --sepolia --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=17586 --rpc-port=17587 --monitoring-port=17548 --p2p-tcp-port=13676 --p2p-udp-port=12676 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_testnet_sepolia_archive/backend/geth/jwtsecret --genesis-state={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://github.com/eth-clients/merge-testnets/raw/302fe27afdc7a9d15b1766a0c0a9d64319140255/sepolia/genesis.ssz -O {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-arm64",
|
||||
"verification_source": "e4975ebfac665e9127f29facaba3a985ba820199b4884812ff52eee6ef9aa1fc"
|
||||
}
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Sepolia Archive",
|
||||
"shortcut": "tSEP",
|
||||
"label": "Ethereum Sepolia",
|
||||
"alias": "ethereum_testnet_sepolia_archive_consensus",
|
||||
"execution_alias": "ethereum_testnet_sepolia_archive"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18086,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48386,
|
||||
"backend_http": 18186,
|
||||
"backend_authrpc": 18586,
|
||||
"blockbook_internal": 19086,
|
||||
"blockbook_public": 19186
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-sepolia-archive-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "5.0.2",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "f3515bdd216a34e54b178d03ced311e4c86cee1a1d0f84fb8bffa682244916b4",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --sepolia --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=17586 --rpc-port=17587 --monitoring-port=17548 --p2p-tcp-port=13676 --p2p-udp-port=12676 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_testnet_sepolia_archive/backend/erigon/jwt.hex --genesis-state={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://github.com/eth-clients/merge-testnets/raw/302fe27afdc7a9d15b1766a0c0a9d64319140255/sepolia/genesis.ssz -O {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-arm64",
|
||||
"verification_source": "dcabf9ecd9e6835f04d81d8317d640fdb3a223cb462c8764f0ea167a3ff3230e"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,52 +1,52 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Sepolia",
|
||||
"shortcut": "gSEP",
|
||||
"label": "Ethereum Sepolia",
|
||||
"alias": "ethereum_testnet_sepolia_consensus",
|
||||
"execution_alias": "ethereum_testnet_sepolia"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18076,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48376,
|
||||
"backend_http": 18176,
|
||||
"backend_authrpc": 18576,
|
||||
"blockbook_internal": 19076,
|
||||
"blockbook_public": 19176
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-sepolia-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "4.0.6",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "ee21cf51cb702230145bf7d74e02ff99795f8501f10084dea4a79a8dd8e9cdca",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --sepolia --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=17576 --rpc-port=17577 --monitoring-port=17578 --p2p-tcp-port=13576 --p2p-udp-port=12576 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_testnet_sepolia/backend/geth/jwtsecret --genesis-state={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://github.com/eth-clients/merge-testnets/raw/302fe27afdc7a9d15b1766a0c0a9d64319140255/sepolia/genesis.ssz -O {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v4.0.6/beacon-chain-v4.0.6-linux-arm64",
|
||||
"verification_source": "e4975ebfac665e9127f29facaba3a985ba820199b4884812ff52eee6ef9aa1fc"
|
||||
}
|
||||
"coin": {
|
||||
"name": "Ethereum Testnet Sepolia",
|
||||
"shortcut": "tSEP",
|
||||
"label": "Ethereum Sepolia",
|
||||
"alias": "ethereum_testnet_sepolia_consensus",
|
||||
"execution_alias": "ethereum_testnet_sepolia"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 18076,
|
||||
"backend_message_queue": 0,
|
||||
"backend_p2p": 48376,
|
||||
"backend_http": 18176,
|
||||
"backend_authrpc": 18576,
|
||||
"blockbook_internal": 19076,
|
||||
"blockbook_public": 19176
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-ethereum-testnet-sepolia-consensus",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ethereum",
|
||||
"version": "5.0.2",
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-amd64",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "f3515bdd216a34e54b178d03ced311e4c86cee1a1d0f84fb8bffa682244916b4",
|
||||
"extract_command": "mv ${ARCHIVE} backend/beacon-chain && chmod +x backend/beacon-chain && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/beacon-chain --sepolia --accept-terms-of-use --execution-endpoint=http://localhost:{{.Ports.BackendAuthRpc}} --grpc-gateway-port=17576 --rpc-port=17577 --monitoring-port=17578 --p2p-tcp-port=13576 --p2p-udp-port=12576 --datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --jwt-secret={{.Env.BackendDataPath}}/ethereum_testnet_sepolia/backend/erigon/jwt.hex --genesis-state={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://github.com/eth-clients/merge-testnets/raw/302fe27afdc7a9d15b1766a0c0a9d64319140255/sepolia/genesis.ssz -O {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/genesis.ssz",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": false,
|
||||
"server_config_file": "",
|
||||
"client_config_file": "",
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/prysmaticlabs/prysm/releases/download/v5.0.2/beacon-chain-v5.0.2-linux-arm64",
|
||||
"verification_source": "dcabf9ecd9e6835f04d81d8317d640fdb3a223cb462c8764f0ea167a3ff3230e"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-firo",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "firo",
|
||||
"version": "0.14.12.0",
|
||||
"binary_url": "https://github.com/firoorg/firo/releases/download/v0.14.12.0/firo-0.14.12.0-linux64.tar.gz",
|
||||
"version": "0.14.13.3",
|
||||
"binary_url": "https://github.com/firoorg/firo/releases/download/v0.14.13.3/firo-0.14.13.3-linux64.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "47c7ae07f85189b6b11068848a5c8f930528e6edfff14fd3c6e6305a01e8da77",
|
||||
"verification_source": "39a4729fe9ab95cf3a236b95aadd53c3a18ac8737b7bfdd8934dd5524e19d2e8",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/firo-qt",
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-flux",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "flux",
|
||||
"version": "6.0.0",
|
||||
"binary_url": "https://github.com/RunOnFlux/fluxd/releases/download/v6.1.0/Flux-amd64-v6.1.0.tar.gz",
|
||||
"version": "7.1.0",
|
||||
"binary_url": "https://github.com/RunOnFlux/fluxd/releases/download/v7.1.0/Flux-amd64-v7.1.0.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "39461407a1b85b9dafc181e88dbd5274002ca36fcd976a8eeb735a900df6ad9a",
|
||||
"verification_source": "832fe0d7700cf74430f4b464f07706a78ec39b2ec309d3d8230b0dffe9993296",
|
||||
"extract_command": "tar -C backend -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/fluxd -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-groestlcoin",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "groestlcoin",
|
||||
"version": "25.0",
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v25.0/groestlcoin-25.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "27.0",
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v27.0/groestlcoin-27.0-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "bcca36b5a2f1e83a4fd9888bc0016d3f46f9ef01238dc23a8e03f2f4ac3b9707",
|
||||
"verification_source": "5189f036913e2033b5fe95ba8f3fc027e9c5bd286d2150e9133cd4a2fd69a7a0",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": ["bin/groestlcoin-qt"],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
@ -41,10 +41,10 @@
|
||||
"deprecatedrpc": "estimatefee"
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v25.0/groestlcoin-25.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "d8776b405113b46d6be6e4921c5a5e62cbfaa5329087abbec14cc24d750f9c94"
|
||||
}
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v27.0/groestlcoin-27.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "95e1a4c4f4d50709df40e2d86c4b578db053d1cb475a3384862192c1298f9de6"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blockbook": {
|
||||
@ -67,8 +67,12 @@
|
||||
"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_params": "{\"coin\": \"groestlcoin\", \"periodSeconds\": 900}",
|
||||
"golomb_filter_p": 20,
|
||||
"mempool_filter_scripts": "taproot"
|
||||
"block_golomb_filter_p": 20,
|
||||
"block_filter_scripts": "taproot-noordinals",
|
||||
"block_filter_use_zeroed_key": true,
|
||||
"mempool_golomb_filter_p": 20,
|
||||
"mempool_filter_scripts": "taproot",
|
||||
"mempool_filter_use_zeroed_key": false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-groestlcoin-regtest",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "groestlcoin",
|
||||
"version": "25.0",
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v25.0/groestlcoin-25.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "27.0",
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v27.0/groestlcoin-27.0-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "bcca36b5a2f1e83a4fd9888bc0016d3f46f9ef01238dc23a8e03f2f4ac3b9707",
|
||||
"verification_source": "5189f036913e2033b5fe95ba8f3fc027e9c5bd286d2150e9133cd4a2fd69a7a0",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": ["bin/groestlcoin-qt"],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
@ -42,8 +42,8 @@
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v25.0/groestlcoin-25.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "d8776b405113b46d6be6e4921c5a5e62cbfaa5329087abbec14cc24d750f9c94"
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v27.0/groestlcoin-27.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "95e1a4c4f4d50709df40e2d86c4b578db053d1cb475a3384862192c1298f9de6"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-groestlcoin-signet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "groestlcoin",
|
||||
"version": "25.0",
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v25.0/groestlcoin-25.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "27.0",
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v27.0/groestlcoin-27.0-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "bcca36b5a2f1e83a4fd9888bc0016d3f46f9ef01238dc23a8e03f2f4ac3b9707",
|
||||
"verification_source": "5189f036913e2033b5fe95ba8f3fc027e9c5bd286d2150e9133cd4a2fd69a7a0",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": ["bin/groestlcoin-qt"],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
@ -42,8 +42,8 @@
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v25.0/groestlcoin-25.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "d8776b405113b46d6be6e4921c5a5e62cbfaa5329087abbec14cc24d750f9c94"
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v27.0/groestlcoin-27.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "95e1a4c4f4d50709df40e2d86c4b578db053d1cb475a3384862192c1298f9de6"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-groestlcoin-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "groestlcoin",
|
||||
"version": "25.0",
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v25.0/groestlcoin-25.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "27.0",
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v27.0/groestlcoin-27.0-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "bcca36b5a2f1e83a4fd9888bc0016d3f46f9ef01238dc23a8e03f2f4ac3b9707",
|
||||
"verification_source": "5189f036913e2033b5fe95ba8f3fc027e9c5bd286d2150e9133cd4a2fd69a7a0",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": ["bin/groestlcoin-qt"],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
@ -41,10 +41,10 @@
|
||||
"deprecatedrpc": "estimatefee"
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v25.0/groestlcoin-25.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "d8776b405113b46d6be6e4921c5a5e62cbfaa5329087abbec14cc24d750f9c94"
|
||||
}
|
||||
"arm64": {
|
||||
"binary_url": "https://github.com/Groestlcoin/groestlcoin/releases/download/v27.0/groestlcoin-27.0-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "95e1a4c4f4d50709df40e2d86c4b578db053d1cb475a3384862192c1298f9de6"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blockbook": {
|
||||
@ -64,8 +64,12 @@
|
||||
"xpub_magic_segwit_native": 73342198,
|
||||
"slip44": 1,
|
||||
"additional_params": {
|
||||
"golomb_filter_p": 20,
|
||||
"mempool_filter_scripts": "taproot"
|
||||
"block_golomb_filter_p": 20,
|
||||
"block_filter_scripts": "taproot-noordinals",
|
||||
"block_filter_use_zeroed_key": true,
|
||||
"mempool_golomb_filter_p": 20,
|
||||
"mempool_filter_scripts": "taproot",
|
||||
"mempool_filter_use_zeroed_key": false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-litecoin",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "litecoin",
|
||||
"version": "0.21.2.2",
|
||||
"binary_url": "https://download.litecoin.org/litecoin-0.21.2.2/linux/litecoin-0.21.2.2-x86_64-linux-gnu.tar.gz",
|
||||
"version": "0.21.3",
|
||||
"binary_url": "https://download.litecoin.org/litecoin-0.21.3/linux/litecoin-0.21.3-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "gpg",
|
||||
"verification_source": "https://download.litecoin.org/litecoin-0.21.2.2/linux/litecoin-0.21.2.2-x86_64-linux-gnu.tar.gz.asc",
|
||||
"verification_source": "https://download.litecoin.org/litecoin-0.21.3/linux/litecoin-0.21.3-x86_64-linux-gnu.tar.gz.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": ["bin/litecoin-qt"],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/litecoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
@ -42,8 +42,8 @@
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://download.litecoin.org/litecoin-0.21.2.1/linux/litecoin-0.21.2.1-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "https://download.litecoin.org/litecoin-0.21.2.1/linux/litecoin-0.21.2.1-aarch64-linux-gnu.tar.gz.asc"
|
||||
"binary_url": "https://download.litecoin.org/litecoin-0.21.3/linux/litecoin-0.21.3-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "https://download.litecoin.org/litecoin-0.21.3/linux/litecoin-0.21.3-aarch64-linux-gnu.tar.gz.asc"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-litecoin-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "litecoin",
|
||||
"version": "0.21.2.2",
|
||||
"binary_url": "https://download.litecoin.org/litecoin-0.21.2.2/linux/litecoin-0.21.2.2-x86_64-linux-gnu.tar.gz",
|
||||
"version": "0.21.3",
|
||||
"binary_url": "https://download.litecoin.org/litecoin-0.21.3/linux/litecoin-0.21.3-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "gpg",
|
||||
"verification_source": "https://download.litecoin.org/litecoin-0.21.2.2/linux/litecoin-0.21.2.2-x86_64-linux-gnu.tar.gz.asc",
|
||||
"verification_source": "https://download.litecoin.org/litecoin-0.21.3/linux/litecoin-0.21.3-x86_64-linux-gnu.tar.gz.asc",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/litecoin-qt"
|
||||
@ -44,8 +44,8 @@
|
||||
},
|
||||
"platforms": {
|
||||
"arm64": {
|
||||
"binary_url": "https://download.litecoin.org/litecoin-0.21.2.1/linux/litecoin-0.21.2.1-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "https://download.litecoin.org/litecoin-0.21.2.1/linux/litecoin-0.21.2.1-aarch64-linux-gnu.tar.gz.asc"
|
||||
"binary_url": "https://download.litecoin.org/litecoin-0.21.3/linux/litecoin-0.21.3-aarch64-linux-gnu.tar.gz",
|
||||
"verification_source": "https://download.litecoin.org/litecoin-0.21.3/linux/litecoin-0.21.3-aarch64-linux-gnu.tar.gz.asc"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -22,19 +22,19 @@
|
||||
"package_name": "backend-pivx",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "pivx",
|
||||
"version": "4.0.0",
|
||||
"binary_url": "https://github.com/PIVX-Project/PIVX/releases/download/v4.0.0/pivx-4.0.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "5.6.1",
|
||||
"binary_url": "https://github.com/PIVX-Project/PIVX/releases/download/v5.6.1/pivx-5.6.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "6cb1f608ec0e106ea6bbb455ec8b85c7cad05ca52ab43011d3db80557816b79e",
|
||||
"verification_source": "6704625c63ff73da8c57f0fbb1dab6f1e4bd8f62c17467e05f52a64012a0ee2f",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/pivx-qt"
|
||||
],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/pivxd -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/*.log",
|
||||
"postinst_script_template": "",
|
||||
"postinst_script_template": "cd {{.Env.BackendInstallPath}}/{{.Coin.Alias}} && HOME={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/install-params.sh",
|
||||
"service_type": "forking",
|
||||
"service_additional_params_template": "",
|
||||
"service_additional_params_template": "Environment=\"HOME={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend\"",
|
||||
"protect_memory": false,
|
||||
"mainnet": true,
|
||||
"server_config_file": "bitcoin_like.conf",
|
||||
@ -64,4 +64,4 @@
|
||||
"package_maintainer": "rikardwissing",
|
||||
"package_maintainer_email": "rikard@coinid.org"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-pivx",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "pivx",
|
||||
"version": "4.0.0",
|
||||
"binary_url": "https://github.com/PIVX-Project/PIVX/releases/download/v4.0.0/pivx-4.0.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "5.6.1",
|
||||
"binary_url": "https://github.com/PIVX-Project/PIVX/releases/download/v5.6.1/pivx-5.6.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "6cb1f608ec0e106ea6bbb455ec8b85c7cad05ca52ab43011d3db80557816b79e",
|
||||
"verification_source": "6704625c63ff73da8c57f0fbb1dab6f1e4bd8f62c17467e05f52a64012a0ee2f",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/pivx-qt"
|
||||
@ -64,4 +64,4 @@
|
||||
"package_maintainer": "PIVX team",
|
||||
"package_maintainer_email": "random.zebra@protonmail.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
65
configs/coins/polygon.json
Normal file
65
configs/coins/polygon.json
Normal file
@ -0,0 +1,65 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Polygon",
|
||||
"shortcut": "MATIC",
|
||||
"label": "Polygon",
|
||||
"alias": "polygon_bor"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 8070,
|
||||
"backend_p2p": 38370,
|
||||
"backend_http": 8170,
|
||||
"blockbook_internal": 9070,
|
||||
"blockbook_public": 9170
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-polygon-bor",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "polygon",
|
||||
"version": "1.3.2",
|
||||
"binary_url": "https://github.com/maticnetwork/bor/archive/refs/tags/v1.3.2.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "bcd662d003a3aaa704b0226afcf0dac040de5f054de09e3ef1f5a0c494cdbc0f",
|
||||
"extract_command": "mkdir backend/source && tar -C backend/source --strip 1 -xf v1.3.2.tar.gz && cd backend/source && make bor && mv build/bin/bor ../ && rm -rf ../source && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/polygon_bor_exec.sh 2>> {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"exec_script": "polygon_bor.sh",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://raw.githubusercontent.com/maticnetwork/bor/v1.3.2/builder/files/genesis-mainnet-v1.json -O {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/genesis.json",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": true,
|
||||
"server_config_file": "",
|
||||
"client_config_file": ""
|
||||
},
|
||||
"blockbook": {
|
||||
"package_name": "blockbook-polygon",
|
||||
"system_user": "blockbook-polygon",
|
||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||
"explorer_url": "",
|
||||
"additional_params": "",
|
||||
"block_chain": {
|
||||
"parse": true,
|
||||
"mempool_workers": 8,
|
||||
"mempool_sub_workers": 2,
|
||||
"block_addresses_to_keep": 300,
|
||||
"additional_params": {
|
||||
"mempoolTxTimeoutHours": 48,
|
||||
"queryBackendOnMempoolResync": false,
|
||||
"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_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"matic-network\",\"platformIdentifier\": \"polygon-pos\",\"platformVsCurrency\": \"usd\",\"periodSeconds\": 900}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
68
configs/coins/polygon_archive.json
Normal file
68
configs/coins/polygon_archive.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Polygon Archive",
|
||||
"shortcut": "MATIC",
|
||||
"label": "Polygon",
|
||||
"alias": "polygon_archive_bor"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 8072,
|
||||
"backend_p2p": 38372,
|
||||
"backend_http": 8172,
|
||||
"blockbook_internal": 9072,
|
||||
"blockbook_public": 9172
|
||||
},
|
||||
"ipc": {
|
||||
"rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_timeout": 25
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-polygon-archive-bor",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "polygon",
|
||||
"version": "1.3.2",
|
||||
"binary_url": "https://github.com/maticnetwork/bor/archive/refs/tags/v1.3.2.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "bcd662d003a3aaa704b0226afcf0dac040de5f054de09e3ef1f5a0c494cdbc0f",
|
||||
"extract_command": "mkdir backend/source && tar -C backend/source --strip 1 -xf v1.3.2.tar.gz && cd backend/source && make bor && mv build/bin/bor ../ && rm -rf ../source && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/polygon_archive_bor_exec.sh 2>> {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"exec_script": "polygon_archive_bor.sh",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://raw.githubusercontent.com/maticnetwork/bor/v1.3.2/builder/files/genesis-mainnet-v1.json -O {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/genesis.json",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": true,
|
||||
"server_config_file": "",
|
||||
"client_config_file": ""
|
||||
},
|
||||
"blockbook": {
|
||||
"package_name": "blockbook-polygon-archive",
|
||||
"system_user": "blockbook-polygon",
|
||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||
"explorer_url": "",
|
||||
"additional_params": "-workers=16",
|
||||
"block_chain": {
|
||||
"parse": true,
|
||||
"mempool_workers": 8,
|
||||
"mempool_sub_workers": 2,
|
||||
"block_addresses_to_keep": 600,
|
||||
"additional_params": {
|
||||
"address_aliases": true,
|
||||
"mempoolTxTimeoutHours": 48,
|
||||
"processInternalTransactions": true,
|
||||
"queryBackendOnMempoolResync": false,
|
||||
"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_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"matic-network\",\"platformIdentifier\": \"polygon-pos\",\"platformVsCurrency\": \"usd\",\"periodSeconds\": 900}",
|
||||
"fourByteSignatures": "https://www.4byte.directory/api/v1/signatures/"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
40
configs/coins/polygon_heimdall.json
Normal file
40
configs/coins/polygon_heimdall.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Polygon Heimdall",
|
||||
"shortcut": "MATIC",
|
||||
"label": "Polygon",
|
||||
"alias": "polygon_heimdall"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 8071,
|
||||
"backend_p2p": 38371,
|
||||
"backend_http": 8171,
|
||||
"blockbook_internal": 9071,
|
||||
"blockbook_public": 9171
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-polygon-heimdall",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "polygon",
|
||||
"version": "1.0.5",
|
||||
"binary_url": "https://github.com/maticnetwork/heimdall/archive/refs/tags/v1.0.5.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "59727263cb3927dd47e5c00dc3c5754f0cd7680af6e1ae019b4b540b3442197c",
|
||||
"extract_command": "mkdir backend/source && tar -C backend/source --strip 1 -xf v1.0.5.tar.gz && cd backend/source && make build && mv build/heimdalld ../ && rm -rf ../source && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/polygon_heimdall_exec.sh 2>&1 >> {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"exec_script": "polygon_heimdall.sh",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://raw.githubusercontent.com/maticnetwork/heimdall/v1.0.5/builder/files/genesis-mainnet-v1.json -O {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/genesis.json",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": true,
|
||||
"server_config_file": "",
|
||||
"client_config_file": ""
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
40
configs/coins/polygon_heimdall_archive.json
Normal file
40
configs/coins/polygon_heimdall_archive.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"coin": {
|
||||
"name": "Polygon Archive Heimdall",
|
||||
"shortcut": "MATIC",
|
||||
"label": "Polygon",
|
||||
"alias": "polygon_archive_heimdall"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 8073,
|
||||
"backend_p2p": 38373,
|
||||
"backend_http": 8173,
|
||||
"blockbook_internal": 9073,
|
||||
"blockbook_public": 9173
|
||||
},
|
||||
"backend": {
|
||||
"package_name": "backend-polygon-archive-heimdall",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "polygon",
|
||||
"version": "1.0.5",
|
||||
"binary_url": "https://github.com/maticnetwork/heimdall/archive/refs/tags/v1.0.5.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "59727263cb3927dd47e5c00dc3c5754f0cd7680af6e1ae019b4b540b3442197c",
|
||||
"extract_command": "mkdir backend/source && tar -C backend/source --strip 1 -xf v1.0.5.tar.gz && cd backend/source && make build && mv build/heimdalld ../ && rm -rf ../source && echo",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/polygon_archive_heimdall_exec.sh 2>&1 >> {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
|
||||
"exec_script": "polygon_archive_heimdall.sh",
|
||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
|
||||
"postinst_script_template": "wget https://raw.githubusercontent.com/maticnetwork/heimdall/v1.0.5/builder/files/genesis-mainnet-v1.json -O {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/genesis.json",
|
||||
"service_type": "simple",
|
||||
"service_additional_params_template": "",
|
||||
"protect_memory": true,
|
||||
"mainnet": true,
|
||||
"server_config_file": "",
|
||||
"client_config_file": ""
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "IT",
|
||||
"package_maintainer_email": "it@satoshilabs.com"
|
||||
}
|
||||
}
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-qtum",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "qtum",
|
||||
"version": "22.1",
|
||||
"binary_url": "https://github.com/qtumproject/qtum/releases/download/v22.1/qtum-22.1-x86_64-linux-gnu.tar.gz",
|
||||
"version": "24.1",
|
||||
"binary_url": "https://github.com/qtumproject/qtum/releases/download/v24.1/qtum-24.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "34f2c6ca10026cc1600cfb3fbc1e606b7f163a15d98781866be6fc34e7269ea0",
|
||||
"verification_source": "13f7ca5c352732772e924bd07db0e8327e0a850edd9c89e7d191e0734990621c",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/qtum-qt"
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-qtum-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "qtum",
|
||||
"version": "22.1",
|
||||
"binary_url": "https://github.com/qtumproject/qtum/releases/download/v22.1/qtum-22.1-x86_64-linux-gnu.tar.gz",
|
||||
"version": "24.1",
|
||||
"binary_url": "https://github.com/qtumproject/qtum/releases/download/v24.1/qtum-24.1-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "34f2c6ca10026cc1600cfb3fbc1e606b7f163a15d98781866be6fc34e7269ea0",
|
||||
"verification_source": "13f7ca5c352732772e924bd07db0e8327e0a850edd9c89e7d191e0734990621c",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/qtum-qt"
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-ravencoin",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "ravencoin",
|
||||
"version": "4.2.1.0",
|
||||
"binary_url": "https://github.com/RavenProject/Ravencoin/releases/download/v4.2.1/raven-4.2.1.0-x86_64-linux-gnu.tar.gz",
|
||||
"version": "4.6.1.0",
|
||||
"binary_url": "https://github.com/RavenProject/Ravencoin/releases/download/v4.6.1/raven-4.6.1-7864c39c2-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "5a86f806e2444c6e6d612fd315f3a1369521fe50863617d5f52c3b1c1e70af76",
|
||||
"verification_source": "6c6ac6382cf594b218ec50dd9662892dc2d9a493ce151acb2d7feb500436c197",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/raven-qt"
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-vertcoin",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "vertcoin",
|
||||
"version": "22.1",
|
||||
"binary_url": "https://github.com/vertcoin-project/vertcoin-core/releases/download/v22.1/vertcoin-22.1-x86_64-linux-gnu.tar.gz",
|
||||
"version": "23.2",
|
||||
"binary_url": "https://github.com/vertcoin-project/vertcoin-core/releases/download/v23.2/vertcoin-23.2-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "aab3068e02d55128326801cdbcbfcb175be96291e024edf5ab12f3af6f4433c0",
|
||||
"verification_source": "51d01d1c7e1307edc0a88f44c3bd73ae8e088633ae85c56b08855b50882ee876",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": ["bin/vertcoin-qt"],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/vertcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-vertcoin-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "vertcoin",
|
||||
"version": "22.1",
|
||||
"binary_url": "https://github.com/vertcoin-project/vertcoin-core/releases/download/v22.1/vertcoin-22.1-x86_64-linux-gnu.tar.gz",
|
||||
"version": "23.2",
|
||||
"binary_url": "https://github.com/vertcoin-project/vertcoin-core/releases/download/v23.2/vertcoin-23.2-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "aab3068e02d55128326801cdbcbfcb175be96291e024edf5ab12f3af6f4433c0",
|
||||
"verification_source": "51d01d1c7e1307edc0a88f44c3bd73ae8e088633ae85c56b08855b50882ee876",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/vertcoin-qt"
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
"ipc": {
|
||||
"rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||
"rpc_user": "rpc",
|
||||
"rpc_pass": "rpcp",
|
||||
"rpc_pass": "rpc",
|
||||
"rpc_timeout": 25,
|
||||
"message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}"
|
||||
},
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-viacoin",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "viacoin",
|
||||
"version": "1.14-beta-1",
|
||||
"binary_url": "https://github.com/viacoin/viacoin/releases/download/v0.15.2/viacoin-0.15.2-x86_64-linux-gnu.tar.gz",
|
||||
"version": "0.16.3",
|
||||
"binary_url": "https://github.com/viacoin/viacoin/releases/download/v0.16.3/viacoin-0.16.3-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "bdbd432645a8b4baadddb7169ea4bef3d03f80dc2ce53dce5783d8582ac63bab",
|
||||
"verification_source": "4b84d8f1485d799fdff6cb4b1a316c00056b8869b53a702cd8ce2cc581bae59a",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/viacoin-qt"
|
||||
@ -41,6 +41,7 @@
|
||||
"client_config_file": "bitcoin_like_client.conf",
|
||||
"additional_params": {
|
||||
"discover": 0,
|
||||
"deprecatedrpc": "estimatefee",
|
||||
"rpcthreads": 16,
|
||||
"upnp": 0,
|
||||
"whitelist": "127.0.0.1"
|
||||
@ -62,11 +63,15 @@
|
||||
"xpub_magic_segwit_p2sh": 77429938,
|
||||
"xpub_magic_segwit_native": 78792518,
|
||||
"slip44": 14,
|
||||
"additional_params": {}
|
||||
"additional_params": {
|
||||
"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_params": "{\"coin\": \"viacoin\", \"periodSeconds\": 900}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "Romano",
|
||||
"package_maintainer_email": "romanornr@gmail.com"
|
||||
"package_maintainer_email": "viacoin@protonmail.com"
|
||||
}
|
||||
}
|
||||
@ -22,10 +22,10 @@
|
||||
"package_name": "backend-zcash",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "zcash",
|
||||
"version": "5.6.0",
|
||||
"binary_url": "https://z.cash/downloads/zcash-5.6.0-linux64-debian-buster.tar.gz",
|
||||
"version": "5.9.1",
|
||||
"binary_url": "https://github.com/zcash/artifacts/raw/master/v5.9.1/bullseye/zcash-5.9.1-linux64-debian-bullseye.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "e0ee5ea93e62590524886d9a643a7f058aa317955584db6fb7529fe47877ff92",
|
||||
"verification_source": "1911d4da83781dfe9d50fb4e0e5bab14fddca6e648f861563a629583182f478e",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/zcashd -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
|
||||
@ -21,10 +21,10 @@
|
||||
"backend": {
|
||||
"package_name": "backend-zcash-testnet",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"version": "5.6.0",
|
||||
"binary_url": "https://z.cash/downloads/zcash-5.6.0-linux64-debian-buster.tar.gz",
|
||||
"version": "5.9.1",
|
||||
"binary_url": "https://github.com/zcash/artifacts/raw/master/v5.9.1/bullseye/zcash-5.9.1-linux64-debian-bullseye.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "e0ee5ea93e62590524886d9a643a7f058aa317955584db6fb7529fe47877ff92",
|
||||
"verification_source": "1911d4da83781dfe9d50fb4e0e5bab14fddca6e648f861563a629583182f478e",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/zcashd -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||
|
||||
@ -6,7 +6,6 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"math"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@ -38,14 +37,17 @@ type Config struct {
|
||||
Label string `json:"label"`
|
||||
Alias string `json:"alias"`
|
||||
}
|
||||
Ports map[string]uint16 `json:"ports"`
|
||||
Ports map[string]uint16 `json:"ports"`
|
||||
Blockbook struct {
|
||||
PackageName string `json:"package_name"`
|
||||
}
|
||||
}
|
||||
|
||||
func checkPorts() int {
|
||||
ports := make(map[uint16][]string)
|
||||
status := 0
|
||||
|
||||
files, err := ioutil.ReadDir(inputDir)
|
||||
files, err := os.ReadDir(inputDir)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@ -83,8 +85,8 @@ func checkPorts() int {
|
||||
}
|
||||
|
||||
for _, port := range v.Ports {
|
||||
// ignore duplicities caused by consensus layer configs
|
||||
if port > 0 && !strings.Contains(v.Coin.Alias, "_consensus") {
|
||||
// ignore duplicities caused by configs that do not serve blockbook directly (consensus layers)
|
||||
if port > 0 && v.Blockbook.PackageName == "" {
|
||||
ports[port] = append(ports[port], v.Coin.Alias)
|
||||
}
|
||||
}
|
||||
@ -134,7 +136,7 @@ func main() {
|
||||
}
|
||||
|
||||
func loadPortInfo(dir string) (PortInfoSlice, error) {
|
||||
files, err := ioutil.ReadDir(dir)
|
||||
files, err := os.ReadDir(dir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -160,30 +162,31 @@ func loadPortInfo(dir string) (PortInfoSlice, error) {
|
||||
return nil, fmt.Errorf("%s: json: %s", path, err)
|
||||
}
|
||||
|
||||
// skip consensus layer configs
|
||||
if strings.Contains(v.Coin.Alias, "_consensus") {
|
||||
// skip configs that do not have blockbook (consensus layers)
|
||||
if v.Blockbook.PackageName == "" {
|
||||
continue
|
||||
}
|
||||
name := v.Coin.Label
|
||||
if len(name) == 0 || strings.Contains(v.Coin.Name, "Archive") {
|
||||
// exceptions when to use Name instead of Label so that the table looks good
|
||||
if len(name) == 0 || strings.Contains(v.Coin.Name, "Ethereum") || strings.Contains(v.Coin.Name, "Archive") {
|
||||
name = v.Coin.Name
|
||||
}
|
||||
item := &PortInfo{CoinName: name, BackendServicePorts: map[string]uint16{}}
|
||||
for k, v := range v.Ports {
|
||||
if v == 0 {
|
||||
for k, p := range v.Ports {
|
||||
if p == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
switch k {
|
||||
case "blockbook_internal":
|
||||
item.BlockbookInternalPort = v
|
||||
item.BlockbookInternalPort = p
|
||||
case "blockbook_public":
|
||||
item.BlockbookPublicPort = v
|
||||
item.BlockbookPublicPort = p
|
||||
case "backend_rpc":
|
||||
item.BackendRPCPort = v
|
||||
item.BackendRPCPort = p
|
||||
default:
|
||||
if len(k) > 8 && k[:8] == "backend_" {
|
||||
item.BackendServicePorts[k[8:]] = v
|
||||
item.BackendServicePorts[k[8:]] = p
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,6 +27,7 @@ type BulkConnect struct {
|
||||
bulkAddressesCount int
|
||||
ethBlockTxs []ethBlockTx
|
||||
txAddressesMap map[string]*TxAddresses
|
||||
blockFilters map[string][]byte
|
||||
balances map[string]*AddrBalance
|
||||
addressContracts map[string]*AddrContracts
|
||||
height uint32
|
||||
@ -40,6 +41,7 @@ const (
|
||||
partialStoreBalances = maxBulkBalances / 10
|
||||
maxBulkAddrContracts = 1200000
|
||||
partialStoreAddrContracts = maxBulkAddrContracts / 10
|
||||
maxBlockFilters = 1000
|
||||
)
|
||||
|
||||
// InitBulkConnect initializes bulk connect and switches DB to inconsistent state
|
||||
@ -50,6 +52,7 @@ func (d *RocksDB) InitBulkConnect() (*BulkConnect, error) {
|
||||
txAddressesMap: make(map[string]*TxAddresses),
|
||||
balances: make(map[string]*AddrBalance),
|
||||
addressContracts: make(map[string]*AddrContracts),
|
||||
blockFilters: make(map[string][]byte),
|
||||
}
|
||||
if err := d.SetInconsistentState(true); err != nil {
|
||||
return nil, err
|
||||
@ -170,9 +173,26 @@ func (b *BulkConnect) storeBulkAddresses(wb *grocksdb.WriteBatch) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *BulkConnect) storeBulkBlockFilters(wb *grocksdb.WriteBatch) error {
|
||||
for blockHash, blockFilter := range b.blockFilters {
|
||||
if err := b.d.storeBlockFilter(wb, blockHash, blockFilter); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
b.blockFilters = make(map[string][]byte)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *BulkConnect) connectBlockBitcoinType(block *bchain.Block, storeBlockTxs bool) error {
|
||||
addresses := make(addressesMap)
|
||||
if err := b.d.processAddressesBitcoinType(block, addresses, b.txAddressesMap, b.balances); err != nil {
|
||||
gf, err := bchain.NewGolombFilter(b.d.is.BlockGolombFilterP, b.d.is.BlockFilterScripts, block.BlockHeader.Hash, b.d.is.BlockFilterUseZeroedKey)
|
||||
if err != nil {
|
||||
glog.Error("connectBlockBitcoinType golomb filter error ", err)
|
||||
gf = nil
|
||||
} else if gf != nil && !gf.Enabled {
|
||||
gf = nil
|
||||
}
|
||||
if err := b.d.processAddressesBitcoinType(block, addresses, b.txAddressesMap, b.balances, gf); err != nil {
|
||||
return err
|
||||
}
|
||||
var storeAddressesChan, storeBalancesChan chan error
|
||||
@ -199,8 +219,11 @@ func (b *BulkConnect) connectBlockBitcoinType(block *bchain.Block, storeBlockTxs
|
||||
addresses: addresses,
|
||||
})
|
||||
b.bulkAddressesCount += len(addresses)
|
||||
if gf != nil {
|
||||
b.blockFilters[block.BlockHeader.Hash] = gf.Compute()
|
||||
}
|
||||
// open WriteBatch only if going to write
|
||||
if sa || b.bulkAddressesCount > maxBulkAddresses || storeBlockTxs {
|
||||
if sa || b.bulkAddressesCount > maxBulkAddresses || storeBlockTxs || len(b.blockFilters) > maxBlockFilters {
|
||||
start := time.Now()
|
||||
wb := grocksdb.NewWriteBatch()
|
||||
defer wb.Destroy()
|
||||
@ -215,6 +238,11 @@ func (b *BulkConnect) connectBlockBitcoinType(block *bchain.Block, storeBlockTxs
|
||||
return err
|
||||
}
|
||||
}
|
||||
if len(b.blockFilters) > maxBlockFilters {
|
||||
if err := b.storeBulkBlockFilters(wb); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := b.d.WriteBatch(wb); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -380,10 +408,17 @@ func (b *BulkConnect) Close() error {
|
||||
}
|
||||
wb := grocksdb.NewWriteBatch()
|
||||
defer wb.Destroy()
|
||||
if err := b.d.storeInternalDataEthereumType(wb, b.ethBlockTxs); err != nil {
|
||||
return err
|
||||
}
|
||||
b.ethBlockTxs = b.ethBlockTxs[:0]
|
||||
bac := b.bulkAddressesCount
|
||||
if err := b.storeBulkAddresses(wb); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := b.storeBulkBlockFilters(wb); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := b.d.WriteBatch(wb); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
102
db/rocksdb.go
102
db/rocksdb.go
@ -83,6 +83,7 @@ const (
|
||||
// BitcoinType
|
||||
cfAddressBalance
|
||||
cfTxAddresses
|
||||
cfBlockFilter
|
||||
|
||||
__break__
|
||||
|
||||
@ -102,7 +103,7 @@ var cfNames []string
|
||||
var cfBaseNames = []string{"default", "height", "addresses", "blockTxs", "transactions", "fiatRates"}
|
||||
|
||||
// type specific columns
|
||||
var cfNamesBitcoinType = []string{"addressBalance", "txAddresses"}
|
||||
var cfNamesBitcoinType = []string{"addressBalance", "txAddresses", "blockFilter"}
|
||||
var cfNamesEthereumType = []string{"addressContracts", "internalData", "contracts", "functionSignatures", "blockInternalDataErrors", "addressAliases"}
|
||||
|
||||
func openDB(path string, c *grocksdb.Cache, openFiles int) (*grocksdb.DB, []*grocksdb.ColumnFamilyHandle, error) {
|
||||
@ -348,7 +349,14 @@ func (d *RocksDB) ConnectBlock(block *bchain.Block) error {
|
||||
if chainType == bchain.ChainBitcoinType {
|
||||
txAddressesMap := make(map[string]*TxAddresses)
|
||||
balances := make(map[string]*AddrBalance)
|
||||
if err := d.processAddressesBitcoinType(block, addresses, txAddressesMap, balances); err != nil {
|
||||
gf, err := bchain.NewGolombFilter(d.is.BlockGolombFilterP, d.is.BlockFilterScripts, block.BlockHeader.Hash, d.is.BlockFilterUseZeroedKey)
|
||||
if err != nil {
|
||||
glog.Error("ConnectBlock golomb filter error ", err)
|
||||
gf = nil
|
||||
} else if gf != nil && !gf.Enabled {
|
||||
gf = nil
|
||||
}
|
||||
if err := d.processAddressesBitcoinType(block, addresses, txAddressesMap, balances, gf); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := d.storeTxAddresses(wb, txAddressesMap); err != nil {
|
||||
@ -360,6 +368,12 @@ func (d *RocksDB) ConnectBlock(block *bchain.Block) error {
|
||||
if err := d.storeAndCleanupBlockTxs(wb, block); err != nil {
|
||||
return err
|
||||
}
|
||||
if gf != nil {
|
||||
blockFilter := gf.Compute()
|
||||
if err := d.storeBlockFilter(wb, block.BlockHeader.Hash, blockFilter); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else if chainType == bchain.ChainEthereumType {
|
||||
addressContracts := make(map[string]*AddrContracts)
|
||||
blockTxs, err := d.processAddressesEthereumType(block, addresses, addressContracts)
|
||||
@ -590,7 +604,7 @@ func (d *RocksDB) GetAndResetConnectBlockStats() string {
|
||||
return s
|
||||
}
|
||||
|
||||
func (d *RocksDB) processAddressesBitcoinType(block *bchain.Block, addresses addressesMap, txAddressesMap map[string]*TxAddresses, balances map[string]*AddrBalance) error {
|
||||
func (d *RocksDB) processAddressesBitcoinType(block *bchain.Block, addresses addressesMap, txAddressesMap map[string]*TxAddresses, balances map[string]*AddrBalance, gf *bchain.GolombFilter) error {
|
||||
blockTxIDs := make([][]byte, len(block.Txs))
|
||||
blockTxAddresses := make([]*TxAddresses, len(block.Txs))
|
||||
// first process all outputs so that inputs can refer to txs in this block
|
||||
@ -628,6 +642,9 @@ func (d *RocksDB) processAddressesBitcoinType(block *bchain.Block, addresses add
|
||||
}
|
||||
continue
|
||||
}
|
||||
if gf != nil {
|
||||
gf.AddAddrDesc(addrDesc, tx)
|
||||
}
|
||||
tao.AddrDesc = addrDesc
|
||||
if d.chainParser.IsAddrDescIndexable(addrDesc) {
|
||||
strAddrDesc := string(addrDesc)
|
||||
@ -702,6 +719,9 @@ func (d *RocksDB) processAddressesBitcoinType(block *bchain.Block, addresses add
|
||||
if spentOutput.Spent {
|
||||
glog.Warningf("rocksdb: height %d, tx %v, input tx %v vout %v is double spend", block.Height, tx.Txid, input.Txid, input.Vout)
|
||||
}
|
||||
if gf != nil {
|
||||
gf.AddAddrDesc(spentOutput.AddrDesc, tx)
|
||||
}
|
||||
tai.AddrDesc = spentOutput.AddrDesc
|
||||
tai.ValueSat = spentOutput.ValueSat
|
||||
// mark the output as spent in tx
|
||||
@ -1550,6 +1570,19 @@ func (d *RocksDB) disconnectTxAddressesOutputs(wb *grocksdb.WriteBatch, btxID []
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *RocksDB) disconnectBlockFilter(wb *grocksdb.WriteBatch, height uint32) error {
|
||||
blockHash, err := d.GetBlockHash(height)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
blockHashBytes, err := hex.DecodeString(blockHash)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
wb.DeleteCF(d.cfh[cfBlockFilter], blockHashBytes)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *RocksDB) disconnectBlock(height uint32, blockTxs []blockTxs) error {
|
||||
wb := grocksdb.NewWriteBatch()
|
||||
defer wb.Destroy()
|
||||
@ -1635,6 +1668,9 @@ func (d *RocksDB) disconnectBlock(height uint32, blockTxs []blockTxs) error {
|
||||
wb.DeleteCF(d.cfh[cfTransactions], b)
|
||||
wb.DeleteCF(d.cfh[cfTxAddresses], b)
|
||||
}
|
||||
if err := d.disconnectBlockFilter(wb, height); err != nil {
|
||||
return err
|
||||
}
|
||||
return d.WriteBatch(wb)
|
||||
}
|
||||
|
||||
@ -1848,7 +1884,7 @@ func (d *RocksDB) checkColumns(is *common.InternalState) ([]common.InternalState
|
||||
}
|
||||
|
||||
// LoadInternalState loads from db internal state or initializes a new one if not yet stored
|
||||
func (d *RocksDB) LoadInternalState(rpcCoin string) (*common.InternalState, error) {
|
||||
func (d *RocksDB) LoadInternalState(config *common.Config) (*common.InternalState, error) {
|
||||
val, err := d.db.GetCF(d.ro, d.cfh[cfDefault], []byte(internalStateKey))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -1857,7 +1893,15 @@ func (d *RocksDB) LoadInternalState(rpcCoin string) (*common.InternalState, erro
|
||||
data := val.Data()
|
||||
var is *common.InternalState
|
||||
if len(data) == 0 {
|
||||
is = &common.InternalState{Coin: rpcCoin, UtxoChecked: true, SortedAddressContracts: true, ExtendedIndex: d.extendedIndex}
|
||||
is = &common.InternalState{
|
||||
Coin: config.CoinName,
|
||||
UtxoChecked: true,
|
||||
SortedAddressContracts: true,
|
||||
ExtendedIndex: d.extendedIndex,
|
||||
BlockGolombFilterP: config.BlockGolombFilterP,
|
||||
BlockFilterScripts: config.BlockFilterScripts,
|
||||
BlockFilterUseZeroedKey: config.BlockFilterUseZeroedKey,
|
||||
}
|
||||
} else {
|
||||
is, err = common.UnpackInternalState(data)
|
||||
if err != nil {
|
||||
@ -1866,13 +1910,22 @@ func (d *RocksDB) LoadInternalState(rpcCoin string) (*common.InternalState, erro
|
||||
// verify that the rpc coin matches DB coin
|
||||
// running it mismatched would corrupt the database
|
||||
if is.Coin == "" {
|
||||
is.Coin = rpcCoin
|
||||
} else if is.Coin != rpcCoin {
|
||||
return nil, errors.Errorf("Coins do not match. DB coin %v, RPC coin %v", is.Coin, rpcCoin)
|
||||
is.Coin = config.CoinName
|
||||
} else if is.Coin != config.CoinName {
|
||||
return nil, errors.Errorf("Coins do not match. DB coin %v, RPC coin %v", is.Coin, config.CoinName)
|
||||
}
|
||||
if is.ExtendedIndex != d.extendedIndex {
|
||||
return nil, errors.Errorf("ExtendedIndex setting does not match. DB extendedIndex %v, extendedIndex in options %v", is.ExtendedIndex, d.extendedIndex)
|
||||
}
|
||||
if is.BlockGolombFilterP != config.BlockGolombFilterP {
|
||||
return nil, errors.Errorf("BlockGolombFilterP does not match. DB BlockGolombFilterP %v, config BlockGolombFilterP %v", is.BlockGolombFilterP, config.BlockGolombFilterP)
|
||||
}
|
||||
if is.BlockFilterScripts != config.BlockFilterScripts {
|
||||
return nil, errors.Errorf("BlockFilterScripts does not match. DB BlockFilterScripts %v, config BlockFilterScripts %v", is.BlockFilterScripts, config.BlockFilterScripts)
|
||||
}
|
||||
if is.BlockFilterUseZeroedKey != config.BlockFilterUseZeroedKey {
|
||||
return nil, errors.Errorf("BlockFilterUseZeroedKey does not match. DB BlockFilterUseZeroedKey %v, config BlockFilterUseZeroedKey %v", is.BlockFilterUseZeroedKey, config.BlockFilterUseZeroedKey)
|
||||
}
|
||||
}
|
||||
nc, err := d.checkColumns(is)
|
||||
if err != nil {
|
||||
@ -1903,6 +1956,13 @@ func (d *RocksDB) LoadInternalState(rpcCoin string) (*common.InternalState, erro
|
||||
glog.Infof("loaded %d address alias records", recordsCount)
|
||||
}
|
||||
|
||||
is.CoinShortcut = config.CoinShortcut
|
||||
if config.CoinLabel == "" {
|
||||
is.CoinLabel = config.CoinName
|
||||
} else {
|
||||
is.CoinLabel = config.CoinLabel
|
||||
}
|
||||
|
||||
return is, nil
|
||||
}
|
||||
|
||||
@ -2191,6 +2251,32 @@ func (d *RocksDB) FixUtxos(stop chan os.Signal) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *RocksDB) storeBlockFilter(wb *grocksdb.WriteBatch, blockHash string, blockFilter []byte) error {
|
||||
blockHashBytes, err := hex.DecodeString(blockHash)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
wb.PutCF(d.cfh[cfBlockFilter], blockHashBytes, blockFilter)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *RocksDB) GetBlockFilter(blockHash string) (string, error) {
|
||||
blockHashBytes, err := hex.DecodeString(blockHash)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
val, err := d.db.GetCF(d.ro, d.cfh[cfBlockFilter], blockHashBytes)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer val.Free()
|
||||
buf := val.Data()
|
||||
if buf == nil {
|
||||
return "", nil
|
||||
}
|
||||
return hex.EncodeToString(buf), nil
|
||||
}
|
||||
|
||||
// Helpers
|
||||
|
||||
func packAddressKey(addrDesc bchain.AddressDescriptor, height uint32) []byte {
|
||||
|
||||
@ -464,7 +464,7 @@ Blockbook supports BIP44, BIP49, BIP84 and BIP86 (Taproot) derivation schemes, u
|
||||
|
||||
- Output descriptors
|
||||
|
||||
Output descriptors are in the form `<type>([<path>]<xpub>[/<change>/*])[#checkum]`, for example `pkh([5c9e228d/44'/0'/0']xpub6BgBgses...Mj92pReUsQ/<0;1>/*)#abcd`
|
||||
Output descriptors are in the form `<type>([<path>]<xpub>[/<change>/*])[#checksum]`, for example `pkh([5c9e228d/44'/0'/0']xpub6BgBgses...Mj92pReUsQ/<0;1>/*)#abcd`
|
||||
|
||||
Parameters `type` and `xpub` are mandatory, the rest is optional
|
||||
|
||||
@ -908,6 +908,8 @@ The websocket interface provides the following requests:
|
||||
- getCurrentFiatRates
|
||||
- getFiatRatesTickersList
|
||||
- getFiatRatesForTimestamps
|
||||
- getMempoolFilters
|
||||
- getBlockFilter
|
||||
- estimateFee
|
||||
- sendTransaction
|
||||
- ping
|
||||
|
||||
@ -11,7 +11,7 @@ Manual build require additional dependencies that are described in appropriate s
|
||||
## Build in Docker environment
|
||||
|
||||
All build operations run in Docker container in order to keep build environment isolated. Makefile in root of repository
|
||||
define few targets used for building, testing and packaging of Blockbook. With Docker image definitions and Debian
|
||||
defines few targets used for building, testing and packaging of Blockbook. With Docker image definitions and Debian
|
||||
package templates in *build/docker* and *build/templates* respectively, they are only inputs that make build process.
|
||||
|
||||
Docker build images are created at first execution of Makefile and that information is persisted. (Actually there are
|
||||
@ -137,7 +137,7 @@ Blockbook versioning is much simpler. There is only one version defined in *conf
|
||||
|
||||
### Back-end building
|
||||
|
||||
Because we don't keep back-end archives inside out repository we download them during build process. Build steps
|
||||
Because we don't keep back-end archives inside our repository we download them during build process. Build steps
|
||||
are these: download, verify and extract archive, prepare distribution and make package.
|
||||
|
||||
All configuration keys described below are in coin definition file in *configs/coins*.
|
||||
@ -153,7 +153,7 @@ have signed sha256 sums and some don't care about verification at all. So there
|
||||
could be *gpg*, *gpg-sha256* or *sha256* and chooses particular method.
|
||||
|
||||
*gpg* type require file with digital sign and maintainer's public key imported in Docker build image (see below). Sign
|
||||
file is downloaded from URL defined in *backend.verification_source*. Than is passed to gpg in order to verify archvie.
|
||||
file is downloaded from URL defined in *backend.verification_source*. Than is passed to gpg in order to verify archive.
|
||||
|
||||
*gpg-sha256* type require signed checksum file and maintainer's public key imported in Docker build image (see below).
|
||||
Checksum file is downloaded from URL defined in *backend.verification_source*. Then is verified by gpg and passed to
|
||||
@ -191,7 +191,7 @@ like macOS or Windows, please adapt the instructions to your target system.
|
||||
Setup go environment (use newer version of go as available)
|
||||
|
||||
```
|
||||
wget https://golang.org/dl/go1.19.linux-amd64.tar.gz && tar xf go1.19.linux-amd64.tar.gz
|
||||
wget https://golang.org/dl/go1.21.4.linux-amd64.tar.gz && tar xf go1.21.4.linux-amd64.tar.gz
|
||||
sudo mv go /opt/go
|
||||
sudo ln -s /opt/go/bin/go /usr/bin/go
|
||||
# see `go help gopath` for details
|
||||
@ -201,12 +201,12 @@ export PATH=$PATH:$GOPATH/bin
|
||||
```
|
||||
|
||||
Install RocksDB: https://github.com/facebook/rocksdb/blob/master/INSTALL.md
|
||||
and compile the static_lib and tools. Optionally, consider adding `PORTABLE=1` before the
|
||||
and compile the static_lib and tools. Optionally, consider adding `PORTABLE=1` before the
|
||||
make command to create a portable binary.
|
||||
|
||||
```
|
||||
sudo apt-get update && sudo apt-get install -y \
|
||||
build-essential git wget pkg-config libzmq3-dev libgflags-dev libsnappy-dev zlib1g-dev libzstd-dev libbz2-dev liblz4-dev
|
||||
build-essential git wget pkg-config libzmq3-dev libgflags-dev libsnappy-dev zlib1g-dev libzstd-dev libbz2-dev liblz4-dev
|
||||
git clone https://github.com/facebook/rocksdb.git
|
||||
cd rocksdb
|
||||
git checkout v7.5.3
|
||||
|
||||
@ -32,7 +32,7 @@ Good examples of coin configuration are
|
||||
* `backend_*` – Additional back-end ports can be documented here. Actually the only purpose is to get them to
|
||||
port table (prefix is removed and rest of string is used as note).
|
||||
* `blockbook_internal` – Blockbook's internal port that is used for metric collecting, debugging etc.
|
||||
* `blockbook_public` – Blockbook's public port that is used to comunicate with Trezor wallet (via Socket.IO).
|
||||
* `blockbook_public` – Blockbook's public port that is used to communicate with Trezor wallet (via Socket.IO).
|
||||
|
||||
* `ipc` – Defines how Blockbook connects its back-end service.
|
||||
* `rpc_url_template` – Template that defines URL of back-end RPC service. See note on templates below.
|
||||
@ -82,7 +82,7 @@ Good examples of coin configuration are
|
||||
* `explorer_url` – URL of blockchain explorer. Leave empty for internal explorer.
|
||||
* `additional_params` – Additional params of exec command (see [Dogecoin definition](/configs/coins/dogecoin.json)).
|
||||
* `block_chain` – Configuration of BlockChain type that ensures communication with back-end service. All options
|
||||
must be tweaked for each individual coin separely.
|
||||
must be tweaked for each individual coin separately.
|
||||
* `parse` – Use binary parser for block decoding if *true* else call verbose back-end RPC method that returns
|
||||
JSON. Note that verbose method is slow and not every coin support it. However there are coin implementations
|
||||
that don't support binary parsing (e.g. ZCash).
|
||||
@ -112,4 +112,4 @@ to alter built-in text that is specific for Trezor. Text fields that could be up
|
||||
* [tos_link](/build/text/tos_link) – A link to Terms of service shown as the footer on the Explorer pages.
|
||||
|
||||
Text data are stored as plain text files in *build/text* directory and are embedded to binary during build. A change of
|
||||
theese files is mean for a private purpose and PRs that would update them won't be accepted.
|
||||
these files is meant for a private purpose and PRs that would update them won't be accepted.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user