OSDN Git Service

update
[bytom/vapor.git] / database / wallet_store.go
index 3ba2ad1..ff25b4d 100644 (file)
@@ -18,27 +18,8 @@ import (
 )
 
 const (
-       // UTXOPrefix          = "ACU:" //UTXOPrefix is StandardUTXOKey prefix
-       // SUTXOPrefix         = "SCU:" //SUTXOPrefix is ContractUTXOKey prefix
-
-       ContractPrefix = "Contract:"
-
-// ContractIndexPrefix = "ContractIndex:"
-// AccountPrefix       = "Account:" // AccountPrefix is account ID prefix
-// AccountAliasPrefix  = "AccountAlias:"
-// AccountIndexPrefix  = "AccountIndex:"
-// TxPrefix            = "TXS:"  //TxPrefix is wallet database transactions prefix
-// TxIndexPrefix       = "TID:"  //TxIndexPrefix is wallet database tx index prefix
-// UnconfirmedTxPrefix = "UTXS:" //UnconfirmedTxPrefix is txpool unconfirmed transactions prefix
-// GlobalTxIndexPrefix = "GTID:" //GlobalTxIndexPrefix is wallet database global tx index prefix
-// WalletKey        = "WalletInfo"
-// MiningAddressKey = "MiningAddress"
-// CoinbaseAbKey    = "CoinbaseArbitrary"
-)
-
-const (
        utxoPrefix  byte = iota //UTXOPrefix is StandardUTXOKey prefix
-       sUTXOPrefix             //SUTXOPrefix is ContractUTXOKey prefix
+       sutxoPrefix             //SUTXOPrefix is ContractUTXOKey prefix
        contractPrefix
        contractIndexPrefix
        accountPrefix // AccountPrefix is account ID prefix
@@ -57,8 +38,9 @@ const (
 // leveldb key prefix
 var (
        UTXOPrefix  = []byte{utxoPrefix, colon}
-       SUTXOPrefix = []byte{sUTXOPrefix, colon}
-       // ContractPrefix      = []byte{contractPrefix, colon}
+       SUTXOPrefix = []byte{sutxoPrefix, colon}
+       // ContractPrefix = []byte{contractPrefix, contractPrefix, colon}
+       ContractPrefix      = "Contract:"
        ContractIndexPrefix = []byte{contractIndexPrefix, colon}
        AccountPrefix       = []byte{accountPrefix, colon} // AccountPrefix is account ID prefix
        AccountAliasPrefix  = []byte{accountAliasPrefix, colon}
@@ -76,8 +58,8 @@ var (
 // errors
 var (
        // ErrFindAccount        = errors.New("Failed to find account")
-       errAccntTxIDNotFound  = errors.New("account TXID not found")
-       errGetAssetDefinition = errors.New("Failed to find asset definition")
+       errAccntTxIDNotFound = errors.New("account TXID not found")
+       errGetAsset          = errors.New("Failed to find asset definition")
 )
 
 func accountIndexKey(xpubs []chainkd.XPub) []byte {
@@ -102,6 +84,8 @@ func Bip44ContractIndexKey(accountID string, change bool) []byte {
 
 // ContractKey account control promgram store prefix
 func ContractKey(hash bc.Hash) []byte {
+       // h := hash.String()
+       // return append([]byte(ContractPrefix), []byte(h)...)
        return append([]byte(ContractPrefix), hash.Bytes()...)
 }
 
@@ -112,14 +96,16 @@ func AccountIDKey(accountID string) []byte {
 
 // StandardUTXOKey makes an account unspent outputs key to store
 func StandardUTXOKey(id bc.Hash) []byte {
-       name := id.String()
-       return append(UTXOPrefix, []byte(name)...)
+       // name := id.String()
+       // return append(UTXOPrefix, []byte(name)...)
+       return append(UTXOPrefix, id.Bytes()...)
 }
 
 // ContractUTXOKey makes a smart contract unspent outputs key to store
 func ContractUTXOKey(id bc.Hash) []byte {
-       name := id.String()
-       return append(SUTXOPrefix, []byte(name)...)
+       // name := id.String()
+       // return append(SUTXOPrefix, []byte(name)...)
+       return append(SUTXOPrefix, id.Bytes()...)
 }
 
 func calcDeleteKey(blockHeight uint64) []byte {
@@ -212,15 +198,6 @@ func (store *WalletStore) DeleteRecoveryStatus() {
        }
 }
 
-// DeleteStardardUTXO delete stardard utxo by outputID
-func (store *WalletStore) DeleteStardardUTXO(outputID bc.Hash) {
-       if store.batch == nil {
-               store.walletDB.Delete(StandardUTXOKey(outputID))
-       } else {
-               store.batch.Delete(StandardUTXOKey(outputID))
-       }
-}
-
 // DeleteTransactions delete transactions when orphan block rollback
 func (store *WalletStore) DeleteTransactions(height uint64) {
        batch := store.walletDB.NewBatch()
@@ -297,24 +274,11 @@ func (store *WalletStore) DeleteWalletUTXOs() {
        }
 }
 
-// GetAccountByID get account value by account ID
-func (store *WalletStore) GetAccountByID(accountID string) (*acc.Account, error) {
-       rawAccount := store.walletDB.Get(AccountIDKey(accountID))
-       if rawAccount == nil {
-               return nil, fmt.Errorf("failed get account, accountID: %s ", accountID)
-       }
-       account := new(acc.Account)
-       if err := json.Unmarshal(rawAccount, account); err != nil {
-               return nil, err
-       }
-       return account, nil
-}
-
-// GetAssetDefinition get asset definition by assetiD
-func (store *WalletStore) GetAssetDefinition(assetID *bc.AssetID) (*asset.Asset, error) {
+// GetAsset get asset by assetID
+func (store *WalletStore) GetAsset(assetID *bc.AssetID) (*asset.Asset, error) {
        definitionByte := store.walletDB.Get(asset.ExtAssetKey(assetID))
        if definitionByte == nil {
-               return nil, errGetAssetDefinition
+               return nil, errGetAsset
        }
        definitionMap := make(map[string]interface{})
        if err := json.Unmarshal(definitionByte, &definitionMap); err != nil {
@@ -334,7 +298,7 @@ func (store *WalletStore) GetAssetDefinition(assetID *bc.AssetID) (*asset.Asset,
 func (store *WalletStore) GetControlProgram(hash bc.Hash) (*acc.CtrlProgram, error) {
        rawProgram := store.walletDB.Get(ContractKey(hash))
        if rawProgram == nil {
-               return nil, fmt.Errorf("failed get account control program:%x ", hash)
+               return nil, acc.ErrFindCtrlProgram
        }
        accountCP := new(acc.CtrlProgram)
        if err := json.Unmarshal(rawProgram, &accountCP); err != nil {
@@ -400,6 +364,7 @@ func (store *WalletStore) GetWalletInfo() []byte {
 
 // ListAccountUTXOs get all account unspent outputs
 func (store *WalletStore) ListAccountUTXOs(key string) ([]*acc.UTXO, error) {
+       fmt.Println("ListAccountUTXOs []byte(key):", []byte(key))
        accountUtxoIter := store.walletDB.IteratorPrefix([]byte(key))
        defer accountUtxoIter.Release()
 
@@ -414,15 +379,33 @@ func (store *WalletStore) ListAccountUTXOs(key string) ([]*acc.UTXO, error) {
        return confirmedUTXOs, nil
 }
 
-// ListTransactions get all walletDB transactions
-func (store *WalletStore) ListTransactions() ([]*query.AnnotatedTx, error) {
+func (store *WalletStore) ListTransactions(accountID string, StartTxID string, count uint, unconfirmed bool) ([]*query.AnnotatedTx, error) {
        annotatedTxs := []*query.AnnotatedTx{}
+       var startKey []byte
+       preFix := TxPrefix
+
+       if StartTxID != "" {
+               if unconfirmed {
+                       startKey = calcUnconfirmedTxKey(StartTxID)
+               } else {
+                       formatKey := store.walletDB.Get(calcTxIndexKey(StartTxID))
+                       if formatKey == nil {
+                               return nil, errAccntTxIDNotFound
+                       }
+                       startKey = calcAnnotatedKey(string(formatKey))
+               }
+       }
 
-       txIter := store.walletDB.IteratorPrefix([]byte(TxPrefix))
-       defer txIter.Release()
-       for txIter.Next() {
-               annotatedTx := &query.AnnotatedTx{}
-               if err := json.Unmarshal(txIter.Value(), &annotatedTx); err != nil {
+       if unconfirmed {
+               preFix = UnconfirmedTxPrefix
+       }
+
+       itr := store.walletDB.IteratorPrefixWithStart([]byte(preFix), startKey, true)
+       defer itr.Release()
+
+       for txNum := count; itr.Next() && txNum > 0; txNum-- {
+               annotatedTx := new(query.AnnotatedTx)
+               if err := json.Unmarshal(itr.Value(), &annotatedTx); err != nil {
                        return nil, err
                }
                annotatedTxs = append(annotatedTxs, annotatedTx)
@@ -488,20 +471,6 @@ func (store *WalletStore) SetRecoveryStatus(recoveryKey, rawStatus []byte) {
        }
 }
 
-// SetStandardUTXO set standard utxo
-func (store *WalletStore) SetStandardUTXO(outputID bc.Hash, utxo *acc.UTXO) error {
-       data, err := json.Marshal(utxo)
-       if err != nil {
-               return err
-       }
-       if store.batch == nil {
-               store.walletDB.Set(StandardUTXOKey(outputID), data)
-       } else {
-               store.batch.Set(StandardUTXOKey(outputID), data)
-       }
-       return nil
-}
-
 // SetTransaction set raw transaction by block height and tx position
 func (store *WalletStore) SetTransaction(height uint64, tx *query.AnnotatedTx) error {
        batch := store.walletDB.NewBatch()