From c81d0804418014a5fc89ff6dacaab94c36907a01 Mon Sep 17 00:00:00 2001 From: Chengcheng Zhang <943420582@qq.com> Date: Fri, 28 Jun 2019 10:32:37 +0800 Subject: [PATCH] update GetAssetDefinition --- database/wallet_store.go | 24 ++++++++++++++++++++---- wallet/annotated.go | 24 +++++++----------------- wallet/indexer.go | 9 +++++++-- wallet/store.go | 4 ++-- wallet/wallet.go | 4 +++- 5 files changed, 39 insertions(+), 26 deletions(-) diff --git a/database/wallet_store.go b/database/wallet_store.go index 92a46d08..cbc9434d 100644 --- a/database/wallet_store.go +++ b/database/wallet_store.go @@ -73,8 +73,9 @@ var ( // errors var ( - ErrFindAccount = errors.New("Failed to find account") - errAccntTxIDNotFound = errors.New("account TXID not found") + // ErrFindAccount = errors.New("Failed to find account") + errAccntTxIDNotFound = errors.New("account TXID not found") + errGetAssetDefinition = errors.New("Failed to find asset definition") ) func accountIndexKey(xpubs []chainkd.XPub) []byte { @@ -190,8 +191,23 @@ func (store *WalletStore) CommitBatch() { } // GetAssetDefinition get asset definition by assetiD -func (store *WalletStore) GetAssetDefinition(assetID *bc.AssetID) []byte { - return store.walletDB.Get(asset.ExtAssetKey(assetID)) +func (store *WalletStore) GetAssetDefinition(assetID *bc.AssetID) (*asset.Asset, error) { + definitionByte := store.walletDB.Get(asset.ExtAssetKey(assetID)) + if definitionByte == nil { + return nil, errGetAssetDefinition + } + definitionMap := make(map[string]interface{}) + if err := json.Unmarshal(definitionByte, &definitionMap); err != nil { + return nil, err + } + alias := assetID.String() + externalAsset := &asset.Asset{ + AssetID: *assetID, + Alias: &alias, + DefinitionMap: definitionMap, + RawDefinitionByte: definitionByte, + } + return externalAsset, nil } // SetAssetDefinition set assetID and definition diff --git a/wallet/annotated.go b/wallet/annotated.go index 6f2570a4..f8ab494d 100644 --- a/wallet/annotated.go +++ b/wallet/annotated.go @@ -32,28 +32,18 @@ func annotateTxsAsset(w *Wallet, txs []*query.AnnotatedTx) { } func (w *Wallet) getExternalDefinition(assetID *bc.AssetID) json.RawMessage { - definitionByte := w.store.GetAssetDefinition(assetID) - if definitionByte == nil { - return nil + externalAsset, err := w.store.GetAssetDefinition(assetID) + if err != nil { + log.WithFields(log.Fields{"module": logModule, "err": err}).Warning("fail on get asset definition.") } - - definitionMap := make(map[string]interface{}) - if err := json.Unmarshal(definitionByte, &definitionMap); err != nil { + if externalAsset == nil { return nil } - alias := assetID.String() - externalAsset := &asset.Asset{ - AssetID: *assetID, - Alias: &alias, - DefinitionMap: definitionMap, - RawDefinitionByte: definitionByte, - } - - if err := w.AssetReg.SaveAsset(externalAsset, alias); err != nil { - log.WithFields(log.Fields{"module": logModule, "err": err, "assetID": alias}).Warning("fail on save external asset to internal asset DB") + if err := w.AssetReg.SaveAsset(externalAsset, *externalAsset.Alias); err != nil { + log.WithFields(log.Fields{"module": logModule, "err": err, "assetAlias": *externalAsset.Alias}).Warning("fail on save external asset to internal asset DB") } - return definitionByte + return json.RawMessage(externalAsset.RawDefinitionByte) } func (w *Wallet) getAliasDefinition(assetID bc.AssetID) (string, json.RawMessage) { diff --git a/wallet/indexer.go b/wallet/indexer.go index c9014f74..f44128b1 100644 --- a/wallet/indexer.go +++ b/wallet/indexer.go @@ -29,7 +29,7 @@ func parseGlobalTxIdx(globalTxIdx []byte) (*bc.Hash, uint64) { // saveExternalAssetDefinition save external and local assets definition, // when query ,query local first and if have no then query external // details see getAliasDefinition -func saveExternalAssetDefinition(b *types.Block, store WalletStorer) { +func saveExternalAssetDefinition(b *types.Block, store WalletStorer) error { store.InitBatch() defer store.CommitBatch() @@ -37,12 +37,17 @@ func saveExternalAssetDefinition(b *types.Block, store WalletStorer) { for _, orig := range tx.Inputs { if cci, ok := orig.TypedInput.(*types.CrossChainInput); ok { assetID := cci.AssetId - if assetExist := store.GetAssetDefinition(assetID); assetExist == nil { + assetExist, err := store.GetAssetDefinition(assetID) + if err != nil { + return err + } + if assetExist == nil { store.SetAssetDefinition(assetID, cci.AssetDefinition) } } } } + return nil } // Summary is the struct of transaction's input and output summary diff --git a/wallet/store.go b/wallet/store.go index 2b643027..536e91a7 100644 --- a/wallet/store.go +++ b/wallet/store.go @@ -1,6 +1,7 @@ package wallet import ( + "github.com/vapor/asset" "github.com/vapor/blockchain/query" "github.com/vapor/common" "github.com/vapor/protocol/bc" @@ -10,7 +11,7 @@ import ( type WalletStorer interface { InitBatch() CommitBatch() - GetAssetDefinition(*bc.AssetID) []byte + GetAssetDefinition(*bc.AssetID) (*asset.Asset, error) SetAssetDefinition(*bc.AssetID, []byte) GetRawProgram(common.Hash) []byte GetAccountByAccountID(string) []byte @@ -38,4 +39,3 @@ type WalletStorer interface { DeleteRecoveryStatus([]byte) GetRecoveryStatus([]byte) []byte } - diff --git a/wallet/wallet.go b/wallet/wallet.go index f4e3d79d..e3339040 100644 --- a/wallet/wallet.go +++ b/wallet/wallet.go @@ -187,7 +187,9 @@ func (w *Wallet) AttachBlock(block *types.Block) error { } annotatedTxs := w.filterAccountTxs(block, txStatus) - saveExternalAssetDefinition(block, w.store) + if err := saveExternalAssetDefinition(block, w.store); err != nil { + return err + } annotateTxsAccount(annotatedTxs, w.store) w.store.InitBatch() -- 2.11.0