OSDN Git Service

API list-unspent-outputs add filter for contract (#1076)
authoroysheng <33340252+oysheng@users.noreply.github.com>
Wed, 20 Jun 2018 13:40:27 +0000 (21:40 +0800)
committerPaladz <yzhu101@uottawa.ca>
Wed, 20 Jun 2018 13:40:27 +0000 (21:40 +0800)
api/query.go
cmd/bytomcli/commands/account.go
wallet/indexer.go

index 426ad0f..7463947 100644 (file)
@@ -232,9 +232,10 @@ func (a *API) decodeRawTransaction(ctx context.Context, ins struct {
 
 // POST /list-unspent-outputs
 func (a *API) listUnspentOutputs(ctx context.Context, filter struct {
-       ID string `json:"id"`
+       ID            string `json:"id"`
+       SmartContract bool   `json:"smart_contract"`
 }) Response {
-       accountUTXOs := a.wallet.GetAccountUTXOs(filter.ID)
+       accountUTXOs := a.wallet.GetAccountUTXOs(filter.ID, filter.SmartContract)
 
        UTXOs := []query.AnnotatedUTXO{}
        for _, utxo := range accountUTXOs {
index 10c6241..0d556a2 100644 (file)
@@ -20,6 +20,7 @@ func init() {
        listAddressesCmd.PersistentFlags().StringVar(&accountAlias, "alias", "", "account alias")
 
        listUnspentOutputsCmd.PersistentFlags().StringVar(&outputID, "id", "", "ID of unspent output")
+       listUnspentOutputsCmd.PersistentFlags().BoolVar(&smartContract, "contract", false, "list smart contract unspent outputs")
 }
 
 var (
@@ -28,6 +29,7 @@ var (
        accountQuorum = 1
        accountToken  = ""
        outputID      = ""
+       smartContract = false
 )
 
 var createAccountCmd = &cobra.Command{
@@ -174,8 +176,9 @@ var listUnspentOutputsCmd = &cobra.Command{
        Args:  cobra.NoArgs,
        Run: func(cmd *cobra.Command, args []string) {
                filter := struct {
-                       ID string `json:"id"`
-               }{ID: outputID}
+                       ID            string `json:"id"`
+                       SmartContract bool   `json:"smart_contract"`
+               }{ID: outputID, SmartContract: smartContract}
 
                data, exitCode := util.ClientCall("/list-unspent-outputs", &filter)
                if exitCode != util.Success {
index 3f8b0ac..acbfa15 100644 (file)
@@ -500,19 +500,24 @@ func (w *Wallet) GetTransactions(accountID string) ([]*query.AnnotatedTx, error)
 }
 
 // GetAccountUTXOs return all account unspent outputs
-func (w *Wallet) GetAccountUTXOs(id string) []account.UTXO {
-       var accountUTXOs []account.UTXO
+func (w *Wallet) GetAccountUTXOs(id string, isSmartContract bool) []account.UTXO {
+       accountUTXO := account.UTXO{}
+       accountUTXOs := []account.UTXO{}
 
-       accountUTXOIter := w.DB.IteratorPrefix([]byte(account.UTXOPreFix + id))
+       prefix := account.UTXOPreFix
+       if isSmartContract {
+               prefix = account.SUTXOPrefix
+       }
+       accountUTXOIter := w.DB.IteratorPrefix([]byte(prefix + id))
        defer accountUTXOIter.Release()
        for accountUTXOIter.Next() {
-               accountUTXO := account.UTXO{}
                if err := json.Unmarshal(accountUTXOIter.Value(), &accountUTXO); err != nil {
-                       hashKey := accountUTXOIter.Key()[len(account.UTXOPreFix):]
+                       hashKey := accountUTXOIter.Key()[len(prefix):]
                        log.WithField("UTXO hash", string(hashKey)).Warn("get account UTXO")
-               } else {
-                       accountUTXOs = append(accountUTXOs, accountUTXO)
+                       continue
                }
+
+               accountUTXOs = append(accountUTXOs, accountUTXO)
        }
 
        return accountUTXOs
@@ -520,7 +525,7 @@ func (w *Wallet) GetAccountUTXOs(id string) []account.UTXO {
 
 // GetAccountBalances return all account balances
 func (w *Wallet) GetAccountBalances(id string) ([]AccountBalance, error) {
-       return w.indexBalances(w.GetAccountUTXOs(""))
+       return w.indexBalances(w.GetAccountUTXOs("", false))
 }
 
 // AccountBalance account balance
@@ -535,7 +540,7 @@ type AccountBalance struct {
 
 func (w *Wallet) indexBalances(accountUTXOs []account.UTXO) ([]AccountBalance, error) {
        accBalance := make(map[string]map[string]uint64)
-       balances := make([]AccountBalance, 0)
+       balances := []AccountBalance{}
 
        for _, accountUTXO := range accountUTXOs {
                assetID := accountUTXO.AssetID.String()