OSDN Git Service

update GetAssetDefinition
authorChengcheng Zhang <943420582@qq.com>
Fri, 28 Jun 2019 02:32:37 +0000 (10:32 +0800)
committerChengcheng Zhang <943420582@qq.com>
Fri, 28 Jun 2019 02:32:37 +0000 (10:32 +0800)
database/wallet_store.go
wallet/annotated.go
wallet/indexer.go
wallet/store.go
wallet/wallet.go

index 92a46d0..cbc9434 100644 (file)
@@ -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
index 6f2570a..f8ab494 100644 (file)
@@ -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) {
index c9014f7..f44128b 100644 (file)
@@ -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
index 2b64302..536e91a 100644 (file)
@@ -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
 }
-
index f4e3d79..e333904 100644 (file)
@@ -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()