mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-12-23 03:41:34 +00:00
commit
d47fe392fb
149 changed files with 384 additions and 406 deletions
8
.github/workflows/tests.yml
vendored
8
.github/workflows/tests.yml
vendored
|
@ -156,19 +156,13 @@ jobs:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-22.04, windows-2022, macos-12, macos-14]
|
os: [ubuntu-22.04, windows-2022, macos-12, macos-14]
|
||||||
go_versions: [ '1.21', '1.22', '1.23' ]
|
go_versions: [ '1.22', '1.23' ]
|
||||||
exclude:
|
exclude:
|
||||||
# Only latest Go version for Windows and MacOS.
|
# Only latest Go version for Windows and MacOS.
|
||||||
- os: windows-2022
|
|
||||||
go_versions: '1.21'
|
|
||||||
- os: windows-2022
|
- os: windows-2022
|
||||||
go_versions: '1.22'
|
go_versions: '1.22'
|
||||||
- os: macos-12
|
|
||||||
go_versions: '1.21'
|
|
||||||
- os: macos-12
|
- os: macos-12
|
||||||
go_versions: '1.22'
|
go_versions: '1.22'
|
||||||
- os: macos-14
|
|
||||||
go_versions: '1.21'
|
|
||||||
- os: macos-14
|
- os: macos-14
|
||||||
go_versions: '1.22'
|
go_versions: '1.22'
|
||||||
# Exclude latest Go version for Ubuntu as Coverage uses it.
|
# Exclude latest Go version for Ubuntu as Coverage uses it.
|
||||||
|
|
|
@ -51,7 +51,7 @@ NeoGo, `:latest` points to the latest release) or build yourself.
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
Building NeoGo requires Go 1.21+ and `make`:
|
Building NeoGo requires Go 1.22+ and `make`:
|
||||||
|
|
||||||
```
|
```
|
||||||
make
|
make
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"math/big"
|
"math/big"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -80,7 +81,7 @@ func TestNEP17Balance(t *testing.T) {
|
||||||
|
|
||||||
e.CheckNextLine(t, "^Account "+testcli.TestWalletMultiAccount1)
|
e.CheckNextLine(t, "^Account "+testcli.TestWalletMultiAccount1)
|
||||||
// The order of assets is undefined.
|
// The order of assets is undefined.
|
||||||
for i := 0; i < 2; i++ {
|
for range 2 {
|
||||||
line := e.GetNextLine(t)
|
line := e.GetNextLine(t)
|
||||||
if strings.Contains(line, "GAS") {
|
if strings.Contains(line, "GAS") {
|
||||||
e.CheckLine(t, line, "^\\s*GAS:\\s+GasToken \\("+e.Chain.UtilityTokenHash().StringLE()+"\\)")
|
e.CheckLine(t, line, "^\\s*GAS:\\s+GasToken \\("+e.Chain.UtilityTokenHash().StringLE()+"\\)")
|
||||||
|
@ -133,8 +134,7 @@ func TestNEP17Transfer(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("missing receiver", func(t *testing.T) {
|
t.Run("missing receiver", func(t *testing.T) {
|
||||||
as := append([]string{}, args[:8]...)
|
as := slices.Concat(args[:8], args[10:])
|
||||||
as = append(as, args[10:]...)
|
|
||||||
e.In.WriteString("one\r")
|
e.In.WriteString("one\r")
|
||||||
e.RunWithErrorCheck(t, `Required flag "to" not set`, as...)
|
e.RunWithErrorCheck(t, `Required flag "to" not set`, as...)
|
||||||
e.In.Reset()
|
e.In.Reset()
|
||||||
|
|
|
@ -200,11 +200,10 @@ func queryCandidates(ctx *cli.Context) error {
|
||||||
if !a.Active && b.Active {
|
if !a.Active && b.Active {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
res := cmp.Compare(a.Votes, b.Votes)
|
return cmp.Or(
|
||||||
if res != 0 {
|
cmp.Compare(a.Votes, b.Votes),
|
||||||
return res
|
a.PublicKey.Cmp(&b.PublicKey),
|
||||||
}
|
)
|
||||||
return a.PublicKey.Cmp(&b.PublicKey)
|
|
||||||
})
|
})
|
||||||
var res []byte
|
var res []byte
|
||||||
res = fmt.Appendf(res, "Key\tVotes\tCommittee\tConsensus\n")
|
res = fmt.Appendf(res, "Key\tVotes\tCommittee\tConsensus\n")
|
||||||
|
|
|
@ -417,7 +417,7 @@ func initSmartContract(ctx *cli.Context) error {
|
||||||
|
|
||||||
gm := []byte("module " + contractName + `
|
gm := []byte("module " + contractName + `
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/nspcc-dev/neo-go/pkg/interop ` + ver + `
|
github.com/nspcc-dev/neo-go/pkg/interop ` + ver + `
|
||||||
|
|
|
@ -353,7 +353,7 @@ require (
|
||||||
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0
|
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0
|
||||||
)
|
)
|
||||||
replace github.com/nspcc-dev/neo-go/pkg/interop => ` + filepath.Join(wd, "../../pkg/interop") + `
|
replace github.com/nspcc-dev/neo-go/pkg/interop => ` + filepath.Join(wd, "../../pkg/interop") + `
|
||||||
go 1.21`)
|
go 1.22`)
|
||||||
require.NoError(t, os.WriteFile(filepath.Join(tmpDir, "go.mod"), goMod, os.ModePerm))
|
require.NoError(t, os.WriteFile(filepath.Join(tmpDir, "go.mod"), goMod, os.ModePerm))
|
||||||
return filename
|
return filename
|
||||||
}
|
}
|
||||||
|
|
|
@ -362,7 +362,7 @@ func getMatchingTokenRPC(ctx *cli.Context, c *rpcclient.Client, addr util.Uint16
|
||||||
func getMatchingTokenAux(ctx *cli.Context, get func(i int) *wallet.Token, n int, name string, standard string) (*wallet.Token, error) {
|
func getMatchingTokenAux(ctx *cli.Context, get func(i int) *wallet.Token, n int, name string, standard string) (*wallet.Token, error) {
|
||||||
var token *wallet.Token
|
var token *wallet.Token
|
||||||
var count int
|
var count int
|
||||||
for i := 0; i < n; i++ {
|
for i := range n {
|
||||||
t := get(i)
|
t := get(i)
|
||||||
if t != nil && (t.Hash.StringLE() == name || t.Address() == name || t.Symbol == name || t.Name == name) && t.Standard == standard {
|
if t != nil && (t.Hash.StringLE() == name || t.Address() == name || t.Symbol == name || t.Name == name) && t.Standard == standard {
|
||||||
if count == 1 {
|
if count == 1 {
|
||||||
|
@ -540,7 +540,7 @@ func multiTransferNEP17(ctx *cli.Context) error {
|
||||||
recipients []transferTarget
|
recipients []transferTarget
|
||||||
cosignersSepPos = ctx.NArg() // `--` position.
|
cosignersSepPos = ctx.NArg() // `--` position.
|
||||||
)
|
)
|
||||||
for i := 0; i < ctx.NArg(); i++ {
|
for i := range ctx.NArg() {
|
||||||
arg := ctx.Args().Get(i)
|
arg := ctx.Args().Get(i)
|
||||||
if arg == cmdargs.CosignersSeparator {
|
if arg == cmdargs.CosignersSeparator {
|
||||||
cosignersSepPos = i
|
cosignersSepPos = i
|
||||||
|
@ -561,7 +561,7 @@ func multiTransferNEP17(ctx *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
cache := make(map[string]*wallet.Token)
|
cache := make(map[string]*wallet.Token)
|
||||||
for i := 0; i < cosignersSepPos; i++ {
|
for i := range cosignersSepPos {
|
||||||
arg := ctx.Args().Get(i)
|
arg := ctx.Args().Get(i)
|
||||||
ss := strings.SplitN(arg, ":", 3)
|
ss := strings.SplitN(arg, ":", 3)
|
||||||
if len(ss) != 3 {
|
if len(ss) != 3 {
|
||||||
|
|
|
@ -1062,7 +1062,7 @@ func TestWalletDumpKeys(t *testing.T) {
|
||||||
e.CheckNextLine(t, pubRegex)
|
e.CheckNextLine(t, pubRegex)
|
||||||
e.CheckNextLine(t, "^\\s*$")
|
e.CheckNextLine(t, "^\\s*$")
|
||||||
e.CheckNextLine(t, "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq")
|
e.CheckNextLine(t, "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq")
|
||||||
for i := 0; i < 4; i++ {
|
for range 4 {
|
||||||
e.CheckNextLine(t, pubRegex)
|
e.CheckNextLine(t, pubRegex)
|
||||||
}
|
}
|
||||||
e.CheckNextLine(t, "^\\s*$")
|
e.CheckNextLine(t, "^\\s*$")
|
||||||
|
@ -1085,7 +1085,7 @@ func TestWalletDumpKeys(t *testing.T) {
|
||||||
cmd := append(cmd, "-a", "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq")
|
cmd := append(cmd, "-a", "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq")
|
||||||
e.Run(t, cmd...)
|
e.Run(t, cmd...)
|
||||||
e.CheckNextLine(t, "3 out of 4 multisig contract")
|
e.CheckNextLine(t, "3 out of 4 multisig contract")
|
||||||
for i := 0; i < 4; i++ {
|
for range 4 {
|
||||||
e.CheckNextLine(t, pubRegex)
|
e.CheckNextLine(t, pubRegex)
|
||||||
}
|
}
|
||||||
e.CheckEOF(t)
|
e.CheckEOF(t)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/engine
|
module github.com/nspcc-dev/neo-go/examples/engine
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/events
|
module github.com/nspcc-dev/neo-go/examples/events
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/iterator
|
module github.com/nspcc-dev/neo-go/examples/iterator
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/nft
|
module github.com/nspcc-dev/neo-go/examples/nft
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/nft-nd-nns
|
module github.com/nspcc-dev/neo-go/examples/nft-nd-nns
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/nspcc-dev/neo-go v0.102.1-0.20231020181554-d89c8801d689
|
github.com/nspcc-dev/neo-go v0.102.1-0.20231020181554-d89c8801d689
|
||||||
|
|
|
@ -158,7 +158,7 @@ func TestRegisterAndRenew(t *testing.T) {
|
||||||
c.InvokeWithFeeFail(t, "GAS limit exceeded", defaultNameServiceSysfee, "register", "neo.org", e.CommitteeHash)
|
c.InvokeWithFeeFail(t, "GAS limit exceeded", defaultNameServiceSysfee, "register", "neo.org", e.CommitteeHash)
|
||||||
c.InvokeWithFeeFail(t, "GAS limit exceeded", defaultNameServiceDomainPrice, "register", "neo.com", e.CommitteeHash)
|
c.InvokeWithFeeFail(t, "GAS limit exceeded", defaultNameServiceDomainPrice, "register", "neo.com", e.CommitteeHash)
|
||||||
var maxLenFragment string
|
var maxLenFragment string
|
||||||
for i := 0; i < maxDomainNameFragmentLength; i++ {
|
for i := range maxDomainNameFragmentLength {
|
||||||
maxLenFragment += "q"
|
maxLenFragment += "q"
|
||||||
}
|
}
|
||||||
c.Invoke(t, true, "isAvailable", maxLenFragment+".com")
|
c.Invoke(t, true, "isAvailable", maxLenFragment+".com")
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/nft-nd
|
module github.com/nspcc-dev/neo-go/examples/nft-nd
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/oracle
|
module github.com/nspcc-dev/neo-go/examples/oracle
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/runtime
|
module github.com/nspcc-dev/neo-go/examples/runtime
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/storage
|
module github.com/nspcc-dev/neo-go/examples/storage
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/timer
|
module github.com/nspcc-dev/neo-go/examples/timer
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/token
|
module github.com/nspcc-dev/neo-go/examples/token
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/zkp/cubic
|
module github.com/nspcc-dev/neo-go/examples/zkp/cubic
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/consensys/gnark v0.10.0
|
github.com/consensys/gnark v0.10.0
|
||||||
|
|
|
@ -315,7 +315,7 @@ func setup(t *testing.T, ccs constraint.ConstraintSystem, phase1ResponsePath str
|
||||||
// receive a []byte, deserialize it, add his contribution and send back to
|
// receive a []byte, deserialize it, add his contribution and send back to
|
||||||
// coordinator, like it is done in https://github.com/bnb-chain/zkbnb-setup
|
// coordinator, like it is done in https://github.com/bnb-chain/zkbnb-setup
|
||||||
// for BN254 elliptic curve.
|
// for BN254 elliptic curve.
|
||||||
for i := 0; i < nContributionsPhase2; i++ {
|
for i := range nContributionsPhase2 {
|
||||||
srs2.Contribute()
|
srs2.Contribute()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/examples/zkp/xor
|
module github.com/nspcc-dev/neo-go/examples/zkp/xor
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -1,6 +1,6 @@
|
||||||
module github.com/nspcc-dev/neo-go
|
module github.com/nspcc-dev/neo-go
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/chzyer/readline v1.5.1
|
github.com/chzyer/readline v1.5.1
|
||||||
|
|
|
@ -19,7 +19,7 @@ var valuesPrefix = []byte{0x01}
|
||||||
func _deploy(data any, isUpdate bool) {
|
func _deploy(data any, isUpdate bool) {
|
||||||
if !isUpdate {
|
if !isUpdate {
|
||||||
ctx := storage.GetContext()
|
ctx := storage.GetContext()
|
||||||
for i := 0; i < valuesCount; i++ {
|
for i := range valuesCount {
|
||||||
key := append(valuesPrefix, byte(i))
|
key := append(valuesPrefix, byte(i))
|
||||||
storage.Put(ctx, key, i)
|
storage.Put(ctx, key, i)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module github.com/nspcc-dev/neo-go/internal/examples/oracle
|
module github.com/nspcc-dev/neo-go/internal/examples/oracle
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
||||||
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20240727093519-1a48f1ce43ec
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
package random
|
package random
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/rand"
|
"math/rand/v2"
|
||||||
"time"
|
|
||||||
|
|
||||||
"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/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
@ -27,14 +26,14 @@ func Bytes(n int) []byte {
|
||||||
|
|
||||||
// Fill fills buffer with random bytes.
|
// Fill fills buffer with random bytes.
|
||||||
func Fill(buf []byte) {
|
func Fill(buf []byte) {
|
||||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
for i := range buf {
|
||||||
// Rand reader returns no errors
|
buf[i] = byte(rand.Int())
|
||||||
r.Read(buf)
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int returns a random integer in [minI,maxI).
|
// Int returns a random integer in [minI,maxI).
|
||||||
func Int(minI, maxI int) int {
|
func Int(minI, maxI int) int {
|
||||||
return minI + rand.Intn(maxI-minI)
|
return minI + rand.IntN(maxI-minI)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint256 returns a random Uint256.
|
// Uint256 returns a random Uint256.
|
||||||
|
@ -48,8 +47,3 @@ func Uint160() util.Uint160 {
|
||||||
str := String(20)
|
str := String(20)
|
||||||
return hash.RipeMD160([]byte(str))
|
return hash.RipeMD160([]byte(str))
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
//nolint:staticcheck
|
|
||||||
rand.Seed(time.Now().UTC().UnixNano())
|
|
||||||
}
|
|
||||||
|
|
|
@ -128,7 +128,7 @@ func CommitteeAddress() string {
|
||||||
// Sign signs data by all consensus nodes and returns invocation script.
|
// Sign signs data by all consensus nodes and returns invocation script.
|
||||||
func Sign(h hash.Hashable) []byte {
|
func Sign(h hash.Hashable) []byte {
|
||||||
buf := io.NewBufBinWriter()
|
buf := io.NewBufBinWriter()
|
||||||
for i := 0; i < 3; i++ {
|
for i := range 3 {
|
||||||
pKey := PrivateKey(i)
|
pKey := PrivateKey(i)
|
||||||
sig := pKey.SignHashable(uint32(Network()), h)
|
sig := pKey.SignHashable(uint32(Network()), h)
|
||||||
if len(sig) != 64 {
|
if len(sig) != 64 {
|
||||||
|
|
|
@ -377,7 +377,7 @@ func (e *Executor) CheckTxTestInvokeOutput(t *testing.T, scriptSize int) {
|
||||||
|
|
||||||
func (e *Executor) CheckScriptDump(t *testing.T, scriptSize int) {
|
func (e *Executor) CheckScriptDump(t *testing.T, scriptSize int) {
|
||||||
e.CheckNextLine(t, `INDEX\s+`)
|
e.CheckNextLine(t, `INDEX\s+`)
|
||||||
for i := 0; i < scriptSize; i++ {
|
for range scriptSize {
|
||||||
e.CheckNextLine(t, `\d+\s+\w+`)
|
e.CheckNextLine(t, `\d+\s+\w+`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,7 +229,7 @@ func isExprNil(e ast.Expr) bool {
|
||||||
// indexOfStruct returns the index of the given field inside that struct.
|
// indexOfStruct returns the index of the given field inside that struct.
|
||||||
// If the struct does not contain that field, it will return -1.
|
// If the struct does not contain that field, it will return -1.
|
||||||
func indexOfStruct(strct *types.Struct, fldName string) int {
|
func indexOfStruct(strct *types.Struct, fldName string) int {
|
||||||
for i := 0; i < strct.NumFields(); i++ {
|
for i := range strct.NumFields() {
|
||||||
if strct.Field(i).Name() == fldName {
|
if strct.Field(i).Name() == fldName {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
|
|
|
@ -383,7 +383,7 @@ func (c *codegen) isVerifyFunc(decl *ast.FuncDecl) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *codegen) clearSlots(n int) {
|
func (c *codegen) clearSlots(n int) {
|
||||||
for i := 0; i < n; i++ {
|
for i := range n {
|
||||||
emit.Opcodes(c.prog.BinWriter, opcode.PUSHNULL)
|
emit.Opcodes(c.prog.BinWriter, opcode.PUSHNULL)
|
||||||
c.emitStoreByIndex(varLocal, i)
|
c.emitStoreByIndex(varLocal, i)
|
||||||
}
|
}
|
||||||
|
@ -680,7 +680,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor {
|
||||||
ast.Walk(c, n.Rhs[0])
|
ast.Walk(c, n.Rhs[0])
|
||||||
c.emitToken(n.Tok, c.typeOf(n.Rhs[0]))
|
c.emitToken(n.Tok, c.typeOf(n.Rhs[0]))
|
||||||
}
|
}
|
||||||
for i := 0; i < len(n.Lhs); i++ {
|
for i := range n.Lhs {
|
||||||
switch t := n.Lhs[i].(type) {
|
switch t := n.Lhs[i].(type) {
|
||||||
case *ast.Ident:
|
case *ast.Ident:
|
||||||
if n.Tok == token.DEFINE {
|
if n.Tok == token.DEFINE {
|
||||||
|
@ -1099,7 +1099,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor {
|
||||||
f := c.typeOf(n.Fun).Underlying().(*types.Signature)
|
f := c.typeOf(n.Fun).Underlying().(*types.Signature)
|
||||||
sz = f.Results().Len()
|
sz = f.Results().Len()
|
||||||
}
|
}
|
||||||
for i := 0; i < sz; i++ {
|
for range sz {
|
||||||
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1662,7 +1662,7 @@ func (c *codegen) dropStackLabel() {
|
||||||
|
|
||||||
func (c *codegen) dropItems(n int) {
|
func (c *codegen) dropItems(n int) {
|
||||||
if n < 4 {
|
if n < 4 {
|
||||||
for i := 0; i < n; i++ {
|
for range n {
|
||||||
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
@ -1930,7 +1930,7 @@ func (c *codegen) convertBuiltin(expr *ast.CallExpr) {
|
||||||
opcode.INC) // x y cnt+1
|
opcode.INC) // x y cnt+1
|
||||||
emit.Jmp(c.prog.BinWriter, opcode.JMPL, start)
|
emit.Jmp(c.prog.BinWriter, opcode.JMPL, start)
|
||||||
c.setLabel(after)
|
c.setLabel(after)
|
||||||
for i := 0; i < 4; i++ { // leave x on stack
|
for range 4 { // leave x on stack
|
||||||
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -2012,7 +2012,7 @@ func (c *codegen) emitConvert(typ stackitem.Type) {
|
||||||
func (c *codegen) convertByteArray(elems []ast.Expr) {
|
func (c *codegen) convertByteArray(elems []ast.Expr) {
|
||||||
buf := make([]byte, len(elems))
|
buf := make([]byte, len(elems))
|
||||||
varIndices := []int{}
|
varIndices := []int{}
|
||||||
for i := 0; i < len(elems); i++ {
|
for i := range elems {
|
||||||
t := c.typeAndValueOf(elems[i])
|
t := c.typeAndValueOf(elems[i])
|
||||||
if t.Value != nil {
|
if t.Value != nil {
|
||||||
val, _ := constant.Int64Val(t.Value)
|
val, _ := constant.Int64Val(t.Value)
|
||||||
|
@ -2508,7 +2508,7 @@ func removeNOPs(b []byte, nopOffsets []int, sequencePoints map[string][]DebugSeq
|
||||||
// 2. Convert instructions.
|
// 2. Convert instructions.
|
||||||
copyOffset := 0
|
copyOffset := 0
|
||||||
l := len(nopOffsets)
|
l := len(nopOffsets)
|
||||||
for i := 0; i < l; i++ {
|
for i := range l {
|
||||||
start := nopOffsets[i]
|
start := nopOffsets[i]
|
||||||
end := len(b)
|
end := len(b)
|
||||||
if i != l-1 {
|
if i != l-1 {
|
||||||
|
|
|
@ -883,11 +883,11 @@ func TestMultipleFuncSameName(t *testing.T) {
|
||||||
func TestConstDontUseSlots(t *testing.T) {
|
func TestConstDontUseSlots(t *testing.T) {
|
||||||
const count = 256
|
const count = 256
|
||||||
buf := bytes.NewBufferString("package foo\n")
|
buf := bytes.NewBufferString("package foo\n")
|
||||||
for i := 0; i < count; i++ {
|
for i := range count {
|
||||||
buf.WriteString(fmt.Sprintf("const n%d = 1\n", i))
|
buf.WriteString(fmt.Sprintf("const n%d = 1\n", i))
|
||||||
}
|
}
|
||||||
buf.WriteString("func Main() int { sum := 0\n")
|
buf.WriteString("func Main() int { sum := 0\n")
|
||||||
for i := 0; i < count; i++ {
|
for i := range count {
|
||||||
buf.WriteString(fmt.Sprintf("sum += n%d\n", i))
|
buf.WriteString(fmt.Sprintf("sum += n%d\n", i))
|
||||||
}
|
}
|
||||||
buf.WriteString("return sum }")
|
buf.WriteString("return sum }")
|
||||||
|
@ -899,11 +899,11 @@ func TestConstDontUseSlots(t *testing.T) {
|
||||||
func TestUnderscoreVarsDontUseSlots(t *testing.T) {
|
func TestUnderscoreVarsDontUseSlots(t *testing.T) {
|
||||||
const count = 128
|
const count = 128
|
||||||
buf := bytes.NewBufferString("package foo\n")
|
buf := bytes.NewBufferString("package foo\n")
|
||||||
for i := 0; i < count; i++ {
|
for i := range count {
|
||||||
buf.WriteString(fmt.Sprintf("var _, n%d = 1, 1\n", i))
|
buf.WriteString(fmt.Sprintf("var _, n%d = 1, 1\n", i))
|
||||||
}
|
}
|
||||||
buf.WriteString("func Main() int { sum := 0\n")
|
buf.WriteString("func Main() int { sum := 0\n")
|
||||||
for i := 0; i < count; i++ {
|
for i := range count {
|
||||||
buf.WriteString(fmt.Sprintf("sum += n%d\n", i))
|
buf.WriteString(fmt.Sprintf("sum += n%d\n", i))
|
||||||
}
|
}
|
||||||
buf.WriteString("return sum }")
|
buf.WriteString("return sum }")
|
||||||
|
|
|
@ -124,7 +124,7 @@ func (c *codegen) inlineCall(f *funcScope, n *ast.CallExpr) {
|
||||||
ast.Walk(c, f.decl.Body)
|
ast.Walk(c, f.decl.Body)
|
||||||
c.setLabel(c.inlineContext[offSz].returnLabel)
|
c.setLabel(c.inlineContext[offSz].returnLabel)
|
||||||
if c.scope.voidCalls[n] {
|
if c.scope.voidCalls[n] {
|
||||||
for i := 0; i < f.decl.Type.Results.NumFields(); i++ {
|
for range f.decl.Type.Results.NumFields() {
|
||||||
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ func TestManyVariables(t *testing.T) {
|
||||||
const count = 155
|
const count = 155
|
||||||
|
|
||||||
buf := bytes.NewBufferString("package main\n")
|
buf := bytes.NewBufferString("package main\n")
|
||||||
for i := 0; i < count; i++ {
|
for i := range count {
|
||||||
buf.WriteString(fmt.Sprintf("var a%d = %d\n", i, i))
|
buf.WriteString(fmt.Sprintf("var a%d = %d\n", i, i))
|
||||||
}
|
}
|
||||||
buf.WriteString("func Main() int {\nreturn 7\n}\n")
|
buf.WriteString("func Main() int {\nreturn 7\n}\n")
|
||||||
|
|
|
@ -361,7 +361,7 @@ func runNativeTestCase(t *testing.T, b *nef.File, di *compiler.DebugInfo, ctr in
|
||||||
if t.CallFlag != md.RequiredFlags {
|
if t.CallFlag != md.RequiredFlags {
|
||||||
return fmt.Errorf("wrong flags %v", t.CallFlag)
|
return fmt.Errorf("wrong flags %v", t.CallFlag)
|
||||||
}
|
}
|
||||||
for i := 0; i < int(t.ParamCount); i++ {
|
for range t.ParamCount {
|
||||||
_ = v.Estack().Pop()
|
_ = v.Estack().Pop()
|
||||||
}
|
}
|
||||||
if v.Estack().Len() != 0 {
|
if v.Estack().Len() != 0 {
|
||||||
|
|
|
@ -151,7 +151,7 @@ func runSyscallTestCase(t *testing.T, ic *interop.Context, realName string,
|
||||||
if ic.VM.Estack().Len() < f.ParamCount {
|
if ic.VM.Estack().Len() < f.ParamCount {
|
||||||
return errors.New("not enough parameters")
|
return errors.New("not enough parameters")
|
||||||
}
|
}
|
||||||
for i := 0; i < f.ParamCount; i++ {
|
for range f.ParamCount {
|
||||||
ic.VM.Estack().Pop()
|
ic.VM.Estack().Pop()
|
||||||
}
|
}
|
||||||
if !tc.isVoid {
|
if !tc.isVoid {
|
||||||
|
@ -385,7 +385,7 @@ func TestInteropTypesComparison(t *testing.T) {
|
||||||
typeCheck := func(t *testing.T, typeName string, typeLen int) {
|
typeCheck := func(t *testing.T, typeName string, typeLen int) {
|
||||||
t.Run(typeName, func(t *testing.T) {
|
t.Run(typeName, func(t *testing.T) {
|
||||||
var ha, hb string
|
var ha, hb string
|
||||||
for i := 0; i < typeLen; i++ {
|
for i := range typeLen {
|
||||||
if i == typeLen-1 {
|
if i == typeLen-1 {
|
||||||
ha += "2"
|
ha += "2"
|
||||||
hb += "3"
|
hb += "3"
|
||||||
|
|
|
@ -195,7 +195,7 @@ func TestService_GetVerified(t *testing.T) {
|
||||||
srv := newTestService(t)
|
srv := newTestService(t)
|
||||||
srv.dbft.Start(0)
|
srv.dbft.Start(0)
|
||||||
var txs []*transaction.Transaction
|
var txs []*transaction.Transaction
|
||||||
for i := 0; i < 4; i++ {
|
for i := range 4 {
|
||||||
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 100000)
|
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 100000)
|
||||||
tx.Nonce = 123 + uint32(i)
|
tx.Nonce = 123 + uint32(i)
|
||||||
tx.ValidUntilBlock = 1
|
tx.ValidUntilBlock = 1
|
||||||
|
@ -208,7 +208,7 @@ func TestService_GetVerified(t *testing.T) {
|
||||||
hashes := []util.Uint256{txs[0].Hash(), txs[1].Hash(), txs[2].Hash()}
|
hashes := []util.Uint256{txs[0].Hash(), txs[1].Hash(), txs[2].Hash()}
|
||||||
|
|
||||||
// Everyone sends a message.
|
// Everyone sends a message.
|
||||||
for i := 0; i < 4; i++ {
|
for i := range 4 {
|
||||||
p := new(Payload)
|
p := new(Payload)
|
||||||
// One PrepareRequest and three ChangeViews.
|
// One PrepareRequest and three ChangeViews.
|
||||||
if i == 1 {
|
if i == 1 {
|
||||||
|
@ -578,7 +578,7 @@ func addSender(t *testing.T, txs ...*transaction.Transaction) {
|
||||||
func signTx(t *testing.T, bc Ledger, txs ...*transaction.Transaction) {
|
func signTx(t *testing.T, bc Ledger, txs ...*transaction.Transaction) {
|
||||||
validators := make([]*keys.PublicKey, 4)
|
validators := make([]*keys.PublicKey, 4)
|
||||||
privNetKeys := make([]*keys.PrivateKey, 4)
|
privNetKeys := make([]*keys.PrivateKey, 4)
|
||||||
for i := 0; i < 4; i++ {
|
for i := range 4 {
|
||||||
privNetKeys[i] = testchain.PrivateKey(i)
|
privNetKeys[i] = testchain.PrivateKey(i)
|
||||||
validators[i] = privNetKeys[i].PublicKey()
|
validators[i] = privNetKeys[i].PublicKey()
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package consensus
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
gio "io"
|
gio "io"
|
||||||
"math/rand"
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/dbft"
|
"github.com/nspcc-dev/dbft"
|
||||||
|
@ -200,7 +200,7 @@ func randomPrepareRequest(t *testing.T) *prepareRequest {
|
||||||
transactionHashes: make([]util.Uint256, txCount),
|
transactionHashes: make([]util.Uint256, txCount),
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < txCount; i++ {
|
for i := range txCount {
|
||||||
req.transactionHashes[i] = random.Uint256()
|
req.transactionHashes[i] = random.Uint256()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ func testRecoveryMessageSetters(t *testing.T, enableStateRoot bool) {
|
||||||
srv := newTestServiceWithState(t, enableStateRoot)
|
srv := newTestServiceWithState(t, enableStateRoot)
|
||||||
privs := make([]*privateKey, testchain.Size())
|
privs := make([]*privateKey, testchain.Size())
|
||||||
pubs := make([]dbft.PublicKey, testchain.Size())
|
pubs := make([]dbft.PublicKey, testchain.Size())
|
||||||
for i := 0; i < testchain.Size(); i++ {
|
for i := range testchain.Size() {
|
||||||
privs[i], pubs[i] = getTestValidator(i)
|
privs[i], pubs[i] = getTestValidator(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ func BenchmarkBlockchain_VerifyWitness(t *testing.B) {
|
||||||
tx := e.NewTx(t, []neotest.Signer{acc}, e.NativeHash(t, nativenames.Gas), "transfer", acc.ScriptHash(), acc.Script(), 1, nil)
|
tx := e.NewTx(t, []neotest.Signer{acc}, e.NativeHash(t, nativenames.Gas), "transfer", acc.ScriptHash(), acc.Script(), 1, nil)
|
||||||
|
|
||||||
t.ResetTimer()
|
t.ResetTimer()
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
_, err := bc.VerifyWitness(tx.Signers[0].Account, tx, &tx.Scripts[0], 100000000)
|
_, err := bc.VerifyWitness(tx.Signers[0].Account, tx, &tx.Scripts[0], 100000000)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
@ -92,9 +92,9 @@ func benchmarkForEachNEP17Transfer(t *testing.B, ps storage.Store, startFromBloc
|
||||||
acc := random.Uint160()
|
acc := random.Uint160()
|
||||||
from := e.Validator.ScriptHash()
|
from := e.Validator.ScriptHash()
|
||||||
|
|
||||||
for j := 0; j < chainHeight; j++ {
|
for range chainHeight {
|
||||||
b := smartcontract.NewBuilder()
|
b := smartcontract.NewBuilder()
|
||||||
for i := 0; i < transfersPerBlock; i++ {
|
for range transfersPerBlock {
|
||||||
b.InvokeWithAssert(gasHash, "transfer", from, acc, 1, nil)
|
b.InvokeWithAssert(gasHash, "transfer", from, acc, 1, nil)
|
||||||
}
|
}
|
||||||
script, err := b.Script()
|
script, err := b.Script()
|
||||||
|
@ -119,7 +119,7 @@ func benchmarkForEachNEP17Transfer(t *testing.B, ps storage.Store, startFromBloc
|
||||||
t.ResetTimer()
|
t.ResetTimer()
|
||||||
t.ReportAllocs()
|
t.ReportAllocs()
|
||||||
t.StartTimer()
|
t.StartTimer()
|
||||||
for i := 0; i < t.N; i++ {
|
for range t.N {
|
||||||
require.NoError(t, bc.ForEachNEP17Transfer(acc, newestTimestamp, func(t *state.NEP17Transfer) (bool, error) {
|
require.NoError(t, bc.ForEachNEP17Transfer(acc, newestTimestamp, func(t *state.NEP17Transfer) (bool, error) {
|
||||||
if t.Timestamp < oldestTimestamp {
|
if t.Timestamp < oldestTimestamp {
|
||||||
// iterating from newest to oldest, already have reached the needed height
|
// iterating from newest to oldest, already have reached the needed height
|
||||||
|
@ -165,7 +165,7 @@ func benchmarkGasPerVote(t *testing.B, ps storage.Store, nRewardRecords int, rew
|
||||||
voters := make([]*wallet.Account, sz)
|
voters := make([]*wallet.Account, sz)
|
||||||
candidates := make(keys.PublicKeys, sz)
|
candidates := make(keys.PublicKeys, sz)
|
||||||
txs := make([]*transaction.Transaction, 0, len(voters)*3)
|
txs := make([]*transaction.Transaction, 0, len(voters)*3)
|
||||||
for i := 0; i < sz; i++ {
|
for i := range sz {
|
||||||
priv, err := keys.NewPrivateKey()
|
priv, err := keys.NewPrivateKey()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
candidates[i] = priv.PublicKey()
|
candidates[i] = priv.PublicKey()
|
||||||
|
@ -186,7 +186,7 @@ func benchmarkGasPerVote(t *testing.B, ps storage.Store, nRewardRecords int, rew
|
||||||
e.CheckHalt(t, tx.Hash())
|
e.CheckHalt(t, tx.Hash())
|
||||||
}
|
}
|
||||||
voteTxs := make([]*transaction.Transaction, 0, sz)
|
voteTxs := make([]*transaction.Transaction, 0, sz)
|
||||||
for i := 0; i < sz; i++ {
|
for i := range sz {
|
||||||
priv := voters[i].PrivateKey()
|
priv := voters[i].PrivateKey()
|
||||||
h := priv.GetScriptHash()
|
h := priv.GetScriptHash()
|
||||||
voteTx := e.NewTx(t, []neotest.Signer{neotest.NewSingleSigner(voters[i])}, neoHash, "vote", h, candidates[i].Bytes())
|
voteTx := e.NewTx(t, []neotest.Signer{neotest.NewSingleSigner(voters[i])}, neoHash, "vote", h, candidates[i].Bytes())
|
||||||
|
@ -211,7 +211,7 @@ func benchmarkGasPerVote(t *testing.B, ps storage.Store, nRewardRecords int, rew
|
||||||
t.ResetTimer()
|
t.ResetTimer()
|
||||||
t.ReportAllocs()
|
t.ReportAllocs()
|
||||||
t.StartTimer()
|
t.StartTimer()
|
||||||
for i := 0; i < t.N; i++ {
|
for range t.N {
|
||||||
_, err := bc.CalculateClaimable(to, end)
|
_, err := bc.CalculateClaimable(to, end)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ func NewTrimmedFromReader(stateRootEnabled bool, br *io.BinReader) (*Block, erro
|
||||||
}
|
}
|
||||||
if lenHashes > 0 {
|
if lenHashes > 0 {
|
||||||
block.Transactions = make([]*transaction.Transaction, lenHashes)
|
block.Transactions = make([]*transaction.Transaction, lenHashes)
|
||||||
for i := 0; i < int(lenHashes); i++ {
|
for i := range lenHashes {
|
||||||
var hash util.Uint256
|
var hash util.Uint256
|
||||||
hash.DecodeBinary(br)
|
hash.DecodeBinary(br)
|
||||||
block.Transactions[i] = transaction.NewTrimmedTX(hash)
|
block.Transactions[i] = transaction.NewTrimmedTX(hash)
|
||||||
|
@ -124,7 +124,7 @@ func (b *Block) DecodeBinary(br *io.BinReader) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
txes := make([]*transaction.Transaction, contentsCount)
|
txes := make([]*transaction.Transaction, contentsCount)
|
||||||
for i := 0; i < int(contentsCount); i++ {
|
for i := range txes {
|
||||||
tx := &transaction.Transaction{}
|
tx := &transaction.Transaction{}
|
||||||
tx.DecodeBinary(br)
|
tx.DecodeBinary(br)
|
||||||
txes[i] = tx
|
txes[i] = tx
|
||||||
|
@ -140,7 +140,7 @@ func (b *Block) DecodeBinary(br *io.BinReader) {
|
||||||
func (b *Block) EncodeBinary(bw *io.BinWriter) {
|
func (b *Block) EncodeBinary(bw *io.BinWriter) {
|
||||||
b.Header.EncodeBinary(bw)
|
b.Header.EncodeBinary(bw)
|
||||||
bw.WriteVarUint(uint64(len(b.Transactions)))
|
bw.WriteVarUint(uint64(len(b.Transactions)))
|
||||||
for i := 0; i < len(b.Transactions); i++ {
|
for i := range b.Transactions {
|
||||||
b.Transactions[i].EncodeBinary(bw)
|
b.Transactions[i].EncodeBinary(bw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ func TestTrimmedBlock(t *testing.T) {
|
||||||
|
|
||||||
assert.Equal(t, block.Script, trimmedBlock.Script)
|
assert.Equal(t, block.Script, trimmedBlock.Script)
|
||||||
assert.Equal(t, len(block.Transactions), len(trimmedBlock.Transactions))
|
assert.Equal(t, len(block.Transactions), len(trimmedBlock.Transactions))
|
||||||
for i := 0; i < len(block.Transactions); i++ {
|
for i := range block.Transactions {
|
||||||
assert.Equal(t, block.Transactions[i].Hash(), trimmedBlock.Transactions[i].Hash())
|
assert.Equal(t, block.Transactions[i].Hash(), trimmedBlock.Transactions[i].Hash())
|
||||||
assert.True(t, trimmedBlock.Transactions[i].Trimmed)
|
assert.True(t, trimmedBlock.Transactions[i].Trimmed)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1203,7 +1203,7 @@ func (bc *Blockchain) resetTransfers(cache *dao.Simple, height uint32) error {
|
||||||
oldBatchSize = v[0]
|
oldBatchSize = v[0]
|
||||||
newBatchSize byte
|
newBatchSize byte
|
||||||
)
|
)
|
||||||
for i := byte(0); i < v[0]; i++ { // From oldest to newest transfer of the batch.
|
for range v[0] { // From oldest to newest transfer of the batch.
|
||||||
var t *state.NEP17Transfer
|
var t *state.NEP17Transfer
|
||||||
if k[0] == byte(storage.STNEP11Transfers) {
|
if k[0] == byte(storage.STNEP11Transfers) {
|
||||||
tr := new(state.NEP11Transfer)
|
tr := new(state.NEP11Transfer)
|
||||||
|
|
|
@ -89,16 +89,16 @@ func TestRemoveOldTransfers(t *testing.T) {
|
||||||
acc3 := util.Uint160{3}
|
acc3 := util.Uint160{3}
|
||||||
ttl := state.TokenTransferLog{Raw: []byte{1}} // It's incorrect, but who cares.
|
ttl := state.TokenTransferLog{Raw: []byte{1}} // It's incorrect, but who cares.
|
||||||
|
|
||||||
for i := uint32(0); i < 3; i++ {
|
for i := range uint32(3) {
|
||||||
bc.dao.PutTokenTransferLog(acc1, older, i, false, &ttl)
|
bc.dao.PutTokenTransferLog(acc1, older, i, false, &ttl)
|
||||||
}
|
}
|
||||||
for i := uint32(0); i < 3; i++ {
|
for i := range uint32(3) {
|
||||||
bc.dao.PutTokenTransferLog(acc2, newer, i, false, &ttl)
|
bc.dao.PutTokenTransferLog(acc2, newer, i, false, &ttl)
|
||||||
}
|
}
|
||||||
for i := uint32(0); i < 2; i++ {
|
for i := range uint32(2) {
|
||||||
bc.dao.PutTokenTransferLog(acc3, older, i, true, &ttl)
|
bc.dao.PutTokenTransferLog(acc3, older, i, true, &ttl)
|
||||||
}
|
}
|
||||||
for i := uint32(0); i < 2; i++ {
|
for i := range uint32(2) {
|
||||||
bc.dao.PutTokenTransferLog(acc3, newer, i, true, &ttl)
|
bc.dao.PutTokenTransferLog(acc3, newer, i, true, &ttl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ func TestRemoveOldTransfers(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_ = bc.removeOldTransfers(0)
|
_ = bc.removeOldTransfers(0)
|
||||||
|
|
||||||
for i := uint32(0); i < 2; i++ {
|
for i := range uint32(2) {
|
||||||
log, err := bc.dao.GetTokenTransferLog(acc1, older, i, false)
|
log, err := bc.dao.GetTokenTransferLog(acc1, older, i, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 0, len(log.Raw))
|
require.Equal(t, 0, len(log.Raw))
|
||||||
|
@ -153,7 +153,7 @@ func TestBlockchain_InitWithIncompleteStateJump(t *testing.T) {
|
||||||
bcSpout := newTestChainWithCustomCfg(t, spountCfg)
|
bcSpout := newTestChainWithCustomCfg(t, spountCfg)
|
||||||
|
|
||||||
// Generate some content.
|
// Generate some content.
|
||||||
for i := 0; i < len(bcSpout.GetConfig().StandbyCommittee); i++ {
|
for range bcSpout.GetConfig().StandbyCommittee {
|
||||||
require.NoError(t, bcSpout.AddBlock(bcSpout.newBlock()))
|
require.NoError(t, bcSpout.AddBlock(bcSpout.newBlock()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -299,7 +299,7 @@ func TestBlockchain_InitializeNeoCache_Bug3181(t *testing.T) {
|
||||||
// Put some empty blocks to reach N-1 block height, so that newEpoch cached
|
// Put some empty blocks to reach N-1 block height, so that newEpoch cached
|
||||||
// values of native Neo contract require an update on the subsequent cache
|
// values of native Neo contract require an update on the subsequent cache
|
||||||
// initialization.
|
// initialization.
|
||||||
for i := 0; i < len(bc.GetConfig().StandbyCommittee)-1-2; i++ {
|
for range len(bc.GetConfig().StandbyCommittee) - 1 - 2 {
|
||||||
e.AddNewBlock(t)
|
e.AddNewBlock(t)
|
||||||
}
|
}
|
||||||
bc.Close() // Ensure persist is done and persistent store is properly closed.
|
bc.Close() // Ensure persist is done and persistent store is properly closed.
|
||||||
|
@ -358,12 +358,12 @@ func TestBlockchain_InitializeNeoCache_Bug3424(t *testing.T) {
|
||||||
// voters vote for candidates.
|
// voters vote for candidates.
|
||||||
voters := make([]neotest.Signer, committeeSize+1)
|
voters := make([]neotest.Signer, committeeSize+1)
|
||||||
candidates := make([]neotest.Signer, committeeSize+1)
|
candidates := make([]neotest.Signer, committeeSize+1)
|
||||||
for i := 0; i < committeeSize+1; i++ {
|
for i := range committeeSize + 1 {
|
||||||
voters[i] = e.NewAccount(t, 10_0000_0000)
|
voters[i] = e.NewAccount(t, 10_0000_0000)
|
||||||
candidates[i] = e.NewAccount(t, 2000_0000_0000) // enough for one registration
|
candidates[i] = e.NewAccount(t, 2000_0000_0000) // enough for one registration
|
||||||
}
|
}
|
||||||
txes := make([]*transaction.Transaction, 0, committeeSize*3)
|
txes := make([]*transaction.Transaction, 0, committeeSize*3)
|
||||||
for i := 0; i < committeeSize+1; i++ {
|
for i := range committeeSize + 1 {
|
||||||
transferTx := neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), voters[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(committeeSize+1-i)*1000000, nil)
|
transferTx := neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), voters[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(committeeSize+1-i)*1000000, nil)
|
||||||
txes = append(txes, transferTx)
|
txes = append(txes, transferTx)
|
||||||
registerTx := neoValidatorsInvoker.WithSigners(candidates[i]).PrepareInvoke(t, "registerCandidate", candidates[i].(neotest.SingleSigner).Account().PublicKey().Bytes())
|
registerTx := neoValidatorsInvoker.WithSigners(candidates[i]).PrepareInvoke(t, "registerCandidate", candidates[i].(neotest.SingleSigner).Account().PublicKey().Bytes())
|
||||||
|
@ -458,7 +458,7 @@ func TestBlockchain_InitializeNativeCacheWrtNativeActivations(t *testing.T) {
|
||||||
|
|
||||||
// Ensure Notary will be properly initialized and accessing Notary cache works
|
// Ensure Notary will be properly initialized and accessing Notary cache works
|
||||||
// as expected.
|
// as expected.
|
||||||
for i := 0; i < notaryEnabledHeight; i++ {
|
for i := range notaryEnabledHeight {
|
||||||
require.NotPanics(t, func() {
|
require.NotPanics(t, func() {
|
||||||
e.AddNewBlock(t)
|
e.AddNewBlock(t)
|
||||||
}, h+uint32(i)+1)
|
}, h+uint32(i)+1)
|
||||||
|
@ -641,7 +641,7 @@ func TestBlockchain_GetBlock(t *testing.T) {
|
||||||
blocks := e.GenerateNewBlocks(t, 10)
|
blocks := e.GenerateNewBlocks(t, 10)
|
||||||
neoValidatorInvoker := e.ValidatorInvoker(e.NativeHash(t, nativenames.Neo))
|
neoValidatorInvoker := e.ValidatorInvoker(e.NativeHash(t, nativenames.Neo))
|
||||||
|
|
||||||
for i := 0; i < len(blocks); i++ {
|
for i := range blocks {
|
||||||
block, err := bc.GetBlock(blocks[i].Hash())
|
block, err := bc.GetBlock(blocks[i].Hash())
|
||||||
require.NoErrorf(t, err, "can't get block %d: %s", i, err)
|
require.NoErrorf(t, err, "can't get block %d: %s", i, err)
|
||||||
assert.Equal(t, blocks[i].Index, block.Index)
|
assert.Equal(t, blocks[i].Index, block.Index)
|
||||||
|
@ -881,7 +881,7 @@ func TestBlockchain_HasBlock(t *testing.T) {
|
||||||
|
|
||||||
blocks := e.GenerateNewBlocks(t, 10)
|
blocks := e.GenerateNewBlocks(t, 10)
|
||||||
|
|
||||||
for i := 0; i < len(blocks); i++ {
|
for i := range blocks {
|
||||||
assert.True(t, bc.HasBlock(blocks[i].Hash()))
|
assert.True(t, bc.HasBlock(blocks[i].Hash()))
|
||||||
}
|
}
|
||||||
newBlock := e.NewUnsignedBlock(t)
|
newBlock := e.NewUnsignedBlock(t)
|
||||||
|
@ -1008,7 +1008,7 @@ func TestBlockchain_Subscriptions(t *testing.T) {
|
||||||
|
|
||||||
// 3 burn events for every tx and 1 mint for primary node
|
// 3 burn events for every tx and 1 mint for primary node
|
||||||
require.True(t, len(notificationCh) >= 4)
|
require.True(t, len(notificationCh) >= 4)
|
||||||
for i := 0; i < 4; i++ {
|
for range 4 {
|
||||||
notif := <-notificationCh
|
notif := <-notificationCh
|
||||||
require.Equal(t, nativeGASHash, notif.ScriptHash)
|
require.Equal(t, nativeGASHash, notif.ScriptHash)
|
||||||
}
|
}
|
||||||
|
@ -2327,7 +2327,7 @@ func TestBlockchain_ResetStateErrors(t *testing.T) {
|
||||||
bc, validators, committee := chain.NewMultiWithCustomConfigAndStore(t, cfg, db, false)
|
bc, validators, committee := chain.NewMultiWithCustomConfigAndStore(t, cfg, db, false)
|
||||||
e := neotest.NewExecutor(t, bc, validators, committee)
|
e := neotest.NewExecutor(t, bc, validators, committee)
|
||||||
go bc.Run()
|
go bc.Run()
|
||||||
for i := 0; i < chainHeight; i++ {
|
for range chainHeight {
|
||||||
e.AddNewBlock(t) // get some height
|
e.AddNewBlock(t) // get some height
|
||||||
}
|
}
|
||||||
bc.Close()
|
bc.Close()
|
||||||
|
|
|
@ -388,7 +388,7 @@ func BenchmarkStoreAsTransaction(b *testing.B) {
|
||||||
|
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for n := 0; n < b.N; n++ {
|
for range b.N {
|
||||||
err := dao.StoreAsTransaction(tx, 1, aer)
|
err := dao.StoreAsTransaction(tx, 1, aer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.FailNow()
|
b.FailNow()
|
||||||
|
|
|
@ -13,7 +13,7 @@ func BenchmarkOpcode1(t *testing.B) {
|
||||||
// Just so that we don't always test the same opcode.
|
// Just so that we don't always test the same opcode.
|
||||||
script := []opcode.Opcode{opcode.NOP, opcode.ADD, opcode.SYSCALL, opcode.APPEND}
|
script := []opcode.Opcode{opcode.NOP, opcode.ADD, opcode.SYSCALL, opcode.APPEND}
|
||||||
l := len(script)
|
l := len(script)
|
||||||
for n := 0; n < t.N; n++ {
|
for n := range t.N {
|
||||||
_ = Opcode(feeFactor, script[n%l])
|
_ = Opcode(feeFactor, script[n%l])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ func (bc *Blockchain) genBlocks(n int) ([]*block.Block, error) {
|
||||||
blocks := make([]*block.Block, n)
|
blocks := make([]*block.Block, n)
|
||||||
lastHash := bc.topBlock.Load().(*block.Block).Hash()
|
lastHash := bc.topBlock.Load().(*block.Block).Hash()
|
||||||
lastIndex := bc.topBlock.Load().(*block.Block).Index
|
lastIndex := bc.topBlock.Load().(*block.Block).Index
|
||||||
for i := 0; i < n; i++ {
|
for i := range n {
|
||||||
blocks[i] = newBlock(bc.config.ProtocolConfiguration, uint32(i)+lastIndex+1, lastHash)
|
blocks[i] = newBlock(bc.config.ProtocolConfiguration, uint32(i)+lastIndex+1, lastHash)
|
||||||
if err := bc.AddBlock(blocks[i]); err != nil {
|
if err := bc.AddBlock(blocks[i]); err != nil {
|
||||||
return blocks, err
|
return blocks, err
|
||||||
|
|
|
@ -363,11 +363,10 @@ func (c *ContractMD) AddMethod(md *MethodAndPrice, desc *manifest.Method) {
|
||||||
desc.Safe = md.RequiredFlags&(callflag.All^callflag.ReadOnly) == 0
|
desc.Safe = md.RequiredFlags&(callflag.All^callflag.ReadOnly) == 0
|
||||||
|
|
||||||
index, _ := slices.BinarySearchFunc(c.methods, *md, func(e, t MethodAndPrice) int {
|
index, _ := slices.BinarySearchFunc(c.methods, *md, func(e, t MethodAndPrice) int {
|
||||||
res := cmp.Compare(e.MD.Name, t.MD.Name)
|
return cmp.Or(
|
||||||
if res != 0 {
|
cmp.Compare(e.MD.Name, t.MD.Name),
|
||||||
return res
|
cmp.Compare(len(e.MD.Parameters), len(t.MD.Parameters)),
|
||||||
}
|
)
|
||||||
return cmp.Compare(len(e.MD.Parameters), len(t.MD.Parameters))
|
|
||||||
})
|
})
|
||||||
c.methods = slices.Insert(c.methods, index, *md)
|
c.methods = slices.Insert(c.methods, index, *md)
|
||||||
|
|
||||||
|
|
|
@ -192,7 +192,7 @@ func TestSystemContractCall_Permissions(t *testing.T) {
|
||||||
e.DeployContract(t, ctrA, nil)
|
e.DeployContract(t, ctrA, nil)
|
||||||
|
|
||||||
var hashAStr string
|
var hashAStr string
|
||||||
for i := 0; i < util.Uint160Size; i++ {
|
for i := range util.Uint160Size {
|
||||||
hashAStr += fmt.Sprintf("%#x", ctrA.Hash[i])
|
hashAStr += fmt.Sprintf("%#x", ctrA.Hash[i])
|
||||||
if i != util.Uint160Size-1 {
|
if i != util.Uint160Size-1 {
|
||||||
hashAStr += ", "
|
hashAStr += ", "
|
||||||
|
@ -367,7 +367,7 @@ func TestSnapshotIsolation_Exceptions(t *testing.T) {
|
||||||
e.DeployContract(t, ctrA, nil)
|
e.DeployContract(t, ctrA, nil)
|
||||||
|
|
||||||
var hashAStr string
|
var hashAStr string
|
||||||
for i := 0; i < util.Uint160Size; i++ {
|
for i := range util.Uint160Size {
|
||||||
hashAStr += fmt.Sprintf("%#x", ctrA.Hash[i])
|
hashAStr += fmt.Sprintf("%#x", ctrA.Hash[i])
|
||||||
if i != util.Uint160Size-1 {
|
if i != util.Uint160Size-1 {
|
||||||
hashAStr += ", "
|
hashAStr += ", "
|
||||||
|
@ -599,7 +599,7 @@ func TestRET_after_FINALLY_PanicInsideVoidMethod(t *testing.T) {
|
||||||
e.DeployContract(t, ctrA, nil)
|
e.DeployContract(t, ctrA, nil)
|
||||||
|
|
||||||
var hashAStr string
|
var hashAStr string
|
||||||
for i := 0; i < util.Uint160Size; i++ {
|
for i := range util.Uint160Size {
|
||||||
hashAStr += fmt.Sprintf("%#x", ctrA.Hash[i])
|
hashAStr += fmt.Sprintf("%#x", ctrA.Hash[i])
|
||||||
if i != util.Uint160Size-1 {
|
if i != util.Uint160Size-1 {
|
||||||
hashAStr += ", "
|
hashAStr += ", "
|
||||||
|
@ -659,7 +659,7 @@ func TestRET_after_FINALLY_CallNonVoidAfterVoidMethod(t *testing.T) {
|
||||||
e.DeployContract(t, ctrA, nil)
|
e.DeployContract(t, ctrA, nil)
|
||||||
|
|
||||||
var hashAStr string
|
var hashAStr string
|
||||||
for i := 0; i < util.Uint160Size; i++ {
|
for i := range util.Uint160Size {
|
||||||
hashAStr += fmt.Sprintf("%#x", ctrA.Hash[i])
|
hashAStr += fmt.Sprintf("%#x", ctrA.Hash[i])
|
||||||
if i != util.Uint160Size-1 {
|
if i != util.Uint160Size-1 {
|
||||||
hashAStr += ", "
|
hashAStr += ", "
|
||||||
|
|
|
@ -32,7 +32,7 @@ func ECDSASecp256r1CheckMultisig(ic *interop.Context) error {
|
||||||
if len(pkeys) < len(sigs) {
|
if len(pkeys) < len(sigs) {
|
||||||
return errors.New("more signatures than there are keys")
|
return errors.New("more signatures than there are keys")
|
||||||
}
|
}
|
||||||
sigok := vm.CheckMultisigPar(ic.VM, elliptic.P256(), hash.NetSha256(ic.Network, ic.Container).BytesBE(), pkeys, sigs)
|
sigok := vm.CheckMultisigPar(elliptic.P256(), hash.NetSha256(ic.Network, ic.Container).BytesBE(), pkeys, sigs)
|
||||||
ic.VM.Estack().PushItem(stackitem.Bool(sigok))
|
ic.VM.Estack().PushItem(stackitem.Bool(sigok))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package runtime
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"math/big"
|
"math/big"
|
||||||
"math/rand"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
@ -46,10 +45,10 @@ func TestPlatform(t *testing.T) {
|
||||||
|
|
||||||
func TestGetTime(t *testing.T) {
|
func TestGetTime(t *testing.T) {
|
||||||
b := block.New(false)
|
b := block.New(false)
|
||||||
b.Timestamp = rand.Uint64()
|
b.Timestamp = 1725021259
|
||||||
ic := &interop.Context{VM: vm.New(), Block: b}
|
ic := &interop.Context{VM: vm.New(), Block: b}
|
||||||
require.NoError(t, GetTime(ic))
|
require.NoError(t, GetTime(ic))
|
||||||
checkStack(t, ic.VM, new(big.Int).SetUint64(b.Timestamp))
|
checkStack(t, ic.VM, new(big.Int).SetUint64(1725021259))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetScriptHash(t *testing.T) {
|
func TestGetScriptHash(t *testing.T) {
|
||||||
|
|
|
@ -84,7 +84,7 @@ func TestRuntimeGetNotifications(t *testing.T) {
|
||||||
require.Error(t, GetNotifications(ic))
|
require.Error(t, GetNotifications(ic))
|
||||||
})
|
})
|
||||||
t.Run("too many notifications", func(t *testing.T) {
|
t.Run("too many notifications", func(t *testing.T) {
|
||||||
for i := 0; i <= vm.MaxStackSize; i++ {
|
for range vm.MaxStackSize + 1 {
|
||||||
ic.Notifications = append(ic.Notifications, state.NotificationEvent{
|
ic.Notifications = append(ic.Notifications, state.NotificationEvent{
|
||||||
ScriptHash: util.Uint160{3},
|
ScriptHash: util.Uint160{3},
|
||||||
Name: "Event3",
|
Name: "Event3",
|
||||||
|
|
|
@ -20,7 +20,7 @@ func BenchmarkStorageFind(b *testing.B) {
|
||||||
require.NoError(b, native.PutContractState(context.DAO, contractState))
|
require.NoError(b, native.PutContractState(context.DAO, contractState))
|
||||||
|
|
||||||
items := make(map[string]state.StorageItem)
|
items := make(map[string]state.StorageItem)
|
||||||
for i := 0; i < count; i++ {
|
for range count {
|
||||||
items["abc"+random.String(10)] = random.Bytes(10)
|
items["abc"+random.String(10)] = random.Bytes(10)
|
||||||
}
|
}
|
||||||
for k, v := range items {
|
for k, v := range items {
|
||||||
|
@ -33,7 +33,7 @@ func BenchmarkStorageFind(b *testing.B) {
|
||||||
|
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
b.StopTimer()
|
b.StopTimer()
|
||||||
v.Estack().PushVal(istorage.FindDefault)
|
v.Estack().PushVal(istorage.FindDefault)
|
||||||
v.Estack().PushVal("abc")
|
v.Estack().PushVal("abc")
|
||||||
|
@ -64,7 +64,7 @@ func BenchmarkStorageFindIteratorNext(b *testing.B) {
|
||||||
require.NoError(b, native.PutContractState(context.DAO, contractState))
|
require.NoError(b, native.PutContractState(context.DAO, contractState))
|
||||||
|
|
||||||
items := make(map[string]state.StorageItem)
|
items := make(map[string]state.StorageItem)
|
||||||
for i := 0; i < count; i++ {
|
for range count {
|
||||||
items["abc"+random.String(10)] = random.Bytes(10)
|
items["abc"+random.String(10)] = random.Bytes(10)
|
||||||
}
|
}
|
||||||
for k, v := range items {
|
for k, v := range items {
|
||||||
|
@ -76,7 +76,7 @@ func BenchmarkStorageFindIteratorNext(b *testing.B) {
|
||||||
require.NotEqual(b, 0, changes)
|
require.NotEqual(b, 0, changes)
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
b.StopTimer()
|
b.StopTimer()
|
||||||
v.Estack().PushVal(istorage.FindDefault)
|
v.Estack().PushVal(istorage.FindDefault)
|
||||||
v.Estack().PushVal("abc")
|
v.Estack().PushVal("abc")
|
||||||
|
@ -88,7 +88,7 @@ func BenchmarkStorageFindIteratorNext(b *testing.B) {
|
||||||
b.FailNow()
|
b.FailNow()
|
||||||
}
|
}
|
||||||
res := context.VM.Estack().Pop().Item()
|
res := context.VM.Estack().Pop().Item()
|
||||||
for i := 0; i < last; i++ {
|
for range last {
|
||||||
context.VM.Estack().PushVal(res)
|
context.VM.Estack().PushVal(res)
|
||||||
b.StartTimer()
|
b.StartTimer()
|
||||||
require.NoError(b, iterator.Next(context))
|
require.NoError(b, iterator.Next(context))
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"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/storage"
|
"github.com/nspcc-dev/neo-go/pkg/core/storage"
|
||||||
|
@ -61,7 +62,7 @@ func (s *Iterator) Value() stackitem.Item {
|
||||||
}
|
}
|
||||||
key := s.curr.Key
|
key := s.curr.Key
|
||||||
if s.opts&FindRemovePrefix == 0 {
|
if s.opts&FindRemovePrefix == 0 {
|
||||||
key = append(bytes.Clone(s.prefix), key...)
|
key = slices.Concat(s.prefix, key)
|
||||||
}
|
}
|
||||||
if s.opts&FindKeysOnly != 0 {
|
if s.opts&FindKeysOnly != 0 {
|
||||||
return stackitem.NewByteArray(key)
|
return stackitem.NewByteArray(key)
|
||||||
|
|
|
@ -49,7 +49,7 @@ func BenchmarkPool(b *testing.B) {
|
||||||
b.Run(name, func(b *testing.B) {
|
b.Run(name, func(b *testing.B) {
|
||||||
p := New(poolSize, 0, false, nil)
|
p := New(poolSize, 0, false, nil)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
for j := range txes {
|
for j := range txes {
|
||||||
if p.Add(txes[j], fe) != nil {
|
if p.Add(txes[j], fe) != nil {
|
||||||
b.Fail()
|
b.Fail()
|
||||||
|
|
|
@ -120,7 +120,7 @@ func TestOverCapacity(t *testing.T) {
|
||||||
require.True(t, slices.IsSortedFunc(mp.verifiedTxes, func(a, b item) int { return -a.Compare(b) }))
|
require.True(t, slices.IsSortedFunc(mp.verifiedTxes, func(a, b item) int { return -a.Compare(b) }))
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < mempoolSize; i++ {
|
for i := range mempoolSize {
|
||||||
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0)
|
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0)
|
||||||
tx.Nonce = uint32(i)
|
tx.Nonce = uint32(i)
|
||||||
tx.Signers = []transaction.Signer{{Account: acc}}
|
tx.Signers = []transaction.Signer{{Account: acc}}
|
||||||
|
@ -135,7 +135,7 @@ func TestOverCapacity(t *testing.T) {
|
||||||
bigScript[0] = byte(opcode.PUSH1)
|
bigScript[0] = byte(opcode.PUSH1)
|
||||||
bigScript[1] = byte(opcode.RET)
|
bigScript[1] = byte(opcode.RET)
|
||||||
// Fees are also prioritized.
|
// Fees are also prioritized.
|
||||||
for i := 0; i < mempoolSize; i++ {
|
for range mempoolSize {
|
||||||
tx := transaction.New(bigScript, 0)
|
tx := transaction.New(bigScript, 0)
|
||||||
tx.NetworkFee = 10000
|
tx.NetworkFee = 10000
|
||||||
tx.Nonce = txcnt
|
tx.Nonce = txcnt
|
||||||
|
@ -176,7 +176,7 @@ func TestOverCapacity(t *testing.T) {
|
||||||
require.Equal(t, *uint256.NewInt(9*10000 + 7000), mp.fees[acc].feeSum)
|
require.Equal(t, *uint256.NewInt(9*10000 + 7000), mp.fees[acc].feeSum)
|
||||||
|
|
||||||
// High priority always wins over low priority.
|
// High priority always wins over low priority.
|
||||||
for i := 0; i < mempoolSize; i++ {
|
for range mempoolSize {
|
||||||
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0)
|
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0)
|
||||||
tx.NetworkFee = 8000
|
tx.NetworkFee = 8000
|
||||||
tx.Nonce = txcnt
|
tx.Nonce = txcnt
|
||||||
|
@ -203,7 +203,7 @@ func TestGetVerified(t *testing.T) {
|
||||||
mp := New(mempoolSize, 0, false, nil)
|
mp := New(mempoolSize, 0, false, nil)
|
||||||
|
|
||||||
txes := make([]*transaction.Transaction, 0, mempoolSize)
|
txes := make([]*transaction.Transaction, 0, mempoolSize)
|
||||||
for i := 0; i < mempoolSize; i++ {
|
for i := range mempoolSize {
|
||||||
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0)
|
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0)
|
||||||
tx.Nonce = uint32(i)
|
tx.Nonce = uint32(i)
|
||||||
tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3}}}
|
tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3}}}
|
||||||
|
@ -228,7 +228,7 @@ func TestRemoveStale(t *testing.T) {
|
||||||
|
|
||||||
txes1 := make([]*transaction.Transaction, 0, mempoolSize/2)
|
txes1 := make([]*transaction.Transaction, 0, mempoolSize/2)
|
||||||
txes2 := make([]*transaction.Transaction, 0, mempoolSize/2)
|
txes2 := make([]*transaction.Transaction, 0, mempoolSize/2)
|
||||||
for i := 0; i < mempoolSize; i++ {
|
for i := range mempoolSize {
|
||||||
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0)
|
tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0)
|
||||||
tx.Nonce = uint32(i)
|
tx.Nonce = uint32(i)
|
||||||
tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3}}}
|
tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3}}}
|
||||||
|
|
|
@ -10,7 +10,7 @@ func benchmarkBytes(b *testing.B, n Node) {
|
||||||
inv := n.(interface{ invalidateCache() })
|
inv := n.(interface{ invalidateCache() })
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
inv.invalidateCache()
|
inv.invalidateCache()
|
||||||
_ = n.Bytes()
|
_ = n.Bytes()
|
||||||
}
|
}
|
||||||
|
|
|
@ -318,7 +318,7 @@ func (b *Billet) tryCollapseExtension(curr *ExtensionNode) Node {
|
||||||
|
|
||||||
func (b *Billet) tryCollapseBranch(curr *BranchNode) Node {
|
func (b *Billet) tryCollapseBranch(curr *BranchNode) Node {
|
||||||
canCollapse := true
|
canCollapse := true
|
||||||
for i := 0; i < childrenCount; i++ {
|
for i := range childrenCount {
|
||||||
if curr.Children[i].Type() == EmptyT {
|
if curr.Children[i].Type() == EmptyT {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ var _ Node = (*BranchNode)(nil)
|
||||||
// NewBranchNode returns a new branch node.
|
// NewBranchNode returns a new branch node.
|
||||||
func NewBranchNode() *BranchNode {
|
func NewBranchNode() *BranchNode {
|
||||||
b := new(BranchNode)
|
b := new(BranchNode)
|
||||||
for i := 0; i < childrenCount; i++ {
|
for i := range childrenCount {
|
||||||
b.Children[i] = EmptyNode{}
|
b.Children[i] = EmptyNode{}
|
||||||
}
|
}
|
||||||
return b
|
return b
|
||||||
|
@ -58,14 +58,14 @@ func (b *BranchNode) Size() int {
|
||||||
|
|
||||||
// EncodeBinary implements io.Serializable.
|
// EncodeBinary implements io.Serializable.
|
||||||
func (b *BranchNode) EncodeBinary(w *io.BinWriter) {
|
func (b *BranchNode) EncodeBinary(w *io.BinWriter) {
|
||||||
for i := 0; i < childrenCount; i++ {
|
for i := range childrenCount {
|
||||||
encodeBinaryAsChild(b.Children[i], w)
|
encodeBinaryAsChild(b.Children[i], w)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DecodeBinary implements io.Serializable.
|
// DecodeBinary implements io.Serializable.
|
||||||
func (b *BranchNode) DecodeBinary(r *io.BinReader) {
|
func (b *BranchNode) DecodeBinary(r *io.BinReader) {
|
||||||
for i := 0; i < childrenCount; i++ {
|
for i := range childrenCount {
|
||||||
no := new(NodeObject)
|
no := new(NodeObject)
|
||||||
no.DecodeBinary(r)
|
no.DecodeBinary(r)
|
||||||
b.Children[i] = no.Node
|
b.Children[i] = no.Node
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
package mpt
|
package mpt
|
||||||
|
|
||||||
import "github.com/nspcc-dev/neo-go/pkg/util"
|
import (
|
||||||
|
"slices"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
)
|
||||||
|
|
||||||
// lcp returns the longest common prefix of a and b.
|
// lcp returns the longest common prefix of a and b.
|
||||||
// Note: it does no allocations.
|
// Note: it does no allocations.
|
||||||
|
@ -47,7 +51,7 @@ func toNibbles(path []byte) []byte {
|
||||||
// ignoring the first byte (prefix).
|
// ignoring the first byte (prefix).
|
||||||
func strToNibbles(path string) []byte {
|
func strToNibbles(path string) []byte {
|
||||||
result := make([]byte, (len(path)-1)*2)
|
result := make([]byte, (len(path)-1)*2)
|
||||||
for i := 0; i < len(path)-1; i++ {
|
for i := range len(path) - 1 {
|
||||||
result[i*2] = path[i+1] >> 4
|
result[i*2] = path[i+1] >> 4
|
||||||
result[i*2+1] = path[i+1] & 0x0F
|
result[i*2+1] = path[i+1] & 0x0F
|
||||||
}
|
}
|
||||||
|
@ -85,9 +89,7 @@ func GetChildrenPaths(path []byte, node Node) map[util.Uint256][][]byte {
|
||||||
}
|
}
|
||||||
case *ExtensionNode:
|
case *ExtensionNode:
|
||||||
if n.next.Type() == HashT {
|
if n.next.Type() == HashT {
|
||||||
cPath := make([]byte, len(path)+len(n.key))
|
cPath := slices.Concat(path, n.key)
|
||||||
copy(cPath, path)
|
|
||||||
copy(cPath[len(path):], n.key)
|
|
||||||
res[n.next.Hash()] = [][]byte{cPath}
|
res[n.next.Hash()] = [][]byte{cPath}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"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"
|
||||||
|
@ -616,7 +617,7 @@ func (t *Trie) Find(prefix, from []byte, maxNum int) ([]storage.KeyValue, error)
|
||||||
if leaf, ok := node.(*LeafNode); ok {
|
if leaf, ok := node.(*LeafNode); ok {
|
||||||
if from == nil || !bytes.Equal(pathToNode, from) { // (*Billet).traverse includes `from` path into result if so. Need to filter out manually.
|
if from == nil || !bytes.Equal(pathToNode, from) { // (*Billet).traverse includes `from` path into result if so. Need to filter out manually.
|
||||||
res = append(res, storage.KeyValue{
|
res = append(res, storage.KeyValue{
|
||||||
Key: append(bytes.Clone(prefix), pathToNode...),
|
Key: slices.Concat(prefix, pathToNode),
|
||||||
Value: bytes.Clone(leaf.value),
|
Value: bytes.Clone(leaf.value),
|
||||||
})
|
})
|
||||||
count++
|
count++
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"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/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
@ -98,7 +99,7 @@ func (m *TrieStore) Seek(rng storage.SeekRange, f func(k, v []byte) bool) {
|
||||||
if leaf, ok := node.(*LeafNode); ok {
|
if leaf, ok := node.(*LeafNode); ok {
|
||||||
// (*Billet).traverse includes `from` path into the result if so. It's OK for Seek, so shouldn't be filtered out.
|
// (*Billet).traverse includes `from` path into the result if so. It's OK for Seek, so shouldn't be filtered out.
|
||||||
kv := storage.KeyValue{
|
kv := storage.KeyValue{
|
||||||
Key: append(bytes.Clone(rng.Prefix), pathToNode...), // Do not cut prefix.
|
Key: slices.Concat(rng.Prefix, pathToNode), // Do not cut prefix.
|
||||||
Value: bytes.Clone(leaf.value),
|
Value: bytes.Clone(leaf.value),
|
||||||
}
|
}
|
||||||
return !f(kv.Key, kv.Value) // Should return whether to stop.
|
return !f(kv.Key, kv.Value) // Should return whether to stop.
|
||||||
|
|
|
@ -50,7 +50,7 @@ func TestTrieStore_TestTrieOperations(t *testing.T) {
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
require.Equal(t, 4, len(res))
|
require.Equal(t, 4, len(res))
|
||||||
for i := 0; i < len(res); i++ {
|
for i := range res {
|
||||||
require.Equal(t, byte(storage.STStorage), res[i][0])
|
require.Equal(t, byte(storage.STStorage), res[i][0])
|
||||||
if i < len(res)-1 {
|
if i < len(res)-1 {
|
||||||
cmp := bytes.Compare(res[i], res[i+1])
|
cmp := bytes.Compare(res[i], res[i+1])
|
||||||
|
|
|
@ -27,7 +27,7 @@ func TestNamesASCII(t *testing.T) {
|
||||||
|
|
||||||
func isASCII(s string) bool {
|
func isASCII(s string) bool {
|
||||||
ok := true
|
ok := true
|
||||||
for i := 0; i < len(s); i++ {
|
for i := range s {
|
||||||
ok = ok && s[i] <= unicode.MaxASCII
|
ok = ok && s[i] <= unicode.MaxASCII
|
||||||
}
|
}
|
||||||
return ok
|
return ok
|
||||||
|
|
|
@ -442,7 +442,7 @@ func (n *NEO) OnPersist(ic *interop.Context) error {
|
||||||
// during the last epoch block handling or by initialization code).
|
// during the last epoch block handling or by initialization code).
|
||||||
|
|
||||||
var oldCommittee, newCommittee stackitem.Item
|
var oldCommittee, newCommittee stackitem.Item
|
||||||
for i := 0; i < len(cache.committee); i++ {
|
for i := range cache.committee {
|
||||||
if cache.newEpochCommittee[i].Key != cache.committee[i].Key ||
|
if cache.newEpochCommittee[i].Key != cache.committee[i].Key ||
|
||||||
(i == 0 && len(cache.newEpochCommittee) != len(cache.committee)) {
|
(i == 0 && len(cache.newEpochCommittee) != len(cache.committee)) {
|
||||||
oldCommittee, newCommittee = cache.committee.toNotificationItem(), cache.newEpochCommittee.toNotificationItem()
|
oldCommittee, newCommittee = cache.committee.toNotificationItem(), cache.newEpochCommittee.toNotificationItem()
|
||||||
|
|
|
@ -238,13 +238,13 @@ func TestLedger_GetTransactionSignersInteropAPI(t *testing.T) {
|
||||||
txHash = tx.Hash().BytesBE()
|
txHash = tx.Hash().BytesBE()
|
||||||
acc = c.Committee.ScriptHash().BytesBE()
|
acc = c.Committee.ScriptHash().BytesBE()
|
||||||
)
|
)
|
||||||
for i := 0; i < util.Uint256Size; i++ {
|
for i := range util.Uint256Size {
|
||||||
hashStr += fmt.Sprintf("%#x", txHash[i])
|
hashStr += fmt.Sprintf("%#x", txHash[i])
|
||||||
if i != util.Uint256Size-1 {
|
if i != util.Uint256Size-1 {
|
||||||
hashStr += ", "
|
hashStr += ", "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for i := 0; i < util.Uint160Size; i++ {
|
for i := range util.Uint160Size {
|
||||||
accStr += fmt.Sprintf("%#x", acc[i])
|
accStr += fmt.Sprintf("%#x", acc[i])
|
||||||
if i != util.Uint160Size-1 {
|
if i != util.Uint160Size-1 {
|
||||||
accStr += ", "
|
accStr += ", "
|
||||||
|
|
|
@ -231,7 +231,7 @@ func TestManagement_NativeUpdate(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
// Add some blocks up to the Cockatrice enabling height and check the default natives state.
|
// Add some blocks up to the Cockatrice enabling height and check the default natives state.
|
||||||
for i := 0; i < cockatriceHeight-1; i++ {
|
for range cockatriceHeight - 1 {
|
||||||
c.AddNewBlock(t)
|
c.AddNewBlock(t)
|
||||||
for _, name := range nativenames.All {
|
for _, name := range nativenames.All {
|
||||||
h := state.CreateNativeContractHash(name)
|
h := state.CreateNativeContractHash(name)
|
||||||
|
@ -275,7 +275,7 @@ func TestManagement_NativeUpdate_Call(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
// Invoke Cockatrice-dependant method before Cockatrice should fail.
|
// Invoke Cockatrice-dependant method before Cockatrice should fail.
|
||||||
for i := 0; i < cockatriceHeight-1; i++ {
|
for range cockatriceHeight - 1 {
|
||||||
c.InvokeFail(t, "at instruction 45 (SYSCALL): System.Contract.Call failed: method not found: getCommitteeAddress/0", method)
|
c.InvokeFail(t, "at instruction 45 (SYSCALL): System.Contract.Call failed: method not found: getCommitteeAddress/0", method)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -131,12 +131,12 @@ func TestNEO_CommitteeEvents(t *testing.T) {
|
||||||
|
|
||||||
voters := make([]neotest.Signer, committeeSize)
|
voters := make([]neotest.Signer, committeeSize)
|
||||||
candidates := make([]neotest.Signer, committeeSize)
|
candidates := make([]neotest.Signer, committeeSize)
|
||||||
for i := 0; i < committeeSize; i++ {
|
for i := range committeeSize {
|
||||||
voters[i] = e.NewAccount(t, 10_0000_0000)
|
voters[i] = e.NewAccount(t, 10_0000_0000)
|
||||||
candidates[i] = e.NewAccount(t, 2000_0000_0000) // enough for one registration
|
candidates[i] = e.NewAccount(t, 2000_0000_0000) // enough for one registration
|
||||||
}
|
}
|
||||||
txes := make([]*transaction.Transaction, 0, committeeSize*3)
|
txes := make([]*transaction.Transaction, 0, committeeSize*3)
|
||||||
for i := 0; i < committeeSize; i++ {
|
for i := range committeeSize {
|
||||||
transferTx := neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), voters[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(committeeSize-i)*1000000, nil)
|
transferTx := neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), voters[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(committeeSize-i)*1000000, nil)
|
||||||
txes = append(txes, transferTx)
|
txes = append(txes, transferTx)
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ func TestNEO_Vote(t *testing.T) {
|
||||||
validatorsCount := cfg.GetNumOfCNs(0)
|
validatorsCount := cfg.GetNumOfCNs(0)
|
||||||
freq := validatorsCount + committeeSize
|
freq := validatorsCount + committeeSize
|
||||||
advanceChain := func(t *testing.T) {
|
advanceChain := func(t *testing.T) {
|
||||||
for i := 0; i < freq; i++ {
|
for range freq {
|
||||||
neoCommitteeInvoker.AddNewBlock(t)
|
neoCommitteeInvoker.AddNewBlock(t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -217,13 +217,13 @@ func TestNEO_Vote(t *testing.T) {
|
||||||
// how much GAS voters receive for NEO ownership.
|
// how much GAS voters receive for NEO ownership.
|
||||||
referenceAccounts := make([]neotest.Signer, committeeSize+1)
|
referenceAccounts := make([]neotest.Signer, committeeSize+1)
|
||||||
candidates := make([]neotest.Signer, committeeSize+1)
|
candidates := make([]neotest.Signer, committeeSize+1)
|
||||||
for i := 0; i < committeeSize+1; i++ {
|
for i := range committeeSize + 1 {
|
||||||
voters[i] = e.NewAccount(t, 10_0000_0000)
|
voters[i] = e.NewAccount(t, 10_0000_0000)
|
||||||
referenceAccounts[i] = e.NewAccount(t, 10_0000_0000)
|
referenceAccounts[i] = e.NewAccount(t, 10_0000_0000)
|
||||||
candidates[i] = e.NewAccount(t, 2000_0000_0000) // enough for one registration
|
candidates[i] = e.NewAccount(t, 2000_0000_0000) // enough for one registration
|
||||||
}
|
}
|
||||||
txes := make([]*transaction.Transaction, 0, committeeSize*4-2)
|
txes := make([]*transaction.Transaction, 0, committeeSize*4-2)
|
||||||
for i := 0; i < committeeSize+1; i++ {
|
for i := range committeeSize + 1 {
|
||||||
transferTx := neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), voters[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(committeeSize+1-i)*1000000, nil)
|
transferTx := neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), voters[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(committeeSize+1-i)*1000000, nil)
|
||||||
txes = append(txes, transferTx)
|
txes = append(txes, transferTx)
|
||||||
transferTx = neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), referenceAccounts[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(committeeSize+1-i)*1000000, nil)
|
transferTx = neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), referenceAccounts[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(committeeSize+1-i)*1000000, nil)
|
||||||
|
@ -419,7 +419,7 @@ func TestNEO_GetAccountState(t *testing.T) {
|
||||||
committeeSize := cfg.GetCommitteeSize(0)
|
committeeSize := cfg.GetCommitteeSize(0)
|
||||||
validatorSize := cfg.GetNumOfCNs(0)
|
validatorSize := cfg.GetNumOfCNs(0)
|
||||||
advanceChain := func(t *testing.T) {
|
advanceChain := func(t *testing.T) {
|
||||||
for i := 0; i < committeeSize; i++ {
|
for range committeeSize {
|
||||||
neoValidatorInvoker.AddNewBlock(t)
|
neoValidatorInvoker.AddNewBlock(t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -485,7 +485,7 @@ func TestNEO_GetAccountStateInteropAPI(t *testing.T) {
|
||||||
committeeSize := cfg.GetCommitteeSize(0)
|
committeeSize := cfg.GetCommitteeSize(0)
|
||||||
validatorSize := cfg.GetNumOfCNs(0)
|
validatorSize := cfg.GetNumOfCNs(0)
|
||||||
advanceChain := func(t *testing.T) {
|
advanceChain := func(t *testing.T) {
|
||||||
for i := 0; i < committeeSize; i++ {
|
for range committeeSize {
|
||||||
neoValidatorInvoker.AddNewBlock(t)
|
neoValidatorInvoker.AddNewBlock(t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -500,7 +500,7 @@ func TestNEO_GetAccountStateInteropAPI(t *testing.T) {
|
||||||
neoValidatorInvoker.WithSigners(acc).Invoke(t, true, "transfer", acc.ScriptHash(), acc.ScriptHash(), amount, nil)
|
neoValidatorInvoker.WithSigners(acc).Invoke(t, true, "transfer", acc.ScriptHash(), acc.ScriptHash(), amount, nil)
|
||||||
|
|
||||||
var hashAStr string
|
var hashAStr string
|
||||||
for i := 0; i < util.Uint160Size; i++ {
|
for i := range util.Uint160Size {
|
||||||
hashAStr += fmt.Sprintf("%#x", acc.ScriptHash()[i])
|
hashAStr += fmt.Sprintf("%#x", acc.ScriptHash()[i])
|
||||||
if i != util.Uint160Size-1 {
|
if i != util.Uint160Size-1 {
|
||||||
hashAStr += ", "
|
hashAStr += ", "
|
||||||
|
@ -544,11 +544,11 @@ func TestNEO_CommitteeBountyOnPersist(t *testing.T) {
|
||||||
const singleBounty = 50000000
|
const singleBounty = 50000000
|
||||||
bs := map[int]int64{0: singleBounty}
|
bs := map[int]int64{0: singleBounty}
|
||||||
checkBalances := func() {
|
checkBalances := func() {
|
||||||
for i := 0; i < committeeSize; i++ {
|
for i := range committeeSize {
|
||||||
require.EqualValues(t, bs[i], e.Chain.GetUtilityTokenBalance(hs[i].GetScriptHash()).Int64(), i)
|
require.EqualValues(t, bs[i], e.Chain.GetUtilityTokenBalance(hs[i].GetScriptHash()).Int64(), i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for i := 0; i < committeeSize*2; i++ {
|
for i := range committeeSize * 2 {
|
||||||
e.AddNewBlock(t)
|
e.AddNewBlock(t)
|
||||||
bs[(i+1)%committeeSize] += singleBounty
|
bs[(i+1)%committeeSize] += singleBounty
|
||||||
checkBalances()
|
checkBalances()
|
||||||
|
@ -731,7 +731,7 @@ func TestNEO_CalculateBonus(t *testing.T) {
|
||||||
|
|
||||||
t.Run("Zero", func(t *testing.T) {
|
t.Run("Zero", func(t *testing.T) {
|
||||||
initialGASBalance := e.Chain.GetUtilityTokenBalance(accH)
|
initialGASBalance := e.Chain.GetUtilityTokenBalance(accH)
|
||||||
for i := 0; i < rewardDistance; i++ {
|
for range rewardDistance {
|
||||||
e.AddNewBlock(t)
|
e.AddNewBlock(t)
|
||||||
}
|
}
|
||||||
// Claim GAS, but there's no NEO on the account, so no GAS should be earned.
|
// Claim GAS, but there's no NEO on the account, so no GAS should be earned.
|
||||||
|
@ -750,13 +750,13 @@ func TestNEO_CalculateBonus(t *testing.T) {
|
||||||
|
|
||||||
// Five blocks of NEO owning with default GasPerBlockValue.
|
// Five blocks of NEO owning with default GasPerBlockValue.
|
||||||
neoValidatorsInvoker.Invoke(t, true, "transfer", e.Validator.ScriptHash(), accH, amount, nil)
|
neoValidatorsInvoker.Invoke(t, true, "transfer", e.Validator.ScriptHash(), accH, amount, nil)
|
||||||
for i := 0; i < rewardDistance/2-2; i++ {
|
for range rewardDistance/2 - 2 {
|
||||||
e.AddNewBlock(t)
|
e.AddNewBlock(t)
|
||||||
}
|
}
|
||||||
neoCommitteeInvoker.Invoke(t, stackitem.Null{}, "setGasPerBlock", newGASPerBlock*native.GASFactor)
|
neoCommitteeInvoker.Invoke(t, stackitem.Null{}, "setGasPerBlock", newGASPerBlock*native.GASFactor)
|
||||||
|
|
||||||
// Five blocks more with modified GasPerBlock value.
|
// Five blocks more with modified GasPerBlock value.
|
||||||
for i := 0; i < rewardDistance/2; i++ {
|
for range rewardDistance / 2 {
|
||||||
e.AddNewBlock(t)
|
e.AddNewBlock(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -783,12 +783,12 @@ func TestNEO_GetCandidates(t *testing.T) {
|
||||||
// Register a set of candidates and vote for them.
|
// Register a set of candidates and vote for them.
|
||||||
voters := make([]neotest.Signer, candidatesCount)
|
voters := make([]neotest.Signer, candidatesCount)
|
||||||
candidates := make([]neotest.Signer, candidatesCount)
|
candidates := make([]neotest.Signer, candidatesCount)
|
||||||
for i := 0; i < candidatesCount; i++ {
|
for i := range candidatesCount {
|
||||||
voters[i] = e.NewAccount(t, 10_0000_0000)
|
voters[i] = e.NewAccount(t, 10_0000_0000)
|
||||||
candidates[i] = e.NewAccount(t, 2000_0000_0000) // enough for one registration
|
candidates[i] = e.NewAccount(t, 2000_0000_0000) // enough for one registration
|
||||||
}
|
}
|
||||||
txes := make([]*transaction.Transaction, 0, candidatesCount*3)
|
txes := make([]*transaction.Transaction, 0, candidatesCount*3)
|
||||||
for i := 0; i < candidatesCount; i++ {
|
for i := range candidatesCount {
|
||||||
transferTx := neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), voters[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(candidatesCount+1-i)*1000000, nil)
|
transferTx := neoValidatorsInvoker.PrepareInvoke(t, "transfer", e.Validator.ScriptHash(), voters[i].(neotest.SingleSigner).Account().PrivateKey().GetScriptHash(), int64(candidatesCount+1-i)*1000000, nil)
|
||||||
txes = append(txes, transferTx)
|
txes = append(txes, transferTx)
|
||||||
registerTx := neoValidatorsInvoker.WithSigners(candidates[i]).PrepareInvoke(t, "registerCandidate", candidates[i].(neotest.SingleSigner).Account().PublicKey().Bytes())
|
registerTx := neoValidatorsInvoker.WithSigners(candidates[i]).PrepareInvoke(t, "registerCandidate", candidates[i].(neotest.SingleSigner).Account().PublicKey().Bytes())
|
||||||
|
@ -818,7 +818,7 @@ func TestNEO_GetCandidates(t *testing.T) {
|
||||||
|
|
||||||
// Check that GetAllCandidates works the same way as GetCandidates.
|
// Check that GetAllCandidates works the same way as GetCandidates.
|
||||||
checkGetAllCandidates := func(t *testing.T, expected []stackitem.Item) {
|
checkGetAllCandidates := func(t *testing.T, expected []stackitem.Item) {
|
||||||
for i := 0; i < len(expected)+1; i++ {
|
for i := range len(expected) + 1 {
|
||||||
w := io.NewBufBinWriter()
|
w := io.NewBufBinWriter()
|
||||||
emit.AppCall(w.BinWriter, neoCommitteeInvoker.Hash, "getAllCandidates", callflag.All)
|
emit.AppCall(w.BinWriter, neoCommitteeInvoker.Hash, "getAllCandidates", callflag.All)
|
||||||
for j := 0; j < i+1; j++ {
|
for j := 0; j < i+1; j++ {
|
||||||
|
|
|
@ -183,7 +183,7 @@ func TestNotary_MaliciousWithdrawal(t *testing.T) {
|
||||||
|
|
||||||
// Perform several deposits to a set of different accounts.
|
// Perform several deposits to a set of different accounts.
|
||||||
count := 3
|
count := 3
|
||||||
for i := 0; i < count; i++ {
|
for range count {
|
||||||
h := random.Uint160()
|
h := random.Uint160()
|
||||||
gasCommitteeInvoker.Invoke(t, true, "transfer", multisigHash, notaryHash, 2*feePerKey, ¬ary.OnNEP17PaymentData{Account: &h, Till: e.Chain.BlockHeight() + 2})
|
gasCommitteeInvoker.Invoke(t, true, "transfer", multisigHash, notaryHash, 2*feePerKey, ¬ary.OnNEP17PaymentData{Account: &h, Till: e.Chain.BlockHeight() + 2})
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ package state
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"math/rand"
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
|
|
@ -85,13 +85,13 @@ func BenchmarkNEP17BalanceBytes(b *testing.B) {
|
||||||
|
|
||||||
b.Run("stackitem", func(b *testing.B) {
|
b.Run("stackitem", func(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
_, _ = stackitem.SerializeConvertible(&bl)
|
_, _ = stackitem.SerializeConvertible(&bl)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
b.Run("bytes", func(b *testing.B) {
|
b.Run("bytes", func(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
_ = bl.Bytes(nil)
|
_ = bl.Bytes(nil)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -100,7 +100,7 @@ func BenchmarkNEP17BalanceBytes(b *testing.B) {
|
||||||
|
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
_ = bl.Bytes(bs[:0])
|
_ = bl.Bytes(bs[:0])
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -114,13 +114,13 @@ func BenchmarkNEP17BalanceFromBytes(b *testing.B) {
|
||||||
|
|
||||||
b.Run("stackitem", func(b *testing.B) {
|
b.Run("stackitem", func(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
_ = stackitem.DeserializeConvertible(buf, new(NEP17Balance))
|
_ = stackitem.DeserializeConvertible(buf, new(NEP17Balance))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
b.Run("from bytes", func(b *testing.B) {
|
b.Run("from bytes", func(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
_, _ = NEP17BalanceFromBytes(buf)
|
_, _ = NEP17BalanceFromBytes(buf)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -111,7 +111,7 @@ func (aer *AppExecResult) DecodeBinary(r *io.BinReader) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
arr := make([]stackitem.Item, sz)
|
arr := make([]stackitem.Item, sz)
|
||||||
for i := 0; i < int(sz); i++ {
|
for i := range arr {
|
||||||
arr[i] = stackitem.DecodeBinaryProtected(r)
|
arr[i] = stackitem.DecodeBinaryProtected(r)
|
||||||
if r.Err != nil {
|
if r.Err != nil {
|
||||||
return
|
return
|
||||||
|
|
|
@ -33,7 +33,7 @@ func BenchmarkAppExecResult_EncodeBinary(b *testing.B) {
|
||||||
w := io.NewBufBinWriter()
|
w := io.NewBufBinWriter()
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
w.Reset()
|
w.Reset()
|
||||||
aer.EncodeBinary(w.BinWriter)
|
aer.EncodeBinary(w.BinWriter)
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,7 @@ func (bs *TokenTransferInfo) DecodeBinary(r *io.BinReader) {
|
||||||
bs.NewNEP17Batch = r.ReadBool()
|
bs.NewNEP17Batch = r.ReadBool()
|
||||||
lenBalances := r.ReadVarUint()
|
lenBalances := r.ReadVarUint()
|
||||||
m := make(map[int32]uint32, lenBalances)
|
m := make(map[int32]uint32, lenBalances)
|
||||||
for i := 0; i < int(lenBalances); i++ {
|
for range lenBalances {
|
||||||
key := int32(r.ReadU32LE())
|
key := int32(r.ReadU32LE())
|
||||||
m[key] = r.ReadU32LE()
|
m[key] = r.ReadU32LE()
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@ func (lg *TokenTransferLog) ForEachNEP11(f func(*NEP11Transfer) (bool, error)) (
|
||||||
}
|
}
|
||||||
transfers := make([]NEP11Transfer, lg.Size())
|
transfers := make([]NEP11Transfer, lg.Size())
|
||||||
r := io.NewBinReaderFromBuf(lg.Raw[1:])
|
r := io.NewBinReaderFromBuf(lg.Raw[1:])
|
||||||
for i := 0; i < lg.Size(); i++ {
|
for i := range transfers {
|
||||||
transfers[i].DecodeBinary(r)
|
transfers[i].DecodeBinary(r)
|
||||||
}
|
}
|
||||||
if r.Err != nil {
|
if r.Err != nil {
|
||||||
|
@ -164,7 +164,7 @@ func (lg *TokenTransferLog) ForEachNEP17(f func(*NEP17Transfer) (bool, error)) (
|
||||||
}
|
}
|
||||||
transfers := make([]NEP17Transfer, lg.Size())
|
transfers := make([]NEP17Transfer, lg.Size())
|
||||||
r := io.NewBinReaderFromBuf(lg.Raw[1:])
|
r := io.NewBinReaderFromBuf(lg.Raw[1:])
|
||||||
for i := 0; i < lg.Size(); i++ {
|
for i := range transfers {
|
||||||
transfers[i].DecodeBinary(r)
|
transfers[i].DecodeBinary(r)
|
||||||
}
|
}
|
||||||
if r.Err != nil {
|
if r.Err != nil {
|
||||||
|
|
|
@ -2,9 +2,8 @@ package state
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"math/rand"
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
|
@ -13,7 +12,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTokenTransferLog_Append17(t *testing.T) {
|
func TestTokenTransferLog_Append17(t *testing.T) {
|
||||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
r := rand.New(rand.NewPCG(42, 100500))
|
||||||
expected := []*NEP17Transfer{
|
expected := []*NEP17Transfer{
|
||||||
random17Transfer(r),
|
random17Transfer(r),
|
||||||
random17Transfer(r),
|
random17Transfer(r),
|
||||||
|
@ -39,7 +38,7 @@ func TestTokenTransferLog_Append17(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTokenTransferLog_Append(t *testing.T) {
|
func TestTokenTransferLog_Append(t *testing.T) {
|
||||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
r := rand.New(rand.NewPCG(42, 100500))
|
||||||
expected := []*NEP11Transfer{
|
expected := []*NEP11Transfer{
|
||||||
random11Transfer(r),
|
random11Transfer(r),
|
||||||
random11Transfer(r),
|
random11Transfer(r),
|
||||||
|
@ -65,7 +64,7 @@ func TestTokenTransferLog_Append(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkTokenTransferLog_Append(b *testing.B) {
|
func BenchmarkTokenTransferLog_Append(b *testing.B) {
|
||||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
r := rand.New(rand.NewPCG(42, 100500))
|
||||||
ts := make([]*NEP17Transfer, TokenTransferBatchSize)
|
ts := make([]*NEP17Transfer, TokenTransferBatchSize)
|
||||||
for i := range ts {
|
for i := range ts {
|
||||||
ts[i] = random17Transfer(r)
|
ts[i] = random17Transfer(r)
|
||||||
|
@ -74,7 +73,7 @@ func BenchmarkTokenTransferLog_Append(b *testing.B) {
|
||||||
lg := new(TokenTransferLog)
|
lg := new(TokenTransferLog)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
for _, tr := range ts {
|
for _, tr := range ts {
|
||||||
err := lg.Append(tr)
|
err := lg.Append(tr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -82,7 +82,7 @@ func TestPool_AddRemoveUpdate(t *testing.T) {
|
||||||
func TestPool_GetBatch(t *testing.T) {
|
func TestPool_GetBatch(t *testing.T) {
|
||||||
check := func(t *testing.T, limit int, itemsCount int) {
|
check := func(t *testing.T, limit int, itemsCount int) {
|
||||||
mp := NewPool()
|
mp := NewPool()
|
||||||
for i := 0; i < itemsCount; i++ {
|
for range itemsCount {
|
||||||
mp.Add(random.Uint256(), []byte{0x01})
|
mp.Add(random.Uint256(), []byte{0x01})
|
||||||
}
|
}
|
||||||
batch := mp.GetBatch(limit)
|
batch := mp.GetBatch(limit)
|
||||||
|
|
|
@ -28,7 +28,7 @@ func TestStateSyncModule_Init(t *testing.T) {
|
||||||
}
|
}
|
||||||
bcSpout, validators, committee := chain.NewMultiWithCustomConfig(t, spoutCfg)
|
bcSpout, validators, committee := chain.NewMultiWithCustomConfig(t, spoutCfg)
|
||||||
e := neotest.NewExecutor(t, bcSpout, validators, committee)
|
e := neotest.NewExecutor(t, bcSpout, validators, committee)
|
||||||
for i := 0; i <= 2*stateSyncInterval+int(maxTraceable)+1; i++ {
|
for range 2*stateSyncInterval + int(maxTraceable) + 2 {
|
||||||
e.AddNewBlock(t)
|
e.AddNewBlock(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -229,7 +229,7 @@ func benchmarkCachedSeek(t *testing.B, ps Store, psElementsCount, tsElementsCoun
|
||||||
|
|
||||||
ts = NewMemCachedStore(ps)
|
ts = NewMemCachedStore(ps)
|
||||||
)
|
)
|
||||||
for i := 0; i < psElementsCount; i++ {
|
for i := range psElementsCount {
|
||||||
// lower KVs with matching prefix that should be found
|
// lower KVs with matching prefix that should be found
|
||||||
ts.Put(append(lowerPrefixGood, random.Bytes(10)...), []byte("value"))
|
ts.Put(append(lowerPrefixGood, random.Bytes(10)...), []byte("value"))
|
||||||
// lower KVs with non-matching prefix that shouldn't be found
|
// lower KVs with non-matching prefix that shouldn't be found
|
||||||
|
@ -266,7 +266,7 @@ func benchmarkCachedSeek(t *testing.B, ps Store, psElementsCount, tsElementsCoun
|
||||||
|
|
||||||
t.ReportAllocs()
|
t.ReportAllocs()
|
||||||
t.ResetTimer()
|
t.ResetTimer()
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
ts.Seek(SeekRange{Prefix: searchPrefix}, func(k, v []byte) bool { return true })
|
ts.Seek(SeekRange{Prefix: searchPrefix}, func(k, v []byte) bool { return true })
|
||||||
}
|
}
|
||||||
t.StopTimer()
|
t.StopTimer()
|
||||||
|
|
|
@ -21,7 +21,7 @@ func BenchmarkMemorySeek(t *testing.B) {
|
||||||
badPrefix = []byte{2}
|
badPrefix = []byte{2}
|
||||||
)
|
)
|
||||||
ts := NewMemCachedStore(ms)
|
ts := NewMemCachedStore(ms)
|
||||||
for i := 0; i < count; i++ {
|
for range count {
|
||||||
ts.Put(append(searchPrefix, random.Bytes(10)...), random.Bytes(10))
|
ts.Put(append(searchPrefix, random.Bytes(10)...), random.Bytes(10))
|
||||||
ts.Put(append(badPrefix, random.Bytes(10)...), random.Bytes(10))
|
ts.Put(append(badPrefix, random.Bytes(10)...), random.Bytes(10))
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ func BenchmarkMemorySeek(t *testing.B) {
|
||||||
|
|
||||||
t.ReportAllocs()
|
t.ReportAllocs()
|
||||||
t.ResetTimer()
|
t.ResetTimer()
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
ms.Seek(SeekRange{Prefix: searchPrefix}, func(k, v []byte) bool { return false })
|
ms.Seek(SeekRange{Prefix: searchPrefix}, func(k, v []byte) bool { return false })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -3,6 +3,7 @@ package storage
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/storage/dbconfig"
|
"github.com/nspcc-dev/neo-go/pkg/core/storage/dbconfig"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/storage/dboper"
|
"github.com/nspcc-dev/neo-go/pkg/core/storage/dboper"
|
||||||
|
@ -105,10 +106,8 @@ type (
|
||||||
func seekRangeToPrefixes(sr SeekRange) *util.Range {
|
func seekRangeToPrefixes(sr SeekRange) *util.Range {
|
||||||
var (
|
var (
|
||||||
rang *util.Range
|
rang *util.Range
|
||||||
start = make([]byte, len(sr.Prefix)+len(sr.Start))
|
start = slices.Concat(sr.Prefix, sr.Start)
|
||||||
)
|
)
|
||||||
copy(start, sr.Prefix)
|
|
||||||
copy(start[len(sr.Prefix):], sr.Start)
|
|
||||||
|
|
||||||
if !sr.Backwards {
|
if !sr.Backwards {
|
||||||
rang = util.BytesPrefix(sr.Prefix)
|
rang = util.BytesPrefix(sr.Prefix)
|
||||||
|
|
|
@ -32,7 +32,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkDecodeBinary(t *testing.B) {
|
func BenchmarkDecodeBinary(t *testing.B) {
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
r := io.NewBinReaderFromBuf(benchTx)
|
r := io.NewBinReaderFromBuf(benchTx)
|
||||||
tx := &Transaction{}
|
tx := &Transaction{}
|
||||||
tx.DecodeBinary(r)
|
tx.DecodeBinary(r)
|
||||||
|
@ -41,14 +41,14 @@ func BenchmarkDecodeBinary(t *testing.B) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkDecodeJSON(t *testing.B) {
|
func BenchmarkDecodeJSON(t *testing.B) {
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
tx := &Transaction{}
|
tx := &Transaction{}
|
||||||
require.NoError(t, tx.UnmarshalJSON(benchTxJSON))
|
require.NoError(t, tx.UnmarshalJSON(benchTxJSON))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkDecodeFromBytes(t *testing.B) {
|
func BenchmarkDecodeFromBytes(t *testing.B) {
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
_, err := NewTransactionFromBytes(benchTx)
|
_, err := NewTransactionFromBytes(benchTx)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ func BenchmarkTransaction_Bytes(b *testing.B) {
|
||||||
|
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
_ = tx.Bytes()
|
_ = tx.Bytes()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ func BenchmarkGetVarSize(b *testing.B) {
|
||||||
|
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
_ = io.GetVarSize(tx)
|
_ = io.GetVarSize(tx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ package transaction
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"math/rand"
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"math/big"
|
"math/big"
|
||||||
"math/rand"
|
"math/rand/v2"
|
||||||
|
|
||||||
"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"
|
||||||
|
@ -160,7 +160,7 @@ func (t *Transaction) decodeHashableFields(br *io.BinReader, buf []byte) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.Signers = make([]Signer, nsigners)
|
t.Signers = make([]Signer, nsigners)
|
||||||
for i := 0; i < int(nsigners); i++ {
|
for i := range t.Signers {
|
||||||
t.Signers[i].DecodeBinary(br)
|
t.Signers[i].DecodeBinary(br)
|
||||||
}
|
}
|
||||||
nattrs := br.ReadVarUint()
|
nattrs := br.ReadVarUint()
|
||||||
|
@ -169,7 +169,7 @@ func (t *Transaction) decodeHashableFields(br *io.BinReader, buf []byte) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.Attributes = make([]Attribute, nattrs)
|
t.Attributes = make([]Attribute, nattrs)
|
||||||
for i := 0; i < int(nattrs); i++ {
|
for i := range t.Attributes {
|
||||||
t.Attributes[i].DecodeBinary(br)
|
t.Attributes[i].DecodeBinary(br)
|
||||||
}
|
}
|
||||||
t.Script = br.ReadVarBytes(MaxScriptLength)
|
t.Script = br.ReadVarBytes(MaxScriptLength)
|
||||||
|
@ -197,7 +197,7 @@ func (t *Transaction) decodeBinaryNoSize(br *io.BinReader, buf []byte) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.Scripts = make([]Witness, nscripts)
|
t.Scripts = make([]Witness, nscripts)
|
||||||
for i := 0; i < int(nscripts); i++ {
|
for i := range t.Scripts {
|
||||||
t.Scripts[i].DecodeBinary(br)
|
t.Scripts[i].DecodeBinary(br)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,7 +422,7 @@ func (t *Transaction) isValid() error {
|
||||||
if len(t.Signers) == 0 {
|
if len(t.Signers) == 0 {
|
||||||
return ErrEmptySigners
|
return ErrEmptySigners
|
||||||
}
|
}
|
||||||
for i := 0; i < len(t.Signers); i++ {
|
for i := range t.Signers {
|
||||||
for j := i + 1; j < len(t.Signers); j++ {
|
for j := i + 1; j < len(t.Signers); j++ {
|
||||||
if t.Signers[i].Account.Equals(t.Signers[j].Account) {
|
if t.Signers[i].Account.Equals(t.Signers[j].Account) {
|
||||||
return ErrNonUniqueSigners
|
return ErrNonUniqueSigners
|
||||||
|
|
|
@ -318,7 +318,7 @@ func BenchmarkTxHash(b *testing.B) {
|
||||||
|
|
||||||
// Prime cache.
|
// Prime cache.
|
||||||
tx.Hash()
|
tx.Hash()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
_ = tx.Hash()
|
_ = tx.Hash()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -233,7 +233,7 @@ func readArrayOfConditions(r *io.BinReader, maxDepth int) []WitnessCondition {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
a := make([]WitnessCondition, l)
|
a := make([]WitnessCondition, l)
|
||||||
for i := 0; i < int(l); i++ {
|
for i := range a {
|
||||||
a[i] = decodeBinaryCondition(r, maxDepth-1)
|
a[i] = decodeBinaryCondition(r, maxDepth-1)
|
||||||
}
|
}
|
||||||
if r.Err != nil {
|
if r.Err != nil {
|
||||||
|
@ -253,7 +253,7 @@ func (c *ConditionAnd) DecodeBinarySpecific(r *io.BinReader, maxDepth int) {
|
||||||
|
|
||||||
func arrayToJSON(c WitnessCondition, a []WitnessCondition) ([]byte, error) {
|
func arrayToJSON(c WitnessCondition, a []WitnessCondition) ([]byte, error) {
|
||||||
exprs := make([]json.RawMessage, len(a))
|
exprs := make([]json.RawMessage, len(a))
|
||||||
for i := 0; i < len(a); i++ {
|
for i := range a {
|
||||||
b, err := a[i].MarshalJSON()
|
b, err := a[i].MarshalJSON()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -74,7 +74,7 @@ func TestWitnessConditionSerDes(t *testing.T) {
|
||||||
}
|
}
|
||||||
var maxSubCondAnd = &ConditionAnd{}
|
var maxSubCondAnd = &ConditionAnd{}
|
||||||
var maxSubCondOr = &ConditionAnd{}
|
var maxSubCondOr = &ConditionAnd{}
|
||||||
for i := 0; i < maxSubitems+1; i++ {
|
for range maxSubitems + 1 {
|
||||||
*maxSubCondAnd = append(*maxSubCondAnd, (*ConditionBoolean)(&someBool))
|
*maxSubCondAnd = append(*maxSubCondAnd, (*ConditionBoolean)(&someBool))
|
||||||
*maxSubCondOr = append(*maxSubCondOr, (*ConditionBoolean)(&someBool))
|
*maxSubCondOr = append(*maxSubCondOr, (*ConditionBoolean)(&someBool))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +1,32 @@
|
||||||
package hash
|
package hash_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/rand"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
||||||
"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"
|
||||||
)
|
)
|
||||||
|
|
||||||
func BenchmarkMerkle(t *testing.B) {
|
func BenchmarkMerkle(t *testing.B) {
|
||||||
var err error
|
|
||||||
var hashes = make([]util.Uint256, 100000)
|
var hashes = make([]util.Uint256, 100000)
|
||||||
var h = make([]byte, 32)
|
|
||||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
||||||
for i := range hashes {
|
for i := range hashes {
|
||||||
r.Read(h)
|
hashes[i] = random.Uint256()
|
||||||
hashes[i], err = util.Uint256DecodeBytesBE(h)
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("NewMerkleTree", func(t *testing.B) {
|
t.Run("NewMerkleTree", func(t *testing.B) {
|
||||||
t.ResetTimer()
|
t.ResetTimer()
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
tr, err := NewMerkleTree(hashes)
|
tr, err := hash.NewMerkleTree(hashes)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_ = tr.Root()
|
_ = tr.Root()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
t.Run("CalcMerkleRoot", func(t *testing.B) {
|
t.Run("CalcMerkleRoot", func(t *testing.B) {
|
||||||
t.ResetTimer()
|
t.ResetTimer()
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
_ = CalcMerkleRoot(hashes)
|
_ = hash.CalcMerkleRoot(hashes)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ func NewMerkleTree(hashes []util.Uint256) (*MerkleTree, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes := make([]*MerkleTreeNode, len(hashes))
|
nodes := make([]*MerkleTreeNode, len(hashes))
|
||||||
for i := 0; i < len(hashes); i++ {
|
for i := range hashes {
|
||||||
nodes[i] = &MerkleTreeNode{
|
nodes[i] = &MerkleTreeNode{
|
||||||
hash: hashes[i],
|
hash: hashes[i],
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ func buildMerkleTree(leaves []*MerkleTreeNode) *MerkleTreeNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
parents := make([]*MerkleTreeNode, (len(leaves)+1)/2)
|
parents := make([]*MerkleTreeNode, (len(leaves)+1)/2)
|
||||||
for i := 0; i < len(parents); i++ {
|
for i := range parents {
|
||||||
parents[i] = &MerkleTreeNode{}
|
parents[i] = &MerkleTreeNode{}
|
||||||
parents[i].leftChild = leaves[i*2]
|
parents[i].leftChild = leaves[i*2]
|
||||||
leaves[i*2].parent = parents[i]
|
leaves[i*2].parent = parents[i]
|
||||||
|
@ -81,7 +81,7 @@ func CalcMerkleRoot(hashes []util.Uint256) util.Uint256 {
|
||||||
|
|
||||||
scratch := make([]byte, 64)
|
scratch := make([]byte, 64)
|
||||||
parents := hashes[:(len(hashes)+1)/2]
|
parents := hashes[:(len(hashes)+1)/2]
|
||||||
for i := 0; i < len(parents); i++ {
|
for i := range parents {
|
||||||
copy(scratch, hashes[i*2].BytesBE())
|
copy(scratch, hashes[i*2].BytesBE())
|
||||||
|
|
||||||
if i*2+1 == len(hashes) {
|
if i*2+1 == len(hashes) {
|
||||||
|
|
|
@ -149,7 +149,7 @@ func xor(a, b []byte) []byte {
|
||||||
panic("cannot XOR non equal length arrays")
|
panic("cannot XOR non equal length arrays")
|
||||||
}
|
}
|
||||||
dst := make([]byte, len(a))
|
dst := make([]byte, len(a))
|
||||||
for i := 0; i < len(dst); i++ {
|
for i := range dst {
|
||||||
dst[i] = a[i] ^ b[i]
|
dst[i] = a[i] ^ b[i]
|
||||||
}
|
}
|
||||||
return dst
|
return dst
|
||||||
|
|
|
@ -26,7 +26,7 @@ func TestEncodeDecodeInfinity(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEncodeDecodePublicKey(t *testing.T) {
|
func TestEncodeDecodePublicKey(t *testing.T) {
|
||||||
for i := 0; i < 4; i++ {
|
for range 4 {
|
||||||
k, err := NewPrivateKey()
|
k, err := NewPrivateKey()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
p := k.PublicKey()
|
p := k.PublicKey()
|
||||||
|
@ -225,7 +225,7 @@ func BenchmarkPublicEqual(t *testing.B) {
|
||||||
k12 := getPubKey(t)
|
k12 := getPubKey(t)
|
||||||
k2, err := NewPublicKeyFromString("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c")
|
k2, err := NewPublicKeyFromString("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
_ = k11.Equal(k12)
|
_ = k11.Equal(k12)
|
||||||
_ = k11.Equal(k2)
|
_ = k11.Equal(k2)
|
||||||
}
|
}
|
||||||
|
@ -233,14 +233,14 @@ func BenchmarkPublicEqual(t *testing.B) {
|
||||||
|
|
||||||
func BenchmarkPublicBytes(t *testing.B) {
|
func BenchmarkPublicBytes(t *testing.B) {
|
||||||
k := getPubKey(t)
|
k := getPubKey(t)
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
_ = k.Bytes()
|
_ = k.Bytes()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkPublicUncompressedBytes(t *testing.B) {
|
func BenchmarkPublicUncompressedBytes(t *testing.B) {
|
||||||
k := getPubKey(t)
|
k := getPubKey(t)
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
_ = k.Bytes()
|
_ = k.Bytes()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -249,7 +249,7 @@ func BenchmarkPublicDecodeBytes(t *testing.B) {
|
||||||
keyBytes, err := hex.DecodeString("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c")
|
keyBytes, err := hex.DecodeString("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
k := new(PublicKey)
|
k := new(PublicKey)
|
||||||
for n := 0; n < t.N; n++ {
|
for range t.N {
|
||||||
require.NoError(t, k.DecodeBytes(keyBytes))
|
require.NoError(t, k.DecodeBytes(keyBytes))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ func BenchmarkToPreallocatedBytes(b *testing.B) {
|
||||||
vn := big.NewInt(-100500)
|
vn := big.NewInt(-100500)
|
||||||
buf := make([]byte, 4)
|
buf := make([]byte, 4)
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
_ = ToPreallocatedBytes(v, buf[:0])
|
_ = ToPreallocatedBytes(v, buf[:0])
|
||||||
_ = ToPreallocatedBytes(vn, buf[:0])
|
_ = ToPreallocatedBytes(vn, buf[:0])
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ func FromBytes(data []byte) *big.Int {
|
||||||
|
|
||||||
lw := size / wordSizeBytes
|
lw := size / wordSizeBytes
|
||||||
ws := make([]big.Word, lw+1)
|
ws := make([]big.Word, lw+1)
|
||||||
for i := 0; i < lw; i++ {
|
for i := range lw {
|
||||||
base := i * wordSizeBytes
|
base := i * wordSizeBytes
|
||||||
for j := base + 7; j >= base; j-- {
|
for j := base + 7; j >= base; j-- {
|
||||||
ws[i] <<= 8
|
ws[i] <<= 8
|
||||||
|
|
|
@ -13,7 +13,7 @@ func FuzzFromBytes(f *testing.F) {
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
f.Add(tc.buf)
|
f.Add(tc.buf)
|
||||||
}
|
}
|
||||||
for i := 0; i < 50; i++ {
|
for range 50 {
|
||||||
for j := 1; j < MaxBytesLen; j++ {
|
for j := 1; j < MaxBytesLen; j++ {
|
||||||
b := make([]byte, j)
|
b := make([]byte, j)
|
||||||
_, err := rand.Read(b)
|
_, err := rand.Read(b)
|
||||||
|
|
|
@ -17,7 +17,7 @@ var _pow10 []*big.Int
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
var p = int64(1)
|
var p = int64(1)
|
||||||
for i := 0; i <= maxAllowedPrecision; i++ {
|
for range maxAllowedPrecision + 1 {
|
||||||
_pow10 = append(_pow10, big.NewInt(p))
|
_pow10 = append(_pow10, big.NewInt(p))
|
||||||
p *= 10
|
p *= 10
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
module github.com/nspcc-dev/neo-go/pkg/interop
|
module github.com/nspcc-dev/neo-go/pkg/interop
|
||||||
|
|
||||||
go 1.21
|
go 1.22
|
||||||
|
|
|
@ -128,7 +128,7 @@ func (r *BinReader) ReadArray(t any, maxSize ...int) {
|
||||||
l := int(lu)
|
l := int(lu)
|
||||||
arr := reflect.MakeSlice(sliceType, l, l)
|
arr := reflect.MakeSlice(sliceType, l, l)
|
||||||
|
|
||||||
for i := 0; i < l; i++ {
|
for i := range l {
|
||||||
var elem reflect.Value
|
var elem reflect.Value
|
||||||
if isPtr {
|
if isPtr {
|
||||||
elem = reflect.New(elemType.Elem())
|
elem = reflect.New(elemType.Elem())
|
||||||
|
|
|
@ -78,7 +78,7 @@ func (w *BinWriter) WriteArray(arr any) {
|
||||||
typ := val.Type().Elem()
|
typ := val.Type().Elem()
|
||||||
|
|
||||||
w.WriteVarUint(uint64(val.Len()))
|
w.WriteVarUint(uint64(val.Len()))
|
||||||
for i := 0; i < val.Len(); i++ {
|
for i := range val.Len() {
|
||||||
el, ok := val.Index(i).Interface().(encodable)
|
el, ok := val.Index(i).Interface().(encodable)
|
||||||
if !ok {
|
if !ok {
|
||||||
el, ok = val.Index(i).Addr().Interface().(encodable)
|
el, ok = val.Index(i).Addr().Interface().(encodable)
|
||||||
|
|
|
@ -218,7 +218,7 @@ func TestBufBinWriterErr(t *testing.T) {
|
||||||
|
|
||||||
func TestBufBinWriterReset(t *testing.T) {
|
func TestBufBinWriterReset(t *testing.T) {
|
||||||
bw := NewBufBinWriter()
|
bw := NewBufBinWriter()
|
||||||
for i := 0; i < 3; i++ {
|
for i := range 3 {
|
||||||
bw.WriteU32LE(uint32(i))
|
bw.WriteU32LE(uint32(i))
|
||||||
assert.Nil(t, bw.Err)
|
assert.Nil(t, bw.Err)
|
||||||
_ = bw.Bytes()
|
_ = bw.Bytes()
|
||||||
|
|
|
@ -75,7 +75,7 @@ func GetVarSize(value any) int {
|
||||||
if valueLength != 0 {
|
if valueLength != 0 {
|
||||||
switch reflect.ValueOf(value).Index(0).Interface().(type) {
|
switch reflect.ValueOf(value).Index(0).Interface().(type) {
|
||||||
case Serializable:
|
case Serializable:
|
||||||
for i := 0; i < valueLength; i++ {
|
for i := range valueLength {
|
||||||
valueSize += GetVarSize(v.Index(i).Interface())
|
valueSize += GetVarSize(v.Index(i).Interface())
|
||||||
}
|
}
|
||||||
case uint8, int8:
|
case uint8, int8:
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue