import (
"context"
- "encoding/binary"
"encoding/json"
"strings"
"sync"
"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"
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() {
//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
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.
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
}
// 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() {