Merge pull request #979 from nspcc-dev/fix/state

core: make GetUnspentCoins interop return array, fix #978.
This commit is contained in:
Roman Khimov 2020-05-22 13:33:32 +03:00 committed by GitHub
commit 3675502927
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 10 deletions

View file

@ -62,14 +62,15 @@ var syscalls = map[string]map[string]string{
"GetTransaction": "Neo.Block.GetTransaction",
},
"transaction": {
"GetAttributes": "Neo.Transaction.GetAttributes",
"GetHash": "Neo.Transaction.GetHash",
"GetInputs": "Neo.Transaction.GetInputs",
"GetOutputs": "Neo.Transaction.GetOutputs",
"GetReferences": "Neo.Transaction.GetReferences",
"GetScript": "Neo.InvocationTransaction.GetScript",
"GetType": "Neo.Transaction.GetType",
"GetWitnesses": "Neo.Transaction.GetWitnesses",
"GetAttributes": "Neo.Transaction.GetAttributes",
"GetHash": "Neo.Transaction.GetHash",
"GetInputs": "Neo.Transaction.GetInputs",
"GetOutputs": "Neo.Transaction.GetOutputs",
"GetReferences": "Neo.Transaction.GetReferences",
"GetScript": "Neo.InvocationTransaction.GetScript",
"GetType": "Neo.Transaction.GetType",
"GetUnspentCoins": "Neo.Transaction.GetUnspentCoins",
"GetWitnesses": "Neo.Transaction.GetWitnesses",
},
"asset": {
"Create": "Neo.Asset.Create",

View file

@ -7,6 +7,7 @@ import (
"math"
"github.com/nspcc-dev/neo-go/pkg/core/state"
"github.com/nspcc-dev/neo-go/pkg/core/storage"
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
@ -177,10 +178,20 @@ func (ic *interopContext) txGetUnspentCoins(v *vm.VM) error {
return errors.New("value is not a transaction")
}
ucs, err := ic.dao.GetUnspentCoinState(tx.Hash())
if err != nil {
if err == storage.ErrKeyNotFound {
v.Estack().PushVal([]vm.StackItem{})
return nil
} else if err != nil {
return errors.New("no unspent coin state found")
}
v.Estack().PushVal(vm.NewInteropItem(ucs))
items := make([]vm.StackItem, 0, len(ucs.States))
for i := range items {
if ucs.States[i].State&state.CoinSpent == 0 {
items = append(items, vm.NewInteropItem(&ucs.States[i].Output))
}
}
v.Estack().PushVal(items)
return nil
}

View file

@ -53,6 +53,12 @@ func GetReferences(t Transaction) []interface{} {
return []interface{}{}
}
// GetUnspentCoins returns a slice of not yet spent ouputs of a given transaction.
// This function uses `Neo.Transaction.GetUnspentCoint` syscall.
func GetUnspentCoins(t Transaction) []output.Output {
return []output.Output{}
}
// GetInputs returns a slice of inputs of a given Transaction. Refer to input
// package on how to use them. This function uses `Neo.Transaction.GetInputs`
// syscall.