23464401bc
This change reduces pressure on DB by doing the following things: * not storing additional KV pair for SpentCoin * storing Output right in the UnspentCoin, thus eliminating the need to get a full transaction from DB At the same time it makes UnspentCoin more fat and hot, but it should probably worth it. Also drop `GetUnspentCoinStateOrNew` as it shouldn't ever existed, UTXOs can't come out of nowhere. 1.5M block import time (VerifyBlocks disabled) on AMD Ryzen 5 1600/16GB/HDD, before: real 302m9.895s user 96m17.200s sys 13m37.084s after: real 159m16.551s user 69m58.279s sys 7m34.334s So it's almost two-fold which is a great improvement.
54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
package state
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
|
"github.com/nspcc-dev/neo-go/pkg/internal/random"
|
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestDecodeEncodeUnspentCoin(t *testing.T) {
|
|
unspent := &UnspentCoin{
|
|
Height: 100500,
|
|
States: []OutputState{
|
|
{
|
|
Output: transaction.Output{
|
|
AssetID: random.Uint256(),
|
|
Amount: util.Fixed8(42),
|
|
ScriptHash: random.Uint160(),
|
|
},
|
|
SpendHeight: 201000,
|
|
State: CoinSpent,
|
|
},
|
|
{
|
|
Output: transaction.Output{
|
|
AssetID: random.Uint256(),
|
|
Amount: util.Fixed8(420),
|
|
ScriptHash: random.Uint160(),
|
|
},
|
|
SpendHeight: 0,
|
|
State: CoinConfirmed,
|
|
},
|
|
{
|
|
Output: transaction.Output{
|
|
AssetID: random.Uint256(),
|
|
Amount: util.Fixed8(4200),
|
|
ScriptHash: random.Uint160(),
|
|
},
|
|
SpendHeight: 111000,
|
|
State: CoinSpent & CoinClaimed,
|
|
},
|
|
},
|
|
}
|
|
|
|
buf := io.NewBufBinWriter()
|
|
unspent.EncodeBinary(buf.BinWriter)
|
|
assert.Nil(t, buf.Err)
|
|
unspentDecode := &UnspentCoin{}
|
|
r := io.NewBinReaderFromBuf(buf.Bytes())
|
|
unspentDecode.DecodeBinary(r)
|
|
assert.Nil(t, r.Err)
|
|
}
|