OSDN Git Service

merge with dev
[bytom/bytom.git] / asset / asset.go
index cd370b8..e8cdbcb 100644 (file)
@@ -2,7 +2,6 @@ package asset
 
 import (
        "context"
-       "encoding/binary"
        "encoding/json"
        "strings"
        "sync"
@@ -12,6 +11,7 @@ import (
        "golang.org/x/crypto/sha3"
 
        "github.com/bytom/blockchain/signers"
+       "github.com/bytom/common"
        "github.com/bytom/consensus"
        "github.com/bytom/crypto/ed25519"
        "github.com/bytom/crypto/ed25519/chainkd"
@@ -27,12 +27,15 @@ var DefaultNativeAsset *Asset
 
 const (
        maxAssetCache = 1000
-       assetPrefix   = "ASS:"
        //AliasPrefix is asset alias prefix
        AliasPrefix = "ALS:"
        //ExternalAssetPrefix is external definition assets prefix
        ExternalAssetPrefix = "EXA"
-       indexPrefix         = "ASSIDX:"
+)
+
+var (
+       assetIndexKey = []byte("assetIndex")
+       assetPrefix   = []byte("ASS:")
 )
 
 func initNativeAsset() {
@@ -57,12 +60,7 @@ func AliasKey(name string) []byte {
 
 //Key asset store prefix
 func Key(id *bc.AssetID) []byte {
-       name := id.String()
-       return []byte(assetPrefix + name)
-}
-
-func indexKey(xpub chainkd.XPub) []byte {
-       return []byte(indexPrefix + xpub.String())
+       return append(assetPrefix, id.Bytes()...)
 }
 
 //CalcExtAssetKey return store external assets key
@@ -116,21 +114,17 @@ type Asset struct {
        DefinitionMap     map[string]interface{} `json:"definition"`
 }
 
-func (reg *Registry) getNextAssetIndex(xpubs []chainkd.XPub) (*uint64, error) {
+func (reg *Registry) getNextAssetIndex() uint64 {
        reg.assetIndexMu.Lock()
        defer reg.assetIndexMu.Unlock()
 
-       var nextIndex uint64 = 1
-
-       if rawIndex := reg.db.Get(indexKey(xpubs[0])); rawIndex != nil {
-               nextIndex = binary.LittleEndian.Uint64(rawIndex) + 1
+       nextIndex := uint64(1)
+       if rawIndex := reg.db.Get(assetIndexKey); rawIndex != nil {
+               nextIndex = common.BytesToUnit64(rawIndex) + 1
        }
 
-       buf := make([]byte, 8)
-       binary.LittleEndian.PutUint64(buf, nextIndex)
-       reg.db.Set(indexKey(xpubs[0]), buf)
-
-       return &nextIndex, nil
+       reg.db.Set(assetIndexKey, common.Unit64ToBytes(nextIndex))
+       return nextIndex
 }
 
 // Define defines a new Asset.
@@ -148,12 +142,8 @@ func (reg *Registry) Define(xpubs []chainkd.XPub, quorum int, definition map[str
                return nil, ErrDuplicateAlias
        }
 
-       nextAssetIndex, err := reg.getNextAssetIndex(xpubs)
-       if err != nil {
-               return nil, errors.Wrap(err, "get asset index error")
-       }
-
-       assetSigner, err := signers.Create("asset", xpubs, quorum, *nextAssetIndex)
+       nextAssetIndex := reg.getNextAssetIndex()
+       assetSigner, err := signers.Create("asset", xpubs, quorum, nextAssetIndex)
        if err != nil {
                return nil, err
        }
@@ -308,7 +298,7 @@ func (reg *Registry) GetAsset(id string) (*Asset, error) {
 // ListAssets returns the accounts in the db
 func (reg *Registry) ListAssets() ([]*Asset, error) {
        assets := []*Asset{DefaultNativeAsset}
-       assetIter := reg.db.IteratorPrefix([]byte(assetPrefix))
+       assetIter := reg.db.IteratorPrefix(assetPrefix)
        defer assetIter.Release()
 
        for assetIter.Next() {