mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-30 09:33:36 +00:00
Merge pull request #1554 from nspcc-dev/feature/chaindump
core: allow to create long dumps for benchmark
This commit is contained in:
commit
619b6d4132
73 changed files with 600 additions and 246 deletions
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config"
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core"
|
"github.com/nspcc-dev/neo-go/pkg/core"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/chaindump"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/storage"
|
"github.com/nspcc-dev/neo-go/pkg/core/storage"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/network"
|
"github.com/nspcc-dev/neo-go/pkg/network"
|
||||||
|
@ -193,20 +194,9 @@ func dumpDB(ctx *cli.Context) error {
|
||||||
count = chainCount - start
|
count = chainCount - start
|
||||||
}
|
}
|
||||||
writer.WriteU32LE(count)
|
writer.WriteU32LE(count)
|
||||||
for i := start; i < start+count; i++ {
|
err = chaindump.Dump(chain, writer, start, count)
|
||||||
bh := chain.GetHeaderHash(int(i))
|
if err != nil {
|
||||||
b, err := chain.GetBlock(bh)
|
return cli.NewExitError(err.Error(), 1)
|
||||||
if err != nil {
|
|
||||||
return cli.NewExitError(fmt.Errorf("failed to get block %d: %w", i, err), 1)
|
|
||||||
}
|
|
||||||
buf := io.NewBufBinWriter()
|
|
||||||
b.EncodeBinary(buf.BinWriter)
|
|
||||||
bytes := buf.Bytes()
|
|
||||||
writer.WriteU32LE(uint32(len(bytes)))
|
|
||||||
writer.WriteBytes(bytes)
|
|
||||||
if writer.Err != nil {
|
|
||||||
return cli.NewExitError(err, 1)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pprof.ShutDown()
|
pprof.ShutDown()
|
||||||
prometheus.ShutDown()
|
prometheus.ShutDown()
|
||||||
|
@ -259,13 +249,6 @@ func restoreDB(ctx *cli.Context) error {
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
count = allBlocks - skip
|
count = allBlocks - skip
|
||||||
}
|
}
|
||||||
i := uint32(0)
|
|
||||||
for ; i < skip; i++ {
|
|
||||||
_, err := readBlock(reader)
|
|
||||||
if err != nil {
|
|
||||||
return cli.NewExitError(err, 1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gctx := newGraceContext()
|
gctx := newGraceContext()
|
||||||
var lastIndex uint32
|
var lastIndex uint32
|
||||||
|
@ -274,45 +257,41 @@ func restoreDB(ctx *cli.Context) error {
|
||||||
_ = dump.tryPersist(dumpDir, lastIndex)
|
_ = dump.tryPersist(dumpDir, lastIndex)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
for ; i < skip+count; i++ {
|
var f = func(b *block.Block) error {
|
||||||
select {
|
select {
|
||||||
case <-gctx.Done():
|
case <-gctx.Done():
|
||||||
return cli.NewExitError("cancelled", 1)
|
return gctx.Err()
|
||||||
default:
|
default:
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
bytes, err := readBlock(reader)
|
}
|
||||||
block := block.New(cfg.ProtocolConfiguration.Magic, cfg.ProtocolConfiguration.StateRootInHeader)
|
if dumpDir != "" {
|
||||||
newReader := io.NewBinReaderFromBuf(bytes)
|
f = func(b *block.Block) error {
|
||||||
block.DecodeBinary(newReader)
|
select {
|
||||||
if err != nil {
|
case <-gctx.Done():
|
||||||
return cli.NewExitError(err, 1)
|
return gctx.Err()
|
||||||
}
|
default:
|
||||||
if block.Index == 0 && i == 0 && skip == 0 {
|
|
||||||
genesis, err := chain.GetBlock(block.Hash())
|
|
||||||
if err == nil && genesis.Index == 0 {
|
|
||||||
log.Info("skipped genesis block", zap.String("hash", block.Hash().StringLE()))
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
err = chain.AddBlock(block)
|
|
||||||
if err != nil {
|
|
||||||
return cli.NewExitError(fmt.Errorf("failed to add block %d: %w", i, err), 1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if dumpDir != "" {
|
|
||||||
batch := chain.LastBatch()
|
batch := chain.LastBatch()
|
||||||
// The genesis block may already be persisted, so LastBatch() will return nil.
|
// The genesis block may already be persisted, so LastBatch() will return nil.
|
||||||
if batch == nil && block.Index == 0 {
|
if batch == nil && b.Index == 0 {
|
||||||
continue
|
return nil
|
||||||
}
|
}
|
||||||
dump.add(block.Index, batch)
|
dump.add(b.Index, batch)
|
||||||
lastIndex = block.Index
|
lastIndex = b.Index
|
||||||
if block.Index%1000 == 0 {
|
if b.Index%1000 == 0 {
|
||||||
if err := dump.tryPersist(dumpDir, block.Index); err != nil {
|
if err := dump.tryPersist(dumpDir, b.Index); err != nil {
|
||||||
return cli.NewExitError(fmt.Errorf("can't dump storage to file: %w", err), 1)
|
return fmt.Errorf("can't dump storage to file: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = chaindump.Restore(chain, reader, skip, count, f)
|
||||||
|
if err != nil {
|
||||||
|
return cli.NewExitError(err, 1)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
88
internal/testchain/transaction.go
Normal file
88
internal/testchain/transaction.go
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
package testchain
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
gio "io"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/compiler"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/blockchainer"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm/emit"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ownerHash = MultisigScriptHash()
|
||||||
|
ownerScript = MultisigVerificationScript()
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewTransferFromOwner returns transaction transfering funds from NEO and GAS owner.
|
||||||
|
func NewTransferFromOwner(bc blockchainer.Blockchainer, contractHash, to util.Uint160, amount int64,
|
||||||
|
nonce, validUntil uint32) (*transaction.Transaction, error) {
|
||||||
|
w := io.NewBufBinWriter()
|
||||||
|
emit.AppCallWithOperationAndArgs(w.BinWriter, contractHash, "transfer", ownerHash, to, amount, nil)
|
||||||
|
emit.Opcodes(w.BinWriter, opcode.ASSERT)
|
||||||
|
if w.Err != nil {
|
||||||
|
return nil, w.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
script := w.Bytes()
|
||||||
|
tx := transaction.New(netmode.UnitTestNet, script, 10000000)
|
||||||
|
tx.ValidUntilBlock = validUntil
|
||||||
|
tx.Nonce = nonce
|
||||||
|
tx.Signers = []transaction.Signer{{
|
||||||
|
Account: ownerHash,
|
||||||
|
Scopes: transaction.CalledByEntry,
|
||||||
|
AllowedContracts: nil,
|
||||||
|
AllowedGroups: nil,
|
||||||
|
}}
|
||||||
|
return tx, SignTx(bc, tx)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDeployTx returns new deployment tx for contract with name with Go code read from r.
|
||||||
|
func NewDeployTx(name string, r gio.Reader) (*transaction.Transaction, []byte, error) {
|
||||||
|
avm, di, err := compiler.CompileWithDebugInfo(name, r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
w := io.NewBufBinWriter()
|
||||||
|
m, err := di.ConvertToManifest(name, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
bs, err := json.Marshal(m)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
emit.Bytes(w.BinWriter, bs)
|
||||||
|
emit.Bytes(w.BinWriter, avm)
|
||||||
|
emit.Syscall(w.BinWriter, interopnames.SystemContractCreate)
|
||||||
|
if w.Err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
return transaction.New(Network(), w.Bytes(), 100*native.GASFactor), avm, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SignTx signs provided transactions with validator keys.
|
||||||
|
func SignTx(bc blockchainer.Blockchainer, txs ...*transaction.Transaction) error {
|
||||||
|
for _, tx := range txs {
|
||||||
|
size := io.GetVarSize(tx)
|
||||||
|
netFee, sizeDelta := fee.Calculate(ownerScript)
|
||||||
|
tx.NetworkFee += netFee
|
||||||
|
size += sizeDelta
|
||||||
|
tx.NetworkFee += int64(size) * bc.FeePerByte()
|
||||||
|
data := tx.GetSignedPart()
|
||||||
|
tx.Scripts = []transaction.Witness{{
|
||||||
|
InvocationScript: Sign(data),
|
||||||
|
VerificationScript: ownerScript,
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -3,8 +3,8 @@ package compiler
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"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/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/dbft/payload"
|
"github.com/nspcc-dev/dbft/payload"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package consensus
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/nspcc-dev/dbft/block"
|
"github.com/nspcc-dev/dbft/block"
|
||||||
"github.com/nspcc-dev/dbft/payload"
|
"github.com/nspcc-dev/dbft/payload"
|
||||||
"github.com/nspcc-dev/dbft/timer"
|
"github.com/nspcc-dev/dbft/timer"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config"
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core"
|
"github.com/nspcc-dev/neo-go/pkg/core"
|
||||||
|
@ -16,7 +17,6 @@ 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/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
|
|
@ -5,11 +5,11 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/dbft/payload"
|
"github.com/nspcc-dev/dbft/payload"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"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/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"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/nspcc-dev/neo-go/pkg/vm/opcode"
|
||||||
|
|
|
@ -3,9 +3,9 @@ package consensus
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,9 +5,9 @@ import (
|
||||||
|
|
||||||
"github.com/nspcc-dev/dbft/crypto"
|
"github.com/nspcc-dev/dbft/crypto"
|
||||||
"github.com/nspcc-dev/dbft/payload"
|
"github.com/nspcc-dev/dbft/payload"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -7,11 +7,11 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"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/encoding/address"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
|
@ -4,10 +4,10 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"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/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
|
@ -7,8 +7,8 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,11 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/chaindump"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/mempool"
|
"github.com/nspcc-dev/neo-go/pkg/core/mempool"
|
||||||
|
@ -18,8 +21,6 @@ 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/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
||||||
|
@ -132,7 +133,7 @@ func TestAddBlockStateRoot(t *testing.T) {
|
||||||
tx := newNEP17Transfer(bc.contracts.NEO.Hash, neoOwner, util.Uint160{}, 1)
|
tx := newNEP17Transfer(bc.contracts.NEO.Hash, neoOwner, util.Uint160{}, 1)
|
||||||
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
||||||
addSigners(tx)
|
addSigners(tx)
|
||||||
require.NoError(t, signTx(bc, tx))
|
require.NoError(t, testchain.SignTx(bc, tx))
|
||||||
|
|
||||||
lastBlock := bc.topBlock.Load().(*block.Block)
|
lastBlock := bc.topBlock.Load().(*block.Block)
|
||||||
b := newBlock(bc.config, lastBlock.Index+1, lastBlock.Hash(), tx)
|
b := newBlock(bc.config, lastBlock.Index+1, lastBlock.Hash(), tx)
|
||||||
|
@ -158,7 +159,7 @@ func TestAddBadBlock(t *testing.T) {
|
||||||
Account: testchain.MultisigScriptHash(),
|
Account: testchain.MultisigScriptHash(),
|
||||||
Scopes: transaction.None,
|
Scopes: transaction.None,
|
||||||
}}
|
}}
|
||||||
require.NoError(t, signTx(bc, tx))
|
require.NoError(t, testchain.SignTx(bc, tx))
|
||||||
b1 := bc.newBlock(tx)
|
b1 := bc.newBlock(tx)
|
||||||
|
|
||||||
require.Error(t, bc.AddBlock(b1))
|
require.Error(t, bc.AddBlock(b1))
|
||||||
|
@ -178,7 +179,7 @@ func TestAddBadBlock(t *testing.T) {
|
||||||
Account: testchain.MultisigScriptHash(),
|
Account: testchain.MultisigScriptHash(),
|
||||||
Scopes: transaction.None,
|
Scopes: transaction.None,
|
||||||
}}
|
}}
|
||||||
require.NoError(t, signTx(bc, tx))
|
require.NoError(t, testchain.SignTx(bc, tx))
|
||||||
require.NoError(t, bc.PoolTx(tx))
|
require.NoError(t, bc.PoolTx(tx))
|
||||||
bc.config.VerifyTransactions = true
|
bc.config.VerifyTransactions = true
|
||||||
bc.config.VerifyBlocks = true
|
bc.config.VerifyBlocks = true
|
||||||
|
@ -191,7 +192,7 @@ func TestGetHeader(t *testing.T) {
|
||||||
tx := transaction.New(netmode.UnitTestNet, []byte{byte(opcode.PUSH1)}, 0)
|
tx := transaction.New(netmode.UnitTestNet, []byte{byte(opcode.PUSH1)}, 0)
|
||||||
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
||||||
addSigners(tx)
|
addSigners(tx)
|
||||||
assert.Nil(t, signTx(bc, tx))
|
assert.Nil(t, testchain.SignTx(bc, tx))
|
||||||
block := bc.newBlock(tx)
|
block := bc.newBlock(tx)
|
||||||
err := bc.AddBlock(block)
|
err := bc.AddBlock(block)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
@ -276,7 +277,7 @@ func TestVerifyTx(t *testing.T) {
|
||||||
|
|
||||||
txMove := bc.newTestTx(neoOwner, w.Bytes())
|
txMove := bc.newTestTx(neoOwner, w.Bytes())
|
||||||
txMove.SystemFee = 1_000_000_000
|
txMove.SystemFee = 1_000_000_000
|
||||||
require.NoError(t, signTx(bc, txMove))
|
require.NoError(t, testchain.SignTx(bc, txMove))
|
||||||
b := bc.newBlock(txMove)
|
b := bc.newBlock(txMove)
|
||||||
require.NoError(t, bc.AddBlock(b))
|
require.NoError(t, bc.AddBlock(b))
|
||||||
|
|
||||||
|
@ -804,12 +805,12 @@ func TestMemPoolRemoval(t *testing.T) {
|
||||||
notAddedTxes := make([]*transaction.Transaction, notAdded)
|
notAddedTxes := make([]*transaction.Transaction, notAdded)
|
||||||
for i := range addedTxes {
|
for i := range addedTxes {
|
||||||
addedTxes[i] = bc.newTestTx(testchain.MultisigScriptHash(), []byte{byte(opcode.PUSH1)})
|
addedTxes[i] = bc.newTestTx(testchain.MultisigScriptHash(), []byte{byte(opcode.PUSH1)})
|
||||||
require.NoError(t, signTx(bc, addedTxes[i]))
|
require.NoError(t, testchain.SignTx(bc, addedTxes[i]))
|
||||||
require.NoError(t, bc.PoolTx(addedTxes[i]))
|
require.NoError(t, bc.PoolTx(addedTxes[i]))
|
||||||
}
|
}
|
||||||
for i := range notAddedTxes {
|
for i := range notAddedTxes {
|
||||||
notAddedTxes[i] = bc.newTestTx(testchain.MultisigScriptHash(), []byte{byte(opcode.PUSH1)})
|
notAddedTxes[i] = bc.newTestTx(testchain.MultisigScriptHash(), []byte{byte(opcode.PUSH1)})
|
||||||
require.NoError(t, signTx(bc, notAddedTxes[i]))
|
require.NoError(t, testchain.SignTx(bc, notAddedTxes[i]))
|
||||||
require.NoError(t, bc.PoolTx(notAddedTxes[i]))
|
require.NoError(t, bc.PoolTx(notAddedTxes[i]))
|
||||||
}
|
}
|
||||||
b := bc.newBlock(addedTxes...)
|
b := bc.newBlock(addedTxes...)
|
||||||
|
@ -853,7 +854,7 @@ func TestGetTransaction(t *testing.T) {
|
||||||
Account: testchain.MultisigScriptHash(),
|
Account: testchain.MultisigScriptHash(),
|
||||||
Scopes: transaction.CalledByEntry,
|
Scopes: transaction.CalledByEntry,
|
||||||
}}
|
}}
|
||||||
require.NoError(t, signTx(bc, tx1, tx2))
|
require.NoError(t, testchain.SignTx(bc, tx1, tx2))
|
||||||
b1 := bc.newBlock(tx1)
|
b1 := bc.newBlock(tx1)
|
||||||
|
|
||||||
assert.Nil(t, bc.AddBlock(b1))
|
assert.Nil(t, bc.AddBlock(b1))
|
||||||
|
@ -954,7 +955,7 @@ func TestSubscriptions(t *testing.T) {
|
||||||
txGood1.Signers = []transaction.Signer{{Account: neoOwner}}
|
txGood1.Signers = []transaction.Signer{{Account: neoOwner}}
|
||||||
txGood1.Nonce = 1
|
txGood1.Nonce = 1
|
||||||
txGood1.ValidUntilBlock = 1024
|
txGood1.ValidUntilBlock = 1024
|
||||||
require.NoError(t, signTx(bc, txGood1))
|
require.NoError(t, testchain.SignTx(bc, txGood1))
|
||||||
|
|
||||||
// Reset() reuses the script buffer and we need to keep scripts.
|
// Reset() reuses the script buffer and we need to keep scripts.
|
||||||
script = io.NewBufBinWriter()
|
script = io.NewBufBinWriter()
|
||||||
|
@ -966,7 +967,7 @@ func TestSubscriptions(t *testing.T) {
|
||||||
txBad.Signers = []transaction.Signer{{Account: neoOwner}}
|
txBad.Signers = []transaction.Signer{{Account: neoOwner}}
|
||||||
txBad.Nonce = 2
|
txBad.Nonce = 2
|
||||||
txBad.ValidUntilBlock = 1024
|
txBad.ValidUntilBlock = 1024
|
||||||
require.NoError(t, signTx(bc, txBad))
|
require.NoError(t, testchain.SignTx(bc, txBad))
|
||||||
|
|
||||||
script = io.NewBufBinWriter()
|
script = io.NewBufBinWriter()
|
||||||
emit.Bytes(script.BinWriter, []byte("yay! yay! yay!"))
|
emit.Bytes(script.BinWriter, []byte("yay! yay! yay!"))
|
||||||
|
@ -976,7 +977,7 @@ func TestSubscriptions(t *testing.T) {
|
||||||
txGood2.Signers = []transaction.Signer{{Account: neoOwner}}
|
txGood2.Signers = []transaction.Signer{{Account: neoOwner}}
|
||||||
txGood2.Nonce = 3
|
txGood2.Nonce = 3
|
||||||
txGood2.ValidUntilBlock = 1024
|
txGood2.ValidUntilBlock = 1024
|
||||||
require.NoError(t, signTx(bc, txGood2))
|
require.NoError(t, testchain.SignTx(bc, txGood2))
|
||||||
|
|
||||||
invBlock := newBlock(bc.config, bc.BlockHeight()+1, bc.CurrentHeaderHash(), txGood1, txBad, txGood2)
|
invBlock := newBlock(bc.config, bc.BlockHeight()+1, bc.CurrentHeaderHash(), txGood1, txBad, txGood2)
|
||||||
require.NoError(t, bc.AddBlock(invBlock))
|
require.NoError(t, bc.AddBlock(invBlock))
|
||||||
|
@ -1032,3 +1033,63 @@ func TestSubscriptions(t *testing.T) {
|
||||||
_, err = bc.genBlocks(2 * chBufSize)
|
_, err = bc.genBlocks(2 * chBufSize)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testDumpAndRestore(t *testing.T, stateRootInHeader bool) {
|
||||||
|
bc := newTestChainWithStateRoot(t, stateRootInHeader)
|
||||||
|
defer bc.Close()
|
||||||
|
|
||||||
|
initBasicChain(t, bc)
|
||||||
|
require.True(t, bc.BlockHeight() > 5) // ensure that test is valid
|
||||||
|
|
||||||
|
w := io.NewBufBinWriter()
|
||||||
|
require.NoError(t, chaindump.Dump(bc, w.BinWriter, 0, bc.BlockHeight()+1))
|
||||||
|
require.NoError(t, w.Err)
|
||||||
|
|
||||||
|
buf := w.Bytes()
|
||||||
|
t.Run("invalid start", func(t *testing.T) {
|
||||||
|
bc2 := newTestChainWithStateRoot(t, stateRootInHeader)
|
||||||
|
defer bc2.Close()
|
||||||
|
|
||||||
|
r := io.NewBinReaderFromBuf(buf)
|
||||||
|
require.Error(t, chaindump.Restore(bc2, r, 2, 1, nil))
|
||||||
|
})
|
||||||
|
t.Run("good", func(t *testing.T) {
|
||||||
|
bc2 := newTestChainWithStateRoot(t, stateRootInHeader)
|
||||||
|
defer bc2.Close()
|
||||||
|
|
||||||
|
r := io.NewBinReaderFromBuf(buf)
|
||||||
|
require.NoError(t, chaindump.Restore(bc2, r, 0, 2, nil))
|
||||||
|
require.Equal(t, uint32(1), bc2.BlockHeight())
|
||||||
|
|
||||||
|
r = io.NewBinReaderFromBuf(buf) // new reader because start is relative to dump
|
||||||
|
require.NoError(t, chaindump.Restore(bc2, r, 2, 1, nil))
|
||||||
|
t.Run("check handler", func(t *testing.T) {
|
||||||
|
lastIndex := uint32(0)
|
||||||
|
errStopped := errors.New("stopped")
|
||||||
|
f := func(b *block.Block) error {
|
||||||
|
lastIndex = b.Index
|
||||||
|
if b.Index >= bc.BlockHeight()-1 {
|
||||||
|
return errStopped
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
require.NoError(t, chaindump.Restore(bc2, r, 0, 1, f))
|
||||||
|
require.Equal(t, bc2.BlockHeight(), lastIndex)
|
||||||
|
|
||||||
|
r = io.NewBinReaderFromBuf(buf)
|
||||||
|
err := chaindump.Restore(bc2, r, 4, bc.BlockHeight()-bc2.BlockHeight(), f)
|
||||||
|
require.True(t, errors.Is(err, errStopped))
|
||||||
|
require.Equal(t, bc.BlockHeight()-1, lastIndex)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDumpAndRestore(t *testing.T) {
|
||||||
|
t.Run("no state root", func(t *testing.T) {
|
||||||
|
testDumpAndRestore(t, false)
|
||||||
|
})
|
||||||
|
t.Run("with state root", func(t *testing.T) {
|
||||||
|
testDumpAndRestore(t, true)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
77
pkg/core/chaindump/dump.go
Normal file
77
pkg/core/chaindump/dump.go
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
package chaindump
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/blockchainer"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Dump writes count blocks from start to the provided writer.
|
||||||
|
// Note: header needs to be written separately by client.
|
||||||
|
func Dump(bc blockchainer.Blockchainer, w *io.BinWriter, start, count uint32) error {
|
||||||
|
for i := start; i < start+count; i++ {
|
||||||
|
bh := bc.GetHeaderHash(int(i))
|
||||||
|
b, err := bc.GetBlock(bh)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
buf := io.NewBufBinWriter()
|
||||||
|
b.EncodeBinary(buf.BinWriter)
|
||||||
|
bytes := buf.Bytes()
|
||||||
|
w.WriteU32LE(uint32(len(bytes)))
|
||||||
|
w.WriteBytes(bytes)
|
||||||
|
if w.Err != nil {
|
||||||
|
return w.Err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore restores blocks from provided reader.
|
||||||
|
// f is called after addition of every block.
|
||||||
|
func Restore(bc blockchainer.Blockchainer, r *io.BinReader, skip, count uint32, f func(b *block.Block) error) error {
|
||||||
|
readBlock := func(r *io.BinReader) ([]byte, error) {
|
||||||
|
var size = r.ReadU32LE()
|
||||||
|
buf := make([]byte, size)
|
||||||
|
r.ReadBytes(buf)
|
||||||
|
return buf, r.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
i := uint32(0)
|
||||||
|
for ; i < skip; i++ {
|
||||||
|
_, err := readBlock(r)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
magic := bc.GetConfig().Magic
|
||||||
|
stateRootInHeader := bc.GetConfig().StateRootInHeader
|
||||||
|
|
||||||
|
for ; i < skip+count; i++ {
|
||||||
|
buf, err := readBlock(r)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
b := block.New(magic, stateRootInHeader)
|
||||||
|
r := io.NewBinReaderFromBuf(buf)
|
||||||
|
b.DecodeBinary(r)
|
||||||
|
if r.Err != nil {
|
||||||
|
return r.Err
|
||||||
|
}
|
||||||
|
if b.Index != 0 || i != 0 || skip != 0 {
|
||||||
|
err = bc.AddBlock(b)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to add block %d: %w", i, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if f != nil {
|
||||||
|
if err := f(b); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -3,11 +3,11 @@ package dao
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
"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/storage"
|
||||||
"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/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
|
@ -4,12 +4,12 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
"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/storage"
|
||||||
"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/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
||||||
|
|
|
@ -11,17 +11,16 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/compiler"
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config"
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/chaindump"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/storage"
|
"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/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/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
@ -171,10 +170,49 @@ func newDumbBlock() *block.Block {
|
||||||
func TestCreateBasicChain(t *testing.T) {
|
func TestCreateBasicChain(t *testing.T) {
|
||||||
const saveChain = false
|
const saveChain = false
|
||||||
const prefix = "../rpc/server/testdata/"
|
const prefix = "../rpc/server/testdata/"
|
||||||
// To make enough GAS.
|
|
||||||
const numOfEmptyBlocks = 200
|
bc := newTestChain(t)
|
||||||
|
defer bc.Close()
|
||||||
|
initBasicChain(t, bc)
|
||||||
|
|
||||||
|
if saveChain {
|
||||||
|
outStream, err := os.Create(prefix + "testblocks.acc")
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer outStream.Close()
|
||||||
|
|
||||||
|
writer := io.NewBinWriterFromIO(outStream)
|
||||||
|
writer.WriteU32LE(bc.BlockHeight())
|
||||||
|
err = chaindump.Dump(bc, writer, 1, bc.BlockHeight())
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
priv0 := testchain.PrivateKeyByID(0)
|
||||||
|
priv1 := testchain.PrivateKeyByID(1)
|
||||||
|
priv0ScriptHash := priv0.GetScriptHash()
|
||||||
|
acc0, err := wallet.NewAccountFromWIF(priv0.WIF())
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Prepare some transaction for future submission.
|
||||||
|
txSendRaw := newNEP17Transfer(bc.contracts.NEO.Hash, priv0ScriptHash, priv1.GetScriptHash(), int64(util.Fixed8FromInt64(1000)))
|
||||||
|
txSendRaw.ValidUntilBlock = transaction.MaxValidUntilBlockIncrement
|
||||||
|
txSendRaw.Nonce = 0x1234
|
||||||
|
txSendRaw.Signers = []transaction.Signer{{
|
||||||
|
Account: priv0ScriptHash,
|
||||||
|
Scopes: transaction.CalledByEntry,
|
||||||
|
AllowedContracts: nil,
|
||||||
|
AllowedGroups: nil,
|
||||||
|
}}
|
||||||
|
require.NoError(t, addNetworkFee(bc, txSendRaw, acc0))
|
||||||
|
require.NoError(t, acc0.SignTx(txSendRaw))
|
||||||
|
bw := io.NewBufBinWriter()
|
||||||
|
txSendRaw.EncodeBinary(bw.BinWriter)
|
||||||
|
t.Logf("sendrawtransaction: %s", hex.EncodeToString(bw.Bytes()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func initBasicChain(t *testing.T, bc *Blockchain) {
|
||||||
|
const prefix = "../rpc/server/testdata/"
|
||||||
// Increase in case if you need more blocks
|
// Increase in case if you need more blocks
|
||||||
const validUntilBlock = numOfEmptyBlocks + 1000
|
const validUntilBlock = 1200
|
||||||
|
|
||||||
// To be incremented after each created transaction to keep chain constant.
|
// To be incremented after each created transaction to keep chain constant.
|
||||||
var testNonce uint32 = 1
|
var testNonce uint32 = 1
|
||||||
|
@ -186,8 +224,6 @@ func TestCreateBasicChain(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const neoAmount = 99999000
|
const neoAmount = 99999000
|
||||||
bc := newTestChain(t)
|
|
||||||
defer bc.Close()
|
|
||||||
|
|
||||||
gasHash := bc.contracts.GAS.Hash
|
gasHash := bc.contracts.GAS.Hash
|
||||||
neoHash := bc.contracts.NEO.Hash
|
neoHash := bc.contracts.NEO.Hash
|
||||||
|
@ -201,27 +237,13 @@ func TestCreateBasicChain(t *testing.T) {
|
||||||
|
|
||||||
require.Equal(t, big.NewInt(5000_0000), bc.GetUtilityTokenBalance(priv0ScriptHash)) // gas bounty
|
require.Equal(t, big.NewInt(5000_0000), bc.GetUtilityTokenBalance(priv0ScriptHash)) // gas bounty
|
||||||
// Move some NEO to one simple account.
|
// Move some NEO to one simple account.
|
||||||
txMoveNeo := newNEP17Transfer(neoHash, neoOwner, priv0ScriptHash, neoAmount)
|
txMoveNeo, err := testchain.NewTransferFromOwner(bc, neoHash, priv0ScriptHash, neoAmount, getNextNonce(), validUntilBlock)
|
||||||
txMoveNeo.ValidUntilBlock = validUntilBlock
|
require.NoError(t, err)
|
||||||
txMoveNeo.Nonce = getNextNonce()
|
|
||||||
txMoveNeo.Signers = []transaction.Signer{{
|
|
||||||
Account: neoOwner,
|
|
||||||
Scopes: transaction.CalledByEntry,
|
|
||||||
AllowedContracts: nil,
|
|
||||||
AllowedGroups: nil,
|
|
||||||
}}
|
|
||||||
require.NoError(t, signTx(bc, txMoveNeo))
|
|
||||||
// Move some GAS to one simple account.
|
// Move some GAS to one simple account.
|
||||||
txMoveGas := newNEP17Transfer(gasHash, neoOwner, priv0ScriptHash, int64(util.Fixed8FromInt64(1000)))
|
txMoveGas, err := testchain.NewTransferFromOwner(bc, gasHash, priv0ScriptHash, int64(util.Fixed8FromInt64(1000)),
|
||||||
txMoveGas.ValidUntilBlock = validUntilBlock
|
getNextNonce(), validUntilBlock)
|
||||||
txMoveGas.Nonce = getNextNonce()
|
require.NoError(t, err)
|
||||||
txMoveGas.Signers = []transaction.Signer{{
|
|
||||||
Account: neoOwner,
|
|
||||||
Scopes: transaction.CalledByEntry,
|
|
||||||
AllowedContracts: nil,
|
|
||||||
AllowedGroups: nil,
|
|
||||||
}}
|
|
||||||
require.NoError(t, signTx(bc, txMoveGas))
|
|
||||||
b := bc.newBlock(txMoveNeo, txMoveGas)
|
b := bc.newBlock(txMoveNeo, txMoveGas)
|
||||||
require.NoError(t, bc.AddBlock(b))
|
require.NoError(t, bc.AddBlock(b))
|
||||||
t.Logf("Block1 hash: %s", b.Hash().StringLE())
|
t.Logf("Block1 hash: %s", b.Hash().StringLE())
|
||||||
|
@ -340,44 +362,6 @@ func TestCreateBasicChain(t *testing.T) {
|
||||||
require.NoError(t, acc0.SignTx(txDeploy2))
|
require.NoError(t, acc0.SignTx(txDeploy2))
|
||||||
b = bc.newBlock(txDeploy2)
|
b = bc.newBlock(txDeploy2)
|
||||||
require.NoError(t, bc.AddBlock(b))
|
require.NoError(t, bc.AddBlock(b))
|
||||||
|
|
||||||
if saveChain {
|
|
||||||
outStream, err := os.Create(prefix + "testblocks.acc")
|
|
||||||
require.NoError(t, err)
|
|
||||||
defer outStream.Close()
|
|
||||||
|
|
||||||
writer := io.NewBinWriterFromIO(outStream)
|
|
||||||
|
|
||||||
count := bc.BlockHeight() + 1
|
|
||||||
writer.WriteU32LE(count - 1)
|
|
||||||
|
|
||||||
for i := 1; i < int(count); i++ {
|
|
||||||
bh := bc.GetHeaderHash(i)
|
|
||||||
b, err := bc.GetBlock(bh)
|
|
||||||
require.NoError(t, err)
|
|
||||||
bytes, err := testserdes.EncodeBinary(b)
|
|
||||||
require.NoError(t, err)
|
|
||||||
writer.WriteU32LE(uint32(len(bytes)))
|
|
||||||
writer.WriteBytes(bytes)
|
|
||||||
require.NoError(t, writer.Err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prepare some transaction for future submission.
|
|
||||||
txSendRaw := newNEP17Transfer(neoHash, priv0ScriptHash, priv1.GetScriptHash(), int64(util.Fixed8FromInt64(1000)))
|
|
||||||
txSendRaw.ValidUntilBlock = validUntilBlock
|
|
||||||
txSendRaw.Nonce = getNextNonce()
|
|
||||||
txSendRaw.Signers = []transaction.Signer{{
|
|
||||||
Account: priv0ScriptHash,
|
|
||||||
Scopes: transaction.CalledByEntry,
|
|
||||||
AllowedContracts: nil,
|
|
||||||
AllowedGroups: nil,
|
|
||||||
}}
|
|
||||||
require.NoError(t, addNetworkFee(bc, txSendRaw, acc0))
|
|
||||||
require.NoError(t, acc0.SignTx(txSendRaw))
|
|
||||||
bw = io.NewBufBinWriter()
|
|
||||||
txSendRaw.EncodeBinary(bw.BinWriter)
|
|
||||||
t.Logf("sendrawtransaction: %s", hex.EncodeToString(bw.Bytes()))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newNEP17Transfer(sc, from, to util.Uint160, amount int64) *transaction.Transaction {
|
func newNEP17Transfer(sc, from, to util.Uint160, amount int64) *transaction.Transaction {
|
||||||
|
@ -392,22 +376,12 @@ func newNEP17Transfer(sc, from, to util.Uint160, amount int64) *transaction.Tran
|
||||||
func newDeployTx(t *testing.T, name, ctrName string) (*transaction.Transaction, []byte) {
|
func newDeployTx(t *testing.T, name, ctrName string) (*transaction.Transaction, []byte) {
|
||||||
c, err := ioutil.ReadFile(name)
|
c, err := ioutil.ReadFile(name)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
avm, di, err := compiler.CompileWithDebugInfo(name, bytes.NewReader(c))
|
tx, avm, err := testchain.NewDeployTx(ctrName, bytes.NewReader(c))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
t.Logf("contractHash (%s): %s", name, hash.Hash160(avm).StringLE())
|
t.Logf("contractHash (%s): %s", name, hash.Hash160(avm).StringLE())
|
||||||
t.Logf("contractScript: %x", avm)
|
t.Logf("contractScript: %x", avm)
|
||||||
|
|
||||||
script := io.NewBufBinWriter()
|
return tx, avm
|
||||||
m, err := di.ConvertToManifest(ctrName, nil)
|
|
||||||
require.NoError(t, err)
|
|
||||||
bs, err := json.Marshal(m)
|
|
||||||
require.NoError(t, err)
|
|
||||||
emit.Bytes(script.BinWriter, bs)
|
|
||||||
emit.Bytes(script.BinWriter, avm)
|
|
||||||
emit.Syscall(script.BinWriter, interopnames.SystemContractCreate)
|
|
||||||
txScript := script.Bytes()
|
|
||||||
|
|
||||||
return transaction.New(testchain.Network(), txScript, 100*native.GASFactor), avm
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func addSigners(txs ...*transaction.Transaction) {
|
func addSigners(txs ...*transaction.Transaction) {
|
||||||
|
@ -421,27 +395,6 @@ func addSigners(txs ...*transaction.Transaction) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func signTx(bc *Blockchain, txs ...*transaction.Transaction) error {
|
|
||||||
validators := bc.GetStandByValidators()
|
|
||||||
rawScript, err := smartcontract.CreateDefaultMultiSigRedeemScript(validators)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to sign tx: %w", err)
|
|
||||||
}
|
|
||||||
for _, tx := range txs {
|
|
||||||
size := io.GetVarSize(tx)
|
|
||||||
netFee, sizeDelta := fee.Calculate(rawScript)
|
|
||||||
tx.NetworkFee += netFee
|
|
||||||
size += sizeDelta
|
|
||||||
tx.NetworkFee += int64(size) * bc.FeePerByte()
|
|
||||||
data := tx.GetSignedPart()
|
|
||||||
tx.Scripts = []transaction.Witness{{
|
|
||||||
InvocationScript: testchain.Sign(data),
|
|
||||||
VerificationScript: rawScript,
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func addNetworkFee(bc *Blockchain, tx *transaction.Transaction, sender *wallet.Account) error {
|
func addNetworkFee(bc *Blockchain, tx *transaction.Transaction, sender *wallet.Account) error {
|
||||||
size := io.GetVarSize(tx)
|
size := io.GetVarSize(tx)
|
||||||
netFee, sizeDelta := fee.Calculate(sender.Contract.Script)
|
netFee, sizeDelta := fee.Calculate(sender.Contract.Script)
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/dbft/crypto"
|
"github.com/nspcc-dev/dbft/crypto"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop/callback"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/callback"
|
||||||
|
@ -17,7 +18,6 @@ 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/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
||||||
|
|
|
@ -7,9 +7,9 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"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/internal/random"
|
|
||||||
"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/nspcc-dev/neo-go/pkg/vm/opcode"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
|
@ -3,8 +3,8 @@ package mpt
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/storage"
|
"github.com/nspcc-dev/neo-go/pkg/core/storage"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@ package native
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/dao"
|
"github.com/nspcc-dev/neo-go/pkg/core/dao"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
||||||
|
@ -164,13 +165,13 @@ func TestNativeContract_Invoke(t *testing.T) {
|
||||||
validUntil := chain.blockHeight + 1
|
validUntil := chain.blockHeight + 1
|
||||||
tx.ValidUntilBlock = validUntil
|
tx.ValidUntilBlock = validUntil
|
||||||
addSigners(tx)
|
addSigners(tx)
|
||||||
require.NoError(t, signTx(chain, tx))
|
require.NoError(t, testchain.SignTx(chain, tx))
|
||||||
|
|
||||||
// Enough for Call and other opcodes, but not enough for "sum" call.
|
// Enough for Call and other opcodes, but not enough for "sum" call.
|
||||||
tx2 := transaction.New(chain.GetConfig().Magic, script, testSumPrice*2+8000)
|
tx2 := transaction.New(chain.GetConfig().Magic, script, testSumPrice*2+8000)
|
||||||
tx2.ValidUntilBlock = chain.blockHeight + 1
|
tx2.ValidUntilBlock = chain.blockHeight + 1
|
||||||
addSigners(tx2)
|
addSigners(tx2)
|
||||||
require.NoError(t, signTx(chain, tx2))
|
require.NoError(t, testchain.SignTx(chain, tx2))
|
||||||
|
|
||||||
b := chain.newBlock(tx, tx2)
|
b := chain.newBlock(tx, tx2)
|
||||||
require.NoError(t, chain.AddBlock(b))
|
require.NoError(t, chain.AddBlock(b))
|
||||||
|
@ -262,7 +263,7 @@ func TestNativeContract_InvokeOtherContract(t *testing.T) {
|
||||||
validUntil := chain.blockHeight + 1
|
validUntil := chain.blockHeight + 1
|
||||||
tx.ValidUntilBlock = validUntil
|
tx.ValidUntilBlock = validUntil
|
||||||
addSigners(tx)
|
addSigners(tx)
|
||||||
require.NoError(t, signTx(chain, tx))
|
require.NoError(t, testchain.SignTx(chain, tx))
|
||||||
|
|
||||||
b := chain.newBlock(tx)
|
b := chain.newBlock(tx)
|
||||||
require.NoError(t, chain.AddBlock(b))
|
require.NoError(t, chain.AddBlock(b))
|
||||||
|
@ -289,7 +290,7 @@ func TestAllContractsHaveName(t *testing.T) {
|
||||||
tx := transaction.New(netmode.UnitTestNet, w.Bytes(), 1015570)
|
tx := transaction.New(netmode.UnitTestNet, w.Bytes(), 1015570)
|
||||||
tx.ValidUntilBlock = bc.blockHeight + 1
|
tx.ValidUntilBlock = bc.blockHeight + 1
|
||||||
addSigners(tx)
|
addSigners(tx)
|
||||||
require.NoError(t, signTx(bc, tx))
|
require.NoError(t, testchain.SignTx(bc, tx))
|
||||||
require.NoError(t, bc.AddBlock(bc.newBlock(tx)))
|
require.NoError(t, bc.AddBlock(bc.newBlock(tx)))
|
||||||
|
|
||||||
aers, err := bc.GetAppExecResults(tx.Hash(), trigger.Application)
|
aers, err := bc.GetAppExecResults(tx.Hash(), trigger.Application)
|
||||||
|
|
|
@ -4,12 +4,12 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
||||||
"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/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm"
|
"github.com/nspcc-dev/neo-go/pkg/vm"
|
||||||
|
@ -46,7 +46,7 @@ func (bc *Blockchain) setNodesByRole(t *testing.T, ok bool, r native.Role, nodes
|
||||||
Scopes: transaction.CalledByEntry,
|
Scopes: transaction.CalledByEntry,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
require.NoError(t, signTx(bc, tx))
|
require.NoError(t, testchain.SignTx(bc, tx))
|
||||||
tx.Scripts = append(tx.Scripts, transaction.Witness{
|
tx.Scripts = append(tx.Scripts, transaction.Witness{
|
||||||
InvocationScript: testchain.SignCommittee(tx.GetSignedPart()),
|
InvocationScript: testchain.SignCommittee(tx.GetSignedPart()),
|
||||||
VerificationScript: testchain.CommitteeVerificationScript(),
|
VerificationScript: testchain.CommitteeVerificationScript(),
|
||||||
|
@ -77,7 +77,7 @@ func (bc *Blockchain) getNodesByRole(t *testing.T, ok bool, r native.Role, index
|
||||||
Scopes: transaction.None,
|
Scopes: transaction.None,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
require.NoError(t, signTx(bc, tx))
|
require.NoError(t, testchain.SignTx(bc, tx))
|
||||||
require.NoError(t, bc.AddBlock(bc.newBlock(tx)))
|
require.NoError(t, bc.AddBlock(bc.newBlock(tx)))
|
||||||
|
|
||||||
aer, err := bc.GetAppExecResults(tx.Hash(), trigger.Application)
|
aer, err := bc.GetAppExecResults(tx.Hash(), trigger.Application)
|
||||||
|
|
|
@ -5,11 +5,11 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
||||||
"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/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
@ -87,7 +87,7 @@ func TestNEO_Vote(t *testing.T) {
|
||||||
tx := transaction.New(netmode.UnitTestNet, w.Bytes(), 1000_000_000)
|
tx := transaction.New(netmode.UnitTestNet, w.Bytes(), 1000_000_000)
|
||||||
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
||||||
setSigner(tx, testchain.MultisigScriptHash())
|
setSigner(tx, testchain.MultisigScriptHash())
|
||||||
require.NoError(t, signTx(bc, tx))
|
require.NoError(t, testchain.SignTx(bc, tx))
|
||||||
txs = append(txs, tx)
|
txs = append(txs, tx)
|
||||||
}
|
}
|
||||||
require.NoError(t, bc.AddBlock(bc.newBlock(txs...)))
|
require.NoError(t, bc.AddBlock(bc.newBlock(txs...)))
|
||||||
|
@ -318,7 +318,7 @@ func TestNEO_TransferOnPayment(t *testing.T) {
|
||||||
tx.NetworkFee = 10_000_000
|
tx.NetworkFee = 10_000_000
|
||||||
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
||||||
addSigners(tx)
|
addSigners(tx)
|
||||||
require.NoError(t, signTx(bc, tx))
|
require.NoError(t, testchain.SignTx(bc, tx))
|
||||||
require.NoError(t, bc.AddBlock(bc.newBlock(tx)))
|
require.NoError(t, bc.AddBlock(bc.newBlock(tx)))
|
||||||
|
|
||||||
aer, err := bc.GetAppExecResults(tx.Hash(), trigger.Application)
|
aer, err := bc.GetAppExecResults(tx.Hash(), trigger.Application)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
||||||
|
@ -12,7 +13,6 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
||||||
"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/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
||||||
|
@ -104,7 +104,7 @@ func putOracleRequest(t *testing.T, h util.Uint160, bc *Blockchain,
|
||||||
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
||||||
tx.NetworkFee = 1_000_000
|
tx.NetworkFee = 1_000_000
|
||||||
setSigner(tx, testchain.MultisigScriptHash())
|
setSigner(tx, testchain.MultisigScriptHash())
|
||||||
require.NoError(t, signTx(bc, tx))
|
require.NoError(t, testchain.SignTx(bc, tx))
|
||||||
require.NoError(t, bc.AddBlock(bc.newBlock(tx)))
|
require.NoError(t, bc.AddBlock(bc.newBlock(tx)))
|
||||||
return tx.Hash()
|
return tx.Hash()
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,13 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
||||||
"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/encoding/bigint"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/bigint"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/network/payload"
|
"github.com/nspcc-dev/neo-go/pkg/network/payload"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
||||||
|
@ -231,7 +232,7 @@ func invokeNativePolicyMethod(chain *Blockchain, method string, args ...interfac
|
||||||
validUntil := chain.blockHeight + 1
|
validUntil := chain.blockHeight + 1
|
||||||
tx.ValidUntilBlock = validUntil
|
tx.ValidUntilBlock = validUntil
|
||||||
addSigners(tx)
|
addSigners(tx)
|
||||||
err := signTx(chain, tx)
|
err := testchain.SignTx(chain, tx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,8 @@ package state
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"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/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
|
@ -5,9 +5,9 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"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/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -6,8 +6,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm"
|
"github.com/nspcc-dev/neo-go/pkg/vm"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
|
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
|
@ -3,7 +3,7 @@ package state
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestEncodeDecodeStorageItem(t *testing.T) {
|
func TestEncodeDecodeStorageItem(t *testing.T) {
|
||||||
|
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package transaction
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -10,10 +10,10 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package transaction
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,8 @@ func createGenesisBlock(cfg config.ProtocolConfiguration) (*block.Block, error)
|
||||||
InvocationScript: []byte{},
|
InvocationScript: []byte{},
|
||||||
VerificationScript: []byte{byte(opcode.PUSH1)},
|
VerificationScript: []byte{byte(opcode.PUSH1)},
|
||||||
},
|
},
|
||||||
Network: cfg.Magic,
|
StateRootEnabled: cfg.StateRootInHeader,
|
||||||
|
Network: cfg.Magic,
|
||||||
}
|
}
|
||||||
|
|
||||||
b := &block.Block{
|
b := &block.Block{
|
||||||
|
|
|
@ -3,7 +3,7 @@ package keys
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/keytestcases"
|
"github.com/nspcc-dev/neo-go/internal/keytestcases"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/keytestcases"
|
"github.com/nspcc-dev/neo-go/internal/keytestcases"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"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/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/network/capability"
|
"github.com/nspcc-dev/neo-go/pkg/network/capability"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/network/payload"
|
"github.com/nspcc-dev/neo-go/pkg/network/payload"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/network/capability"
|
"github.com/nspcc-dev/neo-go/pkg/network/capability"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
|
@ -3,7 +3,7 @@ package payload
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@ package payload
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"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/internal/testserdes"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,9 @@ package payload
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"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/internal/testserdes"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@ package payload
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"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/internal/testserdes"
|
|
||||||
. "github.com/nspcc-dev/neo-go/pkg/util"
|
. "github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
|
@ -6,10 +6,10 @@ import (
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"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/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package payload
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@ package payload
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/network/capability"
|
"github.com/nspcc-dev/neo-go/pkg/network/capability"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
||||||
|
@ -21,7 +22,6 @@ import (
|
||||||
"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/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpc/request"
|
"github.com/nspcc-dev/neo-go/pkg/rpc/request"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpc/response/result"
|
"github.com/nspcc-dev/neo-go/pkg/rpc/response/result"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
|
|
|
@ -4,9 +4,9 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/mpt"
|
"github.com/nspcc-dev/neo-go/pkg/core/mpt"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,11 +5,11 @@ import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
||||||
"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/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpc/client"
|
"github.com/nspcc-dev/neo-go/pkg/rpc/client"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
|
|
|
@ -18,14 +18,14 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core"
|
"github.com/nspcc-dev/neo-go/pkg/core"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
||||||
"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/encoding/address"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpc/response"
|
"github.com/nspcc-dev/neo-go/pkg/rpc/response"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpc/response/result"
|
"github.com/nspcc-dev/neo-go/pkg/rpc/response/result"
|
||||||
|
|
|
@ -8,9 +8,9 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core"
|
"github.com/nspcc-dev/neo-go/pkg/core"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpc/response"
|
"github.com/nspcc-dev/neo-go/pkg/rpc/response"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/atomic"
|
"go.uber.org/atomic"
|
||||||
|
|
|
@ -4,12 +4,12 @@ import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop/crypto"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/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/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm"
|
"github.com/nspcc-dev/neo-go/pkg/vm"
|
||||||
|
|
|
@ -4,9 +4,9 @@ import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -3,8 +3,8 @@ package nef
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"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/internal/testserdes"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
|
@ -10,9 +10,9 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/encoding/bigint"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/bigint"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/emit"
|
"github.com/nspcc-dev/neo-go/pkg/vm/emit"
|
||||||
|
|
|
@ -5,9 +5,9 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/keytestcases"
|
||||||
"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/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/keytestcases"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
193
scripts/gendump/main.go
Normal file
193
scripts/gendump/main.go
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"errors"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/chaindump"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
||||||
|
"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/hash"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm/emit"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/wallet"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
"go.uber.org/zap/zapcore"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Takes 1 minute for 100 tx per block and 5000 blocks.
|
||||||
|
const (
|
||||||
|
defaultBlockCount = 5000
|
||||||
|
defaultTxPerBlock = 100
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
outFile = flag.String("out", "", "filename to write dump to")
|
||||||
|
blockCount = flag.Uint("blocks", defaultBlockCount, "number of blocks to generate")
|
||||||
|
txPerBlock = flag.Uint("txs", defaultTxPerBlock, "number of blocks to generate")
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if *outFile == "" {
|
||||||
|
handleError("", errors.New("output file is not provided"))
|
||||||
|
}
|
||||||
|
outStream, err := os.Create(*outFile) // fail early
|
||||||
|
handleError("can't open output file", err)
|
||||||
|
defer outStream.Close()
|
||||||
|
|
||||||
|
const contract = `
|
||||||
|
package contract
|
||||||
|
import "github.com/nspcc-dev/neo-go/pkg/interop/storage"
|
||||||
|
var ctx = storage.GetContext()
|
||||||
|
func Put(key, value []byte) {
|
||||||
|
storage.Put(ctx, key, value)
|
||||||
|
}`
|
||||||
|
|
||||||
|
acc, err := wallet.NewAccount()
|
||||||
|
handleError("can't create new account", err)
|
||||||
|
h := acc.Contract.ScriptHash()
|
||||||
|
|
||||||
|
bc, err := newChain()
|
||||||
|
handleError("can't initialize blockchain", err)
|
||||||
|
|
||||||
|
valScript, err := smartcontract.CreateDefaultMultiSigRedeemScript(bc.GetStandByValidators())
|
||||||
|
handleError("can't create verification script", err)
|
||||||
|
lastBlock, err := bc.GetBlock(bc.GetHeaderHash(int(bc.BlockHeight())))
|
||||||
|
handleError("can't fetch last block", err)
|
||||||
|
|
||||||
|
txMoveNeo, err := testchain.NewTransferFromOwner(bc, bc.GoverningTokenHash(), h, native.NEOTotalSupply, 0, 2)
|
||||||
|
handleError("can't transfer NEO", err)
|
||||||
|
txMoveGas, err := testchain.NewTransferFromOwner(bc, bc.UtilityTokenHash(), h, 2_000_000_000_000_000, 0, 2)
|
||||||
|
handleError("can't tranfser GAS", err)
|
||||||
|
lastBlock = addBlock(bc, lastBlock, valScript, txMoveNeo, txMoveGas)
|
||||||
|
|
||||||
|
tx, avm, err := testchain.NewDeployTx("DumpContract", strings.NewReader(contract))
|
||||||
|
handleError("can't create deploy tx", err)
|
||||||
|
tx.Signers = []transaction.Signer{{
|
||||||
|
Account: h,
|
||||||
|
Scopes: transaction.CalledByEntry,
|
||||||
|
}}
|
||||||
|
tx.NetworkFee = 10_000_000
|
||||||
|
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
||||||
|
handleError("can't sign deploy tx", acc.SignTx(tx))
|
||||||
|
lastBlock = addBlock(bc, lastBlock, valScript, tx)
|
||||||
|
|
||||||
|
contractHash := hash.Hash160(avm)
|
||||||
|
key := make([]byte, 10)
|
||||||
|
value := make([]byte, 10)
|
||||||
|
nonce := uint32(0)
|
||||||
|
|
||||||
|
blocksNum := uint32(*blockCount)
|
||||||
|
txNum := int(*txPerBlock)
|
||||||
|
for i := bc.BlockHeight(); i < blocksNum; i++ {
|
||||||
|
txs := make([]*transaction.Transaction, txNum)
|
||||||
|
for j := 0; j < txNum; j++ {
|
||||||
|
nonce++
|
||||||
|
rand.Read(key)
|
||||||
|
rand.Read(value)
|
||||||
|
|
||||||
|
w := io.NewBufBinWriter()
|
||||||
|
emit.AppCallWithOperationAndArgs(w.BinWriter, contractHash, "put", key, value)
|
||||||
|
handleError("can't create transaction", w.Err)
|
||||||
|
|
||||||
|
tx := transaction.New(netmode.UnitTestNet, w.Bytes(), 4_000_000)
|
||||||
|
tx.ValidUntilBlock = i + 1
|
||||||
|
tx.NetworkFee = 4_000_000
|
||||||
|
tx.Nonce = nonce
|
||||||
|
tx.Signers = []transaction.Signer{{
|
||||||
|
Account: h,
|
||||||
|
Scopes: transaction.CalledByEntry,
|
||||||
|
}}
|
||||||
|
handleError("can't sign tx", acc.SignTx(tx))
|
||||||
|
|
||||||
|
txs[j] = tx
|
||||||
|
}
|
||||||
|
lastBlock = addBlock(bc, lastBlock, valScript, txs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
w := io.NewBinWriterFromIO(outStream)
|
||||||
|
w.WriteU32LE(bc.BlockHeight() + 1)
|
||||||
|
handleError("error during dump", chaindump.Dump(bc, w, 0, bc.BlockHeight()+1))
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleError(msg string, err error) {
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("%s: %v\n", msg, err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newChain() (*core.Blockchain, error) {
|
||||||
|
unitTestNetCfg, err := config.Load("./config", netmode.UnitTestNet)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
unitTestNetCfg.ProtocolConfiguration.VerifyBlocks = false
|
||||||
|
zapCfg := zap.NewDevelopmentConfig()
|
||||||
|
zapCfg.Level = zap.NewAtomicLevelAt(zapcore.InfoLevel)
|
||||||
|
log, err := zapCfg.Build()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
chain, err := core.NewBlockchain(storage.NewMemoryStore(), unitTestNetCfg.ProtocolConfiguration, log)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
go chain.Run()
|
||||||
|
return chain, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func addBlock(bc *core.Blockchain, lastBlock *block.Block, script []byte, txs ...*transaction.Transaction) *block.Block {
|
||||||
|
b, err := newBlock(bc, lastBlock, script, txs...)
|
||||||
|
if err != nil {
|
||||||
|
handleError("can't create block", err)
|
||||||
|
}
|
||||||
|
if err := bc.AddBlock(b); err != nil {
|
||||||
|
handleError("can't add block", err)
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBlock(bc *core.Blockchain, lastBlock *block.Block, script []byte, txs ...*transaction.Transaction) (*block.Block, error) {
|
||||||
|
witness := transaction.Witness{VerificationScript: script}
|
||||||
|
b := &block.Block{
|
||||||
|
Base: block.Base{
|
||||||
|
Network: netmode.UnitTestNet,
|
||||||
|
PrevHash: lastBlock.Hash(),
|
||||||
|
Timestamp: uint64(time.Now().UTC().Unix())*1000 + uint64(lastBlock.Index),
|
||||||
|
Index: lastBlock.Index + 1,
|
||||||
|
NextConsensus: witness.ScriptHash(),
|
||||||
|
Script: witness,
|
||||||
|
},
|
||||||
|
ConsensusData: block.ConsensusData{
|
||||||
|
PrimaryIndex: 0,
|
||||||
|
Nonce: 1111,
|
||||||
|
},
|
||||||
|
Transactions: txs,
|
||||||
|
}
|
||||||
|
if bc.GetConfig().StateRootInHeader {
|
||||||
|
sr, err := bc.GetStateRoot(bc.BlockHeight())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
b.StateRootEnabled = true
|
||||||
|
b.PrevStateRoot = sr.Root
|
||||||
|
}
|
||||||
|
b.RebuildMerkleRoot()
|
||||||
|
b.Script.InvocationScript = testchain.Sign(b.GetSignedPart())
|
||||||
|
return b, nil
|
||||||
|
}
|
Loading…
Reference in a new issue