mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-22 09:29:38 +00:00
transaction: drop Issue TX support
This commit is contained in:
parent
f445f7c602
commit
169c5ae775
22 changed files with 8 additions and 141 deletions
|
@ -19,7 +19,6 @@ ProtocolConfiguration:
|
||||||
- seed4.neo.org:10333
|
- seed4.neo.org:10333
|
||||||
- seed5.neo.org:10333
|
- seed5.neo.org:10333
|
||||||
SystemFee:
|
SystemFee:
|
||||||
IssueTransaction: 500
|
|
||||||
RegisterTransaction: 10000
|
RegisterTransaction: 10000
|
||||||
VerifyBlocks: true
|
VerifyBlocks: true
|
||||||
VerifyTransactions: false
|
VerifyTransactions: false
|
||||||
|
|
|
@ -15,7 +15,6 @@ ProtocolConfiguration:
|
||||||
- 172.200.0.3:20335
|
- 172.200.0.3:20335
|
||||||
- 172.200.0.4:20336
|
- 172.200.0.4:20336
|
||||||
SystemFee:
|
SystemFee:
|
||||||
IssueTransaction: 500
|
|
||||||
RegisterTransaction: 10000
|
RegisterTransaction: 10000
|
||||||
VerifyBlocks: true
|
VerifyBlocks: true
|
||||||
VerifyTransactions: true
|
VerifyTransactions: true
|
||||||
|
|
|
@ -15,7 +15,6 @@ ProtocolConfiguration:
|
||||||
- 172.200.0.3:20335
|
- 172.200.0.3:20335
|
||||||
- 172.200.0.4:20336
|
- 172.200.0.4:20336
|
||||||
SystemFee:
|
SystemFee:
|
||||||
IssueTransaction: 500
|
|
||||||
RegisterTransaction: 10000
|
RegisterTransaction: 10000
|
||||||
VerifyBlocks: true
|
VerifyBlocks: true
|
||||||
VerifyTransactions: true
|
VerifyTransactions: true
|
||||||
|
|
|
@ -9,7 +9,6 @@ ProtocolConfiguration:
|
||||||
SeedList:
|
SeedList:
|
||||||
- 172.200.0.1:20333
|
- 172.200.0.1:20333
|
||||||
SystemFee:
|
SystemFee:
|
||||||
IssueTransaction: 500
|
|
||||||
RegisterTransaction: 10000
|
RegisterTransaction: 10000
|
||||||
VerifyBlocks: true
|
VerifyBlocks: true
|
||||||
VerifyTransactions: true
|
VerifyTransactions: true
|
||||||
|
|
|
@ -15,7 +15,6 @@ ProtocolConfiguration:
|
||||||
- 172.200.0.3:20335
|
- 172.200.0.3:20335
|
||||||
- 172.200.0.4:20336
|
- 172.200.0.4:20336
|
||||||
SystemFee:
|
SystemFee:
|
||||||
IssueTransaction: 500
|
|
||||||
RegisterTransaction: 10000
|
RegisterTransaction: 10000
|
||||||
VerifyBlocks: true
|
VerifyBlocks: true
|
||||||
VerifyTransactions: true
|
VerifyTransactions: true
|
||||||
|
|
|
@ -15,7 +15,6 @@ ProtocolConfiguration:
|
||||||
- 172.200.0.3:20335
|
- 172.200.0.3:20335
|
||||||
- 172.200.0.4:20336
|
- 172.200.0.4:20336
|
||||||
SystemFee:
|
SystemFee:
|
||||||
IssueTransaction: 500
|
|
||||||
RegisterTransaction: 10000
|
RegisterTransaction: 10000
|
||||||
VerifyBlocks: true
|
VerifyBlocks: true
|
||||||
VerifyTransactions: true
|
VerifyTransactions: true
|
||||||
|
|
|
@ -16,7 +16,6 @@ ProtocolConfiguration:
|
||||||
- 127.0.0.1:20336
|
- 127.0.0.1:20336
|
||||||
SystemFee:
|
SystemFee:
|
||||||
EnrollmentTransaction: 1000
|
EnrollmentTransaction: 1000
|
||||||
IssueTransaction: 500
|
|
||||||
RegisterTransaction: 10000
|
RegisterTransaction: 10000
|
||||||
VerifyBlocks: true
|
VerifyBlocks: true
|
||||||
VerifyTransactions: true
|
VerifyTransactions: true
|
||||||
|
|
|
@ -19,7 +19,6 @@ ProtocolConfiguration:
|
||||||
- seed4t.neo.org:20333
|
- seed4t.neo.org:20333
|
||||||
- seed5t.neo.org:20333
|
- seed5t.neo.org:20333
|
||||||
SystemFee:
|
SystemFee:
|
||||||
IssueTransaction: 5
|
|
||||||
RegisterTransaction: 100
|
RegisterTransaction: 100
|
||||||
VerifyBlocks: true
|
VerifyBlocks: true
|
||||||
VerifyTransactions: false
|
VerifyTransactions: false
|
||||||
|
|
|
@ -14,7 +14,6 @@ ProtocolConfiguration:
|
||||||
- 127.0.0.1:20335
|
- 127.0.0.1:20335
|
||||||
- 127.0.0.1:20336
|
- 127.0.0.1:20336
|
||||||
SystemFee:
|
SystemFee:
|
||||||
IssueTransaction: 500
|
|
||||||
RegisterTransaction: 10000
|
RegisterTransaction: 10000
|
||||||
VerifyBlocks: true
|
VerifyBlocks: true
|
||||||
VerifyTransactions: true
|
VerifyTransactions: true
|
||||||
|
|
|
@ -60,8 +60,6 @@ ProtocolConfiguration:
|
||||||
- 127.0.0.1:20335
|
- 127.0.0.1:20335
|
||||||
- 127.0.0.1:20336
|
- 127.0.0.1:20336
|
||||||
SystemFee:
|
SystemFee:
|
||||||
EnrollmentTransaction: 1000
|
|
||||||
IssueTransaction: 500
|
|
||||||
RegisterTransaction: 10000
|
RegisterTransaction: 10000
|
||||||
|
|
||||||
ApplicationConfiguration:
|
ApplicationConfiguration:
|
||||||
|
|
|
@ -47,7 +47,6 @@ type (
|
||||||
|
|
||||||
// SystemFee fees related to system.
|
// SystemFee fees related to system.
|
||||||
SystemFee struct {
|
SystemFee struct {
|
||||||
IssueTransaction int64 `yaml:"IssueTransaction"`
|
|
||||||
RegisterTransaction int64 `yaml:"RegisterTransaction"`
|
RegisterTransaction int64 `yaml:"RegisterTransaction"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,8 +73,6 @@ func (n NetMode) String() string {
|
||||||
// TryGetValue returns the system fee base on transaction type.
|
// TryGetValue returns the system fee base on transaction type.
|
||||||
func (s SystemFee) TryGetValue(txType transaction.TXType) util.Fixed8 {
|
func (s SystemFee) TryGetValue(txType transaction.TXType) util.Fixed8 {
|
||||||
switch txType {
|
switch txType {
|
||||||
case transaction.IssueType:
|
|
||||||
return util.Fixed8FromInt64(s.IssueTransaction)
|
|
||||||
case transaction.RegisterType:
|
case transaction.RegisterType:
|
||||||
return util.Fixed8FromInt64(s.RegisterTransaction)
|
return util.Fixed8FromInt64(s.RegisterTransaction)
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"github.com/nspcc-dev/dbft/crypto"
|
"github.com/nspcc-dev/dbft/crypto"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -44,7 +45,7 @@ func TestNeoBlock_Setters(t *testing.T) {
|
||||||
b.Block.PrevHash = util.Uint256{9, 8, 7}
|
b.Block.PrevHash = util.Uint256{9, 8, 7}
|
||||||
require.Equal(t, util.Uint256{9, 8, 7}, b.PrevHash())
|
require.Equal(t, util.Uint256{9, 8, 7}, b.PrevHash())
|
||||||
|
|
||||||
txx := []block.Transaction{transaction.NewIssueTX()}
|
txx := []block.Transaction{transaction.NewInvocationTX([]byte{byte(opcode.PUSH1)}, 1)}
|
||||||
b.SetTransactions(txx)
|
b.SetTransactions(txx)
|
||||||
require.Equal(t, txx, b.Transactions())
|
require.Equal(t, txx, b.Transactions())
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -84,7 +85,7 @@ func newDumbBlock() *Block {
|
||||||
Nonce: 1111,
|
Nonce: 1111,
|
||||||
},
|
},
|
||||||
Transactions: []*transaction.Transaction{
|
Transactions: []*transaction.Transaction{
|
||||||
transaction.NewIssueTX(),
|
transaction.NewInvocationTX([]byte{byte(opcode.PUSH1)}, 0),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -643,19 +643,6 @@ func (bc *Blockchain) storeBlock(block *block.Block) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case *transaction.IssueTX:
|
|
||||||
for _, res := range bc.GetTransactionResults(tx) {
|
|
||||||
if res.Amount < 0 {
|
|
||||||
asset, err := cache.GetAssetState(res.AssetID)
|
|
||||||
if asset == nil || err != nil {
|
|
||||||
return fmt.Errorf("issue failed: no asset %s or error %s", res.AssetID, err)
|
|
||||||
}
|
|
||||||
asset.Available -= res.Amount
|
|
||||||
if err := cache.PutAssetState(asset); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case *transaction.InvocationTX:
|
case *transaction.InvocationTX:
|
||||||
systemInterop := bc.newInteropContext(trigger.Application, cache, block, tx)
|
systemInterop := bc.newInteropContext(trigger.Application, cache, block, tx)
|
||||||
v := SpawnVM(systemInterop)
|
v := SpawnVM(systemInterop)
|
||||||
|
@ -1437,26 +1424,8 @@ func (bc *Blockchain) verifyResults(t *transaction.Transaction, results []*trans
|
||||||
return errors.New("tx destroys non-utility token")
|
return errors.New("tx destroys non-utility token")
|
||||||
}
|
}
|
||||||
|
|
||||||
switch t.Type {
|
if len(resultsIssue) > 0 {
|
||||||
case transaction.IssueType:
|
return errors.New("non issue/miner/claim tx issues tokens")
|
||||||
for _, r := range resultsIssue {
|
|
||||||
if r.AssetID == UtilityTokenID() {
|
|
||||||
return errors.New("issue tx issues utility tokens")
|
|
||||||
}
|
|
||||||
asset, err := bc.dao.GetAssetState(r.AssetID)
|
|
||||||
if asset == nil || err != nil {
|
|
||||||
return errors.New("invalid asset in issue tx")
|
|
||||||
}
|
|
||||||
if asset.Available < r.Amount {
|
|
||||||
return errors.New("trying to issue more than available")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
if len(resultsIssue) > 0 {
|
|
||||||
return errors.New("non issue/miner/claim tx issues tokens")
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -1547,16 +1516,6 @@ func (bc *Blockchain) GetScriptHashesForVerifying(t *transaction.Transaction) ([
|
||||||
hashes[c.Account] = true
|
hashes[c.Account] = true
|
||||||
}
|
}
|
||||||
switch t.Type {
|
switch t.Type {
|
||||||
case transaction.IssueType:
|
|
||||||
for _, res := range refsAndOutsToResults(references, t.Outputs) {
|
|
||||||
if res.Amount < 0 {
|
|
||||||
asset, err := bc.dao.GetAssetState(res.AssetID)
|
|
||||||
if asset == nil || err != nil {
|
|
||||||
return nil, errors.New("invalid asset in issue tx")
|
|
||||||
}
|
|
||||||
hashes[asset.Issuer] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case transaction.RegisterType:
|
case transaction.RegisterType:
|
||||||
reg := t.Data.(*transaction.RegisterTX)
|
reg := t.Data.(*transaction.RegisterTX)
|
||||||
hashes[reg.Owner.GetScriptHash()] = true
|
hashes[reg.Owner.GetScriptHash()] = true
|
||||||
|
|
|
@ -220,7 +220,7 @@ func TestGetCurrentHeaderHeight_Store(t *testing.T) {
|
||||||
|
|
||||||
func TestStoreAsTransaction(t *testing.T) {
|
func TestStoreAsTransaction(t *testing.T) {
|
||||||
dao := NewSimple(storage.NewMemoryStore())
|
dao := NewSimple(storage.NewMemoryStore())
|
||||||
tx := transaction.NewIssueTX()
|
tx := transaction.NewInvocationTX([]byte{byte(opcode.PUSH1)}, 1)
|
||||||
hash := tx.Hash()
|
hash := tx.Hash()
|
||||||
err := dao.StoreAsTransaction(tx, 0)
|
err := dao.StoreAsTransaction(tx, 0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
|
@ -138,7 +138,7 @@ func newDumbBlock() *block.Block {
|
||||||
Nonce: 1111,
|
Nonce: 1111,
|
||||||
},
|
},
|
||||||
Transactions: []*transaction.Transaction{
|
Transactions: []*transaction.Transaction{
|
||||||
{Type: transaction.IssueType},
|
transaction.NewInvocationTX([]byte{byte(opcode.PUSH1)}, 0),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -353,17 +353,6 @@ func (mp *Pool) checkTxConflicts(tx *transaction.Transaction, fee Feer) bool {
|
||||||
if !mp.checkBalanceAndUpdate(tx, fee) {
|
if !mp.checkBalanceAndUpdate(tx, fee) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
switch tx.Type {
|
|
||||||
case transaction.IssueType:
|
|
||||||
// It's a hack, because technically we could check for
|
|
||||||
// available asset amount, but these transactions are so rare
|
|
||||||
// that no one really cares about this restriction.
|
|
||||||
for i := range mp.verifiedTxes {
|
|
||||||
if mp.verifiedTxes[i].txn.Type == transaction.IssueType {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,29 +129,6 @@ func TestMemPoolVerifyInputs(t *testing.T) {
|
||||||
require.Error(t, mp.Add(tx3, &FeerStub{}))
|
require.Error(t, mp.Add(tx3, &FeerStub{}))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMemPoolVerifyIssue(t *testing.T) {
|
|
||||||
mp := NewMemPool(50)
|
|
||||||
tx1 := newIssueTX()
|
|
||||||
require.Equal(t, true, mp.Verify(tx1, &FeerStub{}))
|
|
||||||
require.NoError(t, mp.Add(tx1, &FeerStub{}))
|
|
||||||
|
|
||||||
tx2 := newIssueTX()
|
|
||||||
require.Equal(t, false, mp.Verify(tx2, &FeerStub{}))
|
|
||||||
require.Error(t, mp.Add(tx2, &FeerStub{}))
|
|
||||||
}
|
|
||||||
|
|
||||||
func newIssueTX() *transaction.Transaction {
|
|
||||||
tx := transaction.NewIssueTX()
|
|
||||||
tx.Outputs = []transaction.Output{
|
|
||||||
{
|
|
||||||
AssetID: random.Uint256(),
|
|
||||||
Amount: util.Fixed8FromInt64(42),
|
|
||||||
ScriptHash: random.Uint160(),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return tx
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestOverCapacity(t *testing.T) {
|
func TestOverCapacity(t *testing.T) {
|
||||||
var fs = &FeerStub{lowPriority: true}
|
var fs = &FeerStub{lowPriority: true}
|
||||||
const mempoolSize = 10
|
const mempoolSize = 10
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
package transaction
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math/rand"
|
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IssueTX represents a issue transaction.
|
|
||||||
// This TX has not special attributes.
|
|
||||||
type IssueTX struct{}
|
|
||||||
|
|
||||||
// NewIssueTX creates Transaction of IssueType type.
|
|
||||||
func NewIssueTX() *Transaction {
|
|
||||||
return &Transaction{
|
|
||||||
Type: IssueType,
|
|
||||||
Version: 0,
|
|
||||||
Nonce: rand.Uint32(),
|
|
||||||
Data: &IssueTX{},
|
|
||||||
Attributes: []Attribute{},
|
|
||||||
Cosigners: []Cosigner{},
|
|
||||||
Inputs: []Input{},
|
|
||||||
Outputs: []Output{},
|
|
||||||
Scripts: []Witness{},
|
|
||||||
Trimmed: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DecodeBinary implements Serializable interface.
|
|
||||||
func (tx *IssueTX) DecodeBinary(r *io.BinReader) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// EncodeBinary implements Serializable interface.
|
|
||||||
func (tx *IssueTX) EncodeBinary(w *io.BinWriter) {
|
|
||||||
}
|
|
|
@ -179,9 +179,6 @@ func (t *Transaction) decodeData(r *io.BinReader) {
|
||||||
case RegisterType:
|
case RegisterType:
|
||||||
t.Data = &RegisterTX{}
|
t.Data = &RegisterTX{}
|
||||||
t.Data.(*RegisterTX).DecodeBinary(r)
|
t.Data.(*RegisterTX).DecodeBinary(r)
|
||||||
case IssueType:
|
|
||||||
t.Data = &IssueTX{}
|
|
||||||
t.Data.(*IssueTX).DecodeBinary(r)
|
|
||||||
default:
|
default:
|
||||||
r.Err = fmt.Errorf("invalid TX type %x", t.Type)
|
r.Err = fmt.Errorf("invalid TX type %x", t.Type)
|
||||||
}
|
}
|
||||||
|
@ -387,8 +384,6 @@ func (t *Transaction) UnmarshalJSON(data []byte) error {
|
||||||
Owner: tx.Asset.Owner,
|
Owner: tx.Asset.Owner,
|
||||||
Admin: admin,
|
Admin: admin,
|
||||||
}
|
}
|
||||||
case IssueType:
|
|
||||||
t.Data = &IssueTX{}
|
|
||||||
}
|
}
|
||||||
if t.Hash() != tx.TxID {
|
if t.Hash() != tx.TxID {
|
||||||
return errors.New("txid doesn't match transaction hash")
|
return errors.New("txid doesn't match transaction hash")
|
||||||
|
|
|
@ -11,7 +11,6 @@ type TXType uint8
|
||||||
|
|
||||||
// Constants for all valid transaction types.
|
// Constants for all valid transaction types.
|
||||||
const (
|
const (
|
||||||
IssueType TXType = 0x01
|
|
||||||
RegisterType TXType = 0x40
|
RegisterType TXType = 0x40
|
||||||
InvocationType TXType = 0xd1
|
InvocationType TXType = 0xd1
|
||||||
)
|
)
|
||||||
|
@ -19,8 +18,6 @@ const (
|
||||||
// String implements the stringer interface.
|
// String implements the stringer interface.
|
||||||
func (t TXType) String() string {
|
func (t TXType) String() string {
|
||||||
switch t {
|
switch t {
|
||||||
case IssueType:
|
|
||||||
return "IssueTransaction"
|
|
||||||
case RegisterType:
|
case RegisterType:
|
||||||
return "RegisterTransaction"
|
return "RegisterTransaction"
|
||||||
case InvocationType:
|
case InvocationType:
|
||||||
|
@ -49,8 +46,6 @@ func (t *TXType) UnmarshalJSON(data []byte) error {
|
||||||
// TXTypeFromString searches for TXType by string name.
|
// TXTypeFromString searches for TXType by string name.
|
||||||
func TXTypeFromString(jsonString string) (TXType, error) {
|
func TXTypeFromString(jsonString string) (TXType, error) {
|
||||||
switch jsonString = strings.TrimSpace(jsonString); jsonString {
|
switch jsonString = strings.TrimSpace(jsonString); jsonString {
|
||||||
case "IssueTransaction":
|
|
||||||
return IssueType, nil
|
|
||||||
case "RegisterTransaction":
|
case "RegisterTransaction":
|
||||||
return RegisterType, nil
|
return RegisterType, nil
|
||||||
case "InvocationTransaction":
|
case "InvocationTransaction":
|
||||||
|
|
|
@ -23,7 +23,6 @@ func GetHash(t Transaction) []byte {
|
||||||
|
|
||||||
// GetType returns the type of the given transaction. Possible values:
|
// GetType returns the type of the given transaction. Possible values:
|
||||||
// MinerTransaction = 0x00
|
// MinerTransaction = 0x00
|
||||||
// IssueTransaction = 0x01
|
|
||||||
// EnrollmentTransaction = 0x20
|
// EnrollmentTransaction = 0x20
|
||||||
// RegisterTransaction = 0x40
|
// RegisterTransaction = 0x40
|
||||||
// StateType = 0x90
|
// StateType = 0x90
|
||||||
|
|
Loading…
Reference in a new issue