Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: implementing pip-15 #843

Merged
merged 36 commits into from
Dec 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
4e04454
feat: implement lru cache for account in store
amirvalhalla Dec 9, 2023
13902f9
feat: implement lru cache for public key in store
amirvalhalla Dec 9, 2023
6630b6f
feat: implement lru cache for transactions
amirvalhalla Dec 9, 2023
ec8a222
fix: rename print errors and addr cache name
amirvalhalla Dec 10, 2023
d9c4cdd
feat: implement recent transactions and sortition seeds cache
amirvalhalla Dec 11, 2023
c76d802
feat: implement load sortition seed and transactions and save them in…
amirvalhalla Dec 13, 2023
b323db9
fix: change rlock to lock for sortition seed
amirvalhalla Dec 13, 2023
b45cb1b
fix: load sorition seed from cache for invalid proof
amirvalhalla Dec 14, 2023
c17a629
chore: remove unused packages
amirvalhalla Dec 19, 2023
8ca67d3
Merge branch 'main' into feat-pip-15
amirvalhalla Dec 19, 2023
10a98e1
feat: implement private configs for store
amirvalhalla Dec 21, 2023
ac96375
test: change tests based in new store with cache
amirvalhalla Dec 23, 2023
9d8cef3
Merge branch 'main' into feat-pip-15
amirvalhalla Dec 23, 2023
fd5b778
chore: remove unused variables etc.
amirvalhalla Dec 23, 2023
0260d88
test: fix save txs write buffer
amirvalhalla Dec 23, 2023
7d0ea22
fix: race condition, dead lock and out of range index in sortiotion seed
amirvalhalla Dec 24, 2023
aaaeeb6
perf: change linkedlist to slice for better performance
amirvalhalla Dec 26, 2023
887eeca
test: testing sortition seed cache
amirvalhalla Dec 26, 2023
337f579
Merge branch 'main' into feat-pip-15
amirvalhalla Dec 26, 2023
e86ac46
test: get more coverage for linkedmap
amirvalhalla Dec 28, 2023
cffe24f
fix: zero capacity for test linkedmap
amirvalhalla Dec 28, 2023
4591349
test: get more coverage from config/config.go
amirvalhalla Dec 28, 2023
d297c9a
fix: clone account in store/account iterates
amirvalhalla Dec 29, 2023
4f0b61c
test: refined account deep copy
amirvalhalla Dec 29, 2023
bfb3991
refactor: rename addrCache to accInCache
amirvalhalla Dec 29, 2023
d00831f
Merge branch 'main' into feat-pip-15
amirvalhalla Dec 29, 2023
d6d19b8
feat: implement pair slice
amirvalhalla Dec 29, 2023
ef32853
docs: add comment for pairslice methods
amirvalhalla Dec 29, 2023
fbdc2f0
Merge branch 'main' into feat-pip-15
amirvalhalla Dec 29, 2023
c6c05bc
feat: implement tripleslice
amirvalhalla Dec 29, 2023
9a2a1dc
feat: implement sortition seed
amirvalhalla Dec 30, 2023
c9d300c
test: implement tests for pair slice
amirvalhalla Dec 30, 2023
254ff40
docs: write docs for pairslice
amirvalhalla Dec 30, 2023
296a5b4
fix: lint issue
amirvalhalla Dec 30, 2023
0a4274b
Merge branch 'main' into feat-pip-15
amirvalhalla Dec 30, 2023
2e6d417
fix: clone account for cache
amirvalhalla Dec 31, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ func CreateNode(numValidators int, chain genesis.ChainType, workingDir string,
if err := genDoc.SaveToFile(genPath); err != nil {
return nil, nil, err
}
conf := config.DefaultConfigTestnet()
conf := config.DefaultConfigTestnet(genDoc.Params())
if err := conf.Save(confPath); err != nil {
return nil, nil, err
}
Expand All @@ -304,7 +304,7 @@ func CreateNode(numValidators int, chain genesis.ChainType, workingDir string,
return nil, nil, err
}

conf := config.DefaultConfigLocalnet()
conf := config.DefaultConfigLocalnet(genDoc.Params())
if err := conf.Save(confPath); err != nil {
return nil, nil, err
}
Expand Down Expand Up @@ -338,7 +338,7 @@ func StartNode(workingDir string, passwordFetcher func(*wallet.Wallet) (string,
}

confPath := PactusConfigPath(workingDir)
conf, err := tryLoadConfig(gen.ChainType(), confPath)
conf, err := tryLoadConfig(gen, confPath)
if err != nil {
return nil, nil, err
}
Expand Down Expand Up @@ -461,15 +461,15 @@ func makeLocalGenesis(w wallet.Wallet) *genesis.Genesis {
return gen
}

func tryLoadConfig(chainType genesis.ChainType, confPath string) (*config.Config, error) {
func tryLoadConfig(genDoc *genesis.Genesis, confPath string) (*config.Config, error) {
var defConf *config.Config
switch chainType {
switch genDoc.ChainType() {
case genesis.Mainnet:
panic("not yet implemented!")
case genesis.Testnet:
defConf = config.DefaultConfigTestnet()
defConf = config.DefaultConfigTestnet(genDoc.Params())
case genesis.Localnet:
defConf = config.DefaultConfigLocalnet()
defConf = config.DefaultConfigLocalnet(genDoc.Params())
}

conf, err := config.LoadFromFile(confPath, true, defConf)
Expand All @@ -496,7 +496,7 @@ func tryLoadConfig(chainType genesis.ChainType, confPath string) (*config.Config
}
PrintSuccessMsgf("Config updated.")
} else {
switch chainType {
switch genDoc.ChainType() {
case genesis.Mainnet:
err = config.SaveMainnetConfig(confPath)
if err != nil {
Expand Down
26 changes: 23 additions & 3 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/pactus-project/pactus/store"
"github.com/pactus-project/pactus/sync"
"github.com/pactus-project/pactus/txpool"
"github.com/pactus-project/pactus/types/param"
"github.com/pactus-project/pactus/util"
"github.com/pactus-project/pactus/util/errors"
"github.com/pactus-project/pactus/util/logger"
Expand Down Expand Up @@ -77,14 +78,21 @@ func defaultConfig() *Config {
return conf
}

func DefaultConfigMainnet() *Config {
func DefaultConfigMainnet(genParams *param.Params) *Config {
conf := defaultConfig()
// TO BE DEFINED

// Store private configs
conf.Store.TxCacheSize = genParams.TransactionToLiveInterval
conf.Store.SortitionCacheSize = genParams.SortitionInterval
conf.Store.AccountCacheSize = 1024
conf.Store.PublicKeyCacheSize = 1024

return conf
}

//nolint:lll // long multi-address
func DefaultConfigTestnet() *Config {
func DefaultConfigTestnet(genParams *param.Params) *Config {
conf := defaultConfig()
conf.Network.ListenAddrStrings = []string{
"/ip4/0.0.0.0/tcp/21777", "/ip4/0.0.0.0/udp/21777/quic-v1",
Expand Down Expand Up @@ -121,10 +129,16 @@ func DefaultConfigTestnet() *Config {
conf.Nanomsg.Enable = false
conf.Nanomsg.Listen = "tcp://127.0.0.1:40799"

// Store private configs
conf.Store.TxCacheSize = genParams.TransactionToLiveInterval
conf.Store.SortitionCacheSize = genParams.SortitionInterval
conf.Store.AccountCacheSize = 1024
conf.Store.PublicKeyCacheSize = 1024

return conf
}

func DefaultConfigLocalnet() *Config {
func DefaultConfigLocalnet(genParams *param.Params) *Config {
conf := defaultConfig()
conf.Network.ListenAddrStrings = []string{}
conf.Network.EnableRelay = false
Expand All @@ -143,6 +157,12 @@ func DefaultConfigLocalnet() *Config {
conf.Nanomsg.Enable = true
conf.Nanomsg.Listen = "tcp://127.0.0.1:0"

// Store private configs
conf.Store.TxCacheSize = genParams.TransactionToLiveInterval
conf.Store.SortitionCacheSize = genParams.SortitionInterval
conf.Store.AccountCacheSize = 1024
conf.Store.PublicKeyCacheSize = 1024

return conf
}

Expand Down
46 changes: 41 additions & 5 deletions config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"strings"
"testing"

"github.com/pactus-project/pactus/types/param"
"github.com/pactus-project/pactus/util"
"github.com/pactus-project/pactus/util/testsuite"
"github.com/stretchr/testify/assert"
Expand All @@ -13,40 +14,67 @@ func TestSaveMainnetConfig(t *testing.T) {
path := util.TempFilePath()
assert.NoError(t, SaveMainnetConfig(path))

defConf := DefaultConfigMainnet()
defConf := DefaultConfigMainnet(param.DefaultParams())
conf, err := LoadFromFile(path, true, defConf)
assert.NoError(t, err)

assert.NoError(t, conf.BasicCheck())
assert.Equal(t, conf.Store.TxCacheSize, param.DefaultParams().TransactionToLiveInterval)
assert.Equal(t, conf.Store.SortitionCacheSize, param.DefaultParams().SortitionInterval)
assert.Equal(t, conf.Store.AccountCacheSize, 1024)
assert.Equal(t, conf.Store.PublicKeyCacheSize, 1024)
}

func TestSaveConfig(t *testing.T) {
path := util.TempFilePath()
conf := defaultConfig()
assert.NoError(t, conf.Save(path))

defConf := DefaultConfigTestnet()
defConf := DefaultConfigTestnet(param.DefaultParams())
conf, err := LoadFromFile(path, true, defConf)
assert.NoError(t, err)

assert.NoError(t, conf.BasicCheck())
assert.Equal(t, conf.Network.NetworkName, "pactus-testnet-v2")
assert.Equal(t, conf.Network.DefaultPort, 21777)
assert.Equal(t, conf.Store.TxCacheSize, param.DefaultParams().TransactionToLiveInterval)
assert.Equal(t, conf.Store.SortitionCacheSize, param.DefaultParams().SortitionInterval)
assert.Equal(t, conf.Store.AccountCacheSize, 1024)
assert.Equal(t, conf.Store.PublicKeyCacheSize, 1024)
}

func TestLocalnetConfig(t *testing.T) {
amirvalhalla marked this conversation as resolved.
Show resolved Hide resolved
conf := DefaultConfigLocalnet()
conf := DefaultConfigLocalnet(param.DefaultParams())

assert.NoError(t, conf.BasicCheck())
assert.Empty(t, conf.Network.ListenAddrStrings)
amirvalhalla marked this conversation as resolved.
Show resolved Hide resolved
assert.Empty(t, conf.Network.RelayAddrStrings)
assert.Equal(t, conf.Network.NetworkName, "pactus-localnet")
assert.Equal(t, conf.Network.DefaultPort, 21666)
assert.Equal(t, conf.Store.TxCacheSize, param.DefaultParams().TransactionToLiveInterval)
assert.Equal(t, conf.Store.SortitionCacheSize, param.DefaultParams().SortitionInterval)
assert.Equal(t, conf.Store.AccountCacheSize, 1024)
assert.Equal(t, conf.Store.PublicKeyCacheSize, 1024)
}

func TestTestnetConfig(t *testing.T) {
conf := DefaultConfigTestnet(param.DefaultParams())

assert.NoError(t, conf.BasicCheck())
assert.NotEmpty(t, conf.Network.ListenAddrStrings)
assert.NotEmpty(t, conf.Network.DefaultRelayAddrStrings)
assert.Empty(t, conf.Network.RelayAddrStrings)
assert.Equal(t, conf.Network.NetworkName, "pactus-testnet-v2")
assert.Equal(t, conf.Network.DefaultPort, 21777)
assert.Equal(t, conf.Store.TxCacheSize, param.DefaultParams().TransactionToLiveInterval)
assert.Equal(t, conf.Store.SortitionCacheSize, param.DefaultParams().SortitionInterval)
assert.Equal(t, conf.Store.AccountCacheSize, 1024)
assert.Equal(t, conf.Store.PublicKeyCacheSize, 1024)
}

func TestLoadFromFile(t *testing.T) {
path := util.TempFilePath()
defConf := DefaultConfigTestnet()
defConf := DefaultConfigTestnet(param.DefaultParams())

_, err := LoadFromFile(path, true, defConf)
assert.Error(t, err, "not exists")
Expand All @@ -58,6 +86,10 @@ func TestLoadFromFile(t *testing.T) {
conf, err := LoadFromFile(path, false, defConf)
assert.NoError(t, err)
assert.Equal(t, conf, defConf)
assert.Equal(t, conf.Store.TxCacheSize, param.DefaultParams().TransactionToLiveInterval)
assert.Equal(t, conf.Store.SortitionCacheSize, param.DefaultParams().SortitionInterval)
assert.Equal(t, conf.Store.AccountCacheSize, 1024)
assert.Equal(t, conf.Store.PublicKeyCacheSize, 1024)
}

func TestExampleConfig(t *testing.T) {
Expand All @@ -73,7 +105,7 @@ func TestExampleConfig(t *testing.T) {
}
}

defaultConf := DefaultConfigMainnet()
defaultConf := DefaultConfigMainnet(param.DefaultParams())
defaultToml := string(defaultConf.toTOML())

exampleToml = strings.ReplaceAll(exampleToml, "##", "")
Expand All @@ -82,6 +114,10 @@ func TestExampleConfig(t *testing.T) {
defaultToml = strings.ReplaceAll(defaultToml, "\n\n", "\n")

assert.Equal(t, defaultToml, exampleToml)
assert.Equal(t, defaultConf.Store.TxCacheSize, param.DefaultParams().TransactionToLiveInterval)
assert.Equal(t, defaultConf.Store.SortitionCacheSize, param.DefaultParams().SortitionInterval)
assert.Equal(t, defaultConf.Store.AccountCacheSize, 1024)
assert.Equal(t, defaultConf.Store.PublicKeyCacheSize, 1024)
}

func TestNodeConfigBasicCheck(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.21

require (
github.com/fxamacker/cbor/v2 v2.5.0
github.com/gofrs/flock v0.8.1
github.com/google/uuid v1.4.0
github.com/gorilla/handlers v1.5.1
github.com/gorilla/mux v1.8.0
Expand Down Expand Up @@ -53,7 +54,6 @@ require (
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/gofrs/flock v0.8.1 // indirect
amirvalhalla marked this conversation as resolved.
Show resolved Hide resolved
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/golang/snappy v0.0.4 // indirect
Expand Down
1 change: 1 addition & 0 deletions node/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ func (n *Node) Stop() {
}

// these methods are using by GUI.

amirvalhalla marked this conversation as resolved.
Show resolved Hide resolved
func (n *Node) ConsManager() consensus.ManagerReader {
return n.consMgr
}
Expand Down
2 changes: 1 addition & 1 deletion node/node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func TestRunningNode(t *testing.T) {
gen := genesis.MakeGenesis(util.Now(),
map[crypto.Address]*account.Account{crypto.TreasuryAddress: acc},
[]*validator.Validator{val}, param.DefaultParams())
conf := config.DefaultConfigMainnet()
conf := config.DefaultConfigMainnet(param.DefaultParams())
conf.GRPC.Enable = false
conf.HTTP.Enable = false
conf.Store.Path = util.TempDirPath()
Expand Down
16 changes: 6 additions & 10 deletions sandbox/sandbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -277,18 +277,14 @@ func (sb *sandbox) PowerDelta() int64 {

// VerifyProof verifies proof of a sortition transaction.
func (sb *sandbox) VerifyProof(blockHeight uint32, proof sortition.Proof, val *validator.Validator) bool {
committedBlock, err := sb.store.Block(blockHeight)
if err != nil {
return false
}
// TODO: improvement:
// We can get the sortition seed without parsing the block
blk, err := committedBlock.ToBlock()
if err != nil {
sb.lk.RLock()
defer sb.lk.RUnlock()

seed := sb.store.SortitionSeed(blockHeight)
if seed == nil {
return false
}
seed := blk.Header().SortitionSeed()
return sortition.VerifyProof(seed, proof, val.PublicKey(), sb.totalPower, val.Power())
return sortition.VerifyProof(*seed, proof, val.PublicKey(), sb.totalPower, val.Power())
}

func (sb *sandbox) CommitTransaction(trx *tx.Tx) {
Expand Down
Loading
Loading