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

fix(transcation):#195 fixed min_confirmation bug on verify transaction #199

Merged
merged 23 commits into from
Aug 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
11ba621
fix(transcation):#195 fixed min_confirmation bug on veriry transaction
cnlangzi Aug 9, 2021
e220b04
fix(transcation):#195 removed fmt.Println
cnlangzi Aug 9, 2021
2662108
fix(transcation):#195 test result based on ErrNoTxnDetail instead of …
cnlangzi Aug 10, 2021
2a460b3
fix(transcation):#195 test result based on ErrNoTxnDetail instead of …
cnlangzi Aug 10, 2021
926a8fa
fix(transcation):#195 fixed Test_Sharder_Verify_Txn_Failed
cnlangzi Aug 10, 2021
e40ebeb
fix(transcation):#195 fixed Test_Sharder_Verify_Txn_Failed
cnlangzi Aug 10, 2021
d4d05f4
fix(transcation):#195 removed go mod replace on go.mod
cnlangzi Aug 10, 2021
739b482
fix(transcation):#195 remove global variables
cnlangzi Aug 10, 2021
91b5723
fix(transcation):#195 updated comment
cnlangzi Aug 10, 2021
f4b61a6
fix(transcation):#195 refactor old methods with conf.Config
cnlangzi Aug 10, 2021
5cd6873
fix(transcation):#195 merge latest code from master
cnlangzi Aug 11, 2021
4a0c9ae
fix(transcation):#195 revert it with global variables, and removed Lo…
cnlangzi Aug 12, 2021
19565b6
fix(transcation):#195 added Network
cnlangzi Aug 12, 2021
ba46ea8
fix(conf):#195 moved magic number to predefined variables; added rest…
cnlangzi Aug 14, 2021
64a3bb7
fix(conf):#195 refactored mock code
cnlangzi Aug 14, 2021
9e95de5
fix(conf):#195 fixed memory leak issue
cnlangzi Aug 14, 2021
a9f4200
fix(conf):#195 close reponse.Body for avoid to memory leak
cnlangzi Aug 14, 2021
ba85875
fix(transaction):#195 update http reqeust with resty
cnlangzi Aug 16, 2021
6ced451
Merge branch 'master' into fix/min_confirm
cnlangzi Aug 16, 2021
07a755d
fix(error):0chain/errors#195 migrate errors
cnlangzi Aug 16, 2021
f46a8d7
fix(transaction):#195 fixed random issue
cnlangzi Aug 16, 2021
15f2dc5
fix(transaction):#195 fixed unit test
cnlangzi Aug 16, 2021
c6532fe
fix(error):0chain/errors#195 migrate errors
cnlangzi Aug 16, 2021
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
23 changes: 23 additions & 0 deletions core/conf/conf.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// pakcage conf provide config helpers for ~/.zcn/config.yaml, ~/.zcn/network.yaml and ~/.zcn/wallet.json

package conf

import (
"errors"
)

var (
// ErrMssingConfig config file is missing
ErrMssingConfig = errors.New("[conf]missing config file")
// ErrInvalidValue invalid value in config
ErrInvalidValue = errors.New("[conf]invalid value")
// ErrBadParsing fail to parse config via spf13/viper
ErrBadParsing = errors.New("[conf]bad parsing")
)

// Reader a config reader
type Reader interface {
GetString(key string) string
GetInt(key string) int
GetStringSlice(key string) []string
}
151 changes: 151 additions & 0 deletions core/conf/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
package conf

import (
"errors"
"net/url"
"os"
"strings"

thrown "github.com/0chain/errors"
"github.com/spf13/viper"
)

const (
// DefaultMinSubmit default value for min_submit
DefaultMinSubmit = 50
// DefaultMinConfirmation default value for min_confirmation
DefaultMinConfirmation = 50
// DefaultMaxTxnQuery default value for max_txn_query
DefaultMaxTxnQuery = 5
// DefaultConfirmationChainLength default value for confirmation_chain_length
DefaultConfirmationChainLength = 3
// DefaultQuerySleepTime default value for query_sleep_time
DefaultQuerySleepTime = 5
)

// Config settings from ~/.zcn/config.yaml
// block_worker: http://198.18.0.98:9091
// signature_scheme: bls0chain
// min_submit: 50
// min_confirmation: 50
// confirmation_chain_length: 3
// max_txn_query: 5
// query_sleep_time: 5
// # # OPTIONAL - Uncomment to use/ Add more if you want
// # preferred_blobbers:
// # - http://one.devnet-0chain.net:31051
// # - http://one.devnet-0chain.net:31052
// # - http://one.devnet-0chain.net:31053
type Config struct {
// BlockWorker the url of 0dns's network api
BlockWorker string
// PreferredBlobbers preferred blobbers on new allocation
PreferredBlobbers []string

// MinSubmit mininal submit from blobber
MinSubmit int
// MinConfirmation mininal confirmation from sharders
MinConfirmation int
// CconfirmationChainLength minial confirmation chain length
ConfirmationChainLength int

// additional settings depending network latency
// MaxTxnQuery maximum transcation query from sharders
MaxTxnQuery int
// QuerySleepTime sleep time before transcation query
QuerySleepTime int

// SignatureScheme signature scheme
SignatureScheme string
// ChainID which blockchain it is working
ChainID string
}

// LoadConfigFile load and parse Config from file
func LoadConfigFile(file string) (Config, error) {
cnlangzi marked this conversation as resolved.
Show resolved Hide resolved

var cfg Config
var err error

_, err = os.Stat(file)

if err != nil {
if errors.Is(err, os.ErrNotExist) {
return cfg, thrown.Throw(ErrMssingConfig, file)
}
return cfg, err
}

v := viper.New()

v.SetConfigFile(file)

if err := v.ReadInConfig(); err != nil {
return cfg, thrown.Throw(ErrBadParsing, err.Error())
}

return LoadConfig(v)
}

// LoadConfig load and parse config
func LoadConfig(v Reader) (Config, error) {

var cfg Config

blockWorker := strings.TrimSpace(v.GetString("block_worker"))

if !isURL(blockWorker) {
return cfg, thrown.Throw(ErrInvalidValue, "block_worker="+blockWorker)
}

minSubmit := v.GetInt("min_submit")
if minSubmit < 1 {
cnlangzi marked this conversation as resolved.
Show resolved Hide resolved
minSubmit = DefaultMinSubmit
} else if minSubmit > 100 {
minSubmit = 100
}

minCfm := v.GetInt("min_confirmation")

if minCfm < 1 {
minCfm = DefaultMinConfirmation
} else if minCfm > 100 {
minCfm = 100
}

CfmChainLength := v.GetInt("confirmation_chain_length")

if CfmChainLength < 1 {
CfmChainLength = DefaultConfirmationChainLength
}

// additional settings depending network latency
maxTxnQuery := v.GetInt("max_txn_query")
if maxTxnQuery < 1 {
maxTxnQuery = DefaultMaxTxnQuery
}

querySleepTime := v.GetInt("query_sleep_time")
if querySleepTime < 1 {
querySleepTime = DefaultQuerySleepTime
}

cfg.BlockWorker = blockWorker
cfg.PreferredBlobbers = v.GetStringSlice("preferred_blobbers")
cfg.MinSubmit = minSubmit
cfg.MinConfirmation = minCfm
cfg.ConfirmationChainLength = CfmChainLength
cfg.MaxTxnQuery = maxTxnQuery
cfg.QuerySleepTime = querySleepTime

cfg.SignatureScheme = v.GetString("signature_scheme")
cfg.ChainID = v.GetString("chain_id")

return cfg, nil

}

func isURL(s string) bool {
u, err := url.Parse(s)
return err == nil && u.Scheme != "" && u.Host != ""
}
183 changes: 183 additions & 0 deletions core/conf/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
package conf

import (
"testing"

"github.com/0chain/gosdk/core/conf/mocks"
"github.com/stretchr/testify/require"
)

func TestLoadConfig(t *testing.T) {

var mockDefaultReader = func() Reader {
reader := &mocks.Reader{}
reader.On("GetString", "block_worker").Return("http://127.0.0.1:9091/dns")
reader.On("GetInt", "min_submit").Return(0)
reader.On("GetInt", "min_confirmation").Return(0)
reader.On("GetInt", "max_txn_query").Return(0)
reader.On("GetInt", "query_sleep_time").Return(0)
reader.On("GetInt", "confirmation_chain_length").Return(0)
reader.On("GetStringSlice", "preferred_blobbers").Return(nil)
reader.On("GetString", "signature_scheme").Return("")
reader.On("GetString", "chain_id").Return("")

return reader

}

tests := []struct {
name string
exceptedErr error

setup func(*testing.T) Reader
run func(*require.Assertions, Config)
}{
{
name: "Test_Config_Invalid_BlockWorker",
exceptedErr: ErrInvalidValue,
setup: func(t *testing.T) Reader {

reader := &mocks.Reader{}
reader.On("GetString", "block_worker").Return("")
reader.On("GetInt", "min_submit").Return(0)
reader.On("GetInt", "min_confirmation").Return(0)
reader.On("GetInt", "max_txn_query").Return(0)
reader.On("GetInt", "query_sleep_time").Return(0)
reader.On("GetInt", "confirmation_chain_length").Return(0)
reader.On("GetStringSlice", "preferred_blobbers").Return(nil)
reader.On("GetString", "signature_scheme").Return("")
reader.On("GetString", "chain_id").Return("")

return reader
},
run: func(r *require.Assertions, cfg Config) {

},
},
{
name: "Test_Config_BlockWorker",

setup: func(t *testing.T) Reader {
return mockDefaultReader()
},
run: func(r *require.Assertions, cfg Config) {
r.Equal("http://127.0.0.1:9091/dns", cfg.BlockWorker)
},
},
{
name: "Test_Config_Min_Submit_Less_Than_1",

setup: func(t *testing.T) Reader {
return mockDefaultReader()
},
run: func(r *require.Assertions, cfg Config) {
r.Equal(50, cfg.MinSubmit)
},
},
{
name: "Test_Config_Min_Submit_Greater_Than_100",

setup: func(t *testing.T) Reader {

reader := &mocks.Reader{}
reader.On("GetString", "block_worker").Return("https://127.0.0.1:9091/dns")
reader.On("GetInt", "min_submit").Return(101)
reader.On("GetInt", "min_confirmation").Return(0)
reader.On("GetInt", "max_txn_query").Return(0)
reader.On("GetInt", "query_sleep_time").Return(0)
reader.On("GetInt", "confirmation_chain_length").Return(0)
reader.On("GetStringSlice", "preferred_blobbers").Return(nil)
reader.On("GetString", "signature_scheme").Return("")
reader.On("GetString", "chain_id").Return("")

return reader
},
run: func(r *require.Assertions, cfg Config) {
r.Equal(100, cfg.MinSubmit)
},
},
{
name: "Test_Config_Min_Confirmation_Less_Than_1",

setup: func(t *testing.T) Reader {
return mockDefaultReader()
},
run: func(r *require.Assertions, cfg Config) {
r.Equal(50, cfg.MinConfirmation)
},
},
{
name: "Test_Config_Min_Confirmation_Greater_100",

setup: func(t *testing.T) Reader {

reader := &mocks.Reader{}
reader.On("GetString", "block_worker").Return("https://127.0.0.1:9091/dns")
reader.On("GetInt", "min_submit").Return(0)
reader.On("GetInt", "min_confirmation").Return(101)
reader.On("GetInt", "max_txn_query").Return(0)
reader.On("GetInt", "query_sleep_time").Return(0)
reader.On("GetInt", "confirmation_chain_length").Return(0)
reader.On("GetStringSlice", "preferred_blobbers").Return(nil)
reader.On("GetString", "signature_scheme").Return("")
reader.On("GetString", "chain_id").Return("")

return reader
},
run: func(r *require.Assertions, cfg Config) {
r.Equal(100, cfg.MinConfirmation)
},
}, {
name: "Test_Config_Nax_Txn_Query_Less_Than_1",

setup: func(t *testing.T) Reader {

return mockDefaultReader()
},
run: func(r *require.Assertions, cfg Config) {
r.Equal(5, cfg.QuerySleepTime)
},
}, {
name: "Test_Config_Max_Txn_Query_Less_Than_1",

setup: func(t *testing.T) Reader {

return mockDefaultReader()
},
run: func(r *require.Assertions, cfg Config) {
r.Equal(5, cfg.MaxTxnQuery)
},
}, {
name: "Test_Config_Confirmation_Chain_Length_Less_Than_1",

setup: func(t *testing.T) Reader {
return mockDefaultReader()
},
run: func(r *require.Assertions, cfg Config) {
r.Equal(3, cfg.ConfirmationChainLength)
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {

require := require.New(t)

reader := tt.setup(t)

cfg, err := LoadConfig(reader)

// test it by predefined error variable instead of error message
if tt.exceptedErr != nil {
require.ErrorIs(err, tt.exceptedErr)
} else {
require.Equal(nil, err)
}

if tt.run != nil {
tt.run(require, cfg)
}

})
}
}
Loading