EthereumType: Remove fetching of contract details from sync

This commit is contained in:
Martin Boehm 2024-11-25 09:25:26 +01:00
parent 1fe4ee04f3
commit 19a902360e
3 changed files with 36 additions and 14 deletions

View File

@ -172,9 +172,18 @@ func (w *Worker) getAddressAliases(addresses map[string]struct{}) AddressAliases
} }
for a := range addresses { for a := range addresses {
if w.chainType == bchain.ChainEthereumType { if w.chainType == bchain.ChainEthereumType {
ci, err := w.db.GetContractInfoForAddress(a) addrDesc, err := w.chainParser.GetAddrDescFromAddress(a)
if err == nil && ci != nil && ci.Name != "" { if err != nil || addrDesc == nil {
aliases[a] = AddressAlias{Type: "Contract", Alias: ci.Name} continue
}
ci, err := w.db.GetContractInfo(addrDesc, bchain.UnknownTokenType)
if err == nil && ci != nil {
if ci.Type == bchain.UnhandledTokenType {
ci, _, err = w.getContractDescriptorInfo(addrDesc, bchain.UnknownTokenType)
}
if err == nil && ci != nil && ci.Name != "" {
aliases[a] = AddressAlias{Type: "Contract", Alias: ci.Name}
}
} }
} }
n := w.db.GetAddressAlias(a) n := w.db.GetAddressAlias(a)
@ -608,7 +617,7 @@ func (w *Worker) GetTransactionFromMempoolTx(mempoolTx *bchain.MempoolTx) (*Tx,
return r, nil return r, nil
} }
func (w *Worker) getContractInfo(contract string, typeFromContext bchain.TokenTypeName) (*bchain.ContractInfo, bool, error) { func (w *Worker) GetContractInfo(contract string, typeFromContext bchain.TokenTypeName) (*bchain.ContractInfo, bool, error) {
cd, err := w.chainParser.GetAddrDescFromAddress(contract) cd, err := w.chainParser.GetAddrDescFromAddress(contract)
if err != nil { if err != nil {
return nil, false, err return nil, false, err
@ -648,7 +657,7 @@ func (w *Worker) getContractDescriptorInfo(cd bchain.AddressDescriptor, typeFrom
glog.Errorf("StoreContractInfo error %v, contract %v", err, cd) glog.Errorf("StoreContractInfo error %v, contract %v", err, cd)
} }
} }
} else if (len(contractInfo.Name) > 0 && contractInfo.Name[0] == 0) || (len(contractInfo.Symbol) > 0 && contractInfo.Symbol[0] == 0) { } else if (contractInfo.Type == bchain.UnhandledTokenType || len(contractInfo.Name) > 0 && contractInfo.Name[0] == 0) || (len(contractInfo.Symbol) > 0 && contractInfo.Symbol[0] == 0) {
// fix contract name/symbol that was parsed as a string consisting of zeroes // fix contract name/symbol that was parsed as a string consisting of zeroes
blockchainContractInfo, err := w.chain.GetContractInfo(cd) blockchainContractInfo, err := w.chain.GetContractInfo(cd)
if err != nil { if err != nil {
@ -667,6 +676,10 @@ func (w *Worker) getContractDescriptorInfo(cd bchain.AddressDescriptor, typeFrom
if blockchainContractInfo != nil { if blockchainContractInfo != nil {
contractInfo.Decimals = blockchainContractInfo.Decimals contractInfo.Decimals = blockchainContractInfo.Decimals
} }
if contractInfo.Type == bchain.UnhandledTokenType {
glog.Infof("Contract %v %v [%s] handled", cd, typeFromContext, contractInfo.Name)
contractInfo.Type = typeFromContext
}
if err = w.db.StoreContractInfo(contractInfo); err != nil { if err = w.db.StoreContractInfo(contractInfo); err != nil {
glog.Errorf("StoreContractInfo error %v, contract %v", err, cd) glog.Errorf("StoreContractInfo error %v, contract %v", err, cd)
} }
@ -687,7 +700,7 @@ func (w *Worker) getEthereumTokensTransfers(transfers bchain.TokenTransfers, add
if info, ok := contractCache[t.Contract]; ok { if info, ok := contractCache[t.Contract]; ok {
contractInfo = info contractInfo = info
} else { } else {
info, _, err := w.getContractInfo(t.Contract, typeName) info, _, err := w.GetContractInfo(t.Contract, typeName)
if err != nil { if err != nil {
glog.Errorf("getContractInfo error %v, contract %v", err, t.Contract) glog.Errorf("getContractInfo error %v, contract %v", err, t.Contract)
continue continue
@ -1124,10 +1137,16 @@ func (w *Worker) getEthereumTypeAddressBalances(addrDesc bchain.AddressDescripto
d.tokens = d.tokens[:j] d.tokens = d.tokens[:j]
sort.Sort(d.tokens) sort.Sort(d.tokens)
} }
d.contractInfo, err = w.db.GetContractInfo(addrDesc, "") d.contractInfo, err = w.db.GetContractInfo(addrDesc, bchain.UnknownTokenType)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
if d.contractInfo != nil && d.contractInfo.Type == bchain.UnhandledTokenType {
d.contractInfo, _, err = w.getContractDescriptorInfo(addrDesc, bchain.UnknownTokenType)
if err != nil {
return nil, nil, err
}
}
if filter.FromHeight == 0 && filter.ToHeight == 0 { if filter.FromHeight == 0 && filter.ToHeight == 0 {
// compute total results for paging // compute total results for paging
if filter.Vout == AddressFilterVoutOff { if filter.Vout == AddressFilterVoutOff {

View File

@ -610,13 +610,15 @@ type rpcTraceResult struct {
} }
func (b *EthereumRPC) getCreationContractInfo(contract string, height uint32) *bchain.ContractInfo { func (b *EthereumRPC) getCreationContractInfo(contract string, height uint32) *bchain.ContractInfo {
ci, err := b.fetchContractInfo(contract) // do not fetch fetchContractInfo in sync, it slows it down
if ci == nil || err != nil { // the contract will be fetched only when asked by a client
ci = &bchain.ContractInfo{ // ci, err := b.fetchContractInfo(contract)
Contract: contract, // if ci == nil || err != nil {
} ci := &bchain.ContractInfo{
Contract: contract,
} }
ci.Type = bchain.UnknownTokenType // }
ci.Type = bchain.UnhandledTokenType
ci.CreatedInBlock = height ci.CreatedInBlock = height
return ci return ci
} }

View File

@ -131,7 +131,8 @@ type TokenTypeName string
// Token types // Token types
const ( const (
UnknownTokenType TokenTypeName = "" UnknownTokenType TokenTypeName = ""
UnhandledTokenType TokenTypeName = "-"
// XPUBAddressTokenType is address derived from xpub // XPUBAddressTokenType is address derived from xpub
XPUBAddressTokenType TokenTypeName = "XPUBAddress" XPUBAddressTokenType TokenTypeName = "XPUBAddress"