diff --git a/.gitignore b/.gitignore index 6e13223e1..ad7a24047 100644 --- a/.gitignore +++ b/.gitignore @@ -63,4 +63,8 @@ rpc/client.gen.go build/config/gen*.json # Ignored generated files by build -bin/* \ No newline at end of file +bin/* + +# Validator keys used for testing/demoes +val1.json +val2.json \ No newline at end of file diff --git a/Makefile b/Makefile index 417727028..ea9dfe957 100644 --- a/Makefile +++ b/Makefile @@ -243,18 +243,19 @@ protogen_clean: ## Remove all the generated protobufs. .PHONY: protogen_local protogen_local: go_protoc-go-inject-tag ## Generate go structures for all of the protobufs $(eval proto_dir = ".") - protoc --go_opt=paths=source_relative -I=./shared/messaging/proto --go_out=./shared/messaging ./shared/messaging/proto/*.proto --experimental_allow_proto3_optional - protoc --go_opt=paths=source_relative -I=./shared/codec/proto --go_out=./shared/codec ./shared/codec/proto/*.proto --experimental_allow_proto3_optional - protoc --go_opt=paths=source_relative -I=./persistence/indexer/proto --go_out=./persistence/indexer/ ./persistence/indexer/proto/*.proto --experimental_allow_proto3_optional - protoc --go_opt=paths=source_relative -I=./persistence/proto --go_out=./persistence/types ./persistence/proto/*.proto --experimental_allow_proto3_optional +# TODO: Use a forloop to avoid all the code duplication and improve readability + protoc --go_opt=paths=source_relative -I=./shared/messaging/proto --go_out=./shared/messaging ./shared/messaging/proto/*.proto --experimental_allow_proto3_optional + protoc --go_opt=paths=source_relative -I=./shared/codec/proto --go_out=./shared/codec ./shared/codec/proto/*.proto --experimental_allow_proto3_optional + protoc --go_opt=paths=source_relative -I=./persistence/indexer/proto --go_out=./persistence/indexer ./persistence/indexer/proto/*.proto --experimental_allow_proto3_optional + protoc --go_opt=paths=source_relative -I=./shared/ -I=./persistence/proto --go_out=./persistence/types ./persistence/proto/*.proto --experimental_allow_proto3_optional protoc-go-inject-tag -input="./persistence/types/*.pb.go" - protoc --go_opt=paths=source_relative -I=./utility/types/proto --go_out=./utility/types ./utility/types/proto/*.proto --experimental_allow_proto3_optional - protoc --go_opt=paths=source_relative -I=./consensus/types/proto --go_out=./consensus/types ./consensus/types/proto/*.proto --experimental_allow_proto3_optional - protoc --go_opt=paths=source_relative -I=./p2p/raintree/types/proto --go_out=./p2p/types ./p2p/raintree/types/proto/*.proto --experimental_allow_proto3_optional - protoc --go_opt=paths=source_relative -I=./p2p/types/proto --go_out=./p2p/types ./p2p/types/proto/*.proto --experimental_allow_proto3_optional - protoc --go_opt=paths=source_relative -I=./telemetry/proto --go_out=./telemetry ./telemetry/proto/*.proto --experimental_allow_proto3_optional - protoc --go_opt=paths=source_relative -I=./logger/proto --go_out=./logger ./logger/proto/*.proto --experimental_allow_proto3_optional - protoc --go_opt=paths=source_relative -I=./rpc/types/proto --go_out=./rpc/types ./rpc/types/proto/*.proto --experimental_allow_proto3_optional + protoc --go_opt=paths=source_relative -I=./shared/ -I=./utility/types/proto --go_out=./utility/types ./utility/types/proto/*.proto --experimental_allow_proto3_optional + protoc --go_opt=paths=source_relative -I=./consensus/types/proto --go_out=./consensus/types ./consensus/types/proto/*.proto --experimental_allow_proto3_optional + protoc --go_opt=paths=source_relative -I=./p2p/raintree/types/proto --go_out=./p2p/types ./p2p/raintree/types/proto/*.proto --experimental_allow_proto3_optional + protoc --go_opt=paths=source_relative -I=./runtime/configs/proto --go_out=./runtime/configs ./runtime/configs/proto/*.proto --experimental_allow_proto3_optional + protoc --go_opt=paths=source_relative -I=./shared/core/types/proto --go_out=./shared/core/types ./shared/core/types/proto/*.proto --experimental_allow_proto3_optional + protoc --go_opt=paths=source_relative -I=./shared/ -I=./runtime/genesis/proto --go_out=./runtime/genesis ./runtime/genesis/proto/*.proto --experimental_allow_proto3_optional + protoc-go-inject-tag -input="./runtime/genesis/*.pb.go" echo "View generated proto files by running: make protogen_show" .PHONY: protogen_docker_m1 diff --git a/app/client/cli/actor.go b/app/client/cli/actor.go index 6661cb532..7621628d9 100644 --- a/app/client/cli/actor.go +++ b/app/client/cli/actor.go @@ -6,6 +6,7 @@ import ( "regexp" "strings" + coreTypes "github.com/pokt-network/pocket/shared/core/types" typesUtil "github.com/pokt-network/pocket/utility/types" "github.com/spf13/cobra" ) @@ -34,17 +35,17 @@ type ( cmdOption func(*cobra.Command) actorCmdDef struct { Name string - ActorType typesUtil.ActorType + ActorType coreTypes.ActorType Options []cmdOption } ) func NewActorCommands(cmdOptions []cmdOption) []*cobra.Command { actorCmdDefs := []actorCmdDef{ - {"Application", typesUtil.ActorType_App, cmdOptions}, - {"Node", typesUtil.ActorType_ServiceNode, cmdOptions}, - {"Fisherman", typesUtil.ActorType_Fisherman, cmdOptions}, - {"Validator", typesUtil.ActorType_Validator, cmdOptions}, + {"Application", coreTypes.ActorType_ACTOR_TYPE_APP, cmdOptions}, + {"Node", coreTypes.ActorType_ACTOR_TYPE_SERVICENODE, cmdOptions}, + {"Fisherman", coreTypes.ActorType_ACTOR_TYPE_FISH, cmdOptions}, + {"Validator", coreTypes.ActorType_ACTOR_TYPE_VAL, cmdOptions}, } cmds := make([]*cobra.Command, len(actorCmdDefs)) diff --git a/app/client/cli/doc/CHANGELOG.md b/app/client/cli/doc/CHANGELOG.md index 3f8516c53..5cbd7faf9 100644 --- a/app/client/cli/doc/CHANGELOG.md +++ b/app/client/cli/doc/CHANGELOG.md @@ -7,7 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [0.0.2] - 2022-11-02 +## [0.0.0.3] - 2023-01-03 + +- Updated to use `coreTypes` instead of utility types for `Actor` and `ActorType` +- Updated README.md + +## [0.0.0.2] - 2022-11-02 ### Added @@ -16,13 +21,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - System commands working end-to-end - Added Consensus State commands -## [0.0.1] - 2022-09-09 +## [0.0.0.1] - 2022-09-09 ### Added - Commands documentation generator -## [0.0.0] - 2022-09-07 +## [0.0.0.0] - 2022-09-07 ### Added diff --git a/app/client/cli/doc/README.md b/app/client/cli/doc/README.md index abbc2ac4e..d4e1c7b07 100644 --- a/app/client/cli/doc/README.md +++ b/app/client/cli/doc/README.md @@ -24,6 +24,7 @@ Command tree available [here](./commands/client.md) │ │ └── main.go # commands specific documentation generator │ ├── gov.go # Governance subcommand │ ├── utils.go # support functions +│ ├── system.go # System subcommand │ └── utils_test.go # tests for the support functions └── main.go # entrypoint ``` diff --git a/build/config/config1.json b/build/config/config1.json index 359328cb5..e296eb787 100644 --- a/build/config/config1.json +++ b/build/config/config1.json @@ -1,8 +1,6 @@ { - "base": { - "root_directory": "/go/src/github.com/pocket-network", - "private_key": "6fd0bc54cc2dd205eaf226eebdb0451629b321f11d279013ce6fdd5a33059256b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4" - }, + "root_directory": "/go/src/github.com/pocket-network", + "private_key": "6fd0bc54cc2dd205eaf226eebdb0451629b321f11d279013ce6fdd5a33059256b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4", "consensus": { "max_mempool_bytes": 500000000, "pacemaker_config": { diff --git a/build/config/config2.json b/build/config/config2.json index 3b60ffa62..afa43715e 100644 --- a/build/config/config2.json +++ b/build/config/config2.json @@ -1,8 +1,6 @@ { - "base": { - "root_directory": "/go/src/github.com/pocket-network", - "private_key": "5db3e9d97d04d6d70359de924bb02039c602080d6bf01a692bad31ad5ef93524c16043323c83ffd901a8bf7d73543814b8655aa4695f7bfb49d01926fc161cdb" - }, + "root_directory": "/go/src/github.com/pocket-network", + "private_key": "5db3e9d97d04d6d70359de924bb02039c602080d6bf01a692bad31ad5ef93524c16043323c83ffd901a8bf7d73543814b8655aa4695f7bfb49d01926fc161cdb", "consensus": { "max_mempool_bytes": 500000000, "pacemaker_config": { diff --git a/build/config/config3.json b/build/config/config3.json index 54140b350..58cbe5248 100644 --- a/build/config/config3.json +++ b/build/config/config3.json @@ -1,8 +1,6 @@ { - "base": { - "root_directory": "/go/src/github.com/pocket-network", - "private_key": "b37d3ba2f232060c41ba1177fea6008d885fcccad6826d64ee7d49f94d1dbc49a8b6be75d7551da093f788f7286c3a9cb885cfc8e52710eac5f1d5e5b4bf19b2" - }, + "root_directory": "/go/src/github.com/pocket-network", + "private_key": "b37d3ba2f232060c41ba1177fea6008d885fcccad6826d64ee7d49f94d1dbc49a8b6be75d7551da093f788f7286c3a9cb885cfc8e52710eac5f1d5e5b4bf19b2", "consensus": { "max_mempool_bytes": 500000000, "pacemaker_config": { diff --git a/build/config/config4.json b/build/config/config4.json index 333ebad2e..74f76035b 100644 --- a/build/config/config4.json +++ b/build/config/config4.json @@ -1,8 +1,6 @@ { - "base": { - "root_directory": "/go/src/github.com/pocket-network", - "private_key": "c6c136d010d07d7f5e9944aa3594a10f9210dd3e26ebc1bc1516a6d957fd0df353ee26c82826694ffe1773d7b60d5f20dd9e91bdf8745544711bec5ff9c6fb4a" - }, + "root_directory": "/go/src/github.com/pocket-network", + "private_key": "c6c136d010d07d7f5e9944aa3594a10f9210dd3e26ebc1bc1516a6d957fd0df353ee26c82826694ffe1773d7b60d5f20dd9e91bdf8745544711bec5ff9c6fb4a", "consensus": { "max_mempool_bytes": 500000000, "pacemaker_config": { diff --git a/build/config/genesis.json b/build/config/genesis.json index ad0784df5..e19613d45 100755 --- a/build/config/genesis.json +++ b/build/config/genesis.json @@ -1,309 +1,259 @@ { - "persistence_genesis_state": { - "accounts": [ - { - "address": "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", - "amount": "100000000000000" - }, - { - "address": "67eb3f0a50ae459fecf666be0e93176e92441317", - "amount": "100000000000000" - }, - { - "address": "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", - "amount": "100000000000000" - }, - { - "address": "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", - "amount": "100000000000000" - }, - { - "address": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", - "amount": "100000000000000" - }, - { - "address": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", - "amount": "100000000000000" - }, - { - "address": "88a792b7aca673620132ef01f50e62caa58eca83", - "amount": "100000000000000" - } - ], - "pools": [ - { - "address": "DAO", - "amount": "100000000000000" - }, - { - "address": "FeeCollector", - "amount": "0" - }, - { - "address": "AppStakePool", - "amount": "100000000000000" - }, - { - "address": "ValidatorStakePool", - "amount": "100000000000000" - }, - { - "address": "ServiceNodeStakePool", - "amount": "100000000000000" - }, - { - "address": "FishermanStakePool", - "amount": "100000000000000" - } - ], - "validators": [ - { - "address": "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", - "public_key": "b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4", - "chains": null, - "generic_param": "node1.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", - "actor_type": 3 - }, - { - "address": "67eb3f0a50ae459fecf666be0e93176e92441317", - "public_key": "c16043323c83ffd901a8bf7d73543814b8655aa4695f7bfb49d01926fc161cdb", - "chains": null, - "generic_param": "node2.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "67eb3f0a50ae459fecf666be0e93176e92441317", - "actor_type": 3 - }, - { - "address": "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", - "public_key": "a8b6be75d7551da093f788f7286c3a9cb885cfc8e52710eac5f1d5e5b4bf19b2", - "chains": null, - "generic_param": "node3.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", - "actor_type": 3 - }, - { - "address": "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", - "public_key": "53ee26c82826694ffe1773d7b60d5f20dd9e91bdf8745544711bec5ff9c6fb4a", - "chains": null, - "generic_param": "node4.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", - "actor_type": 3 - } - ], - "applications": [ - { - "address": "88a792b7aca673620132ef01f50e62caa58eca83", - "public_key": "5f78658599943dc3e623539ce0b3c9fe4e192034a1e3fef308bc9f96915754e0", - "chains": ["0001"], - "generic_param": "1000000", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "88a792b7aca673620132ef01f50e62caa58eca83", - "actor_type": 0 - } - ], - "service_nodes": [ - { - "address": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", - "public_key": "16cd0a304c38d76271f74dd3c90325144425d904ef1b9a6fbab9b201d75a998b", - "chains": ["0001"], - "generic_param": "node1.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", - "actor_type": 1 - } - ], - "fishermen": [ - { - "address": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", - "public_key": "68efd26af01692fcd77dc135ca1de69ede464e8243e6832bd6c37f282db8c9cb", - "chains": ["0001"], - "generic_param": "node1.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", - "actor_type": 2 - } - ], - "params": { - "blocks_per_session": 4, - "app_minimum_stake": "15000000000", - "app_max_chains": 15, - "app_baseline_stake_rate": 100, - "app_unstaking_blocks": 2016, - "app_minimum_pause_blocks": 4, - "app_max_pause_blocks": 672, - "service_node_minimum_stake": "15000000000", - "service_node_max_chains": 15, - "service_node_unstaking_blocks": 2016, - "service_node_minimum_pause_blocks": 4, - "service_node_max_pause_blocks": 672, - "service_nodes_per_session": 24, - "fisherman_minimum_stake": "15000000000", - "fisherman_max_chains": 15, - "fisherman_unstaking_blocks": 2016, - "fisherman_minimum_pause_blocks": 4, - "fisherman_max_pause_blocks": 672, - "validator_minimum_stake": "15000000000", - "validator_unstaking_blocks": 2016, - "validator_minimum_pause_blocks": 4, - "validator_max_pause_blocks": 672, - "validator_maximum_missed_blocks": 5, - "validator_max_evidence_age_in_blocks": 8, - "proposer_percentage_of_fees": 10, - "missed_blocks_burn_percentage": 1, - "double_sign_burn_percentage": 5, - "message_double_sign_fee": "10000", - "message_send_fee": "10000", - "message_stake_fisherman_fee": "10000", - "message_edit_stake_fisherman_fee": "10000", - "message_unstake_fisherman_fee": "10000", - "message_pause_fisherman_fee": "10000", - "message_unpause_fisherman_fee": "10000", - "message_fisherman_pause_service_node_fee": "10000", - "message_test_score_fee": "10000", - "message_prove_test_score_fee": "10000", - "message_stake_app_fee": "10000", - "message_edit_stake_app_fee": "10000", - "message_unstake_app_fee": "10000", - "message_pause_app_fee": "10000", - "message_unpause_app_fee": "10000", - "message_stake_validator_fee": "10000", - "message_edit_stake_validator_fee": "10000", - "message_unstake_validator_fee": "10000", - "message_pause_validator_fee": "10000", - "message_unpause_validator_fee": "10000", - "message_stake_service_node_fee": "10000", - "message_edit_stake_service_node_fee": "10000", - "message_unstake_service_node_fee": "10000", - "message_pause_service_node_fee": "10000", - "message_unpause_service_node_fee": "10000", - "message_change_parameter_fee": "10000", - "acl_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "blocks_per_session_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "app_minimum_stake_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "app_max_chains_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "app_baseline_stake_rate_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "app_staking_adjustment_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "app_unstaking_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "app_minimum_pause_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "app_max_paused_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "service_node_minimum_stake_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "service_node_max_chains_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "service_node_unstaking_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "service_node_minimum_pause_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "service_node_max_paused_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "service_nodes_per_session_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "fisherman_minimum_stake_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "fisherman_max_chains_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "fisherman_unstaking_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "fisherman_minimum_pause_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "fisherman_max_paused_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "validator_minimum_stake_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "validator_unstaking_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "validator_minimum_pause_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "validator_max_paused_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "validator_maximum_missed_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "validator_max_evidence_age_in_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "proposer_percentage_of_fees_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "missed_blocks_burn_percentage_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "double_sign_burn_percentage_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_double_sign_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_send_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_stake_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_edit_stake_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_unstake_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_pause_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_unpause_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_fisherman_pause_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_test_score_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_prove_test_score_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_stake_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_edit_stake_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_unstake_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_pause_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_unpause_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_stake_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_edit_stake_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_unstake_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_pause_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_unpause_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_stake_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_edit_stake_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_unstake_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_pause_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_unpause_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", - "message_change_parameter_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45" + "accounts": [ + { + "address": "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", + "amount": "100000000000000" + }, + { + "address": "67eb3f0a50ae459fecf666be0e93176e92441317", + "amount": "100000000000000" + }, + { + "address": "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", + "amount": "100000000000000" + }, + { + "address": "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", + "amount": "100000000000000" + }, + { + "address": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", + "amount": "100000000000000" + }, + { + "address": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", + "amount": "100000000000000" + }, + { + "address": "88a792b7aca673620132ef01f50e62caa58eca83", + "amount": "100000000000000" } - }, - "consensus_genesis_state": { - "genesis_time": { - "seconds": 1663610702, - "nanos": 405401000 + ], + "pools": [ + { + "address": "DAO", + "amount": "100000000000000" + }, + { + "address": "FeeCollector", + "amount": "0" + }, + { + "address": "AppStakePool", + "amount": "100000000000000" + }, + { + "address": "ValidatorStakePool", + "amount": "100000000000000" + }, + { + "address": "ServiceNodeStakePool", + "amount": "100000000000000" }, - "chain_id": "testnet", - "max_block_bytes": 4000000, - "validators": [ - { - "address": "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", - "public_key": "b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4", - "chains": null, - "generic_param": "node1.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", - "actor_type": 3 - }, - { - "address": "67eb3f0a50ae459fecf666be0e93176e92441317", - "public_key": "c16043323c83ffd901a8bf7d73543814b8655aa4695f7bfb49d01926fc161cdb", - "chains": null, - "generic_param": "node2.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "67eb3f0a50ae459fecf666be0e93176e92441317", - "actor_type": 3 - }, - { - "address": "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", - "public_key": "a8b6be75d7551da093f788f7286c3a9cb885cfc8e52710eac5f1d5e5b4bf19b2", - "chains": null, - "generic_param": "node3.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", - "actor_type": 3 - }, - { - "address": "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", - "public_key": "53ee26c82826694ffe1773d7b60d5f20dd9e91bdf8745544711bec5ff9c6fb4a", - "chains": null, - "generic_param": "node4.consensus:8080", - "staked_amount": "1000000000000", - "paused_height": -1, - "unstaking_height": -1, - "output": "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", - "actor_type": 3 - } - ] - } + { + "address": "FishermanStakePool", + "amount": "100000000000000" + } + ], + "validators": [ + { + "address": "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", + "public_key": "b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4", + "chains": null, + "generic_param": "node1.consensus:8080", + "staked_amount": "1000000000000", + "paused_height": -1, + "unstaking_height": -1, + "output": "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", + "actor_type": 4 + }, + { + "address": "67eb3f0a50ae459fecf666be0e93176e92441317", + "public_key": "c16043323c83ffd901a8bf7d73543814b8655aa4695f7bfb49d01926fc161cdb", + "chains": null, + "generic_param": "node2.consensus:8080", + "staked_amount": "1000000000000", + "paused_height": -1, + "unstaking_height": -1, + "output": "67eb3f0a50ae459fecf666be0e93176e92441317", + "actor_type": 4 + }, + { + "address": "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", + "public_key": "a8b6be75d7551da093f788f7286c3a9cb885cfc8e52710eac5f1d5e5b4bf19b2", + "chains": null, + "generic_param": "node3.consensus:8080", + "staked_amount": "1000000000000", + "paused_height": -1, + "unstaking_height": -1, + "output": "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", + "actor_type": 4 + }, + { + "address": "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", + "public_key": "53ee26c82826694ffe1773d7b60d5f20dd9e91bdf8745544711bec5ff9c6fb4a", + "chains": null, + "generic_param": "node4.consensus:8080", + "staked_amount": "1000000000000", + "paused_height": -1, + "unstaking_height": -1, + "output": "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", + "actor_type": 4 + } + ], + "applications": [ + { + "address": "88a792b7aca673620132ef01f50e62caa58eca83", + "public_key": "5f78658599943dc3e623539ce0b3c9fe4e192034a1e3fef308bc9f96915754e0", + "chains": ["0001"], + "generic_param": "1000000", + "staked_amount": "1000000000000", + "paused_height": -1, + "unstaking_height": -1, + "output": "88a792b7aca673620132ef01f50e62caa58eca83", + "actor_type": 1 + } + ], + "service_nodes": [ + { + "address": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", + "public_key": "16cd0a304c38d76271f74dd3c90325144425d904ef1b9a6fbab9b201d75a998b", + "chains": ["0001"], + "generic_param": "node1.consensus:8080", + "staked_amount": "1000000000000", + "paused_height": -1, + "unstaking_height": -1, + "output": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", + "actor_type": 2 + } + ], + "fishermen": [ + { + "address": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", + "public_key": "68efd26af01692fcd77dc135ca1de69ede464e8243e6832bd6c37f282db8c9cb", + "chains": ["0001"], + "generic_param": "node1.consensus:8080", + "staked_amount": "1000000000000", + "paused_height": -1, + "unstaking_height": -1, + "output": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", + "actor_type": 3 + } + ], + "params": { + "blocks_per_session": 4, + "app_minimum_stake": "15000000000", + "app_max_chains": 15, + "app_baseline_stake_rate": 100, + "app_unstaking_blocks": 2016, + "app_minimum_pause_blocks": 4, + "app_max_pause_blocks": 672, + "service_node_minimum_stake": "15000000000", + "service_node_max_chains": 15, + "service_node_unstaking_blocks": 2016, + "service_node_minimum_pause_blocks": 4, + "service_node_max_pause_blocks": 672, + "service_nodes_per_session": 24, + "fisherman_minimum_stake": "15000000000", + "fisherman_max_chains": 15, + "fisherman_unstaking_blocks": 2016, + "fisherman_minimum_pause_blocks": 4, + "fisherman_max_pause_blocks": 672, + "validator_minimum_stake": "15000000000", + "validator_unstaking_blocks": 2016, + "validator_minimum_pause_blocks": 4, + "validator_max_pause_blocks": 672, + "validator_maximum_missed_blocks": 5, + "validator_max_evidence_age_in_blocks": 8, + "proposer_percentage_of_fees": 10, + "missed_blocks_burn_percentage": 1, + "double_sign_burn_percentage": 5, + "message_double_sign_fee": "10000", + "message_send_fee": "10000", + "message_stake_fisherman_fee": "10000", + "message_edit_stake_fisherman_fee": "10000", + "message_unstake_fisherman_fee": "10000", + "message_pause_fisherman_fee": "10000", + "message_unpause_fisherman_fee": "10000", + "message_fisherman_pause_service_node_fee": "10000", + "message_test_score_fee": "10000", + "message_prove_test_score_fee": "10000", + "message_stake_app_fee": "10000", + "message_edit_stake_app_fee": "10000", + "message_unstake_app_fee": "10000", + "message_pause_app_fee": "10000", + "message_unpause_app_fee": "10000", + "message_stake_validator_fee": "10000", + "message_edit_stake_validator_fee": "10000", + "message_unstake_validator_fee": "10000", + "message_pause_validator_fee": "10000", + "message_unpause_validator_fee": "10000", + "message_stake_service_node_fee": "10000", + "message_edit_stake_service_node_fee": "10000", + "message_unstake_service_node_fee": "10000", + "message_pause_service_node_fee": "10000", + "message_unpause_service_node_fee": "10000", + "message_change_parameter_fee": "10000", + "acl_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "blocks_per_session_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "app_minimum_stake_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "app_max_chains_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "app_baseline_stake_rate_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "app_staking_adjustment_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "app_unstaking_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "app_minimum_pause_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "app_max_paused_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "service_node_minimum_stake_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "service_node_max_chains_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "service_node_unstaking_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "service_node_minimum_pause_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "service_node_max_paused_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "service_nodes_per_session_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "fisherman_minimum_stake_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "fisherman_max_chains_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "fisherman_unstaking_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "fisherman_minimum_pause_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "fisherman_max_paused_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "validator_minimum_stake_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "validator_unstaking_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "validator_minimum_pause_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "validator_max_paused_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "validator_maximum_missed_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "validator_max_evidence_age_in_blocks_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "proposer_percentage_of_fees_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "missed_blocks_burn_percentage_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "double_sign_burn_percentage_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_double_sign_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_send_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_stake_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_edit_stake_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_unstake_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_pause_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_unpause_fisherman_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_fisherman_pause_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_test_score_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_prove_test_score_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_stake_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_edit_stake_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_unstake_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_pause_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_unpause_app_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_stake_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_edit_stake_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_unstake_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_pause_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_unpause_validator_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_stake_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_edit_stake_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_unstake_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_pause_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_unpause_service_node_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45", + "message_change_parameter_fee_owner": "da034209758b78eaea06dd99c07909ab54c99b45" + }, + "genesis_time": { + "seconds": 1663610702, + "nanos": 405401000 + }, + "chain_id": "testnet", + "max_block_bytes": 4000000 } diff --git a/build/docs/CHANGELOG.md b/build/docs/CHANGELOG.md new file mode 100644 index 000000000..aa092940b --- /dev/null +++ b/build/docs/CHANGELOG.md @@ -0,0 +1,17 @@ +# Changelog + +All notable changes to this module will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.0.0.1] - 2023-01-03 + +- Removed `BaseConfig` from `configs` +- Centralized `PersistenceGenesisState` and `ConsensusGenesisState` into `GenesisState` + +## [0.0.0.0] - 2022-12-22 + +- Introduced this `CHANGELOG.md` diff --git a/consensus/block.go b/consensus/block.go index 75b62ab80..2ff8b8914 100644 --- a/consensus/block.go +++ b/consensus/block.go @@ -35,8 +35,8 @@ func (m *consensusModule) validateBlockBasic(block *typesCons.Block) error { return typesCons.ErrBlockExists } - if block != nil && unsafe.Sizeof(*block) > uintptr(m.consGenesis.GetMaxBlockBytes()) { - return typesCons.ErrInvalidBlockSize(uint64(unsafe.Sizeof(*block)), m.consGenesis.GetMaxBlockBytes()) + if block != nil && unsafe.Sizeof(*block) > uintptr(m.genesisState.GetMaxBlockBytes()) { + return typesCons.ErrInvalidBlockSize(uint64(unsafe.Sizeof(*block)), m.genesisState.GetMaxBlockBytes()) } // If the current block being processed (i.e. voted on) by consensus is non nil, we need to make diff --git a/consensus/consensus_tests/pacemaker_test.go b/consensus/consensus_tests/pacemaker_test.go index 17fdd0b93..d5db12c35 100644 --- a/consensus/consensus_tests/pacemaker_test.go +++ b/consensus/consensus_tests/pacemaker_test.go @@ -25,9 +25,8 @@ func TestTinyPacemakerTimeouts(t *testing.T) { paceMakerTimeout := 50 * time.Millisecond runtimeMgrs := GenerateNodeRuntimeMgrs(t, numValidators, clockMock) for _, runtimeConfig := range runtimeMgrs { - if consCfg, ok := runtimeConfig.GetConfig().GetConsensusConfig().(consensus.HasPacemakerConfig); ok { - consCfg.GetPacemakerConfig().SetTimeoutMsec(paceMakerTimeoutMsec) - } + consCfg := runtimeConfig.GetConfig().Consensus.PacemakerConfig + consCfg.TimeoutMsec = paceMakerTimeoutMsec } // Create & start test pocket nodes diff --git a/consensus/consensus_tests/utils_test.go b/consensus/consensus_tests/utils_test.go index 9cf3c2de1..518e487e1 100644 --- a/consensus/consensus_tests/utils_test.go +++ b/consensus/consensus_tests/utils_test.go @@ -16,9 +16,12 @@ import ( "github.com/pokt-network/pocket/consensus" typesCons "github.com/pokt-network/pocket/consensus/types" "github.com/pokt-network/pocket/runtime" + "github.com/pokt-network/pocket/runtime/configs" + "github.com/pokt-network/pocket/runtime/genesis" "github.com/pokt-network/pocket/runtime/test_artifacts" "github.com/pokt-network/pocket/shared" "github.com/pokt-network/pocket/shared/codec" + coreTypes "github.com/pokt-network/pocket/shared/core/types" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/messaging" "github.com/pokt-network/pocket/shared/modules" @@ -66,17 +69,17 @@ func GenerateNodeRuntimeMgrs(_ *testing.T, validatorCount int, clockMgr clock.Cl runtimeMgrs := make([]runtime.Manager, validatorCount) var validatorKeys []string genesisState, validatorKeys := test_artifacts.NewGenesisState(validatorCount, 1, 1, 1) - configs := test_artifacts.NewDefaultConfigs(validatorKeys) - for i, config := range configs { - runtime.WithConsensusConfig(&typesCons.ConsensusConfig{ - PrivateKey: config.GetBaseConfig().GetPrivateKey(), + cfgs := test_artifacts.NewDefaultConfigs(validatorKeys) + for i, config := range cfgs { + config.Consensus = &configs.ConsensusConfig{ + PrivateKey: config.PrivateKey, MaxMempoolBytes: 500000000, - PacemakerConfig: &typesCons.PacemakerConfig{ + PacemakerConfig: &configs.PacemakerConfig{ TimeoutMsec: 5000, Manual: false, DebugTimeBetweenStepsMsec: 0, }, - })(config) + } runtimeMgrs[i] = *runtime.NewManager(config, genesisState, runtime.WithClock(clockMgr)) } return runtimeMgrs @@ -91,9 +94,9 @@ func CreateTestConsensusPocketNodes( // TODO(design): The order here is important in order for NodeId to be set correctly below. // This logic will need to change once proper leader election is implemented. sort.Slice(runtimeMgrs, func(i, j int) bool { - pk, err := cryptoPocket.NewPrivateKey(runtimeMgrs[i].GetConfig().GetBaseConfig().GetPrivateKey()) + pk, err := cryptoPocket.NewPrivateKey(runtimeMgrs[i].GetConfig().PrivateKey) require.NoError(t, err) - pk2, err := cryptoPocket.NewPrivateKey(runtimeMgrs[j].GetConfig().GetBaseConfig().GetPrivateKey()) + pk2, err := cryptoPocket.NewPrivateKey(runtimeMgrs[j].GetConfig().PrivateKey) require.NoError(t, err) return pk.Address().String() < pk2.Address().String() }) @@ -114,9 +117,9 @@ func CreateTestConsensusPocketNodesNew( // TODO(design): The order here is important in order for NodeId to be set correctly below. // This logic will need to change once proper leader election is implemented. sort.Slice(runtimeMgrs, func(i, j int) bool { - pk, err := cryptoPocket.NewPrivateKey(runtimeMgrs[i].GetConfig().GetBaseConfig().GetPrivateKey()) + pk, err := cryptoPocket.NewPrivateKey(runtimeMgrs[i].GetConfig().PrivateKey) require.NoError(t, err) - pk2, err := cryptoPocket.NewPrivateKey(runtimeMgrs[j].GetConfig().GetBaseConfig().GetPrivateKey()) + pk2, err := cryptoPocket.NewPrivateKey(runtimeMgrs[j].GetConfig().PrivateKey) require.NoError(t, err) return pk.Address().String() < pk2.Address().String() }) @@ -149,7 +152,7 @@ func CreateTestConsensusPocketNode( require.NoError(t, err) - pk, err := cryptoPocket.NewPrivateKey(runtimeMgr.GetConfig().GetBaseConfig().GetPrivateKey()) + pk, err := cryptoPocket.NewPrivateKey(runtimeMgr.GetConfig().PrivateKey) require.NoError(t, err) pocketNode := shared.NewNodeWithP2PAddress(pk.Address()) @@ -350,7 +353,7 @@ func baseP2PMock(t *testing.T, testChannel modules.EventsChannel) *modulesMock.M } // Creates a utility module mock with mock implementations of some basic functionality -func baseUtilityMock(t *testing.T, _ modules.EventsChannel, genesisState modules.GenesisState) *modulesMock.MockUtilityModule { +func baseUtilityMock(t *testing.T, _ modules.EventsChannel, genesisState *genesis.GenesisState) *modulesMock.MockUtilityModule { ctrl := gomock.NewController(t) utilityMock := modulesMock.NewMockUtilityModule(ctrl) utilityContextMock := baseUtilityContextMock(t, genesisState) @@ -365,11 +368,11 @@ func baseUtilityMock(t *testing.T, _ modules.EventsChannel, genesisState modules return utilityMock } -func baseUtilityContextMock(t *testing.T, genesisState modules.GenesisState) *modulesMock.MockUtilityContext { +func baseUtilityContextMock(t *testing.T, genesisState *genesis.GenesisState) *modulesMock.MockUtilityContext { ctrl := gomock.NewController(t) utilityContextMock := modulesMock.NewMockUtilityContext(ctrl) persistenceContextMock := modulesMock.NewMockPersistenceRWContext(ctrl) - persistenceContextMock.EXPECT().GetAllValidators(gomock.Any()).Return(genesisState.GetPersistenceGenesisState().GetVals(), nil).AnyTimes() + persistenceContextMock.EXPECT().GetAllValidators(gomock.Any()).Return(genesisState.GetValidators(), nil).AnyTimes() persistenceContextMock.EXPECT().GetBlockHash(gomock.Any()).Return("", nil).AnyTimes() utilityContextMock.EXPECT(). @@ -485,11 +488,11 @@ func assertRound(t *testing.T, nodeId typesCons.NodeId, expected, actual uint8) require.Equal(t, expected, actual, "[NODE][%v] failed assertRound", nodeId) } -// makeMockActors creates a slice of modules.Actor with n &modulesMock.MockActor{} in it. -func makeMockActors(n int) []modules.Actor { - actors := make([]modules.Actor, n) +// makeMockActors creates a slice of *coreTypes.Actor with n &coreTypes.MockActor{} in it. +func makeMockActors(n int) []*coreTypes.Actor { + actors := make([]*coreTypes.Actor, n) for i := 0; i < n; i++ { - actors[i] = &modulesMock.MockActor{} + actors[i] = &coreTypes.Actor{} } return actors } diff --git a/consensus/doc/CHANGELOG.md b/consensus/doc/CHANGELOG.md index 7c4267f40..d59274cf2 100644 --- a/consensus/doc/CHANGELOG.md +++ b/consensus/doc/CHANGELOG.md @@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.15] - 2023-01-03 + +- ValidatorMap uses `Actor` references now + +## [0.0.0.14] - 2022-12-21 + +- Updated do use the new centralized config and genesis +- `Actor` is now a shared `struct` instead of an `interface` +- Removed converters between the interfaces and the consensus structs for Validators + ## [0.0.0.13] - 2022-12-14 - Consolidated number of validators in tests in a single constant: `numValidators` diff --git a/consensus/hotstuff_leader.go b/consensus/hotstuff_leader.go index 1fe6fa59a..e8147c584 100644 --- a/consensus/hotstuff_leader.go +++ b/consensus/hotstuff_leader.go @@ -322,7 +322,7 @@ func (m *consensusModule) validatePartialSignature(msg *typesCons.HotstuffMessag // and does not recursively determine the size of all the underlying elements // Add proper tests and implementation once the mempool is implemented. func (m *consensusModule) tempIndexHotstuffMessage(msg *typesCons.HotstuffMessage) { - if m.consCfg.GetMaxMempoolBytes() < uint64(unsafe.Sizeof(m.messagePool)) { + if m.consCfg.MaxMempoolBytes < uint64(unsafe.Sizeof(m.messagePool)) { m.nodeLogError(typesCons.DisregardHotstuffMessage, typesCons.ErrConsensusMempoolFull) return } diff --git a/consensus/module.go b/consensus/module.go index 51242f5c1..5e15f30ce 100644 --- a/consensus/module.go +++ b/consensus/module.go @@ -9,6 +9,8 @@ import ( "github.com/pokt-network/pocket/consensus/leader_election" consensusTelemetry "github.com/pokt-network/pocket/consensus/telemetry" typesCons "github.com/pokt-network/pocket/consensus/types" + "github.com/pokt-network/pocket/runtime/configs" + "github.com/pokt-network/pocket/runtime/genesis" "github.com/pokt-network/pocket/shared/codec" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/modules" @@ -21,18 +23,16 @@ const ( ) var ( - _ modules.ConsensusModule = &consensusModule{} - _ modules.ConsensusConfig = &typesCons.ConsensusConfig{} - _ modules.ConsensusGenesisState = &typesCons.ConsensusGenesisState{} - _ ConsensusDebugModule = &consensusModule{} + _ modules.ConsensusModule = &consensusModule{} + _ ConsensusDebugModule = &consensusModule{} ) type consensusModule struct { bus modules.Bus privateKey cryptoPocket.Ed25519PrivateKey - consCfg modules.ConsensusConfig - consGenesis modules.ConsensusGenesisState + consCfg *configs.ConsensusConfig + genesisState *genesis.GenesisState // m is a mutex used to control synchronization when multiple goroutines are accessing the struct and its fields / properties. // @@ -119,17 +119,12 @@ func Create(runtimeMgr modules.RuntimeMgr) (modules.Module, error) { func (*consensusModule) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, error) { var m *consensusModule - cfg := runtimeMgr.GetConfig() - if err := m.ValidateConfig(cfg); err != nil { - return nil, fmt.Errorf("config validation failed: %w", err) - } - consensusCfg := cfg.GetConsensusConfig() + consensusCfg := runtimeMgr.GetConfig().Consensus - genesis := runtimeMgr.GetGenesis() - if err := m.ValidateGenesis(genesis); err != nil { + genesisState := runtimeMgr.GetGenesis() + if err := m.ValidateGenesis(genesisState); err != nil { return nil, fmt.Errorf("genesis validation failed: %w", err) } - consensusGenesis := genesis.GetConsensusGenesisState() leaderElectionMod, err := leader_election.Create(runtimeMgr) if err != nil { @@ -142,9 +137,9 @@ func (*consensusModule) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, e return nil, err } - valMap := typesCons.ActorListToValidatorMap(consensusGenesis.GetVals()) + valMap := typesCons.ActorListToValidatorMap(genesisState.GetValidators()) - privateKey, err := cryptoPocket.NewPrivateKey(consensusCfg.GetPrivateKey()) + privateKey, err := cryptoPocket.NewPrivateKey(consensusCfg.PrivateKey) if err != nil { return nil, err } @@ -156,9 +151,9 @@ func (*consensusModule) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, e m = &consensusModule{ bus: nil, - privateKey: privateKey.(cryptoPocket.Ed25519PrivateKey), - consCfg: cfg.GetConsensusConfig(), - consGenesis: genesis.GetConsensusGenesisState(), + privateKey: privateKey.(cryptoPocket.Ed25519PrivateKey), + consCfg: consensusCfg, + genesisState: genesisState, height: 0, round: 0, @@ -235,14 +230,9 @@ func (m *consensusModule) SetBus(pocketBus modules.Bus) { m.leaderElectionMod.SetBus(pocketBus) } -func (*consensusModule) ValidateConfig(cfg modules.Config) error { - // TODO (#334): implement this - return nil -} - -func (*consensusModule) ValidateGenesis(genesis modules.GenesisState) error { +func (*consensusModule) ValidateGenesis(genesis *genesis.GenesisState) error { // Sort the validators by their generic param (i.e. service URL) - vals := genesis.GetConsensusGenesisState().GetVals() + vals := genesis.GetValidators() sort.Slice(vals, func(i, j int) bool { return vals[i].GetGenericParam() < vals[j].GetGenericParam() }) @@ -266,7 +256,7 @@ func (*consensusModule) ValidateGenesis(genesis modules.GenesisState) error { } func (m *consensusModule) GetPrivateKey() (cryptoPocket.PrivateKey, error) { - return cryptoPocket.NewPrivateKey(m.consCfg.GetPrivateKey()) + return cryptoPocket.NewPrivateKey(m.consCfg.PrivateKey) } func (m *consensusModule) HandleMessage(message *anypb.Any) error { @@ -329,9 +319,3 @@ func (m *consensusModule) loadPersistedState() error { return nil } - -// HasPacemakerConfig is used to determine if a ConsensusConfig includes a PacemakerConfig without having to cast to the struct -// (which would break mocks and/or pollute the codebase with mock types casts and checks) -type HasPacemakerConfig interface { - GetPacemakerConfig() *typesCons.PacemakerConfig -} diff --git a/consensus/pacemaker.go b/consensus/pacemaker.go index bb7b3c3ca..0f1e90590 100644 --- a/consensus/pacemaker.go +++ b/consensus/pacemaker.go @@ -2,12 +2,12 @@ package consensus import ( "context" - "fmt" "log" timePkg "time" consensusTelemetry "github.com/pokt-network/pocket/consensus/telemetry" typesCons "github.com/pokt-network/pocket/consensus/types" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/shared/modules" ) @@ -31,10 +31,8 @@ type Pacemaker interface { } var ( - _ modules.Module = &paceMaker{} - _ modules.ConfigurableModule = &paceMaker{} - _ PacemakerDebug = &paceMaker{} - _ modules.PacemakerConfig = &typesCons.PacemakerConfig{} + _ modules.Module = &paceMaker{} + _ PacemakerDebug = &paceMaker{} ) type paceMaker struct { @@ -46,7 +44,7 @@ type paceMaker struct { // a great idea in production code. consensusMod *consensusModule - pacemakerCfg modules.PacemakerConfig + pacemakerCfg *configs.PacemakerConfig stepCancelFunc context.CancelFunc @@ -61,11 +59,8 @@ func CreatePacemaker(runtimeMgr modules.RuntimeMgr) (modules.Module, error) { func (m *paceMaker) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, error) { cfg := runtimeMgr.GetConfig() - if err := m.ValidateConfig(cfg); err != nil { - log.Fatalf("config validation failed: %v", err) - } - pacemakerCfg := cfg.GetConsensusConfig().(HasPacemakerConfig).GetPacemakerConfig() + pacemakerCfg := cfg.Consensus.PacemakerConfig return &paceMaker{ bus: nil, @@ -76,8 +71,8 @@ func (m *paceMaker) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, error stepCancelFunc: nil, // Only set on restarts paceMakerDebug: paceMakerDebug{ - manualMode: pacemakerCfg.GetManual(), - debugTimeBetweenStepsMsec: pacemakerCfg.GetDebugTimeBetweenStepsMsec(), + manualMode: pacemakerCfg.Manual, + debugTimeBetweenStepsMsec: pacemakerCfg.DebugTimeBetweenStepsMsec, quorumCertificate: nil, }, }, nil @@ -106,13 +101,6 @@ func (m *paceMaker) GetBus() modules.Bus { return m.bus } -func (*paceMaker) ValidateConfig(cfg modules.Config) error { - if _, ok := cfg.GetConsensusConfig().(HasPacemakerConfig); !ok { - return fmt.Errorf("cannot cast to PacemakeredConsensus") - } - return nil -} - func (m *paceMaker) SetConsensusModule(c *consensusModule) { m.consensusMod = c } @@ -259,6 +247,6 @@ func (p *paceMaker) startNextView(qc *typesCons.QuorumCertificate, forceNextView // TODO(olshansky): Increase timeout using exponential backoff. func (p *paceMaker) getStepTimeout(round uint64) timePkg.Duration { - baseTimeout := timePkg.Duration(int64(timePkg.Millisecond) * int64(p.pacemakerCfg.GetTimeoutMsec())) + baseTimeout := timePkg.Duration(int64(timePkg.Millisecond) * int64(p.pacemakerCfg.TimeoutMsec)) return baseTimeout } diff --git a/consensus/types/consensus_genesis.go b/consensus/types/consensus_genesis.go deleted file mode 100644 index 4ec59e476..000000000 --- a/consensus/types/consensus_genesis.go +++ /dev/null @@ -1,19 +0,0 @@ -package types - -import "github.com/pokt-network/pocket/shared/modules" - -var _ modules.ConsensusGenesisState = &ConsensusGenesisState{} - -func (x *ConsensusGenesisState) GetVals() []modules.Actor { - return ActorsToActorsInterface(x.GetValidators()) -} - -func ActorsToActorsInterface(vals []*Validator) (actorI []modules.Actor) { - actorI = make([]modules.Actor, len(vals)) - for i, actor := range vals { - actorI[i] = actor - } - return -} - -var _ modules.Actor = &Validator{} diff --git a/consensus/types/converters.go b/consensus/types/converters.go deleted file mode 100644 index f11d42bc2..000000000 --- a/consensus/types/converters.go +++ /dev/null @@ -1,22 +0,0 @@ -package types - -import ( - "github.com/pokt-network/pocket/shared/modules" -) - -func actorToValidator(actor modules.Actor) *Validator { - return &Validator{ - Address: actor.GetAddress(), - PublicKey: actor.GetPublicKey(), - StakedAmount: actor.GetStakedAmount(), - GenericParam: actor.GetGenericParam(), - } -} - -func ToConsensusValidators(actors []modules.Actor) (vals []*Validator) { - vals = make([]*Validator, len(actors)) - for i, actor := range actors { - vals[i] = actorToValidator(actor) - } - return -} diff --git a/consensus/types/proto/consensus_genesis.proto b/consensus/types/proto/validator.proto similarity index 52% rename from consensus/types/proto/consensus_genesis.proto rename to consensus/types/proto/validator.proto index 0d6ac61c4..dfac06ea9 100644 --- a/consensus/types/proto/consensus_genesis.proto +++ b/consensus/types/proto/validator.proto @@ -1,20 +1,12 @@ syntax = "proto3"; -package consensus; -import "google/protobuf/timestamp.proto"; +package consensus; option go_package = "github.com/pokt-network/pocket/consensus/types"; -message ConsensusGenesisState { - google.protobuf.Timestamp genesis_time = 1; - string chain_id = 2; // TODO/DISCUSS re-evaluate naming covention - uint64 max_block_bytes = 3; - repeated Validator validators = 4; -} - message Validator { string address = 1; string public_key = 2; string staked_amount = 3; string generic_param = 4; // TODO/DISCUSS re-evaluate naming covention -} \ No newline at end of file +} diff --git a/consensus/types/types.go b/consensus/types/types.go index 67f3af523..263ea8862 100644 --- a/consensus/types/types.go +++ b/consensus/types/types.go @@ -4,6 +4,7 @@ package types import ( "sort" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/modules" ) @@ -11,7 +12,7 @@ type NodeId uint64 type ValAddrToIdMap map[string]NodeId // Mapping from hex encoded address to an integer node id. type IdToValAddrMap map[NodeId]string // Mapping from node id to a hex encoded string address. -type ValidatorMap map[string]modules.Actor +type ValidatorMap map[string]*coreTypes.Actor type ConsensusNodeState struct { NodeId NodeId @@ -41,30 +42,18 @@ func GetValAddrToIdMap(validatorMap ValidatorMap) (ValAddrToIdMap, IdToValAddrMa return valToIdMap, idToValMap } -func (x *PacemakerConfig) SetTimeoutMsec(u uint64) { - x.TimeoutMsec = u -} - func ValidatorMapToModulesValidatorMap(validatorMap ValidatorMap) (vm modules.ValidatorMap) { vm = make(modules.ValidatorMap) for _, v := range validatorMap { - vm[v.GetAddress()] = v + vm[v.GetAddress()] = *v } return } -func ActorListToValidatorMap(actors []modules.Actor) (m ValidatorMap) { +func ActorListToValidatorMap(actors []*coreTypes.Actor) (m ValidatorMap) { m = make(ValidatorMap, len(actors)) for _, a := range actors { m[a.GetAddress()] = a } return } - -var _ modules.Actor = &Validator{} - -func (x *Validator) GetPausedHeight() int64 { panic("not implemented on consensus validator") } -func (x *Validator) GetUnstakingHeight() int64 { panic("not implemented on consensus validator") } -func (x *Validator) GetOutput() string { panic("not implemented on consensus validator") } -func (x *Validator) GetActorTyp() modules.ActorType { panic("not implemented on consensus validator") } -func (x *Validator) GetChains() []string { panic("not implemented on consensus validator") } diff --git a/docs/demos/iteration_3_end_to_end_tx.md b/docs/demos/iteration_3_end_to_end_tx.md index 55010445b..38c5fd8c5 100644 --- a/docs/demos/iteration_3_end_to_end_tx.md +++ b/docs/demos/iteration_3_end_to_end_tx.md @@ -10,6 +10,7 @@ - [Shell #4: Inspect the data in the database for node3](#shell-4-inspect-the-data-in-the-database-for-node3) - [Shell #5: Trigger a send transaction from the CLI](#shell-5-trigger-a-send-transaction-from-the-cli) - [Available Commands](#available-commands) + - [Accounts setup](#accounts-setup) - [First Transaction](#first-transaction) - [Second Transaction](#second-transaction) - [\[Optional\] Shell #6: See Swagger UI](#optional-shell-6-see-swagger-ui) @@ -96,12 +97,32 @@ Show all the commands available in the CLI: go run app/client/*.go ``` +#### Accounts setup + +Since our Keybase is under development, we have to manually inject the private keys of the accounts we want to use in the CLI. + +For the following steps, you'll need to use the accounts of the first two validators in the hard-coded development genesis file. Therefore you have some options: + +1) You can just: + ```bash + echo '"6fd0bc54cc2dd205eaf226eebdb0451629b321f11d279013ce6fdd5a33059256b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4"' > /tmp/val1.json + echo '"5db3e9d97d04d6d70359de924bb02039c602080d6bf01a692bad31ad5ef93524c16043323c83ffd901a8bf7d73543814b8655aa4695f7bfb49d01926fc161cdb"' > /tmp/val2.json + ``` + +2) You can use `jq` and run these commands: + ```bash + cat ./build/config/config1.json | jq '.private_key' > /tmp/val1.json + cat ./build/config/config2.json | jq '.private_key' > /tmp/val2.json + ``` + +3) You can manually copy-paste the private keys from the config files into the `/tmp/val1.json` and `/tmp/val2.json` files. Remember to keep the double quotes around the private keys ("private_key" field in the JSON). + ### First Transaction Trigger a send transaction from validator 1 to validator 2. ```bash -go run app/client/*.go --path_to_private_key_file=/Users/olshansky/workspace/pocket/pocket/build/pkeys/val1.json Account Send 6f66574e1f50f0ef72dff748c3f11b9e0e89d32a 67eb3f0a50ae459fecf666be0e93176e92441317 1000 +go run app/client/*.go --path_to_private_key_file=/tmp/val1.json Account Send 6f66574e1f50f0ef72dff748c3f11b9e0e89d32a 67eb3f0a50ae459fecf666be0e93176e92441317 1000 ``` 1. Use shell #2 to `TriggerNextView` and confirm height increased via `PrintNodeState` @@ -120,7 +141,7 @@ go run app/client/*.go --path_to_private_key_file=/Users/olshansky/workspace/poc Trigger a send transaction from validator 2 to validator 1. ```bash -go run app/client/*.go --path_to_private_key_file=/Users/olshansky/workspace/pocket/pocket/build/pkeys/val2.json Account Send 67eb3f0a50ae459fecf666be0e93176e92441317 6f66574e1f50f0ef72dff748c3f11b9e0e89d32a 1000 +go run app/client/*.go --path_to_private_key_file=/tmp/val2.json Account Send 67eb3f0a50ae459fecf666be0e93176e92441317 6f66574e1f50f0ef72dff748c3f11b9e0e89d32a 1000 ``` 1. Use shell #2 to `TriggerNextView` (one or more times) and confirm height increased via `PrintNodeState` diff --git a/docs/development/README.md b/docs/development/README.md index bf8bdc924..7116d0f2f 100644 --- a/docs/development/README.md +++ b/docs/development/README.md @@ -161,11 +161,14 @@ Pocket | ├── deployments # Docker-compose to run different cluster of services for development | ├── Docker* # Various Dockerfile(s) ├── consensus # Implementation of the Consensus module -├── core # [currently-unused] ├── docs # Links to V1 Protocol implementation documentation (excluding the protocol specification) +├── logger # Implementation of the Logger module ├── p2p # Implementation of the P2P module ├── persistence # Implementation of the Persistence module +├── rpc # Implementation of the RPC module +├── runtime # Implementation of the Runtime module ├── shared # [to-be-refactored] Shared types, modules and utils +├── telemetry # Implementation of the Telemetry module ├── utility # Implementation of the Utility module ├── Makefile # [to-be-deleted] The source of targets used to develop, build and test ``` diff --git a/go.mod b/go.mod index b0f541362..1782ea860 100644 --- a/go.mod +++ b/go.mod @@ -11,8 +11,8 @@ require ( github.com/golang/mock v1.6.0 github.com/jackc/pgx/v4 v4.17.2 github.com/ory/dockertest v3.3.5+incompatible - github.com/stretchr/testify v1.8.0 - golang.org/x/crypto v0.0.0-20221012134737-56aed061732a + github.com/stretchr/testify v1.8.1 + golang.org/x/crypto v0.1.0 golang.org/x/exp v0.0.0-20221012211006-4de253d81b95 gonum.org/v1/gonum v0.12.0 google.golang.org/protobuf v1.28.1 @@ -60,7 +60,7 @@ require ( github.com/prometheus/client_golang v1.13.0 github.com/sirupsen/logrus v1.9.0 // indirect go.opencensus.io v0.23.0 // indirect - golang.org/x/net v0.0.0-20221014081412-f15817d10f9b // indirect + golang.org/x/net v0.2.0 // indirect gotest.tools v2.2.0+incompatible // indirect ) @@ -72,7 +72,7 @@ require ( github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/term v0.0.0-20220919170432-7a66f970e087 // indirect + golang.org/x/term v0.2.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) @@ -83,7 +83,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/swag v0.19.5 // indirect + github.com/go-openapi/swag v0.21.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -94,11 +94,12 @@ require ( github.com/jackc/pgproto3/v2 v2.3.1 // indirect github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect github.com/jackc/pgtype v1.12.0 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/labstack/gommon v0.4.0 // indirect github.com/magiconair/properties v1.8.6 // indirect - github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect @@ -109,12 +110,12 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.1 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.1 // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 // indirect - golang.org/x/text v0.3.8 // indirect - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.1.12 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + golang.org/x/mod v0.7.0 // indirect + golang.org/x/sys v0.2.0 // indirect + golang.org/x/text v0.4.0 // indirect + golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect + golang.org/x/tools v0.3.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 71f1933cc..0197be791 100644 --- a/go.sum +++ b/go.sum @@ -102,6 +102,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -145,8 +146,9 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= +github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -293,6 +295,8 @@ github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jordanorelli/lexnum v0.0.0-20141216151731-460eeb125754 h1:ovgRFhVUYZWz6KnWPrnV7HBxrK0ErOeyXtlVvh0Rr5k= github.com/jordanorelli/lexnum v0.0.0-20141216151731-460eeb125754/go.mod h1:f1WdQhB98V35bULPsZUMFP9U1XWhpaHrO6myMijgMhU= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -319,6 +323,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.9.1 h1:GliPYSpzGKlyOhqIbG8nmHBo3i1saKWFOgh41AN3b+Y= github.com/labstack/echo/v4 v4.9.1/go.mod h1:Pop5HLc+xoc4qhTZ1ip6C0RtP7Z+4VzRLWZZFKqbbjo= github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= @@ -332,20 +337,23 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -364,6 +372,7 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwd github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= @@ -461,6 +470,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -468,8 +478,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -477,8 +488,9 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= @@ -522,8 +534,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20221012134737-56aed061732a h1:NmSIgad6KjE6VvHciPZuNRTKxGhlPfD6OA87W/PLkqg= -golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -560,8 +572,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -602,8 +614,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -626,6 +638,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -690,15 +703,16 @@ golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 h1:OK7RB6t2WQX54srQQYSXMW8dF5C6/8+oA/s5QBmmto4= -golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220919170432-7a66f970e087 h1:tPwmk4vmvVCMdr98VgL4JH+qZxPL8fqlUOHnyOM8N3w= -golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -707,13 +721,13 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220411224347-583f2d630306 h1:+gHMid33q6pen7kv9xvT+JRinntgeXO2AeZVd0AWD3w= +golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -769,8 +783,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -876,6 +890,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -890,6 +905,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/logger/docs/CHANGELOG.md b/logger/docs/CHANGELOG.md new file mode 100644 index 000000000..3cfd02919 --- /dev/null +++ b/logger/docs/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +All notable changes to this module will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.0.0.1] - 2023-01-03 + +- Refactored configs into `configs` package + +## [0.0.0.0] - 2023-01-03 + +- Introduced this `CHANGELOG.md` diff --git a/logger/module.go b/logger/module.go index 0171ef999..775299fee 100644 --- a/logger/module.go +++ b/logger/module.go @@ -4,6 +4,7 @@ import ( "os" "strings" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/shared/modules" "github.com/rs/zerolog" ) @@ -11,7 +12,7 @@ import ( type loggerModule struct { bus modules.Bus logger modules.Logger - config modules.LoggerConfig + config *configs.LoggerConfig } // All loggers branch out of mainLogger, that way configuration changes to mainLogger propagate to others. @@ -28,19 +29,19 @@ const ( ModuleName = "logger" ) -var pocketLogLevelToZeroLog = map[LogLevel]zerolog.Level{ - LogLevel_LOG_LEVEL_UNSPECIFIED: zerolog.NoLevel, - LogLevel_LOG_LEVEL_DEBUG: zerolog.DebugLevel, - LogLevel_LOG_LEVEL_INFO: zerolog.InfoLevel, - LogLevel_LOG_LEVEL_WARN: zerolog.WarnLevel, - LogLevel_LOG_LEVEL_ERROR: zerolog.ErrorLevel, - LogLevel_LOG_LEVEL_FATAL: zerolog.FatalLevel, - LogLevel_LOG_LEVEL_PANIC: zerolog.PanicLevel, +var pocketLogLevelToZeroLog = map[configs.LogLevel]zerolog.Level{ + configs.LogLevel_LOG_LEVEL_UNSPECIFIED: zerolog.NoLevel, + configs.LogLevel_LOG_LEVEL_DEBUG: zerolog.DebugLevel, + configs.LogLevel_LOG_LEVEL_INFO: zerolog.InfoLevel, + configs.LogLevel_LOG_LEVEL_WARN: zerolog.WarnLevel, + configs.LogLevel_LOG_LEVEL_ERROR: zerolog.ErrorLevel, + configs.LogLevel_LOG_LEVEL_FATAL: zerolog.FatalLevel, + configs.LogLevel_LOG_LEVEL_PANIC: zerolog.PanicLevel, } -var pocketLogFormatToEnum = map[string]LogFormat{ - "json": LogFormat_LOG_FORMAT_JSON, - "pretty": LogFormat_LOG_FORMAT_PRETTY, +var pocketLogFormatToEnum = map[string]configs.LogFormat{ + "json": configs.LogFormat_LOG_FORMAT_JSON, + "pretty": configs.LogFormat_LOG_FORMAT_PRETTY, } func Create(runtimeMgr modules.RuntimeMgr) (modules.Module, error) { @@ -54,19 +55,19 @@ func (*loggerModule) CreateLoggerForModule(moduleName string) modules.Logger { func (*loggerModule) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, error) { cfg := runtimeMgr.GetConfig() m := loggerModule{ - config: cfg.GetLoggerConfig(), + config: cfg.Logger, } m.InitLogger() // Mapping config string value to the proto enum - if pocketLogLevel, ok := LogLevel_value[`LogLevel_LOG_LEVEL_`+strings.ToUpper(m.config.GetLevel())]; ok { - zerolog.SetGlobalLevel(pocketLogLevelToZeroLog[LogLevel(pocketLogLevel)]) + if pocketLogLevel, ok := configs.LogLevel_value[`LogLevel_LOG_LEVEL_`+strings.ToUpper(m.config.Level)]; ok { + zerolog.SetGlobalLevel(pocketLogLevelToZeroLog[configs.LogLevel(pocketLogLevel)]) } else { zerolog.SetGlobalLevel(zerolog.NoLevel) } - if pocketLogFormatToEnum[m.config.GetFormat()] == LogFormat_LOG_FORMAT_PRETTY { + if pocketLogFormatToEnum[m.config.Format] == configs.LogFormat_LOG_FORMAT_PRETTY { mainLogger = mainLogger.Output(zerolog.ConsoleWriter{Out: os.Stderr}) mainLogger.Info().Msg("using pretty log format") } diff --git a/p2p/CHANGELOG.md b/p2p/CHANGELOG.md index a54dfd530..000e2772e 100644 --- a/p2p/CHANGELOG.md +++ b/p2p/CHANGELOG.md @@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.14] - 2023-01-03 + +- `ActorsToAddrBook` now skips actors that are not validators since they don't have a serviceUrl generic parameter + +## [0.0.0.13] - 2022-12-21 + +- Updated to use the new centralized config and genesis handling +- Updated to use the new `Actor` struct under `coreTypes` +- Updated tests and mocks +- Added missing `max_mempool_count` in config (it was causing P2P instabilities in LocalNet) + ## [0.0.0.12] - 2022-12-16 - `ValidatorMapToAddrBook` renamed to `ActorToAddrBook` diff --git a/p2p/addrbook_provider/persistence.go b/p2p/addrbook_provider/persistence.go index ed6ee2d7f..81db1d718 100644 --- a/p2p/addrbook_provider/persistence.go +++ b/p2p/addrbook_provider/persistence.go @@ -6,6 +6,8 @@ import ( "github.com/pokt-network/pocket/p2p/transport" typesP2P "github.com/pokt-network/pocket/p2p/types" + "github.com/pokt-network/pocket/runtime/configs" + coreTypes "github.com/pokt-network/pocket/shared/core/types" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/modules" ) @@ -15,11 +17,11 @@ var _ typesP2P.AddrBookProvider = &persistenceAddrBookProvider{} type persistenceAddrBookProvider struct { bus modules.Bus - p2pCfg modules.P2PConfig + p2pCfg *configs.P2PConfig connFactory typesP2P.ConnectionFactory } -func NewPersistenceAddrBookProvider(bus modules.Bus, p2pCfg modules.P2PConfig, options ...func(*persistenceAddrBookProvider)) *persistenceAddrBookProvider { +func NewPersistenceAddrBookProvider(bus modules.Bus, p2pCfg *configs.P2PConfig, options ...func(*persistenceAddrBookProvider)) *persistenceAddrBookProvider { pabp := &persistenceAddrBookProvider{ bus: bus, p2pCfg: p2pCfg, @@ -60,7 +62,7 @@ func (pabp *persistenceAddrBookProvider) GetStakedAddrBookAtHeight(height uint64 // TODO(#203): refactor `ValidatorMap` validatorMap := make(modules.ValidatorMap, len(stakedActors)) for _, v := range stakedActors { - validatorMap[v.GetAddress()] = v + validatorMap[v.GetAddress()] = *v } addrBook, err := pabp.ActorsToAddrBook(validatorMap) if err != nil { @@ -69,9 +71,16 @@ func (pabp *persistenceAddrBookProvider) GetStakedAddrBookAtHeight(height uint64 return addrBook, nil } -func (pabp *persistenceAddrBookProvider) ActorsToAddrBook(actors map[string]modules.Actor) (typesP2P.AddrBook, error) { +// TODO (#426): refactor so that it's possible to connect to peers without using the GenericParam and having to filter out non-validator actors. +// AddrBook and similar concepts shouldn't leak outside the P2P module. It should be possible to broadcast messages to all peers or only to a specific actor type +// without having to know the underlying implementation in the P2P module. +func (pabp *persistenceAddrBookProvider) ActorsToAddrBook(actors map[string]coreTypes.Actor) (typesP2P.AddrBook, error) { book := make(typesP2P.AddrBook, 0) for _, v := range actors { + // only add validator actors since they are the only ones having a service url in their generic param at the moment + if v.ActorType != coreTypes.ActorType_ACTOR_TYPE_VAL { + continue + } networkPeer, err := pabp.ActorToNetworkPeer(v) if err != nil { log.Println("[WARN] Error connecting to validator: ", err) @@ -82,7 +91,8 @@ func (pabp *persistenceAddrBookProvider) ActorsToAddrBook(actors map[string]modu return book, nil } -func (pabp *persistenceAddrBookProvider) ActorToNetworkPeer(v modules.Actor) (*typesP2P.NetworkPeer, error) { +// TODO (#426): refactor so that it doesn't use the GenericParam anymore to connect to the peer +func (pabp *persistenceAddrBookProvider) ActorToNetworkPeer(v coreTypes.Actor) (*typesP2P.NetworkPeer, error) { conn, err := pabp.connFactory(pabp.p2pCfg, v.GetGenericParam()) // service url if err != nil { return nil, fmt.Errorf("error resolving addr: %v", err) diff --git a/p2p/module.go b/p2p/module.go index 54f5a52bb..177aeecd7 100644 --- a/p2p/module.go +++ b/p2p/module.go @@ -1,7 +1,6 @@ package p2p import ( - "fmt" "log" "github.com/pokt-network/pocket/p2p/addrbook_provider" @@ -9,6 +8,7 @@ import ( "github.com/pokt-network/pocket/p2p/stdnetwork" "github.com/pokt-network/pocket/p2p/transport" typesP2P "github.com/pokt-network/pocket/p2p/types" + "github.com/pokt-network/pocket/runtime/configs" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/messaging" "github.com/pokt-network/pocket/shared/modules" @@ -25,7 +25,7 @@ const ( type p2pModule struct { bus modules.Bus - p2pCfg modules.P2PConfig // TODO (olshansky): to remove this since it'll be available via the bus + p2pCfg *configs.P2PConfig // TODO (olshansky): to remove this since it'll be available via the bus listener typesP2P.Transport address cryptoPocket.Address @@ -47,16 +47,13 @@ func (*p2pModule) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, error) var m *p2pModule cfg := runtimeMgr.GetConfig() - if err := m.ValidateConfig(cfg); err != nil { - return nil, fmt.Errorf("config validation failed: %w", err) - } - p2pCfg := cfg.GetP2PConfig() + p2pCfg := cfg.P2P l, err := transport.CreateListener(p2pCfg) if err != nil { return nil, err } - privateKey, err := cryptoPocket.NewPrivateKey(p2pCfg.GetPrivateKey()) + privateKey, err := cryptoPocket.NewPrivateKey(p2pCfg.PrivateKey) if err != nil { return nil, err } @@ -100,7 +97,7 @@ func (m *p2pModule) Start() error { addrbookProvider := addrbook_provider.NewPersistenceAddrBookProvider(m.GetBus(), m.p2pCfg) - if m.p2pCfg.GetUseRainTree() { + if m.p2pCfg.UseRainTree { m.network = raintree.NewRainTreeNetwork(m.address, m.GetBus(), m.p2pCfg, addrbookProvider) } else { m.network = stdnetwork.NewNetwork(m.GetBus(), m.p2pCfg, addrbookProvider) @@ -158,11 +155,6 @@ func (m *p2pModule) Send(addr cryptoPocket.Address, msg *anypb.Any) error { return m.network.NetworkSend(data, addr) } -func (*p2pModule) ValidateConfig(cfg modules.Config) error { - // TODO (#334): implement this - return nil -} - func (m *p2pModule) handleNetworkMessage(networkMsgData []byte) { appMsgData, err := m.network.HandleNetworkData(networkMsgData) if err != nil { diff --git a/p2p/raintree/network.go b/p2p/raintree/network.go index 2251d282a..6cee74b0b 100644 --- a/p2p/raintree/network.go +++ b/p2p/raintree/network.go @@ -8,6 +8,7 @@ import ( "github.com/pokt-network/pocket/p2p/addrbook_provider" typesP2P "github.com/pokt-network/pocket/p2p/types" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/shared/codec" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/messaging" @@ -34,13 +35,13 @@ type rainTreeNetwork struct { mampoolMaxNonces uint64 } -func NewRainTreeNetworkWithAddrBook(addr cryptoPocket.Address, addrBook typesP2P.AddrBook, p2pCfg modules.P2PConfig) typesP2P.Network { +func NewRainTreeNetworkWithAddrBook(addr cryptoPocket.Address, addrBook typesP2P.AddrBook, p2pCfg configs.P2PConfig) typesP2P.Network { pm, err := newPeersManager(addr, addrBook, true) if err != nil { log.Fatalf("[ERROR] Error initializing rainTreeNetwork peersManager: %v", err) } - mempoolMaxNonces := p2pCfg.GetMaxMempoolCount() + mempoolMaxNonces := p2pCfg.MaxMempoolCount n := &rainTreeNetwork{ selfAddr: addr, peersManager: pm, @@ -52,7 +53,7 @@ func NewRainTreeNetworkWithAddrBook(addr cryptoPocket.Address, addrBook typesP2P return typesP2P.Network(n) } -func NewRainTreeNetwork(addr cryptoPocket.Address, bus modules.Bus, p2pCfg modules.P2PConfig, addrBookProvider typesP2P.AddrBookProvider) typesP2P.Network { +func NewRainTreeNetwork(addr cryptoPocket.Address, bus modules.Bus, p2pCfg *configs.P2PConfig, addrBookProvider typesP2P.AddrBookProvider) typesP2P.Network { addrBook, err := addrbook_provider.GetAddrBook(bus, addrBookProvider) if err != nil { log.Fatalf("[ERROR] Error getting addrBook: %v", err) @@ -67,7 +68,7 @@ func NewRainTreeNetwork(addr cryptoPocket.Address, bus modules.Bus, p2pCfg modul selfAddr: addr, peersManager: pm, nonceSet: make(map[uint64]struct{}), - nonceList: make([]uint64, 0, p2pCfg.GetMaxMempoolCount()), + nonceList: make([]uint64, 0, p2pCfg.MaxMempoolCount), addrBookProvider: addrBookProvider, } n.SetBus(bus) diff --git a/p2p/raintree/network_test.go b/p2p/raintree/network_test.go index 732f982b9..10c9f35a6 100644 --- a/p2p/raintree/network_test.go +++ b/p2p/raintree/network_test.go @@ -5,16 +5,17 @@ import ( "github.com/golang/mock/gomock" typesP2P "github.com/pokt-network/pocket/p2p/types" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/runtime/defaults" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" - mockModules "github.com/pokt-network/pocket/shared/modules/mocks" "github.com/stretchr/testify/require" ) func TestRainTreeNetwork_AddPeerToAddrBook(t *testing.T) { ctrl := gomock.NewController(t) - mockP2PCfg := mockModules.NewMockP2PConfig(ctrl) - mockP2PCfg.EXPECT().GetMaxMempoolCount().Return(defaults.DefaultP2PMaxMempoolCount).AnyTimes() + p2pCfg := &configs.P2PConfig{ + MaxMempoolCount: defaults.DefaultP2PMaxMempoolCount, + } // starting with an empty address book and only self selfAddr, err := cryptoPocket.GenerateAddress() @@ -27,7 +28,7 @@ func TestRainTreeNetwork_AddPeerToAddrBook(t *testing.T) { busMock := mockBus(ctrl) addrBookProviderMock := mockAddrBookProvider(ctrl, addrBook) - network := NewRainTreeNetwork(selfAddr, busMock, mockP2PCfg, addrBookProviderMock).(*rainTreeNetwork) + network := NewRainTreeNetwork(selfAddr, busMock, p2pCfg, addrBookProviderMock).(*rainTreeNetwork) peerAddr, err := cryptoPocket.GenerateAddress() require.NoError(t, err) @@ -52,8 +53,9 @@ func TestRainTreeNetwork_AddPeerToAddrBook(t *testing.T) { func TestRainTreeNetwork_RemovePeerToAddrBook(t *testing.T) { ctrl := gomock.NewController(t) - mockP2PCfg := mockModules.NewMockP2PConfig(ctrl) - mockP2PCfg.EXPECT().GetMaxMempoolCount().Return(defaults.DefaultP2PMaxMempoolCount).AnyTimes() + p2pCfg := &configs.P2PConfig{ + MaxMempoolCount: defaults.DefaultP2PMaxMempoolCount, + } // starting with an address book having only self and an arbitrary number of peers `numAddressesInAddressBook`` numAddressesInAddressBook := 3 @@ -66,7 +68,7 @@ func TestRainTreeNetwork_RemovePeerToAddrBook(t *testing.T) { busMock := mockBus(ctrl) addrBookProviderMock := mockAddrBookProvider(ctrl, addrBook) - network := NewRainTreeNetwork(selfAddr, busMock, mockP2PCfg, addrBookProviderMock).(*rainTreeNetwork) + network := NewRainTreeNetwork(selfAddr, busMock, p2pCfg, addrBookProviderMock).(*rainTreeNetwork) stateView := network.peersManager.getNetworkView() require.Equal(t, numAddressesInAddressBook+1, len(stateView.addrList)) // +1 to account for self in the addrBook as well diff --git a/p2p/raintree/peers_manager_test.go b/p2p/raintree/peers_manager_test.go index 25a71530c..eb7cbe3ce 100644 --- a/p2p/raintree/peers_manager_test.go +++ b/p2p/raintree/peers_manager_test.go @@ -8,6 +8,7 @@ import ( "github.com/golang/mock/gomock" "github.com/pokt-network/pocket/p2p/types" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/runtime/defaults" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" modulesMock "github.com/pokt-network/pocket/shared/modules/mocks" @@ -37,9 +38,9 @@ type ExpectedRainTreeMessageProp struct { func TestRainTreeAddrBookUtilsHandleUpdate(t *testing.T) { ctrl := gomock.NewController(t) - mockP2PCfg := modulesMock.NewMockP2PConfig(ctrl) - mockP2PCfg.EXPECT().GetMaxMempoolCount().Return(defaults.DefaultP2PMaxMempoolCount).AnyTimes() - + p2pCfg := &configs.P2PConfig{ + MaxMempoolCount: defaults.DefaultP2PMaxMempoolCount, + } addr, err := cryptoPocket.GenerateAddress() require.NoError(t, err) @@ -81,7 +82,7 @@ func TestRainTreeAddrBookUtilsHandleUpdate(t *testing.T) { mockBus := mockBus(ctrl) mockAddrBookProvider := mockAddrBookProvider(ctrl, addrBook) - network := NewRainTreeNetwork(addr, mockBus, mockP2PCfg, mockAddrBookProvider).(*rainTreeNetwork) + network := NewRainTreeNetwork(addr, mockBus, p2pCfg, mockAddrBookProvider).(*rainTreeNetwork) peersManagerStateView := network.peersManager.getNetworkView() @@ -94,9 +95,9 @@ func TestRainTreeAddrBookUtilsHandleUpdate(t *testing.T) { func BenchmarkAddrBookUpdates(b *testing.B) { ctrl := gomock.NewController(gomock.TestReporter(b)) - mockP2PCfg := modulesMock.NewMockP2PConfig(ctrl) - mockP2PCfg.EXPECT().GetMaxMempoolCount().Return(defaults.DefaultP2PMaxMempoolCount).AnyTimes() - + p2pCfg := &configs.P2PConfig{ + MaxMempoolCount: defaults.DefaultP2PMaxMempoolCount, + } addr, err := cryptoPocket.GenerateAddress() require.NoError(b, err) @@ -123,7 +124,7 @@ func BenchmarkAddrBookUpdates(b *testing.B) { mockBus := mockBus(ctrl) mockAddrBookProvider := mockAddrBookProvider(ctrl, addrBook) - network := NewRainTreeNetwork(addr, mockBus, mockP2PCfg, mockAddrBookProvider).(*rainTreeNetwork) + network := NewRainTreeNetwork(addr, mockBus, p2pCfg, mockAddrBookProvider).(*rainTreeNetwork) peersManagerStateView := network.peersManager.getNetworkView() @@ -208,13 +209,13 @@ func testRainTreeMessageTargets(t *testing.T, expectedMsgProp *ExpectedRainTreeM busMock.EXPECT().GetConsensusModule().Return(consensusMock).AnyTimes() persistenceMock := modulesMock.NewMockPersistenceModule(ctrl) busMock.EXPECT().GetPersistenceModule().Return(persistenceMock).AnyTimes() - mockP2PCfg := modulesMock.NewMockP2PConfig(ctrl) - mockP2PCfg.EXPECT().GetMaxMempoolCount().Return(defaults.DefaultP2PMaxMempoolCount).AnyTimes() - + p2pCfg := &configs.P2PConfig{ + MaxMempoolCount: defaults.DefaultP2PMaxMempoolCount, + } addrBook := getAlphabetAddrBook(expectedMsgProp.numNodes) mockAddrBookProvider := mockAddrBookProvider(ctrl, addrBook) - network := NewRainTreeNetwork([]byte{expectedMsgProp.orig}, busMock, mockP2PCfg, mockAddrBookProvider).(*rainTreeNetwork) + network := NewRainTreeNetwork([]byte{expectedMsgProp.orig}, busMock, p2pCfg, mockAddrBookProvider).(*rainTreeNetwork) network.SetBus(busMock) diff --git a/p2p/stdnetwork/network.go b/p2p/stdnetwork/network.go index aa69a579e..4adb8550e 100644 --- a/p2p/stdnetwork/network.go +++ b/p2p/stdnetwork/network.go @@ -8,6 +8,7 @@ import ( "github.com/pokt-network/pocket/p2p/addrbook_provider" typesP2P "github.com/pokt-network/pocket/p2p/types" + "github.com/pokt-network/pocket/runtime/configs" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/modules" ) @@ -19,7 +20,7 @@ type network struct { addrBookMap typesP2P.AddrBookMap } -func NewNetwork(bus modules.Bus, p2pCfg modules.P2PConfig, addrBookProvider typesP2P.AddrBookProvider) (n typesP2P.Network) { +func NewNetwork(bus modules.Bus, p2pCfg *configs.P2PConfig, addrBookProvider typesP2P.AddrBookProvider) (n typesP2P.Network) { addrBook, err := addrbook_provider.GetAddrBook(bus, addrBookProvider) if err != nil { log.Fatalf("[ERROR] Error getting addrBook: %v", err) diff --git a/p2p/transport/transport.go b/p2p/transport/transport.go index 6df8f3932..8943224cb 100644 --- a/p2p/transport/transport.go +++ b/p2p/transport/transport.go @@ -6,32 +6,32 @@ import ( "net" typesP2P "github.com/pokt-network/pocket/p2p/types" - "github.com/pokt-network/pocket/shared/modules" + "github.com/pokt-network/pocket/runtime/configs" ) const ( TCPNetworkLayerProtocol = "tcp4" ) -func CreateListener(cfg modules.P2PConfig) (typesP2P.Transport, error) { - switch cfg.GetIsEmptyConnectionType() { // TECHDEBT kept in switch format because this should be an enum not a bool +func CreateListener(cfg *configs.P2PConfig) (typesP2P.Transport, error) { + switch cfg.IsEmptyConnectionType { // TECHDEBT kept in switch format because this should be an enum not a bool case true: return createEmptyListener(cfg) case false: return createTCPListener(cfg) default: - return nil, fmt.Errorf("unsupported connection type for listener: %v", cfg.GetIsEmptyConnectionType()) + return nil, fmt.Errorf("unsupported connection type for listener: %v", cfg.IsEmptyConnectionType) } } -func CreateDialer(cfg modules.P2PConfig, url string) (typesP2P.Transport, error) { - switch cfg.GetIsEmptyConnectionType() { +func CreateDialer(cfg *configs.P2PConfig, url string) (typesP2P.Transport, error) { + switch cfg.IsEmptyConnectionType { case true: return createEmptyDialer(cfg, url) case false: return createTCPDialer(cfg, url) default: - return nil, fmt.Errorf("unsupported connection type for dialer: %v", cfg.GetIsEmptyConnectionType()) + return nil, fmt.Errorf("unsupported connection type for dialer: %v", cfg.IsEmptyConnectionType) } } @@ -42,8 +42,8 @@ type tcpConn struct { listener *net.TCPListener } -func createTCPListener(cfg modules.P2PConfig) (*tcpConn, error) { - addr, err := net.ResolveTCPAddr(TCPNetworkLayerProtocol, fmt.Sprintf(":%d", cfg.GetConsensusPort())) +func createTCPListener(cfg *configs.P2PConfig) (*tcpConn, error) { + addr, err := net.ResolveTCPAddr(TCPNetworkLayerProtocol, fmt.Sprintf(":%d", cfg.ConsensusPort)) if err != nil { return nil, err } @@ -57,7 +57,7 @@ func createTCPListener(cfg modules.P2PConfig) (*tcpConn, error) { }, nil } -func createTCPDialer(_ modules.P2PConfig, url string) (*tcpConn, error) { +func createTCPDialer(_ *configs.P2PConfig, url string) (*tcpConn, error) { addr, err := net.ResolveTCPAddr(TCPNetworkLayerProtocol, url) if err != nil { return nil, err @@ -119,11 +119,11 @@ var _ typesP2P.Transport = &emptyConn{} type emptyConn struct { } -func createEmptyListener(_ modules.P2PConfig) (typesP2P.Transport, error) { +func createEmptyListener(_ *configs.P2PConfig) (typesP2P.Transport, error) { return &emptyConn{}, nil } -func createEmptyDialer(_ modules.P2PConfig, _ string) (typesP2P.Transport, error) { +func createEmptyDialer(_ *configs.P2PConfig, _ string) (typesP2P.Transport, error) { return &emptyConn{}, nil } diff --git a/p2p/types/addr_book.go b/p2p/types/addr_book.go index 8c246e231..d0594dc4a 100644 --- a/p2p/types/addr_book.go +++ b/p2p/types/addr_book.go @@ -2,7 +2,7 @@ package types //go:generate mockgen -source=$GOFILE -destination=./mocks/addrbook_provider_mock.go github.com/pokt-network/pocket/p2p/types AddrBookProvider -import "github.com/pokt-network/pocket/shared/modules" +import coreTypes "github.com/pokt-network/pocket/shared/core/types" // AddrBook is a way of representing NetworkPeer sets type AddrBook []*NetworkPeer @@ -15,6 +15,6 @@ type AddrBookMap map[string]*NetworkPeer // AddrBookProvider is an interface that provides AddrBook accessors type AddrBookProvider interface { GetStakedAddrBookAtHeight(height uint64) (AddrBook, error) - ActorsToAddrBook(actors map[string]modules.Actor) (AddrBook, error) - ActorToNetworkPeer(actor modules.Actor) (*NetworkPeer, error) + ActorsToAddrBook(actors map[string]coreTypes.Actor) (AddrBook, error) + ActorToNetworkPeer(actor coreTypes.Actor) (*NetworkPeer, error) } diff --git a/p2p/types/p2p_config.go b/p2p/types/p2p_config.go deleted file mode 100644 index c6fa251c0..000000000 --- a/p2p/types/p2p_config.go +++ /dev/null @@ -1,12 +0,0 @@ -package types - -import "github.com/pokt-network/pocket/shared/modules" - -var _ modules.P2PConfig = &P2PConfig{} - -func (x *P2PConfig) IsEmptyConnType() bool { - if x.GetIsEmptyConnectionType() { - return true - } - return false -} diff --git a/p2p/types/transport.go b/p2p/types/transport.go index 4625cb573..bbe2c4846 100644 --- a/p2p/types/transport.go +++ b/p2p/types/transport.go @@ -1,6 +1,6 @@ package types -import "github.com/pokt-network/pocket/shared/modules" +import "github.com/pokt-network/pocket/runtime/configs" //go:generate mockgen -source=$GOFILE -destination=./mocks/transport_mock.go github.com/pokt-network/pocket/p2p/types Transport @@ -11,4 +11,4 @@ type Transport interface { Close() error } -type ConnectionFactory func(cfg modules.P2PConfig, url string) (Transport, error) +type ConnectionFactory func(cfg *configs.P2PConfig, url string) (Transport, error) diff --git a/p2p/utils_test.go b/p2p/utils_test.go index fb279db64..3412cf4b3 100644 --- a/p2p/utils_test.go +++ b/p2p/utils_test.go @@ -12,7 +12,9 @@ import ( "github.com/golang/mock/gomock" typesP2P "github.com/pokt-network/pocket/p2p/types" mocksP2P "github.com/pokt-network/pocket/p2p/types/mocks" - "github.com/pokt-network/pocket/runtime" + "github.com/pokt-network/pocket/runtime/configs" + "github.com/pokt-network/pocket/runtime/genesis" + coreTypes "github.com/pokt-network/pocket/shared/core/types" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/modules" modulesMock "github.com/pokt-network/pocket/shared/modules/mocks" @@ -114,54 +116,48 @@ func createMockRuntimeMgrs(t *testing.T, numValidators int) []modules.RuntimeMgr copy(valKeys[:], keys[:numValidators]) mockGenesisState := createMockGenesisState(t, valKeys) for i := range mockRuntimeMgrs { - mockConfig := modulesMock.NewMockConfig(ctrl) - mockConfig.EXPECT().GetBaseConfig().Return(&runtime.BaseConfig{ + cfg := &configs.Config{ RootDirectory: "", PrivateKey: valKeys[i].String(), - }).AnyTimes() - mockConfig.EXPECT().GetP2PConfig().Return(&typesP2P.P2PConfig{ - PrivateKey: valKeys[i].String(), - ConsensusPort: 8080, - UseRainTree: true, - IsEmptyConnectionType: true, - }).AnyTimes() + P2P: &configs.P2PConfig{ + PrivateKey: valKeys[i].String(), + ConsensusPort: 8080, + UseRainTree: true, + IsEmptyConnectionType: true, + }, + } mockRuntimeMgr := modulesMock.NewMockRuntimeMgr(ctrl) - mockRuntimeMgr.EXPECT().GetConfig().Return(mockConfig).AnyTimes() + mockRuntimeMgr.EXPECT().GetConfig().Return(cfg).AnyTimes() mockRuntimeMgr.EXPECT().GetGenesis().Return(mockGenesisState).AnyTimes() mockRuntimeMgrs[i] = mockRuntimeMgr } return mockRuntimeMgrs } +// TODO: we need to support all protocol actor types, not only validators // createMockGenesisState configures and returns a mocked GenesisState -func createMockGenesisState(t *testing.T, valKeys []cryptoPocket.PrivateKey) modules.GenesisState { - ctrl := gomock.NewController(t) +func createMockGenesisState(t *testing.T, valKeys []cryptoPocket.PrivateKey) *genesis.GenesisState { + var genesisState = new(genesis.GenesisState) - validators := make([]modules.Actor, len(valKeys)) + validators := make([]*coreTypes.Actor, len(valKeys)) for i, valKey := range valKeys { addr := valKey.Address().String() - mockActor := modulesMock.NewMockActor(ctrl) - mockActor.EXPECT().GetAddress().Return(addr).AnyTimes() - mockActor.EXPECT().GetPublicKey().Return(valKey.PublicKey().String()).AnyTimes() - mockActor.EXPECT().GetGenericParam().Return(validatorId(i + 1)).AnyTimes() - mockActor.EXPECT().GetStakedAmount().Return("1000000000000000").AnyTimes() - mockActor.EXPECT().GetPausedHeight().Return(int64(0)).AnyTimes() - mockActor.EXPECT().GetUnstakingHeight().Return(int64(0)).AnyTimes() - mockActor.EXPECT().GetOutput().Return(addr).AnyTimes() + mockActor := &coreTypes.Actor{ + ActorType: coreTypes.ActorType_ACTOR_TYPE_VAL, + Address: addr, + PublicKey: valKey.PublicKey().String(), + GenericParam: validatorId(i + 1), + StakedAmount: "1000000000000000", + PausedHeight: int64(0), + UnstakingHeight: int64(0), + Output: addr, + } validators[i] = mockActor } + genesisState.Validators = validators - mockPersistenceGenesisState := modulesMock.NewMockPersistenceGenesisState(ctrl) - mockPersistenceGenesisState.EXPECT(). - GetVals(). - Return(validators).AnyTimes() - - mockGenesisState := modulesMock.NewMockGenesisState(ctrl) - mockGenesisState.EXPECT(). - GetPersistenceGenesisState(). - Return(mockPersistenceGenesisState).AnyTimes() - return mockGenesisState + return genesisState } // Bus Mock - needed to return the appropriate modules when accessed @@ -182,14 +178,14 @@ func prepareBusMock(t *testing.T, } // Consensus mock - only needed for validatorMap access -func prepareConsensusMock(t *testing.T, genesisState modules.GenesisState) *modulesMock.MockConsensusModule { +func prepareConsensusMock(t *testing.T, genesisState *genesis.GenesisState) *modulesMock.MockConsensusModule { ctrl := gomock.NewController(t) consensusMock := modulesMock.NewMockConsensusModule(ctrl) - validators := genesisState.GetPersistenceGenesisState().GetVals() + validators := genesisState.GetValidators() m := make(modules.ValidatorMap, len(validators)) for _, v := range validators { - m[v.GetAddress()] = v + m[v.GetAddress()] = *v } consensusMock.EXPECT().ValidatorMap().Return(m).AnyTimes() @@ -199,13 +195,13 @@ func prepareConsensusMock(t *testing.T, genesisState modules.GenesisState) *modu } // Persistence mock - only needed for validatorMap access -func preparePersistenceMock(t *testing.T, genesisState modules.GenesisState) *modulesMock.MockPersistenceModule { +func preparePersistenceMock(t *testing.T, genesisState *genesis.GenesisState) *modulesMock.MockPersistenceModule { ctrl := gomock.NewController(t) persistenceMock := modulesMock.NewMockPersistenceModule(ctrl) readContextMock := modulesMock.NewMockPersistenceReadContext(ctrl) - readContextMock.EXPECT().GetAllStakedActors(gomock.Any()).Return(genesisState.GetPersistenceGenesisState().GetVals(), nil).AnyTimes() + readContextMock.EXPECT().GetAllStakedActors(gomock.Any()).Return(genesisState.GetValidators(), nil).AnyTimes() persistenceMock.EXPECT().NewReadContext(gomock.Any()).Return(readContextMock, nil).AnyTimes() return persistenceMock diff --git a/persistence/CHANGELOG.md b/persistence/CHANGELOG.md deleted file mode 100644 index f84ab7d18..000000000 --- a/persistence/CHANGELOG.md +++ /dev/null @@ -1,156 +0,0 @@ -# Changelog - -All notable changes to this module will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -TODO: consolidate `persistence/docs/CHANGELOG` and `persistence/CHANGELOG.md` - -## [Unreleased] - -## [0.0.0.12] - 2022-12-15 - -- Remove `SetProposalBlock` and local vars to keep proposal state -- Add `proposerAddr` to the `Commit` function -- Move the `PostgresContext` struct to `context.db` - -## [0.0.0.11] - 2022-12-14 - -- Moved Actor related getters from `genesis.go` to `actor.go` -- Added `GetAllStakedActors()` that returns all Actors - -## [0.0.0.10] - 2022-12-06 - -- Changed the scope of `TransactionExists` from the `PostgresContext` to the `PersistenceModule` - -## [0.0.0.9] - 2022-11-30 - -Core StateHash changes - -- Introduced & defined for `block_persistence.proto` - - A persistence specific protobuf for the Block stored in the BlockStore -- On `Commit`, prepare and store a persistence block in the KV Store, SQL Store -- Replace `IndexTransactions` (plural) to `IndexTransaction` (singular) -- Maintaining a list of StateTrees using Celestia’s SMT and badger as the KV store to compute the state hash -- Implemented `ComputeStateHash` to update the global state based on: - - Validators - - Applications - - Servicers - - Fisherman - - Accounts - - Pools - - Transactions - - Added a placeholder for `params` and `flags` -- Added a benchmarking and a determinism test suite to validate this - -Supporting StateHash changes - -- Implemented `GetAccountsUpdated`, `GetPoolsUpdated` and `GetActorsUpdated` functions -- Removed `GetPrevAppHash` and `indexTransactions` functions -- Removed `blockProtoBytes` and `txResults` from the local state and added `quorumCert` -- Consolidate all `resetContext` related operations into a single function -- Implemented `ReleaseWriteContext` -- Implemented ability to `ClearAllState` and `ResetToGenesis` for debugging & testing purposes -- Added unit tests for all of the supporting SQL functions implemented -- Some improvements in unit test preparation & cleanup (limited to this PR's functionality) - -KVStore changes - -- Renamed `Put` to `Set` -- Embedded `smt.MapStore` in the interface containing `Get`, `Set` and `Delete` -- Implemented `Delete` -- Modified `GetAll` to return both `keys` and `values` -- Turned off badger logging options since it’s noisy - -## [0.0.0.8] - 2022-11-15 - -- Rename `GetBlockHash` to `GetBlockHashAtHeight` -- Reduce visibility scope of `IndexTransactions` to `indexTransactions` -- Remove `quorumCertificate` from the local context state -- Remove `LatestQC` and `SetLatestQC` -- Remove `Latest` prefix from several functions including related to setting context of the proposal block -- Added `ReleaseWriteContext` placeholder -- Replaced `ResetContext` with `Release` - -## [0.0.0.7] - 2022-11-01 - -- Ported over storing blocks and block components to the Persistence module from Consensus and Utility modules -- Encapsulated `TxIndexer` logic to the persistence context only - -## [0.0.0.6] - 2022-10-06 - -- Don't ignore the exit code of `m.Run()` in the unit tests -- Fixed several broken unit tests related to type casting - -## [0.0.0.5] - 2022-09-14 - -- Consolidated `PostgresContext` and `PostgresDb` into a single structure - -## [0.0.0.4] - 2022-08-25 - -**Encapsulate structures previously in shared [#163](github.com/pokt-network/pocket/issues/163)** - -- Renamed schema -> types -- Added genesis, config, and unstaking proto files from shared -- Ensured proto structures implement shared interfaces -- Populate `PersistenceGenesisState` uses shared interfaces in order to accept `MockPersistenceGenesisState` -- ^ Same applies for `PersistenceConfig` -- Bumped cleanup TODOs to #149 due to scope size of #163 - -## [0.0.0.3] - 2022-08-16 - -**Main persistence module changes:** - -- Split `ConnectAndInitializeDatabase` into `connectToDatabase` and `initializeDatabase` - - This enables creating multiple contexts in parallel without re-initializing the DB connection -- Fix the SQL query used in `SelectActors`, `SelectAccounts` & `SelectPools` - - Add a generalized unit test for all actors -- Remove `NewPersistenceModule` and an injected `Config` + `Create` - - This improves isolation a a “injection-like” paradigm for unit testing -- Change `SetupPostgresDocker` to `SetupPostgresDockerPersistenceMod` - - This enables more “functional” like testing by returning a persistence module and avoiding global testing variables - - Only return once a connection to the DB has been initialized reducing the likelihood of test race conditions -- Implemented `NewReadContext` with a proper read-only context -- Add `ResetContext` to the persistence module and `Close` to the read context - -**Secondary persistence module changes** - -- Improve return values in `Commit` and `Release` (return error, add logging, etc…) -- Add `pgx.Conn` pointer to `PostgresDB` -- `s/db/conn/g` and `s/conn/tx/g` in some (not all) places where appropriate -- Make some exported variables / functions unexported for readability & access purposes -- Add a few helpers for persistence related unit testing -- Added unit tests and TODOs for handling multiple read/write contexts - -## [0.0.0.2] - 2022-08-03 - -Deprecate PrePersistence - -- Fix for bytes parameters -- Accounts / pools default to 0 -- Pre-added accounts to genesis file -- Separated out Persistence Read Context from Persistence Write Context -- Added various TODO's in order to code-complete a working persistence module -- Added genesis level functions to GetAllActors() and GetAllAccounts/Pools() for testing -- Added PopulateGenesisState function to persistence module -- Fixed the stake status iota issue -- Discovered and documented (with TODO) double setting parameters issue -- Attached to the Utility Module and using in `make compose_and_watch` - -## [0.0.0.1] - 2022-07-05 - -Pocket Persistence 1st Iteration (https://github.com/pokt-network/pocket/pull/73) - -# Added - -- Base persistence module implementation for the following actors: `Account`, `Pool`, `Validator`, `Fisherman`, `ServiceNode`, `Application` -- Generalization of common protocol actor behvaiours via the `ProtocolActor` and `BaseActor` interface and implementation -- A PostgreSQL based implementation of the persistence middleware including: - - SQL query implementation for each actor - - SQL schema definition for each actor - - SQL execution for common actor behaviours - - Golang interface implementation of the Persistence module -- Update to the Persistence module interface to enable historical height queries -- Library / infrastructure for persistence unit fuzz testing -- Tests triggered via `make test_persistence` diff --git a/persistence/account.go b/persistence/account.go index 63229f4f7..5d03928f6 100644 --- a/persistence/account.go +++ b/persistence/account.go @@ -6,6 +6,7 @@ import ( "github.com/pokt-network/pocket/persistence/types" "github.com/pokt-network/pocket/shared/converters" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/jackc/pgx/v4" ) @@ -68,7 +69,7 @@ func (p PostgresContext) SetAccountAmount(address []byte, amount string) error { return nil } -func (p PostgresContext) GetAccountsUpdated(height int64) (accounts []*types.Account, err error) { +func (p PostgresContext) GetAccountsUpdated(height int64) (accounts []*coreTypes.Account, err error) { return p.getPoolOrAccUpdatedInternal(types.GetAccountsUpdatedAtHeightQuery(height)) } @@ -146,14 +147,14 @@ func (p *PostgresContext) operationPoolAmount(name string, amount string, op fun return p.operationPoolOrAccAmount(name, amount, op, p.GetPoolAmount, types.InsertPoolAmountQuery) } -func (p PostgresContext) GetPoolsUpdated(height int64) ([]*types.Account, error) { +func (p PostgresContext) GetPoolsUpdated(height int64) ([]*coreTypes.Account, error) { return p.getPoolOrAccUpdatedInternal(types.GetPoolsUpdatedAtHeightQuery(height)) } // Joint Pool & Account Helpers // Shared logic between `getPoolsUpdated` & `getAccountsUpdated` to keep explicit external interfaces -func (p *PostgresContext) getPoolOrAccUpdatedInternal(query string) (accounts []*types.Account, err error) { +func (p *PostgresContext) getPoolOrAccUpdatedInternal(query string) (accounts []*coreTypes.Account, err error) { ctx, tx, err := p.getCtxAndTx() if err != nil { return @@ -166,7 +167,7 @@ func (p *PostgresContext) getPoolOrAccUpdatedInternal(query string) (accounts [] defer rows.Close() for rows.Next() { - account := new(types.Account) + account := new(coreTypes.Account) if err = rows.Scan(&account.Address, &account.Amount); err != nil { return nil, err } diff --git a/persistence/actor.go b/persistence/actor.go index 6f2eda716..74e5fda29 100644 --- a/persistence/actor.go +++ b/persistence/actor.go @@ -2,13 +2,13 @@ package persistence import ( "github.com/pokt-network/pocket/persistence/types" - "github.com/pokt-network/pocket/shared/modules" + coreTypes "github.com/pokt-network/pocket/shared/core/types" ) // TODO (#399): All of the functions below following a structure similar to `GetAll` // can easily be refactored and condensed into a single function using a generic type or a common // interface. -func (p PostgresContext) GetAllApps(height int64) (apps []modules.Actor, err error) { +func (p PostgresContext) GetAllApps(height int64) (apps []*coreTypes.Actor, err error) { ctx, tx, err := p.getCtxAndTx() if err != nil { return nil, err @@ -17,10 +17,10 @@ func (p PostgresContext) GetAllApps(height int64) (apps []modules.Actor, err err if err != nil { return nil, err } - var actors []*types.Actor + var actors []*coreTypes.Actor for rows.Next() { - var actor *types.Actor - actor, height, err = p.getActorFromRow(rows) + var actor *coreTypes.Actor + actor, height, err = p.getActorFromRow(types.ApplicationActor.GetActorType(), rows) if err != nil { return } @@ -37,7 +37,7 @@ func (p PostgresContext) GetAllApps(height int64) (apps []modules.Actor, err err return } -func (p PostgresContext) GetAllValidators(height int64) (vals []modules.Actor, err error) { +func (p PostgresContext) GetAllValidators(height int64) (vals []*coreTypes.Actor, err error) { ctx, tx, err := p.getCtxAndTx() if err != nil { return nil, err @@ -46,13 +46,14 @@ func (p PostgresContext) GetAllValidators(height int64) (vals []modules.Actor, e if err != nil { return nil, err } - var actors []*types.Actor + var actors []*coreTypes.Actor for rows.Next() { - var actor *types.Actor - actor, height, err = p.getActorFromRow(rows) + var actor *coreTypes.Actor + actor, height, err = p.getActorFromRow(types.ValidatorActor.GetActorType(), rows) if err != nil { return } + actor.ActorType = types.ValidatorActor.GetActorType() actors = append(actors, actor) } rows.Close() @@ -66,7 +67,7 @@ func (p PostgresContext) GetAllValidators(height int64) (vals []modules.Actor, e return } -func (p PostgresContext) GetAllServiceNodes(height int64) (sn []modules.Actor, err error) { +func (p PostgresContext) GetAllServiceNodes(height int64) (sn []*coreTypes.Actor, err error) { ctx, tx, err := p.getCtxAndTx() if err != nil { return nil, err @@ -75,10 +76,10 @@ func (p PostgresContext) GetAllServiceNodes(height int64) (sn []modules.Actor, e if err != nil { return nil, err } - var actors []*types.Actor + var actors []*coreTypes.Actor for rows.Next() { - var actor *types.Actor - actor, height, err = p.getActorFromRow(rows) + var actor *coreTypes.Actor + actor, height, err = p.getActorFromRow(types.ServiceNodeActor.GetActorType(), rows) if err != nil { return } @@ -95,7 +96,7 @@ func (p PostgresContext) GetAllServiceNodes(height int64) (sn []modules.Actor, e return } -func (p PostgresContext) GetAllFishermen(height int64) (f []modules.Actor, err error) { +func (p PostgresContext) GetAllFishermen(height int64) (f []*coreTypes.Actor, err error) { ctx, tx, err := p.getCtxAndTx() if err != nil { return nil, err @@ -104,10 +105,10 @@ func (p PostgresContext) GetAllFishermen(height int64) (f []modules.Actor, err e if err != nil { return nil, err } - var actors []*types.Actor + var actors []*coreTypes.Actor for rows.Next() { - var actor *types.Actor - actor, height, err = p.getActorFromRow(rows) + var actor *coreTypes.Actor + actor, height, err = p.getActorFromRow(types.FishermanActor.GetActorType(), rows) if err != nil { return } @@ -125,11 +126,11 @@ func (p PostgresContext) GetAllFishermen(height int64) (f []modules.Actor, err e } // IMPROVE: This is a proof of concept. Ideally we should have a single query that returns all actors. -func (p PostgresContext) GetAllStakedActors(height int64) (allActors []modules.Actor, err error) { - type actorGetter func(height int64) ([]modules.Actor, error) +func (p PostgresContext) GetAllStakedActors(height int64) (allActors []*coreTypes.Actor, err error) { + type actorGetter func(height int64) ([]*coreTypes.Actor, error) actorGetters := []actorGetter{p.GetAllValidators, p.GetAllServiceNodes, p.GetAllFishermen, p.GetAllApps} for _, actorGetter := range actorGetters { - var actors []modules.Actor + var actors []*coreTypes.Actor actors, err = actorGetter(height) if err != nil { return diff --git a/persistence/application.go b/persistence/application.go index 414286550..a89cea060 100644 --- a/persistence/application.go +++ b/persistence/application.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "github.com/pokt-network/pocket/persistence/types" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/modules" ) @@ -28,8 +29,8 @@ func (p PostgresContext) GetApp(address []byte, height int64) (operator, publicK } func (p PostgresContext) InsertApp(address []byte, publicKey []byte, output []byte, _ bool, _ int32, maxRelays string, stakedTokens string, chains []string, pausedHeight int64, unstakingHeight int64) error { - return p.InsertActor(types.ApplicationActor, &types.Actor{ - ActorType: types.ActorType_App, + return p.InsertActor(types.ApplicationActor, &coreTypes.Actor{ + ActorType: coreTypes.ActorType_ACTOR_TYPE_APP, Address: hex.EncodeToString(address), PublicKey: hex.EncodeToString(publicKey), Chains: chains, @@ -42,8 +43,8 @@ func (p PostgresContext) InsertApp(address []byte, publicKey []byte, output []by } func (p PostgresContext) UpdateApp(address []byte, maxRelays string, stakedAmount string, chains []string) error { - return p.UpdateActor(types.ApplicationActor, &types.Actor{ - ActorType: types.ActorType_App, + return p.UpdateActor(types.ApplicationActor, &coreTypes.Actor{ + ActorType: coreTypes.ActorType_ACTOR_TYPE_APP, Address: hex.EncodeToString(address), Chains: chains, GenericParam: maxRelays, diff --git a/persistence/debug.go b/persistence/debug.go index 3adde38fc..90ade24ae 100644 --- a/persistence/debug.go +++ b/persistence/debug.go @@ -33,7 +33,7 @@ func (m *persistenceModule) HandleDebugMessage(debugMessage *messaging.DebugMess if err := m.clearAllState(debugMessage); err != nil { return err } - g := m.genesisState.(*types.PersistenceGenesisState) + g := m.genesisState m.populateGenesisState(g) // fatal if there's an error default: log.Printf("Debug message not handled by persistence module: %s \n", debugMessage.Message) diff --git a/persistence/docs/CHANGELOG.md b/persistence/docs/CHANGELOG.md index b18fd21ee..fcc6d1888 100644 --- a/persistence/docs/CHANGELOG.md +++ b/persistence/docs/CHANGELOG.md @@ -5,11 +5,95 @@ All notable changes to this module will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -TODO: consolidate `persistence/docs/CHANGELOG` and `persistence/CHANGELOG.md` - ## [Unreleased] -## [0.0.0.9] - 2022-11-08 +## [0.0.0.18] - 2023-01-03 + +- Renamed `InitParams` to `InitGenesisParams` + +## [0.0.0.17] - 2023-01-03 + +- Added missing `ActorType` in `GetAllXXXX()` functions +- Updated to new `PoolNames` enums +- Using `Enum.FriendlyName()` instead of `Enum.String()` for `PoolNames` enums (backward compatibility + flexibility) +- Updated `InitParams` so that Params can be initialized from a `GenesisState` and not just hardcoded +- Refactored default values sourcing (test_artifacts for tests) +- Updated tests +- Consolidated `persistence/docs/CHANGELOG` and `persistence/CHANGELOG.md` into `persistence/docs/CHANGELOG` + +## [0.0.0.16] - 2022-12-21 + +- Updated to use centralized config and genesis +- Updated to use `Account` struct now under `coreTypes` +- Tended for the TODO "// TODO (Andrew) genericize the genesis population logic for actors #149" in `persistence/genesis.go` +- Updated tests to use the new config and genesis handling +- Updated statetest hashes to reflect updated genesis state + +## [0.0.0.15] - 2022-12-15 + +- Remove `SetProposalBlock` and local vars to keep proposal state +- Add `proposerAddr` to the `Commit` function +- Move the `PostgresContext` struct to `context.db` + +## [0.0.0.14] - 2022-12-14 + +- Moved Actor related getters from `genesis.go` to `actor.go` +- Added `GetAllStakedActors()` that returns all Actors + +## [0.0.0.13] - 2022-12-06 + +- Changed the scope of `TransactionExists` from the `PostgresContext` to the `PersistenceModule` + +## [0.0.0.13] - 2022-11-30 + +Core StateHash changes + +- Introduced & defined for `block_persistence.proto` + - A persistence specific protobuf for the Block stored in the BlockStore +- On `Commit`, prepare and store a persistence block in the KV Store, SQL Store +- Replace `IndexTransactions` (plural) to `IndexTransaction` (singular) +- Maintaining a list of StateTrees using Celestia’s SMT and badger as the KV store to compute the state hash +- Implemented `ComputeStateHash` to update the global state based on: + - Validators + - Applications + - Servicers + - Fisherman + - Accounts + - Pools + - Transactions + - Added a placeholder for `params` and `flags` +- Added a benchmarking and a determinism test suite to validate this + +Supporting StateHash changes + +- Implemented `GetAccountsUpdated`, `GetPoolsUpdated` and `GetActorsUpdated` functions +- Removed `GetPrevAppHash` and `indexTransactions` functions +- Removed `blockProtoBytes` and `txResults` from the local state and added `quorumCert` +- Consolidate all `resetContext` related operations into a single function +- Implemented `ReleaseWriteContext` +- Implemented ability to `ClearAllState` and `ResetToGenesis` for debugging & testing purposes +- Added unit tests for all of the supporting SQL functions implemented +- Some improvements in unit test preparation & cleanup (limited to this PR's functionality) + +KVStore changes + +- Renamed `Put` to `Set` +- Embedded `smt.MapStore` in the interface containing `Get`, `Set` and `Delete` +- Implemented `Delete` +- Modified `GetAll` to return both `keys` and `values` +- Turned off badger logging options since it’s noisy + +## [0.0.0.12] - 2022-11-15 + +- Rename `GetBlockHash` to `GetBlockHashAtHeight` +- Reduce visibility scope of `IndexTransactions` to `indexTransactions` +- Remove `quorumCertificate` from the local context state +- Remove `LatestQC` and `SetLatestQC` +- Remove `Latest` prefix from several functions including related to setting context of the proposal block +- Added `ReleaseWriteContext` placeholder +- Replaced `ResetContext` with `Release` + +## [0.0.0.11] - 2022-11-08 - Changed the following exported functions to lowercase non-exported functions - [./pocket/persistence/] @@ -41,13 +125,20 @@ TODO: consolidate `persistence/docs/CHANGELOG` and `persistence/CHANGELOG.md` - GetGenericActor - NewTestGenericActor -## [0.0.0.8] - 2022-10-19 +## [0.0.0.10] - 2022-11-01 + +- Ported over storing blocks and block components to the Persistence module from Consensus and Utility modules +- Encapsulated `TxIndexer` logic to the persistence context only + + +## [0.0.0.9] - 2022-10-19 - Fixed `ToPersistenceActors()` by filling all structure fields - Deprecated `BaseActor` -> `Actor` - Changed default actor type to `ActorType_Undefined` -## [0.0.0.7] - 2022-10-12 + +## [0.0.0.8] - 2022-10-12 ### [#235](https://github.com/pokt-network/pocket/pull/235) Config and genesis handling @@ -59,6 +150,13 @@ TODO: consolidate `persistence/docs/CHANGELOG` and `persistence/CHANGELOG.md` - Added `TxIndexer` to both `PersistenceModule` and `PersistenceContext` - Implemented `TransactionExists` and `StoreTransaction` +## [0.0.0.7] - 2022-10-06 + +- Don't ignore the exit code of `m.Run()` in the unit tests +- Fixed several broken unit tests related to type casting + + + ## [0.0.0.6] - 2022-09-30 - Removed no-op `DeleteActor` code @@ -68,7 +166,12 @@ TODO: consolidate `persistence/docs/CHANGELOG` and `persistence/CHANGELOG.md` - Added ticks to CHANGELOG.md - Removed reference to Utility Mod's `BigIntToString()` and used internal `BigIntToString()` -## [0.0.0.5] - 2022-08-25 + +## [0.0.0.5] - 2022-09-14 + +- Consolidated `PostgresContext` and `PostgresDb` into a single structure + +## [0.0.0.4] - 2022-08-25 **Encapsulate structures previously in shared [#163](github.com/pokt-network/pocket/issues/163)** @@ -79,20 +182,19 @@ TODO: consolidate `persistence/docs/CHANGELOG` and `persistence/CHANGELOG.md` - ^ Same applies for `PersistenceConfig` - Bumped cleanup TODOs to #149 due to scope size of #163 -## [0.0.0.4] - 2022-08-16 +## [0.0.0.3] - 2022-08-16 **Main persistence module changes:** - Split `ConnectAndInitializeDatabase` into `connectToDatabase` and `initializeDatabase` - - This enables creating multiple contexts in parallel without re-initializing the DB connection + - This enables creating multiple contexts in parallel without re-initializing the DB connection - Fix the SQL query used in `SelectActors`, `SelectAccounts` & `SelectPools` - - Add a generalized unit test for all actors + - Add a generalized unit test for all actors - Remove `NewPersistenceModule` and an injected `Config` + `Create` - - This improves isolation a a “injection-like” paradigm for unit testing + - This improves isolation a a “injection-like” paradigm for unit testing - Change `SetupPostgresDocker` to `SetupPostgresDockerPersistenceMod` - - This enables more “functional” like testing by returning a persistence module and avoiding global testing - variables - - Only return once a connection to the DB has been initialized reducing the likelihood of test race conditions + - This enables more “functional” like testing by returning a persistence module and avoiding global testing variables + - Only return once a connection to the DB has been initialized reducing the likelihood of test race conditions - Implemented `NewReadContext` with a proper read-only context - Add `ResetContext` to the persistence module and `Close` to the read context @@ -105,33 +207,6 @@ TODO: consolidate `persistence/docs/CHANGELOG` and `persistence/CHANGELOG.md` - Add a few helpers for persistence related unit testing - Added unit tests and TODOs for handling multiple read/write contexts -## [0.0.0.3] - 2022-08-08 - -- Deprecated old placeholder `genesis_state` and `genesis_config` -- Added `utility_genesis_state` to `genesis_state` -- Added `consensus_genesis_state` to `genesis_state` -- Added `genesis_time` to `consensus_genesis_state` -- Added `chainID` to `consensus_genesis_state` -- Added `max_block_bytes` to `consensus_genesis_state` -- Added `accounts` and` pools to utility_genesis_state` -- Added `validators` to `utility_genesis_state` -- Added `applications` to `utility_genesis_state` -- Added `service_nodes` to `utility_genesis_state` -- Added `fishermen` to `utility_genesis_state` -- Deprecated `shared/config/` -- Added new `shared config proto3 structure` -- Added `base_config` to `config` -- Added `utility_config` to `config` -- Added `consensus_config` to `config` -- Added `persistence_config` to `config` -- Added `p2p_config` to `config` -- Added `telemetry_config` to `config` -- Opened followup issue #163 -- Added config and genesis generator to build package -- Deprecated old build files -- Use new config and genesis files for make `compose_and_watch` -- Use new config and genesis files for make `client_start && `make client_connect` - ## [0.0.0.2] - 2022-08-03 Deprecate PrePersistence @@ -151,15 +226,15 @@ Deprecate PrePersistence Pocket Persistence 1st Iteration (https://github.com/pokt-network/pocket/pull/73) -- Base persistence module implementation for the following actors: `Account`, `Pool`, `Validator`, `Fisherman` - , `ServiceNode`, `Application` -- Generalization of common protocol actor behvaiours via the `ProtocolActor` and `BaseActor` interface and - implementation +# Added + +- Base persistence module implementation for the following actors: `Account`, `Pool`, `Validator`, `Fisherman`, `ServiceNode`, `Application` +- Generalization of common protocol actor behvaiours via the `ProtocolActor` and `BaseActor` interface and implementation - A PostgreSQL based implementation of the persistence middleware including: - - SQL query implementation for each actor - - SQL schema definition for each actor - - SQL execution for common actor behaviours - - Golang interface implementation of the Persistence module + - SQL query implementation for each actor + - SQL schema definition for each actor + - SQL execution for common actor behaviours + - Golang interface implementation of the Persistence module - Update to the Persistence module interface to enable historical height queries - Library / infrastructure for persistence unit fuzz testing - Tests triggered via `make test_persistence` diff --git a/persistence/fisherman.go b/persistence/fisherman.go index deb079c50..182b8fbaf 100644 --- a/persistence/fisherman.go +++ b/persistence/fisherman.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "github.com/pokt-network/pocket/persistence/types" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/modules" ) @@ -25,8 +26,8 @@ func (p PostgresContext) GetFisherman(address []byte, height int64) (operator, p } func (p PostgresContext) InsertFisherman(address []byte, publicKey []byte, output []byte, _ bool, _ int32, serviceURL string, stakedTokens string, chains []string, pausedHeight int64, unstakingHeight int64) error { - return p.InsertActor(types.FishermanActor, &types.Actor{ - ActorType: types.ActorType_Fish, + return p.InsertActor(types.FishermanActor, &coreTypes.Actor{ + ActorType: coreTypes.ActorType_ACTOR_TYPE_FISH, Address: hex.EncodeToString(address), PublicKey: hex.EncodeToString(publicKey), Chains: chains, @@ -39,8 +40,8 @@ func (p PostgresContext) InsertFisherman(address []byte, publicKey []byte, outpu } func (p PostgresContext) UpdateFisherman(address []byte, serviceURL string, stakedAmount string, chains []string) error { - return p.UpdateActor(types.FishermanActor, &types.Actor{ - ActorType: types.ActorType_Fish, + return p.UpdateActor(types.FishermanActor, &coreTypes.Actor{ + ActorType: coreTypes.ActorType_ACTOR_TYPE_FISH, Address: hex.EncodeToString(address), StakedAmount: stakedAmount, GenericParam: serviceURL, diff --git a/persistence/genesis.go b/persistence/genesis.go index ada90b3cd..1c94316d6 100644 --- a/persistence/genesis.go +++ b/persistence/genesis.go @@ -6,12 +6,13 @@ import ( "math/big" "github.com/pokt-network/pocket/persistence/types" + "github.com/pokt-network/pocket/runtime/genesis" "github.com/pokt-network/pocket/shared/converters" - "github.com/pokt-network/pocket/shared/modules" + coreTypes "github.com/pokt-network/pocket/shared/core/types" ) // CONSIDERATION: Should this return an error and let the caller decide if it should log a fatal error? -func (m *persistenceModule) populateGenesisState(state modules.PersistenceGenesisState) { +func (m *persistenceModule) populateGenesisState(state *genesis.GenesisState) { log.Println("Populating genesis state...") // REFACTOR: This business logic should probably live in `types/genesis.go` @@ -34,7 +35,7 @@ func (m *persistenceModule) populateGenesisState(state modules.PersistenceGenesi log.Fatalf("an error occurred creating the rwContext for the genesis state: %s", err.Error()) } - for _, acc := range state.GetAccs() { + for _, acc := range state.GetAccounts() { addrBz, err := hex.DecodeString(acc.GetAddress()) if err != nil { log.Fatalf("an error occurred converting address to bytes %s", acc.GetAddress()) @@ -44,99 +45,73 @@ func (m *persistenceModule) populateGenesisState(state modules.PersistenceGenesi log.Fatalf("an error occurred inserting an acc in the genesis state: %s", err.Error()) } } - for _, pool := range state.GetAccPools() { + for _, pool := range state.GetPools() { poolNameBytes := []byte(pool.GetAddress()) err = rwContext.InsertPool(pool.GetAddress(), poolNameBytes, pool.GetAmount()) if err != nil { log.Fatalf("an error occurred inserting an pool in the genesis state: %s", err.Error()) } } - for _, act := range state.GetApps() { // TODO (Andrew) genericize the genesis population logic for actors #149 - addrBz, err := hex.DecodeString(act.GetAddress()) - if err != nil { - log.Fatalf("an error occurred converting address to bytes %s", act.GetAddress()) - } - pubKeyBz, err := hex.DecodeString(act.GetPublicKey()) - if err != nil { - log.Fatalf("an error occurred converting pubKey to bytes %s", act.GetPublicKey()) - } - outputBz, err := hex.DecodeString(act.GetOutput()) - if err != nil { - log.Fatalf("an error occurred converting output to bytes %s", act.GetOutput()) - } - err = rwContext.InsertApp(addrBz, pubKeyBz, outputBz, false, StakedStatus, act.GetGenericParam(), act.GetStakedAmount(), act.GetChains(), act.GetPausedHeight(), act.GetUnstakingHeight()) - if err != nil { - log.Fatalf("an error occurred inserting an app in the genesis state: %s", err.Error()) - } - if err = addValueToPool(types.PoolNames_AppStakePool.String(), act.GetStakedAmount()); err != nil { - log.Fatalf("an error occurred inserting staked tokens into %s pool: %s", types.PoolNames_AppStakePool, err.Error()) - } - } - for _, act := range state.GetNodes() { - addrBz, err := hex.DecodeString(act.GetAddress()) - if err != nil { - log.Fatalf("an error occurred converting address to bytes %s", act.GetAddress()) - } - pubKeyBz, err := hex.DecodeString(act.GetPublicKey()) - if err != nil { - log.Fatalf("an error occurred converting pubKey to bytes %s", act.GetPublicKey()) - } - outputBz, err := hex.DecodeString(act.GetOutput()) - if err != nil { - log.Fatalf("an error occurred converting output to bytes %s", act.GetOutput()) - } - err = rwContext.InsertServiceNode(addrBz, pubKeyBz, outputBz, false, StakedStatus, act.GetGenericParam(), act.GetStakedAmount(), act.GetChains(), act.GetPausedHeight(), act.GetUnstakingHeight()) - if err != nil { - log.Fatalf("an error occurred inserting a service node in the genesis state: %s", err.Error()) - } - if err = addValueToPool(types.PoolNames_ServiceNodeStakePool.String(), act.GetStakedAmount()); err != nil { - log.Fatalf("an error occurred inserting staked tokens into %s pool: %s", types.PoolNames_ServiceNodeStakePool.String(), err.Error()) - } - } - for _, act := range state.GetFish() { - addrBz, err := hex.DecodeString(act.GetAddress()) - if err != nil { - log.Fatalf("an error occurred converting address to bytes %s", act.GetAddress()) - } - pubKeyBz, err := hex.DecodeString(act.GetPublicKey()) - if err != nil { - log.Fatalf("an error occurred converting pubKey to bytes %s", act.GetPublicKey()) - } - outputBz, err := hex.DecodeString(act.GetOutput()) - if err != nil { - log.Fatalf("an error occurred converting output to bytes %s", act.GetOutput()) - } - err = rwContext.InsertFisherman(addrBz, pubKeyBz, outputBz, false, StakedStatus, act.GetGenericParam(), act.GetStakedAmount(), act.GetChains(), act.GetPausedHeight(), act.GetUnstakingHeight()) - if err != nil { - log.Fatalf("an error occurred inserting a fisherman in the genesis state: %s", err.Error()) - } - if err = addValueToPool(types.PoolNames_FishermanStakePool.String(), act.GetStakedAmount()); err != nil { - log.Fatalf("an error occurred inserting staked tokens into %s pool: %s", types.PoolNames_FishermanStakePool.String(), err.Error()) - } + + stakedActorsInsertConfigs := []struct { + Name string + Getter func() []*coreTypes.Actor + InsertFn func(address, publicKey, output []byte, paused bool, status int32, serviceURL, stakedTokens string, chains []string, pausedHeight, unstakingHeight int64) error + Pool coreTypes.Pools + }{ + { + Name: "app", + Getter: state.GetApplications, + InsertFn: rwContext.InsertApp, + Pool: coreTypes.Pools_POOLS_APP_STAKE, + }, + { + Name: "serviceNode", + Getter: state.GetServiceNodes, + InsertFn: rwContext.InsertServiceNode, + Pool: coreTypes.Pools_POOLS_SERVICE_NODE_STAKE, + }, + { + Name: "fisherman", + Getter: state.GetFishermen, + InsertFn: rwContext.InsertFisherman, + Pool: coreTypes.Pools_POOLS_FISHERMAN_STAKE, + }, + { + Name: "validator", + Getter: state.GetValidators, + InsertFn: func(address, publicKey, output []byte, paused bool, status int32, serviceURL, stakedTokens string, chains []string, pausedHeight, unstakingHeight int64) error { + return rwContext.InsertValidator(address, publicKey, output, paused, status, serviceURL, stakedTokens, pausedHeight, unstakingHeight) + }, + Pool: coreTypes.Pools_POOLS_VALIDATOR_STAKE, + }, } - for _, act := range state.GetVals() { - addrBz, err := hex.DecodeString(act.GetAddress()) - if err != nil { - log.Fatalf("an error occurred converting address to bytes %s", act.GetAddress()) - } - pubKeyBz, err := hex.DecodeString(act.GetPublicKey()) - if err != nil { - log.Fatalf("an error occurred converting pubKey to bytes %s", act.GetPublicKey()) - } - outputBz, err := hex.DecodeString(act.GetOutput()) - if err != nil { - log.Fatalf("an error occurred converting output to bytes %s", act.GetOutput()) - } - err = rwContext.InsertValidator(addrBz, pubKeyBz, outputBz, false, StakedStatus, act.GetGenericParam(), act.GetStakedAmount(), act.GetPausedHeight(), act.GetUnstakingHeight()) - if err != nil { - log.Fatalf("an error occurred inserting a validator in the genesis state: %s", err.Error()) - } - if err = addValueToPool(types.PoolNames_ValidatorStakePool.String(), act.GetStakedAmount()); err != nil { - log.Fatalf("an error occurred inserting staked tokens into %s pool: %s", types.PoolNames_ValidatorStakePool.String(), err.Error()) + + for _, saic := range stakedActorsInsertConfigs { + for _, act := range saic.Getter() { + addrBz, err := hex.DecodeString(act.GetAddress()) + if err != nil { + log.Fatalf("an error occurred converting address to bytes %s", act.GetAddress()) + } + pubKeyBz, err := hex.DecodeString(act.GetPublicKey()) + if err != nil { + log.Fatalf("an error occurred converting pubKey to bytes %s", act.GetPublicKey()) + } + outputBz, err := hex.DecodeString(act.GetOutput()) + if err != nil { + log.Fatalf("an error occurred converting output to bytes %s", act.GetOutput()) + } + err = saic.InsertFn(addrBz, pubKeyBz, outputBz, false, StakedStatus, act.GetGenericParam(), act.GetStakedAmount(), act.GetChains(), act.GetPausedHeight(), act.GetUnstakingHeight()) + if err != nil { + log.Fatalf("an error occurred inserting an %s in the genesis state: %s", saic.Name, err.Error()) + } + if err = addValueToPool(saic.Pool.FriendlyName(), act.GetStakedAmount()); err != nil { + log.Fatalf("an error occurred inserting staked tokens into %s pool: %s", saic.Pool, err.Error()) + } } } - // TODO(team): use params from genesis file - not the hardcoded - if err = rwContext.InitParams(); err != nil { + + if err = rwContext.InitGenesisParams(state.Params); err != nil { log.Fatalf("an error occurred initializing params: %s", err.Error()) } @@ -159,9 +134,10 @@ func (m *persistenceModule) populateGenesisState(state modules.PersistenceGenesi } // TODO (#399): All of the functions below following a structure similar to `GetAll` -// can easily be refactored and condensed into a single function using a generic type or a common -// interface. -func (p PostgresContext) GetAllAccounts(height int64) (accs []modules.Account, err error) { +// +// can easily be refactored and condensed into a single function using a generic type or a common +// interface. +func (p PostgresContext) GetAllAccounts(height int64) (accs []*coreTypes.Account, err error) { ctx, tx, err := p.getCtxAndTx() if err != nil { return nil, err @@ -171,7 +147,7 @@ func (p PostgresContext) GetAllAccounts(height int64) (accs []modules.Account, e return nil, err } for rows.Next() { - acc := new(types.Account) + acc := new(coreTypes.Account) if err = rows.Scan(&acc.Address, &acc.Amount, &height); err != nil { return nil, err } @@ -185,7 +161,7 @@ func (p PostgresContext) GetAllAccounts(height int64) (accs []modules.Account, e } // CLEANUP: Consolidate with GetAllAccounts. -func (p PostgresContext) GetAllPools(height int64) (accs []modules.Account, err error) { +func (p PostgresContext) GetAllPools(height int64) (accs []*coreTypes.Account, err error) { ctx, tx, err := p.getCtxAndTx() if err != nil { return nil, err @@ -195,7 +171,7 @@ func (p PostgresContext) GetAllPools(height int64) (accs []modules.Account, err return nil, err } for rows.Next() { - pool := new(types.Account) + pool := new(coreTypes.Account) if err = rows.Scan(&pool.Address, &pool.Amount, &height); err != nil { return nil, err } diff --git a/persistence/gov.go b/persistence/gov.go index 83a5fbd27..135c268a0 100644 --- a/persistence/gov.go +++ b/persistence/gov.go @@ -7,6 +7,7 @@ import ( "strconv" "github.com/pokt-network/pocket/persistence/types" + "github.com/pokt-network/pocket/runtime/genesis" ) // TODO : Deprecate these two constants when we change the persistenceRWContext interface to pass the `paramName` @@ -26,12 +27,15 @@ func (p PostgresContext) GetServiceNodesPerSessionAt(height int64) (int, error) return p.GetIntParam(ServiceNodesPerSessionParamName, height) } -func (p PostgresContext) InitParams() error { +func (p PostgresContext) InitGenesisParams(params *genesis.Params) error { ctx, tx, err := p.getCtxAndTx() if err != nil { return err } - _, err = tx.Exec(ctx, types.InsertParams(types.DefaultParams(), p.Height)) + if p.Height != 0 { + return fmt.Errorf("cannot initialize params at height %d", p.Height) + } + _, err = tx.Exec(ctx, types.InsertParams(params, p.Height)) return err } diff --git a/persistence/module.go b/persistence/module.go index f1f89323d..51f6cb5cc 100644 --- a/persistence/module.go +++ b/persistence/module.go @@ -8,7 +8,8 @@ import ( "github.com/jackc/pgx/v4" "github.com/pokt-network/pocket/persistence/indexer" "github.com/pokt-network/pocket/persistence/kvstore" - "github.com/pokt-network/pocket/persistence/types" + "github.com/pokt-network/pocket/runtime/configs" + "github.com/pokt-network/pocket/runtime/genesis" "github.com/pokt-network/pocket/shared/modules" ) @@ -16,17 +17,15 @@ var ( _ modules.PersistenceModule = &persistenceModule{} _ modules.PersistenceModule = &persistenceModule{} - _ modules.PersistenceRWContext = &PostgresContext{} - _ modules.PersistenceGenesisState = &types.PersistenceGenesisState{} - _ modules.PersistenceConfig = &types.PersistenceConfig{} + _ modules.PersistenceRWContext = &PostgresContext{} ) // TODO: convert address and public key to string not bytes in all account and actor functions // TODO: remove address parameter from all pool operations type persistenceModule struct { bus modules.Bus - config modules.PersistenceConfig - genesisState modules.PersistenceGenesisState + config *configs.PersistenceConfig + genesisState *genesis.GenesisState blockStore kvstore.KVStore txIndexer indexer.TxIndexer @@ -47,20 +46,10 @@ func Create(runtimeMgr modules.RuntimeMgr) (modules.Module, error) { func (*persistenceModule) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, error) { var m *persistenceModule - cfg := runtimeMgr.GetConfig() + persistenceCfg := runtimeMgr.GetConfig().Persistence + genesisState := runtimeMgr.GetGenesis() - if err := m.ValidateConfig(cfg); err != nil { - return nil, fmt.Errorf("config validation failed: %w", err) - } - persistenceCfg := cfg.GetPersistenceConfig() - - genesis := runtimeMgr.GetGenesis() - if err := m.ValidateGenesis(genesis); err != nil { - return nil, fmt.Errorf("genesis validation failed: %w", err) - } - persistenceGenesis := genesis.GetPersistenceGenesisState() - - conn, err := connectToDatabase(persistenceCfg.GetPostgresUrl(), persistenceCfg.GetNodeSchema()) + conn, err := connectToDatabase(persistenceCfg.PostgresUrl, persistenceCfg.NodeSchema) if err != nil { return nil, err } @@ -70,17 +59,17 @@ func (*persistenceModule) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, conn.Close(context.TODO()) // TODO: Follow the same pattern as txIndexer below for initializing the blockStore - blockStore, err := initializeBlockStore(persistenceCfg.GetBlockStorePath()) + blockStore, err := initializeBlockStore(persistenceCfg.BlockStorePath) if err != nil { return nil, err } - txIndexer, err := indexer.NewTxIndexer(persistenceCfg.GetTxIndexerPath()) + txIndexer, err := indexer.NewTxIndexer(persistenceCfg.TxIndexerPath) if err != nil { return nil, err } - stateTrees, err := newStateTrees(persistenceCfg.GetTreesStoreDir()) + stateTrees, err := newStateTrees(persistenceCfg.TreesStoreDir) if err != nil { return nil, err } @@ -88,7 +77,7 @@ func (*persistenceModule) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, m = &persistenceModule{ bus: nil, config: persistenceCfg, - genesisState: persistenceGenesis, + genesisState: genesisState, blockStore: blockStore, txIndexer: txIndexer, @@ -104,7 +93,7 @@ func (*persistenceModule) Create(runtimeMgr modules.RuntimeMgr) (modules.Module, if shouldHydrateGenesis, err := m.shouldHydrateGenesisDb(); err != nil { return nil, err } else if shouldHydrateGenesis { - m.populateGenesisState(persistenceGenesis) // fatal if there's an error + m.populateGenesisState(genesisState) // fatal if there's an error } else { // This configurations will connect to the SQL database and key-value stores specified // in the configurations and connected to those. @@ -139,21 +128,11 @@ func (m *persistenceModule) GetBus() modules.Bus { return m.bus } -func (*persistenceModule) ValidateConfig(cfg modules.Config) error { - // TODO (#334): implement this - return nil -} - -func (*persistenceModule) ValidateGenesis(genesis modules.GenesisState) error { - // TODO (#334): implement this - return nil -} - func (m *persistenceModule) NewRWContext(height int64) (modules.PersistenceRWContext, error) { if m.writeContext != nil && !m.writeContext.conn.IsClosed() { return nil, fmt.Errorf("write context already exists") } - conn, err := connectToDatabase(m.config.GetPostgresUrl(), m.config.GetNodeSchema()) + conn, err := connectToDatabase(m.config.PostgresUrl, m.config.NodeSchema) if err != nil { return nil, err } @@ -183,7 +162,7 @@ func (m *persistenceModule) NewRWContext(height int64) (modules.PersistenceRWCon } func (m *persistenceModule) NewReadContext(height int64) (modules.PersistenceReadContext, error) { - conn, err := connectToDatabase(m.config.GetPostgresUrl(), m.config.GetNodeSchema()) + conn, err := connectToDatabase(m.config.PostgresUrl, m.config.NodeSchema) if err != nil { return nil, err } diff --git a/persistence/service_node.go b/persistence/service_node.go index e217db649..6de1f6923 100644 --- a/persistence/service_node.go +++ b/persistence/service_node.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "github.com/pokt-network/pocket/persistence/types" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/modules" ) @@ -25,8 +26,8 @@ func (p PostgresContext) GetServiceNode(address []byte, height int64) (operator, } func (p PostgresContext) InsertServiceNode(address []byte, publicKey []byte, output []byte, _ bool, _ int32, serviceURL string, stakedTokens string, chains []string, pausedHeight int64, unstakingHeight int64) error { - return p.InsertActor(types.ServiceNodeActor, &types.Actor{ - ActorType: types.ActorType_Node, + return p.InsertActor(types.ServiceNodeActor, &coreTypes.Actor{ + ActorType: coreTypes.ActorType_ACTOR_TYPE_SERVICENODE, Address: hex.EncodeToString(address), PublicKey: hex.EncodeToString(publicKey), StakedAmount: stakedTokens, @@ -39,8 +40,8 @@ func (p PostgresContext) InsertServiceNode(address []byte, publicKey []byte, out } func (p PostgresContext) UpdateServiceNode(address []byte, serviceURL string, stakedAmount string, chains []string) error { - return p.UpdateActor(types.ServiceNodeActor, &types.Actor{ - ActorType: types.ActorType_Node, + return p.UpdateActor(types.ServiceNodeActor, &coreTypes.Actor{ + ActorType: coreTypes.ActorType_ACTOR_TYPE_SERVICENODE, Address: hex.EncodeToString(address), StakedAmount: stakedAmount, GenericParam: serviceURL, diff --git a/persistence/shared_sql.go b/persistence/shared_sql.go index 49c54770b..f9311cc6d 100644 --- a/persistence/shared_sql.go +++ b/persistence/shared_sql.go @@ -7,6 +7,7 @@ import ( "github.com/jackc/pgx/v4" "github.com/pokt-network/pocket/persistence/types" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/modules" ) @@ -44,7 +45,7 @@ func (p *PostgresContext) GetExists(actorSchema types.ProtocolActorSchema, addre return } -func (p *PostgresContext) GetActorsUpdated(actorSchema types.ProtocolActorSchema, height int64) (actors []*types.Actor, err error) { +func (p *PostgresContext) GetActorsUpdated(actorSchema types.ProtocolActorSchema, height int64) (actors []*coreTypes.Actor, err error) { ctx, tx, err := p.getCtxAndTx() if err != nil { return @@ -70,7 +71,7 @@ func (p *PostgresContext) GetActorsUpdated(actorSchema types.ProtocolActorSchema } rows.Close() - actors = make([]*types.Actor, len(addrs)) + actors = make([]*coreTypes.Actor, len(addrs)) for i, addr := range addrs { actor, err := p.getActor(actorSchema, addr, height) if err != nil { @@ -82,21 +83,22 @@ func (p *PostgresContext) GetActorsUpdated(actorSchema types.ProtocolActorSchema return } -func (p *PostgresContext) getActor(actorSchema types.ProtocolActorSchema, address []byte, height int64) (actor *types.Actor, err error) { +func (p *PostgresContext) getActor(actorSchema types.ProtocolActorSchema, address []byte, height int64) (actor *coreTypes.Actor, err error) { ctx, tx, err := p.getCtxAndTx() if err != nil { return } - actor, height, err = p.getActorFromRow(tx.QueryRow(ctx, actorSchema.GetQuery(hex.EncodeToString(address), height))) + actor, height, err = p.getActorFromRow(actorSchema.GetActorType(), tx.QueryRow(ctx, actorSchema.GetQuery(hex.EncodeToString(address), height))) if err != nil { return } - return p.getChainsForActor(ctx, tx, actorSchema, actor, height) } -func (p *PostgresContext) getActorFromRow(row pgx.Row) (actor *types.Actor, height int64, err error) { - actor = new(types.Actor) +func (p *PostgresContext) getActorFromRow(actorType coreTypes.ActorType, row pgx.Row) (actor *coreTypes.Actor, height int64, err error) { + actor = &coreTypes.Actor{ + ActorType: actorType, + } err = row.Scan( &actor.Address, &actor.PublicKey, @@ -113,9 +115,9 @@ func (p *PostgresContext) getChainsForActor( ctx context.Context, tx pgx.Tx, actorSchema types.ProtocolActorSchema, - actor *types.Actor, + actor *coreTypes.Actor, height int64, -) (a *types.Actor, err error) { +) (a *coreTypes.Actor, err error) { if actorSchema.GetChainsTableName() == "" { return actor, nil } @@ -141,7 +143,7 @@ func (p *PostgresContext) getChainsForActor( return actor, nil } -func (p *PostgresContext) InsertActor(actorSchema types.ProtocolActorSchema, actor *types.Actor) error { +func (p *PostgresContext) InsertActor(actorSchema types.ProtocolActorSchema, actor *coreTypes.Actor) error { ctx, tx, err := p.getCtxAndTx() if err != nil { return err @@ -159,7 +161,7 @@ func (p *PostgresContext) InsertActor(actorSchema types.ProtocolActorSchema, act return err } -func (p *PostgresContext) UpdateActor(actorSchema types.ProtocolActorSchema, actor *types.Actor) error { +func (p *PostgresContext) UpdateActor(actorSchema types.ProtocolActorSchema, actor *coreTypes.Actor) error { ctx, tx, err := p.getCtxAndTx() if err != nil { return err diff --git a/persistence/state.go b/persistence/state.go index 13e56643c..31ac68b8d 100644 --- a/persistence/state.go +++ b/persistence/state.go @@ -10,6 +10,7 @@ import ( "github.com/celestiaorg/smt" "github.com/pokt-network/pocket/persistence/kvstore" "github.com/pokt-network/pocket/persistence/types" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" "google.golang.org/protobuf/proto" ) @@ -70,25 +71,25 @@ var merkleTreeToString = map[merkleTree]string{ flagsMerkleTree: "flags", } -var actorTypeToMerkleTreeName = map[types.ActorType]merkleTree{ - types.ActorType_App: appMerkleTree, - types.ActorType_Val: valMerkleTree, - types.ActorType_Fish: fishMerkleTree, - types.ActorType_Node: serviceNodeMerkleTree, +var actorTypeToMerkleTreeName = map[coreTypes.ActorType]merkleTree{ + coreTypes.ActorType_ACTOR_TYPE_APP: appMerkleTree, + coreTypes.ActorType_ACTOR_TYPE_VAL: valMerkleTree, + coreTypes.ActorType_ACTOR_TYPE_FISH: fishMerkleTree, + coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: serviceNodeMerkleTree, } -var actorTypeToSchemaName = map[types.ActorType]types.ProtocolActorSchema{ - types.ActorType_App: types.ApplicationActor, - types.ActorType_Val: types.ValidatorActor, - types.ActorType_Fish: types.FishermanActor, - types.ActorType_Node: types.ServiceNodeActor, +var actorTypeToSchemaName = map[coreTypes.ActorType]types.ProtocolActorSchema{ + coreTypes.ActorType_ACTOR_TYPE_APP: types.ApplicationActor, + coreTypes.ActorType_ACTOR_TYPE_VAL: types.ValidatorActor, + coreTypes.ActorType_ACTOR_TYPE_FISH: types.FishermanActor, + coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: types.ServiceNodeActor, } -var merkleTreeToActorTypeName = map[merkleTree]types.ActorType{ - appMerkleTree: types.ActorType_App, - valMerkleTree: types.ActorType_Val, - fishMerkleTree: types.ActorType_Fish, - serviceNodeMerkleTree: types.ActorType_Node, +var merkleTreeToActorTypeName = map[merkleTree]coreTypes.ActorType{ + appMerkleTree: coreTypes.ActorType_ACTOR_TYPE_APP, + valMerkleTree: coreTypes.ActorType_ACTOR_TYPE_VAL, + fishMerkleTree: coreTypes.ActorType_ACTOR_TYPE_FISH, + serviceNodeMerkleTree: coreTypes.ActorType_ACTOR_TYPE_SERVICENODE, } func newStateTrees(treesStoreDir string) (*stateTrees, error) { @@ -225,7 +226,7 @@ func (p PostgresContext) getTxsHash() (txs []byte, err error) { // Actor Tree Helpers -func (p *PostgresContext) updateActorsTree(actorType types.ActorType) error { +func (p *PostgresContext) updateActorsTree(actorType coreTypes.ActorType) error { actors, err := p.getActorsUpdatedAtHeight(actorType, p.Height) if err != nil { return err @@ -254,7 +255,7 @@ func (p *PostgresContext) updateActorsTree(actorType types.ActorType) error { return nil } -func (p *PostgresContext) getActorsUpdatedAtHeight(actorType types.ActorType, height int64) (actors []*types.Actor, err error) { +func (p *PostgresContext) getActorsUpdatedAtHeight(actorType coreTypes.ActorType, height int64) (actors []*coreTypes.Actor, err error) { actorSchema, ok := actorTypeToSchemaName[actorType] if !ok { return nil, fmt.Errorf("no schema found for actor type: %s", actorType) @@ -265,9 +266,9 @@ func (p *PostgresContext) getActorsUpdatedAtHeight(actorType types.ActorType, he return nil, err } - actors = make([]*types.Actor, len(schemaActors)) + actors = make([]*coreTypes.Actor, len(schemaActors)) for i, schemaActor := range schemaActors { - actor := &types.Actor{ + actor := &coreTypes.Actor{ ActorType: actorType, Address: schemaActor.Address, PublicKey: schemaActor.PublicKey, diff --git a/persistence/test/account_test.go b/persistence/test/account_test.go index b4a0f4b08..e332abe34 100644 --- a/persistence/test/account_test.go +++ b/persistence/test/account_test.go @@ -8,11 +8,9 @@ import ( "math/rand" "testing" - "github.com/pokt-network/pocket/persistence/types" - "github.com/pokt-network/pocket/shared/converters" - "github.com/pokt-network/pocket/shared/modules" - "github.com/pokt-network/pocket/persistence" + "github.com/pokt-network/pocket/shared/converters" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" "github.com/stretchr/testify/require" ) @@ -342,7 +340,7 @@ func TestSubPoolAmount(t *testing.T) { func TestGetAllAccounts(t *testing.T) { db := NewTestPostgresContext(t, 0) - updateAccount := func(db *persistence.PostgresContext, acc modules.Account) error { + updateAccount := func(db *persistence.PostgresContext, acc *coreTypes.Account) error { if addr, err := hex.DecodeString(acc.GetAddress()); err == nil { return nil } else { @@ -356,7 +354,7 @@ func TestGetAllAccounts(t *testing.T) { func TestGetAllPools(t *testing.T) { db := NewTestPostgresContext(t, 0) - updatePool := func(db *persistence.PostgresContext, pool modules.Account) error { + updatePool := func(db *persistence.PostgresContext, pool *coreTypes.Account) error { return db.AddPoolAmount(pool.GetAddress(), "10") } @@ -413,7 +411,7 @@ func TestPoolsUpdatedAtHeight(t *testing.T) { // --- Helpers --- -func createAndInsertNewAccount(db *persistence.PostgresContext) (modules.Account, error) { +func createAndInsertNewAccount(db *persistence.PostgresContext) (*coreTypes.Account, error) { account := newTestAccount(nil) addr, err := hex.DecodeString(account.Address) if err != nil { @@ -422,7 +420,7 @@ func createAndInsertNewAccount(db *persistence.PostgresContext) (modules.Account return &account, db.SetAccountAmount(addr, DefaultAccountAmount) } -func createAndInsertNewPool(db *persistence.PostgresContext) (modules.Account, error) { +func createAndInsertNewPool(db *persistence.PostgresContext) (*coreTypes.Account, error) { pool := newTestPool(nil) return &pool, db.SetPoolAmount(pool.Address, DefaultAccountAmount) } @@ -430,23 +428,23 @@ func createAndInsertNewPool(db *persistence.PostgresContext) (modules.Account, e // TODO(olshansky): consolidate newTestAccount and newTestPool into one function // Note to the reader: lack of consistency between []byte and string in addresses will be consolidated. -func newTestAccount(t *testing.T) types.Account { +func newTestAccount(t *testing.T) coreTypes.Account { addr, err := crypto.GenerateAddress() if t != nil { require.NoError(t, err) } - return types.Account{ + return coreTypes.Account{ Address: hex.EncodeToString(addr), Amount: DefaultAccountAmount, } } -func newTestPool(t *testing.T) types.Account { +func newTestPool(t *testing.T) coreTypes.Account { addr, err := crypto.GenerateAddress() if t != nil { require.NoError(t, err) } - return types.Account{ + return coreTypes.Account{ Address: hex.EncodeToString(addr), Amount: DefaultAccountAmount, } diff --git a/persistence/test/actor_test.go b/persistence/test/actor_test.go new file mode 100644 index 000000000..2eab35c82 --- /dev/null +++ b/persistence/test/actor_test.go @@ -0,0 +1,38 @@ +package test + +import ( + "testing" + + "github.com/pokt-network/pocket/shared/core/types" + "github.com/stretchr/testify/require" +) + +func TestGetAllStakedActors(t *testing.T) { + db := NewTestPostgresContext(t, 0) + expectedActorCount := genesisStateNumValidators + genesisStateNumServiceNodes + genesisStateNumApplications + genesisStateNumFishermen + + actors, err := db.GetAllStakedActors(0) + require.NoError(t, err) + require.Equal(t, expectedActorCount, len(actors)) + + actualValidators := 0 + actualServiceNodes := 0 + actualApplications := 0 + actualFishermen := 0 + for _, actor := range actors { + switch actor.ActorType { + case types.ActorType_ACTOR_TYPE_VAL: + actualValidators++ + case types.ActorType_ACTOR_TYPE_SERVICENODE: + actualServiceNodes++ + case types.ActorType_ACTOR_TYPE_APP: + actualApplications++ + case types.ActorType_ACTOR_TYPE_FISH: + actualFishermen++ + } + } + require.Equal(t, genesisStateNumValidators, actualValidators) + require.Equal(t, genesisStateNumServiceNodes, actualServiceNodes) + require.Equal(t, genesisStateNumApplications, actualApplications) + require.Equal(t, genesisStateNumFishermen, actualFishermen) +} diff --git a/persistence/test/application_test.go b/persistence/test/application_test.go index 87357a91d..5fd14bbb1 100644 --- a/persistence/test/application_test.go +++ b/persistence/test/application_test.go @@ -5,9 +5,9 @@ import ( "log" "testing" - "github.com/pokt-network/pocket/persistence/types" - "github.com/pokt-network/pocket/persistence" + "github.com/pokt-network/pocket/persistence/types" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" "github.com/stretchr/testify/require" ) @@ -20,7 +20,7 @@ func FuzzApplication(f *testing.F) { } func TestGetApplicationsUpdatedAtHeight(t *testing.T) { - getApplicationsUpdatedFunc := func(db *persistence.PostgresContext, height int64) ([]*types.Actor, error) { + getApplicationsUpdatedFunc := func(db *persistence.PostgresContext, height int64) ([]*coreTypes.Actor, error) { return db.GetActorsUpdated(types.ApplicationActor, height) } getAllActorsUpdatedAtHeightTest(t, createAndInsertDefaultTestApp, getApplicationsUpdatedFunc, 1) @@ -207,7 +207,7 @@ func TestGetAppOutputAddress(t *testing.T) { require.Equal(t, hex.EncodeToString(output), app.Output, "unexpected output address") } -func newTestApp() (*types.Actor, error) { +func newTestApp() (*coreTypes.Actor, error) { operatorKey, err := crypto.GeneratePublicKey() if err != nil { return nil, err @@ -218,7 +218,7 @@ func newTestApp() (*types.Actor, error) { return nil, err } - return &types.Actor{ + return &coreTypes.Actor{ Address: hex.EncodeToString(operatorKey.Address()), PublicKey: hex.EncodeToString(operatorKey.Bytes()), Chains: DefaultChains, @@ -253,7 +253,7 @@ func TestGetSetStakeAmount(t *testing.T) { require.Equal(t, newStakeAmount, stakeAmountAfter, "unexpected status") } -func createAndInsertDefaultTestApp(db *persistence.PostgresContext) (*types.Actor, error) { +func createAndInsertDefaultTestApp(db *persistence.PostgresContext) (*coreTypes.Actor, error) { app, err := newTestApp() if err != nil { return nil, err @@ -285,13 +285,13 @@ func createAndInsertDefaultTestApp(db *persistence.PostgresContext) (*types.Acto DefaultUnstakingHeight) } -func getTestApp(db *persistence.PostgresContext, address []byte) (*types.Actor, error) { +func getTestApp(db *persistence.PostgresContext, address []byte) (*coreTypes.Actor, error) { operator, publicKey, stakedTokens, maxRelays, outputAddress, pauseHeight, unstakingHeight, chains, err := db.GetApp(address, db.Height) if err != nil { return nil, err } - return &types.Actor{ + return &coreTypes.Actor{ Address: operator, PublicKey: publicKey, Chains: chains, diff --git a/persistence/test/fisherman_test.go b/persistence/test/fisherman_test.go index a22f7f9fe..e38c7ef9e 100644 --- a/persistence/test/fisherman_test.go +++ b/persistence/test/fisherman_test.go @@ -8,6 +8,7 @@ import ( "github.com/pokt-network/pocket/persistence/types" "github.com/pokt-network/pocket/persistence" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" "github.com/stretchr/testify/require" ) @@ -27,7 +28,7 @@ func TestGetSetFishermanStakeAmount(t *testing.T) { } func TestGetFishermanUpdatedAtHeight(t *testing.T) { - getFishermanUpdatedFunc := func(db *persistence.PostgresContext, height int64) ([]*types.Actor, error) { + getFishermanUpdatedFunc := func(db *persistence.PostgresContext, height int64) ([]*coreTypes.Actor, error) { return db.GetActorsUpdated(types.FishermanActor, height) } getAllActorsUpdatedAtHeightTest(t, createAndInsertDefaultTestFisherman, getFishermanUpdatedFunc, 1) @@ -219,7 +220,7 @@ func TestGetFishermanOutputAddress(t *testing.T) { require.Equal(t, hex.EncodeToString(output), fisherman.Output, "unexpected output address") } -func newTestFisherman() (*types.Actor, error) { +func newTestFisherman() (*coreTypes.Actor, error) { operatorKey, err := crypto.GeneratePublicKey() if err != nil { return nil, err @@ -230,7 +231,7 @@ func newTestFisherman() (*types.Actor, error) { return nil, err } - return &types.Actor{ + return &coreTypes.Actor{ Address: hex.EncodeToString(operatorKey.Address()), PublicKey: hex.EncodeToString(operatorKey.Bytes()), Chains: DefaultChains, @@ -242,7 +243,7 @@ func newTestFisherman() (*types.Actor, error) { }, nil } -func createAndInsertDefaultTestFisherman(db *persistence.PostgresContext) (*types.Actor, error) { +func createAndInsertDefaultTestFisherman(db *persistence.PostgresContext) (*coreTypes.Actor, error) { fisherman, err := newTestFisherman() if err != nil { return nil, err @@ -272,7 +273,7 @@ func createAndInsertDefaultTestFisherman(db *persistence.PostgresContext) (*type DefaultUnstakingHeight) } -func getTestFisherman(db *persistence.PostgresContext, address []byte) (*types.Actor, error) { +func getTestFisherman(db *persistence.PostgresContext, address []byte) (*coreTypes.Actor, error) { operator, publicKey, stakedTokens, serviceURL, outputAddress, pauseHeight, unstakingHeight, chains, err := db.GetFisherman(address, db.Height) if err != nil { return nil, err @@ -293,7 +294,7 @@ func getTestFisherman(db *persistence.PostgresContext, address []byte) (*types.A return nil, err } - return &types.Actor{ + return &coreTypes.Actor{ Address: hex.EncodeToString(operatorAddr), PublicKey: hex.EncodeToString(operatorPubKey), Chains: chains, diff --git a/persistence/test/generic_test.go b/persistence/test/generic_test.go index 19c5c0903..31c0d8fc7 100644 --- a/persistence/test/generic_test.go +++ b/persistence/test/generic_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/pokt-network/pocket/persistence/types" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/persistence" "github.com/stretchr/testify/require" @@ -16,8 +17,8 @@ import ( func getGenericActor[T any]( protocolActorSchema types.ProtocolActorSchema, getActor func(*persistence.PostgresContext, []byte) (T, error), -) func(*persistence.PostgresContext, string) (*types.Actor, error) { - return func(db *persistence.PostgresContext, address string) (*types.Actor, error) { +) func(*persistence.PostgresContext, string) (*coreTypes.Actor, error) { + return func(db *persistence.PostgresContext, address string) (*coreTypes.Actor, error) { addr, err := hex.DecodeString(address) if err != nil { return nil, err @@ -31,8 +32,8 @@ func getGenericActor[T any]( } } -func newTestGenericActor[T any](protocolActorSchema types.ProtocolActorSchema, newActor func() (T, error)) func() (*types.Actor, error) { - return func() (*types.Actor, error) { +func newTestGenericActor[T any](protocolActorSchema types.ProtocolActorSchema, newActor func() (T, error)) func() (*coreTypes.Actor, error) { + return func() (*coreTypes.Actor, error) { actor, err := newActor() if err != nil { return nil, err @@ -203,13 +204,13 @@ func getAllActorsUpdatedAtHeightTest[T any]( require.Equal(t, 1, len(accs)) } -func getActorValues(_ types.ProtocolActorSchema, actorValue reflect.Value) *types.Actor { +func getActorValues(_ types.ProtocolActorSchema, actorValue reflect.Value) *coreTypes.Actor { chains := make([]string, 0) if actorValue.FieldByName("Chains").Kind() != 0 { chains = actorValue.FieldByName("Chains").Interface().([]string) } - return &types.Actor{ + return &coreTypes.Actor{ Address: actorValue.FieldByName("Address").String(), PublicKey: actorValue.FieldByName("PublicKey").String(), StakedAmount: actorValue.FieldByName("StakedAmount").String(), diff --git a/persistence/test/gov_test.go b/persistence/test/gov_test.go index 1cadfa46c..c07c3ea37 100644 --- a/persistence/test/gov_test.go +++ b/persistence/test/gov_test.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "testing" + "github.com/pokt-network/pocket/runtime/test_artifacts" "github.com/stretchr/testify/require" ) @@ -14,16 +15,16 @@ const ( ServiceNodeUnstakingBlocksOwner = "service_node_unstaking_blocks_owner" ) -func TestInitParams(t *testing.T) { +func TestInitGenesisParams(t *testing.T) { db := NewTestPostgresContext(t, 0) - err := db.InitParams() + err := db.InitGenesisParams(test_artifacts.DefaultParams()) require.NoError(t, err) } func TestGetSetIntParam(t *testing.T) { db := NewTestPostgresContext(t, 0) - err := db.InitParams() + err := db.InitGenesisParams(test_artifacts.DefaultParams()) require.NoError(t, err) newMaxChains := 42 @@ -43,7 +44,7 @@ func TestGetSetIntParam(t *testing.T) { func TestGetSetStringParam(t *testing.T) { db := NewTestPostgresContext(t, 0) - err := db.InitParams() + err := db.InitGenesisParams(test_artifacts.DefaultParams()) require.NoError(t, err) newServiceNodeMinimumStake := "99999999" @@ -63,7 +64,7 @@ func TestGetSetStringParam(t *testing.T) { func TestGetSetByteArrayParam(t *testing.T) { db := NewTestPostgresContext(t, 0) - err := db.InitParams() + err := db.InitGenesisParams(test_artifacts.DefaultParams()) require.NoError(t, err) newOwner, err := hex.DecodeString("63585955783252764a6e576a5631647542486168426c63774e4655345a57617468545532637a6330516e4d5978575977674553537857644e4a6b4c7734575335416a65616c6d57494a47535364555933686d565a706e57564a6d6143526c54594248626864465a72646c624f646c59704a45536a6c6c52794d32527849545733566c6557464763745a465377466a57324a316157314562554a6c564b6c325470394753696c58544846474e786331567a70554d534a6c5335566d4c356f305157684663726c6b4e4a4e305931496c624a4e58537035554d4a7058564a705561506c3259484a47614b6c585a") @@ -121,7 +122,7 @@ func TestGetSetToggleIntFlag(t *testing.T) { func TestGetSetToggleStringFlag(t *testing.T) { db := NewTestPostgresContext(t, 0) - err := db.InitParams() + err := db.InitGenesisParams(test_artifacts.DefaultParams()) require.NoError(t, err) newServiceNodeMinimumStake := "99999999" @@ -157,7 +158,7 @@ func TestGetSetToggleStringFlag(t *testing.T) { func TestGetSetToggleByteArrayFlag(t *testing.T) { db := NewTestPostgresContext(t, 0) - err := db.InitParams() + err := db.InitGenesisParams(test_artifacts.DefaultParams()) require.NoError(t, err) newOwner, err := hex.DecodeString("576c687353324648536b685a4d6d785159565677536c5a596345704e565456775531684f536d4a735354465a4d45354b546d7473636d4e47614664524d473831544731574e564e58624642685658417a5757704b4d4531466548524f56336872553064534d6c6b794d587068565868455532784b55303156634870574d574e34546b64475346525962476c54527a6c7756444a7353315274546e42526132524b5530645362316b7a62454e694d58425a55323134536d4a71515856564d573831576c525753466c555a456c5a656c5a35557a4e4f56314a7352545657566b303055573157616d52704d545a5256557033576a4677556d5274576c6c57526d6779546c684b546c5a52") diff --git a/persistence/test/service_node_test.go b/persistence/test/service_node_test.go index 4e3f7e28b..9a0aa0015 100644 --- a/persistence/test/service_node_test.go +++ b/persistence/test/service_node_test.go @@ -8,6 +8,7 @@ import ( "github.com/pokt-network/pocket/persistence/types" "github.com/pokt-network/pocket/persistence" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" "github.com/stretchr/testify/require" ) @@ -25,7 +26,7 @@ func TestGetSetServiceNodeStakeAmount(t *testing.T) { } func TestGetServiceNodeUpdatedAtHeight(t *testing.T) { - getServiceNodeUpdatedFunc := func(db *persistence.PostgresContext, height int64) ([]*types.Actor, error) { + getServiceNodeUpdatedFunc := func(db *persistence.PostgresContext, height int64) ([]*coreTypes.Actor, error) { return db.GetActorsUpdated(types.ServiceNodeActor, height) } getAllActorsUpdatedAtHeightTest(t, createAndInsertDefaultTestServiceNode, getServiceNodeUpdatedFunc, 1) @@ -219,7 +220,7 @@ func TestGetServiceNodeOutputAddress(t *testing.T) { require.Equal(t, hex.EncodeToString(output), serviceNode.Output, "unexpected output address") } -func newTestServiceNode() (*types.Actor, error) { +func newTestServiceNode() (*coreTypes.Actor, error) { operatorKey, err := crypto.GeneratePublicKey() if err != nil { return nil, err @@ -230,7 +231,7 @@ func newTestServiceNode() (*types.Actor, error) { return nil, err } - return &types.Actor{ + return &coreTypes.Actor{ Address: hex.EncodeToString(operatorKey.Address()), PublicKey: hex.EncodeToString(operatorKey.Bytes()), Chains: DefaultChains, @@ -242,7 +243,7 @@ func newTestServiceNode() (*types.Actor, error) { }, nil } -func createAndInsertDefaultTestServiceNode(db *persistence.PostgresContext) (*types.Actor, error) { +func createAndInsertDefaultTestServiceNode(db *persistence.PostgresContext) (*coreTypes.Actor, error) { serviceNode, err := newTestServiceNode() if err != nil { return nil, err @@ -272,7 +273,7 @@ func createAndInsertDefaultTestServiceNode(db *persistence.PostgresContext) (*ty DefaultUnstakingHeight) } -func getTestServiceNode(db *persistence.PostgresContext, address []byte) (*types.Actor, error) { +func getTestServiceNode(db *persistence.PostgresContext, address []byte) (*coreTypes.Actor, error) { operator, publicKey, stakedTokens, serviceURL, outputAddress, pauseHeight, unstakingHeight, chains, err := db.GetServiceNode(address, db.Height) if err != nil { return nil, err @@ -293,7 +294,7 @@ func getTestServiceNode(db *persistence.PostgresContext, address []byte) (*types return nil, err } - return &types.Actor{ + return &coreTypes.Actor{ Address: hex.EncodeToString(operatorAddr), PublicKey: hex.EncodeToString(operatorPubKey), Chains: chains, diff --git a/persistence/test/setup_test.go b/persistence/test/setup_test.go index fbd0a0c79..3845bf8c2 100644 --- a/persistence/test/setup_test.go +++ b/persistence/test/setup_test.go @@ -14,8 +14,11 @@ import ( "github.com/pokt-network/pocket/persistence" "github.com/pokt-network/pocket/persistence/types" "github.com/pokt-network/pocket/runtime" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/runtime/test_artifacts" + "github.com/pokt-network/pocket/runtime/test_artifacts/keygenerator" "github.com/pokt-network/pocket/shared/converters" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/messaging" "github.com/pokt-network/pocket/shared/modules" "github.com/stretchr/testify/require" @@ -46,6 +49,11 @@ var ( OlshanskyChains = []string{"OLSH"} testSchema = "test_schema" + + genesisStateNumValidators = 5 + genesisStateNumServiceNodes = 1 + genesisStateNumApplications = 1 + genesisStateNumFishermen = 1 ) var testPersistenceMod modules.PersistenceModule // initialized in TestMain @@ -80,18 +88,25 @@ func NewTestPostgresContext(t testing.TB, height int64) *persistence.PostgresCon // TODO(olshansky): Take in `t testing.T` as a parameter and error if there's an issue func newTestPersistenceModule(databaseUrl string) modules.PersistenceModule { - // HACK: See `runtime/test_artifacts/generator.go` for why we're doing this to get deterministic key generation. - os.Setenv(test_artifacts.PrivateKeySeedEnv, "42") - defer os.Unsetenv(test_artifacts.PrivateKeySeedEnv) - - cfg := runtime.NewConfig(&runtime.BaseConfig{}, runtime.WithPersistenceConfig(&types.PersistenceConfig{ - PostgresUrl: databaseUrl, - NodeSchema: testSchema, - BlockStorePath: "", - TxIndexerPath: "", - TreesStoreDir: "", - })) - genesisState, _ := test_artifacts.NewGenesisState(5, 1, 1, 1) + teardownDeterministicKeygen := keygenerator.GetInstance().SetSeed(42) + defer teardownDeterministicKeygen() + + cfg := &configs.Config{ + Persistence: &configs.PersistenceConfig{ + PostgresUrl: databaseUrl, + NodeSchema: testSchema, + BlockStorePath: "", + TxIndexerPath: "", + TreesStoreDir: "", + }, + } + + genesisState, _ := test_artifacts.NewGenesisState( + genesisStateNumValidators, + genesisStateNumServiceNodes, + genesisStateNumApplications, + genesisStateNumServiceNodes, + ) runtimeCfg := runtime.NewManager(cfg, genesisState) persistenceMod, err := persistence.Create(runtimeCfg) @@ -104,8 +119,8 @@ func newTestPersistenceModule(databaseUrl string) modules.PersistenceModule { // IMPROVE(team): Extend this to more complex and variable test cases challenging & randomizing the state of persistence. func fuzzSingleProtocolActor( f *testing.F, - newTestActor func() (*types.Actor, error), - getTestActor func(db *persistence.PostgresContext, address string) (*types.Actor, error), + newTestActor func() (*coreTypes.Actor, error), + getTestActor func(db *persistence.PostgresContext, address string) (*coreTypes.Actor, error), protocolActorSchema types.ProtocolActorSchema, ) { // Clear the genesis state. @@ -173,7 +188,7 @@ func fuzzSingleProtocolActor( } } } - updatedActor := &types.Actor{ + updatedActor := &coreTypes.Actor{ Address: originalActor.Address, PublicKey: originalActor.PublicKey, StakedAmount: newStakedTokens, diff --git a/persistence/test/state_test.go b/persistence/test/state_test.go index 7eab689d5..57bfccf31 100644 --- a/persistence/test/state_test.go +++ b/persistence/test/state_test.go @@ -48,9 +48,9 @@ func TestStateHash_DeterministicStateWhenUpdatingAppStake(t *testing.T) { // that the business logic doesn't change and that they remain deterministic. Anytime the business // logic changes, these hashes will need to be updated based on the test output. stateHashes := []string{ - "b076081d48f6652d2302c974f20e5371b4728c7950735f6617aac7b6be62f581", - "171af2b820d2a65861c4e63f0cdd9c8bdde4798e6ace28c47d0e83467848ab02", - "b168dff3a83215f12093e548aa22cdf907fbfdb1e12d217ffbb4a07beca065f1", + "d3e433812bef43bf8639be73f7584e85822f98378d46de436d363683aa9020c1", + "81e7af742329dead35969a163862337fba7bebc0444351cca54f00fc34bf48e2", + "6fc07bdec8f96f8ef59c86d44062e4947ba2591a2adf9d6b2fe7838cea6a1b4b", } stakeAmount := initialStakeAmount diff --git a/persistence/test/validator_test.go b/persistence/test/validator_test.go index 86ce0db18..ca8096903 100644 --- a/persistence/test/validator_test.go +++ b/persistence/test/validator_test.go @@ -8,6 +8,7 @@ import ( "github.com/pokt-network/pocket/persistence/types" "github.com/pokt-network/pocket/persistence" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" "github.com/stretchr/testify/require" ) @@ -25,7 +26,7 @@ func TestGetSetValidatorStakeAmount(t *testing.T) { } func TestGetValidatorUpdatedAtHeight(t *testing.T) { - getValidatorsUpdatedFunc := func(db *persistence.PostgresContext, height int64) ([]*types.Actor, error) { + getValidatorsUpdatedFunc := func(db *persistence.PostgresContext, height int64) ([]*coreTypes.Actor, error) { return db.GetActorsUpdated(types.ValidatorActor, height) } getAllActorsUpdatedAtHeightTest(t, createAndInsertDefaultTestValidator, getValidatorsUpdatedFunc, 5) @@ -217,7 +218,7 @@ func TestGetValidatorOutputAddress(t *testing.T) { require.Equal(t, hex.EncodeToString(output), validator.Output, "unexpected output address") } -func newTestValidator() (*types.Actor, error) { +func newTestValidator() (*coreTypes.Actor, error) { operatorKey, err := crypto.GeneratePublicKey() if err != nil { return nil, err @@ -228,7 +229,7 @@ func newTestValidator() (*types.Actor, error) { return nil, err } - return &types.Actor{ + return &coreTypes.Actor{ Address: hex.EncodeToString(operatorKey.Address()), PublicKey: hex.EncodeToString(operatorKey.Bytes()), GenericParam: DefaultServiceUrl, @@ -239,7 +240,7 @@ func newTestValidator() (*types.Actor, error) { }, nil } -func createAndInsertDefaultTestValidator(db *persistence.PostgresContext) (*types.Actor, error) { +func createAndInsertDefaultTestValidator(db *persistence.PostgresContext) (*coreTypes.Actor, error) { validator, err := newTestValidator() if err != nil { return nil, err @@ -268,7 +269,7 @@ func createAndInsertDefaultTestValidator(db *persistence.PostgresContext) (*type DefaultUnstakingHeight) } -func getTestValidator(db *persistence.PostgresContext, address []byte) (*types.Actor, error) { +func getTestValidator(db *persistence.PostgresContext, address []byte) (*coreTypes.Actor, error) { operator, publicKey, stakedTokens, serviceURL, outputAddress, pauseHeight, unstakingHeight, err := db.GetValidator(address, db.Height) if err != nil { return nil, err @@ -289,7 +290,7 @@ func getTestValidator(db *persistence.PostgresContext, address []byte) (*types.A return nil, err } - return &types.Actor{ + return &coreTypes.Actor{ Address: hex.EncodeToString(operatorAddr), PublicKey: hex.EncodeToString(operatorPubKey), GenericParam: serviceURL, diff --git a/persistence/types/application.go b/persistence/types/application.go index 141dd46e4..a6881f9b7 100644 --- a/persistence/types/application.go +++ b/persistence/types/application.go @@ -1,5 +1,7 @@ package types +import coreTypes "github.com/pokt-network/pocket/shared/core/types" + var _ ProtocolActorSchema = &ApplicationSchema{} type ApplicationSchema struct { @@ -15,6 +17,8 @@ const ( var ApplicationActor ProtocolActorSchema = &ApplicationSchema{ BaseProtocolActorSchema: BaseProtocolActorSchema{ + actorType: coreTypes.ActorType_ACTOR_TYPE_APP, + tableName: AppTableName, chainsTableName: AppChainsTableName, diff --git a/persistence/types/base_actor.go b/persistence/types/base_actor.go index a21f65e62..16d3d1b6e 100644 --- a/persistence/types/base_actor.go +++ b/persistence/types/base_actor.go @@ -1,7 +1,9 @@ package types // REFACTOR: Move schema related functions to a separate sub-package -import "github.com/pokt-network/pocket/shared/modules" +import ( + coreTypes "github.com/pokt-network/pocket/shared/core/types" +) var _ ProtocolActorSchema = &BaseProtocolActorSchema{} @@ -10,6 +12,9 @@ var _ ProtocolActorSchema = &BaseProtocolActorSchema{} // Note that this implementation assumes the protocol actor is chain dependant, so that behaviour needs // to be overridden if the actor (e.g. Validator) is chain independent. type BaseProtocolActorSchema struct { + // Actor Type + actorType coreTypes.ActorType + // SQL Tables tableName string chainsTableName string @@ -22,6 +27,10 @@ type BaseProtocolActorSchema struct { chainsHeightConstraintName string } +func (actor *BaseProtocolActorSchema) GetActorType() coreTypes.ActorType { + return actor.actorType +} + func (actor *BaseProtocolActorSchema) GetTableName() string { return actor.tableName } @@ -83,7 +92,7 @@ func (actor *BaseProtocolActorSchema) GetChainsQuery(address string, height int6 } func (actor *BaseProtocolActorSchema) InsertQuery(address, publicKey, stakedTokens, generic, outputAddress string, pausedHeight, unstakingHeight int64, chains []string, height int64) string { - return Insert(&Actor{ + return Insert(&coreTypes.Actor{ Address: address, PublicKey: publicKey, StakedAmount: stakedTokens, @@ -129,12 +138,3 @@ func (actor *BaseProtocolActorSchema) ClearAllQuery() string { func (actor *BaseProtocolActorSchema) ClearAllChainsQuery() string { return ClearAll(actor.chainsTableName) } - -var _ modules.Actor = &Actor{} - -func (x *Actor) GetActorTyp() modules.ActorType { - if x != nil { - return x.GetActorType() - } - return ActorType_Undefined -} diff --git a/persistence/types/converters.go b/persistence/types/converters.go deleted file mode 100644 index 2c9e81f88..000000000 --- a/persistence/types/converters.go +++ /dev/null @@ -1,156 +0,0 @@ -package types - -import ( - "github.com/pokt-network/pocket/shared/modules" -) - -func toPersistenceActor(actor modules.Actor) *Actor { - return &Actor{ - ActorType: actor.GetActorTyp().(ActorType), - Address: actor.GetAddress(), - PublicKey: actor.GetPublicKey(), - Chains: actor.GetChains(), - GenericParam: actor.GetGenericParam(), - StakedAmount: actor.GetStakedAmount(), - PausedHeight: actor.GetPausedHeight(), - UnstakingHeight: actor.GetUnstakingHeight(), - Output: actor.GetOutput(), - } -} - -func ToPersistenceActors(actors []modules.Actor) []*Actor { - perActors := make([]*Actor, len(actors)) - for i, actor := range actors { - perActors[i] = toPersistenceActor(actor) - } - return perActors -} - -func toPersistenceAccount(account modules.Account) *Account { - return &Account{ - Address: account.GetAddress(), - Amount: account.GetAmount(), - } -} - -func ToPersistenceAccounts(accounts []modules.Account) []*Account { - perAccounts := make([]*Account, len(accounts)) - for i, account := range accounts { - perAccounts[i] = toPersistenceAccount(account) - } - return perAccounts -} - -func ToPersistenceParams(params modules.Params) *Params { - return &Params{ - BlocksPerSession: params.GetBlocksPerSession(), - AppMinimumStake: params.GetAppMinimumStake(), - AppMaxChains: params.GetAppMaxChains(), - AppBaselineStakeRate: params.GetAppBaselineStakeRate(), - AppStakingAdjustment: params.GetAppStakingAdjustment(), - AppUnstakingBlocks: params.GetAppUnstakingBlocks(), - AppMinimumPauseBlocks: params.GetAppMinimumPauseBlocks(), - AppMaxPauseBlocks: params.GetAppMaxPauseBlocks(), - ServiceNodeMinimumStake: params.GetServiceNodeMinimumStake(), - ServiceNodeMaxChains: params.GetServiceNodeMaxChains(), - ServiceNodeUnstakingBlocks: params.GetServiceNodeUnstakingBlocks(), - ServiceNodeMinimumPauseBlocks: params.GetServiceNodeMinimumPauseBlocks(), - ServiceNodeMaxPauseBlocks: params.GetServiceNodeMaxPauseBlocks(), - ServiceNodesPerSession: params.GetServiceNodesPerSession(), - FishermanMinimumStake: params.GetFishermanMinimumStake(), - FishermanMaxChains: params.GetFishermanMaxChains(), - FishermanUnstakingBlocks: params.GetFishermanUnstakingBlocks(), - FishermanMinimumPauseBlocks: params.GetFishermanMinimumPauseBlocks(), - FishermanMaxPauseBlocks: params.GetFishermanMaxPauseBlocks(), - ValidatorMinimumStake: params.GetValidatorMinimumStake(), - ValidatorUnstakingBlocks: params.GetValidatorUnstakingBlocks(), - ValidatorMinimumPauseBlocks: params.GetValidatorMinimumPauseBlocks(), - ValidatorMaxPauseBlocks: params.GetValidatorMaxPauseBlocks(), - ValidatorMaximumMissedBlocks: params.GetValidatorMaximumMissedBlocks(), - ValidatorMaxEvidenceAgeInBlocks: params.GetValidatorMaxEvidenceAgeInBlocks(), - ProposerPercentageOfFees: params.GetProposerPercentageOfFees(), - MissedBlocksBurnPercentage: params.GetMissedBlocksBurnPercentage(), - DoubleSignBurnPercentage: params.GetDoubleSignBurnPercentage(), - MessageDoubleSignFee: params.GetMessageDoubleSignFee(), - MessageSendFee: params.GetMessageSendFee(), - MessageStakeFishermanFee: params.GetMessageStakeFishermanFee(), - MessageEditStakeFishermanFee: params.GetMessageEditStakeFishermanFee(), - MessageUnstakeFishermanFee: params.GetMessageUnstakeFishermanFee(), - MessagePauseFishermanFee: params.GetMessagePauseFishermanFee(), - MessageUnpauseFishermanFee: params.GetMessageUnpauseFishermanFee(), - MessageFishermanPauseServiceNodeFee: params.GetMessageFishermanPauseServiceNodeFee(), - MessageTestScoreFee: params.GetMessageTestScoreFee(), - MessageProveTestScoreFee: params.GetMessageProveTestScoreFee(), - MessageStakeAppFee: params.GetMessageStakeAppFee(), - MessageEditStakeAppFee: params.GetMessageEditStakeAppFee(), - MessageUnstakeAppFee: params.GetMessageUnstakeAppFee(), - MessagePauseAppFee: params.GetMessagePauseAppFee(), - MessageUnpauseAppFee: params.GetMessageUnpauseAppFee(), - MessageStakeValidatorFee: params.GetMessageStakeValidatorFee(), - MessageEditStakeValidatorFee: params.GetMessageEditStakeValidatorFee(), - MessageUnstakeValidatorFee: params.GetMessageUnstakeValidatorFee(), - MessagePauseValidatorFee: params.GetMessagePauseValidatorFee(), - MessageUnpauseValidatorFee: params.GetMessageUnpauseValidatorFee(), - MessageStakeServiceNodeFee: params.GetMessageStakeServiceNodeFee(), - MessageEditStakeServiceNodeFee: params.GetMessageEditStakeServiceNodeFee(), - MessageUnstakeServiceNodeFee: params.GetMessageUnstakeServiceNodeFee(), - MessagePauseServiceNodeFee: params.GetMessagePauseServiceNodeFee(), - MessageUnpauseServiceNodeFee: params.GetMessageUnpauseServiceNodeFee(), - MessageChangeParameterFee: params.GetMessageChangeParameterFee(), - AclOwner: params.GetAclOwner(), - BlocksPerSessionOwner: params.GetBlocksPerSessionOwner(), - AppMinimumStakeOwner: params.GetAppMinimumStakeOwner(), - AppMaxChainsOwner: params.GetAppMaxChainsOwner(), - AppBaselineStakeRateOwner: params.GetAppBaselineStakeRateOwner(), - AppStakingAdjustmentOwner: params.GetAppStakingAdjustmentOwner(), - AppUnstakingBlocksOwner: params.GetAppUnstakingBlocksOwner(), - AppMinimumPauseBlocksOwner: params.GetAppMinimumPauseBlocksOwner(), - AppMaxPausedBlocksOwner: params.GetAppMaxPausedBlocksOwner(), - ServiceNodeMinimumStakeOwner: params.GetServiceNodeMinimumStakeOwner(), - ServiceNodeMaxChainsOwner: params.GetServiceNodeMaxChainsOwner(), - ServiceNodeUnstakingBlocksOwner: params.GetServiceNodeUnstakingBlocksOwner(), - ServiceNodeMinimumPauseBlocksOwner: params.GetServiceNodeMinimumPauseBlocksOwner(), - ServiceNodeMaxPausedBlocksOwner: params.GetServiceNodeMaxPausedBlocksOwner(), - ServiceNodesPerSessionOwner: params.GetServiceNodesPerSessionOwner(), - FishermanMinimumStakeOwner: params.GetFishermanMinimumStakeOwner(), - FishermanMaxChainsOwner: params.GetFishermanMaxChainsOwner(), - FishermanUnstakingBlocksOwner: params.GetFishermanUnstakingBlocksOwner(), - FishermanMinimumPauseBlocksOwner: params.GetFishermanMinimumPauseBlocksOwner(), - FishermanMaxPausedBlocksOwner: params.GetFishermanMaxPausedBlocksOwner(), - ValidatorMinimumStakeOwner: params.GetValidatorMinimumStakeOwner(), - ValidatorUnstakingBlocksOwner: params.GetValidatorUnstakingBlocksOwner(), - ValidatorMinimumPauseBlocksOwner: params.GetValidatorMinimumPauseBlocksOwner(), - ValidatorMaxPausedBlocksOwner: params.GetValidatorMaxPausedBlocksOwner(), - ValidatorMaximumMissedBlocksOwner: params.GetValidatorMaximumMissedBlocksOwner(), - ValidatorMaxEvidenceAgeInBlocksOwner: params.GetValidatorMaxEvidenceAgeInBlocksOwner(), - ProposerPercentageOfFeesOwner: params.GetProposerPercentageOfFeesOwner(), - MissedBlocksBurnPercentageOwner: params.GetMissedBlocksBurnPercentageOwner(), - DoubleSignBurnPercentageOwner: params.GetDoubleSignBurnPercentageOwner(), - MessageDoubleSignFeeOwner: params.GetMessageDoubleSignFeeOwner(), - MessageSendFeeOwner: params.GetMessageSendFeeOwner(), - MessageStakeFishermanFeeOwner: params.GetMessageStakeFishermanFeeOwner(), - MessageEditStakeFishermanFeeOwner: params.GetMessageEditStakeFishermanFeeOwner(), - MessageUnstakeFishermanFeeOwner: params.GetMessageUnstakeFishermanFeeOwner(), - MessagePauseFishermanFeeOwner: params.GetMessagePauseFishermanFeeOwner(), - MessageUnpauseFishermanFeeOwner: params.GetMessageUnpauseFishermanFeeOwner(), - MessageFishermanPauseServiceNodeFeeOwner: params.GetMessageFishermanPauseServiceNodeFeeOwner(), - MessageTestScoreFeeOwner: params.GetMessageTestScoreFeeOwner(), - MessageProveTestScoreFeeOwner: params.GetMessageProveTestScoreFeeOwner(), - MessageStakeAppFeeOwner: params.GetMessageStakeAppFeeOwner(), - MessageEditStakeAppFeeOwner: params.GetMessageEditStakeAppFeeOwner(), - MessageUnstakeAppFeeOwner: params.GetMessageUnstakeAppFeeOwner(), - MessagePauseAppFeeOwner: params.GetMessagePauseAppFeeOwner(), - MessageUnpauseAppFeeOwner: params.GetMessageUnpauseAppFeeOwner(), - MessageStakeValidatorFeeOwner: params.GetMessageStakeValidatorFeeOwner(), - MessageEditStakeValidatorFeeOwner: params.GetMessageEditStakeValidatorFeeOwner(), - MessageUnstakeValidatorFeeOwner: params.GetMessageUnstakeValidatorFeeOwner(), - MessagePauseValidatorFeeOwner: params.GetMessagePauseValidatorFeeOwner(), - MessageUnpauseValidatorFeeOwner: params.GetMessageUnpauseValidatorFeeOwner(), - MessageStakeServiceNodeFeeOwner: params.GetMessageStakeServiceNodeFeeOwner(), - MessageEditStakeServiceNodeFeeOwner: params.GetMessageEditStakeServiceNodeFeeOwner(), - MessageUnstakeServiceNodeFeeOwner: params.GetMessageUnstakeServiceNodeFeeOwner(), - MessagePauseServiceNodeFeeOwner: params.GetMessagePauseServiceNodeFeeOwner(), - MessageUnpauseServiceNodeFeeOwner: params.GetMessageUnpauseServiceNodeFeeOwner(), - MessageChangeParameterFeeOwner: params.GetMessageChangeParameterFeeOwner(), - } -} diff --git a/persistence/types/fisherman.go b/persistence/types/fisherman.go index da116a7fe..1ffe2e8b7 100644 --- a/persistence/types/fisherman.go +++ b/persistence/types/fisherman.go @@ -1,5 +1,7 @@ package types +import coreTypes "github.com/pokt-network/pocket/shared/core/types" + var _ ProtocolActorSchema = &FishermanSchema{} type FishermanSchema struct { @@ -15,6 +17,8 @@ const ( var FishermanActor ProtocolActorSchema = &FishermanSchema{ BaseProtocolActorSchema: BaseProtocolActorSchema{ + actorType: coreTypes.ActorType_ACTOR_TYPE_FISH, + tableName: FishermanTableName, chainsTableName: FishermanChainsTableName, diff --git a/persistence/types/gov.go b/persistence/types/gov.go index dbfdd9d1b..c391e3289 100644 --- a/persistence/types/gov.go +++ b/persistence/types/gov.go @@ -7,7 +7,7 @@ import ( "reflect" "strings" - "github.com/pokt-network/pocket/shared/modules" + "github.com/pokt-network/pocket/runtime/genesis" ) // init initializes a map that contains the metadata extracted from `gov.proto`. @@ -60,7 +60,7 @@ var ( // InsertParams generates the SQL INSERT statement given a *genesis.Params // It leverages metadata in the form of struct tags (see `parseGovProto` for more information). // WARNING: reflections in prod -func InsertParams(params modules.Params, height int64) string { +func InsertParams(params *genesis.Params, height int64) string { val := reflect.ValueOf(params) var sb strings.Builder @@ -172,7 +172,7 @@ type govParamMetadata struct { // WARNING: reflections in prod func parseGovProto() (govParamMetadataMap map[string]govParamMetadata) { govParamMetadataMap = make(map[string]govParamMetadata) - fields := reflect.VisibleFields(reflect.TypeOf(Params{})) + fields := reflect.VisibleFields(reflect.TypeOf(genesis.Params{})) for _, field := range fields { if !field.IsExported() { continue @@ -187,7 +187,6 @@ func parseGovProto() (govParamMetadataMap map[string]govParamMetadata) { } govParamMetadataKeys = append(govParamMetadataKeys, protoName) } - return govParamMetadataMap } diff --git a/persistence/types/gov_test.go b/persistence/types/gov_test.go index b0222bb29..f3dea6c76 100644 --- a/persistence/types/gov_test.go +++ b/persistence/types/gov_test.go @@ -2,11 +2,14 @@ package types import ( "testing" + + "github.com/pokt-network/pocket/runtime/genesis" + "github.com/pokt-network/pocket/runtime/test_artifacts" ) func TestInsertParams(t *testing.T) { type args struct { - params *Params + params *genesis.Params height int64 } tests := []struct { @@ -17,7 +20,7 @@ func TestInsertParams(t *testing.T) { { name: "should insert genesis.DefaultParams() as expected", args: args{ - params: DefaultParams(), + params: test_artifacts.DefaultParams(), height: DefaultBigInt, }, want: "INSERT INTO params VALUES ('blocks_per_session', -1, 'BIGINT', 4)," + diff --git a/persistence/types/persistence_genesis.go b/persistence/types/persistence_genesis.go deleted file mode 100644 index 8437faf9b..000000000 --- a/persistence/types/persistence_genesis.go +++ /dev/null @@ -1,176 +0,0 @@ -package types - -import ( - "math/big" - - "github.com/pokt-network/pocket/shared/converters" - "github.com/pokt-network/pocket/shared/crypto" - "github.com/pokt-network/pocket/shared/modules" -) - -var _ modules.PersistenceGenesisState = &PersistenceGenesisState{} - -// TODO (Research) is there anyway to not have to name these protobuf files uniquely? -// not a fan of _config/genesis.go would rather just config/genesis.go - -func (x *PersistenceGenesisState) GetAccs() []modules.Account { - return accToAccInterface(x.GetAccounts()) -} - -func (x *PersistenceGenesisState) GetAccPools() []modules.Account { - return accToAccInterface(x.GetPools()) -} - -func (x *PersistenceGenesisState) GetApps() []modules.Actor { - return ActorsToActorsInterface(x.GetApplications()) -} - -func (x *PersistenceGenesisState) GetVals() []modules.Actor { - return ActorsToActorsInterface(x.GetValidators()) -} - -func (x *PersistenceGenesisState) GetFish() []modules.Actor { - return ActorsToActorsInterface(x.GetFishermen()) -} - -func (x *PersistenceGenesisState) GetNodes() []modules.Actor { - return ActorsToActorsInterface(x.GetServiceNodes()) -} - -func (x *PersistenceGenesisState) GetParameters() modules.Params { - return x.GetParams() -} - -// RESEARCH(olshansky): AFAIK this is the only way to convert slice of structs into interface - O(n) -// https://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces -func ActorsToActorsInterface(a []*Actor) (actorI []modules.Actor) { - for _, actor := range a { - actorI = append(actorI, actor) - } - return -} - -func accToAccInterface(a []*Account) (accI []modules.Account) { - for _, acc := range a { - accI = append(accI, acc) - } - return -} - -var ( - DefaultParamsOwner, _ = crypto.NewPrivateKey("ff538589deb7f28bbce1ba68b37d2efc0eaa03204b36513cf88422a875559e38d6cbe0430ddd85a5e48e0c99ef3dea47bf0d1a83c6e6ad1640f72201dc8a0120") -) - -func DefaultParams() *Params { // TODO this is just a test / demo artifact and should be deprecated by genesis file - return &Params{ - BlocksPerSession: 4, - AppMinimumStake: converters.BigIntToString(big.NewInt(15000000000)), - AppMaxChains: 15, - AppBaselineStakeRate: 100, - AppStakingAdjustment: 0, - AppUnstakingBlocks: 2016, - AppMinimumPauseBlocks: 4, - AppMaxPauseBlocks: 672, - ServiceNodeMinimumStake: converters.BigIntToString(big.NewInt(15000000000)), - ServiceNodeMaxChains: 15, - ServiceNodeUnstakingBlocks: 2016, - ServiceNodeMinimumPauseBlocks: 4, - ServiceNodeMaxPauseBlocks: 672, - ServiceNodesPerSession: 24, - FishermanMinimumStake: converters.BigIntToString(big.NewInt(15000000000)), - FishermanMaxChains: 15, - FishermanUnstakingBlocks: 2016, - FishermanMinimumPauseBlocks: 4, - FishermanMaxPauseBlocks: 672, - ValidatorMinimumStake: converters.BigIntToString(big.NewInt(15000000000)), - ValidatorUnstakingBlocks: 2016, - ValidatorMinimumPauseBlocks: 4, - ValidatorMaxPauseBlocks: 672, - ValidatorMaximumMissedBlocks: 5, - ValidatorMaxEvidenceAgeInBlocks: 8, - ProposerPercentageOfFees: 10, - MissedBlocksBurnPercentage: 1, - DoubleSignBurnPercentage: 5, - MessageDoubleSignFee: converters.BigIntToString(big.NewInt(10000)), - MessageSendFee: converters.BigIntToString(big.NewInt(10000)), - MessageStakeFishermanFee: converters.BigIntToString(big.NewInt(10000)), - MessageEditStakeFishermanFee: converters.BigIntToString(big.NewInt(10000)), - MessageUnstakeFishermanFee: converters.BigIntToString(big.NewInt(10000)), - MessagePauseFishermanFee: converters.BigIntToString(big.NewInt(10000)), - MessageUnpauseFishermanFee: converters.BigIntToString(big.NewInt(10000)), - MessageFishermanPauseServiceNodeFee: converters.BigIntToString(big.NewInt(10000)), - MessageTestScoreFee: converters.BigIntToString(big.NewInt(10000)), - MessageProveTestScoreFee: converters.BigIntToString(big.NewInt(10000)), - MessageStakeAppFee: converters.BigIntToString(big.NewInt(10000)), - MessageEditStakeAppFee: converters.BigIntToString(big.NewInt(10000)), - MessageUnstakeAppFee: converters.BigIntToString(big.NewInt(10000)), - MessagePauseAppFee: converters.BigIntToString(big.NewInt(10000)), - MessageUnpauseAppFee: converters.BigIntToString(big.NewInt(10000)), - MessageStakeValidatorFee: converters.BigIntToString(big.NewInt(10000)), - MessageEditStakeValidatorFee: converters.BigIntToString(big.NewInt(10000)), - MessageUnstakeValidatorFee: converters.BigIntToString(big.NewInt(10000)), - MessagePauseValidatorFee: converters.BigIntToString(big.NewInt(10000)), - MessageUnpauseValidatorFee: converters.BigIntToString(big.NewInt(10000)), - MessageStakeServiceNodeFee: converters.BigIntToString(big.NewInt(10000)), - MessageEditStakeServiceNodeFee: converters.BigIntToString(big.NewInt(10000)), - MessageUnstakeServiceNodeFee: converters.BigIntToString(big.NewInt(10000)), - MessagePauseServiceNodeFee: converters.BigIntToString(big.NewInt(10000)), - MessageUnpauseServiceNodeFee: converters.BigIntToString(big.NewInt(10000)), - MessageChangeParameterFee: converters.BigIntToString(big.NewInt(10000)), - AclOwner: DefaultParamsOwner.Address().String(), - BlocksPerSessionOwner: DefaultParamsOwner.Address().String(), - AppMinimumStakeOwner: DefaultParamsOwner.Address().String(), - AppMaxChainsOwner: DefaultParamsOwner.Address().String(), - AppBaselineStakeRateOwner: DefaultParamsOwner.Address().String(), - AppStakingAdjustmentOwner: DefaultParamsOwner.Address().String(), - AppUnstakingBlocksOwner: DefaultParamsOwner.Address().String(), - AppMinimumPauseBlocksOwner: DefaultParamsOwner.Address().String(), - AppMaxPausedBlocksOwner: DefaultParamsOwner.Address().String(), - ServiceNodeMinimumStakeOwner: DefaultParamsOwner.Address().String(), - ServiceNodeMaxChainsOwner: DefaultParamsOwner.Address().String(), - ServiceNodeUnstakingBlocksOwner: DefaultParamsOwner.Address().String(), - ServiceNodeMinimumPauseBlocksOwner: DefaultParamsOwner.Address().String(), - ServiceNodeMaxPausedBlocksOwner: DefaultParamsOwner.Address().String(), - ServiceNodesPerSessionOwner: DefaultParamsOwner.Address().String(), - FishermanMinimumStakeOwner: DefaultParamsOwner.Address().String(), - FishermanMaxChainsOwner: DefaultParamsOwner.Address().String(), - FishermanUnstakingBlocksOwner: DefaultParamsOwner.Address().String(), - FishermanMinimumPauseBlocksOwner: DefaultParamsOwner.Address().String(), - FishermanMaxPausedBlocksOwner: DefaultParamsOwner.Address().String(), - ValidatorMinimumStakeOwner: DefaultParamsOwner.Address().String(), - ValidatorUnstakingBlocksOwner: DefaultParamsOwner.Address().String(), - ValidatorMinimumPauseBlocksOwner: DefaultParamsOwner.Address().String(), - ValidatorMaxPausedBlocksOwner: DefaultParamsOwner.Address().String(), - ValidatorMaximumMissedBlocksOwner: DefaultParamsOwner.Address().String(), - ValidatorMaxEvidenceAgeInBlocksOwner: DefaultParamsOwner.Address().String(), - ProposerPercentageOfFeesOwner: DefaultParamsOwner.Address().String(), - MissedBlocksBurnPercentageOwner: DefaultParamsOwner.Address().String(), - DoubleSignBurnPercentageOwner: DefaultParamsOwner.Address().String(), - MessageDoubleSignFeeOwner: DefaultParamsOwner.Address().String(), - MessageSendFeeOwner: DefaultParamsOwner.Address().String(), - MessageStakeFishermanFeeOwner: DefaultParamsOwner.Address().String(), - MessageEditStakeFishermanFeeOwner: DefaultParamsOwner.Address().String(), - MessageUnstakeFishermanFeeOwner: DefaultParamsOwner.Address().String(), - MessagePauseFishermanFeeOwner: DefaultParamsOwner.Address().String(), - MessageUnpauseFishermanFeeOwner: DefaultParamsOwner.Address().String(), - MessageFishermanPauseServiceNodeFeeOwner: DefaultParamsOwner.Address().String(), - MessageTestScoreFeeOwner: DefaultParamsOwner.Address().String(), - MessageProveTestScoreFeeOwner: DefaultParamsOwner.Address().String(), - MessageStakeAppFeeOwner: DefaultParamsOwner.Address().String(), - MessageEditStakeAppFeeOwner: DefaultParamsOwner.Address().String(), - MessageUnstakeAppFeeOwner: DefaultParamsOwner.Address().String(), - MessagePauseAppFeeOwner: DefaultParamsOwner.Address().String(), - MessageUnpauseAppFeeOwner: DefaultParamsOwner.Address().String(), - MessageStakeValidatorFeeOwner: DefaultParamsOwner.Address().String(), - MessageEditStakeValidatorFeeOwner: DefaultParamsOwner.Address().String(), - MessageUnstakeValidatorFeeOwner: DefaultParamsOwner.Address().String(), - MessagePauseValidatorFeeOwner: DefaultParamsOwner.Address().String(), - MessageUnpauseValidatorFeeOwner: DefaultParamsOwner.Address().String(), - MessageStakeServiceNodeFeeOwner: DefaultParamsOwner.Address().String(), - MessageEditStakeServiceNodeFeeOwner: DefaultParamsOwner.Address().String(), - MessageUnstakeServiceNodeFeeOwner: DefaultParamsOwner.Address().String(), - MessagePauseServiceNodeFeeOwner: DefaultParamsOwner.Address().String(), - MessageUnpauseServiceNodeFeeOwner: DefaultParamsOwner.Address().String(), - MessageChangeParameterFeeOwner: DefaultParamsOwner.Address().String(), - } -} diff --git a/persistence/types/protocol_actor.go b/persistence/types/protocol_actor.go index 709457b6c..7b16a1def 100644 --- a/persistence/types/protocol_actor.go +++ b/persistence/types/protocol_actor.go @@ -1,10 +1,15 @@ package types +import coreTypes "github.com/pokt-network/pocket/shared/core/types" + // Interface common to all protocol actors at the persistence schema layer. This exposes SQL specific // attributes and queries. type ProtocolActorSchema interface { /*** Protocol Actor Attributes ***/ + // Actor Type + GetActorType() coreTypes.ActorType + // SQL Table Names GetTableName() string GetChainsTableName() string diff --git a/persistence/types/service_node.go b/persistence/types/service_node.go index 76857e0da..d7bbe9cb0 100644 --- a/persistence/types/service_node.go +++ b/persistence/types/service_node.go @@ -1,5 +1,7 @@ package types +import coreTypes "github.com/pokt-network/pocket/shared/core/types" + var _ ProtocolActorSchema = &ServiceNodeSchema{} type ServiceNodeSchema struct { @@ -15,6 +17,8 @@ const ( var ServiceNodeActor ProtocolActorSchema = &ServiceNodeSchema{ BaseProtocolActorSchema: BaseProtocolActorSchema{ + actorType: coreTypes.ActorType_ACTOR_TYPE_SERVICENODE, + tableName: ServiceNodeTableName, chainsTableName: ServiceNodeChainsTableName, diff --git a/persistence/types/shared_sql.go b/persistence/types/shared_sql.go index a0b04820a..c2f98ab6f 100644 --- a/persistence/types/shared_sql.go +++ b/persistence/types/shared_sql.go @@ -3,6 +3,8 @@ package types import ( "bytes" "fmt" + + coreTypes "github.com/pokt-network/pocket/shared/core/types" ) const ( @@ -111,7 +113,7 @@ func readyToUnstake(unstakingHeight int64, tableName string) string { } func Insert( - actor *Actor, + actor *coreTypes.Actor, actorSpecificParam, actorSpecificParamValue, constraintName, chainsConstraintName, tableName, chainsTableName string, diff --git a/persistence/types/validator.go b/persistence/types/validator.go index 1eaf287aa..6cded8004 100644 --- a/persistence/types/validator.go +++ b/persistence/types/validator.go @@ -1,5 +1,7 @@ package types +import coreTypes "github.com/pokt-network/pocket/shared/core/types" + var _ ProtocolActorSchema = &ValidatorSchema{} const ( @@ -15,6 +17,8 @@ type ValidatorSchema struct { var ValidatorActor ProtocolActorSchema = &ValidatorSchema{ BaseProtocolActorSchema: BaseProtocolActorSchema{ + actorType: coreTypes.ActorType_ACTOR_TYPE_VAL, + tableName: ValidatorTableName, chainsTableName: NullString, @@ -26,7 +30,7 @@ var ValidatorActor ProtocolActorSchema = &ValidatorSchema{ } func (actor *ValidatorSchema) InsertQuery(address, publicKey, stakedTokens, maxRelays, outputAddress string, pausedHeight, unstakingHeight int64, _ []string, height int64) string { - return Insert(&Actor{ + return Insert(&coreTypes.Actor{ Address: address, PublicKey: publicKey, StakedAmount: stakedTokens, diff --git a/persistence/validator.go b/persistence/validator.go index 3c1bff1c0..6b3258496 100644 --- a/persistence/validator.go +++ b/persistence/validator.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "github.com/pokt-network/pocket/persistence/types" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/modules" ) @@ -24,8 +25,8 @@ func (p PostgresContext) GetValidator(address []byte, height int64) (operator, p } func (p PostgresContext) InsertValidator(address []byte, publicKey []byte, output []byte, _ bool, _ int32, serviceURL string, stakedTokens string, pausedHeight int64, unstakingHeight int64) error { - return p.InsertActor(types.ValidatorActor, &types.Actor{ - ActorType: types.ActorType_Val, + return p.InsertActor(types.ValidatorActor, &coreTypes.Actor{ + ActorType: coreTypes.ActorType_ACTOR_TYPE_VAL, Address: hex.EncodeToString(address), PublicKey: hex.EncodeToString(publicKey), StakedAmount: stakedTokens, @@ -37,8 +38,8 @@ func (p PostgresContext) InsertValidator(address []byte, publicKey []byte, outpu } func (p PostgresContext) UpdateValidator(address []byte, serviceURL string, stakedAmount string) error { - return p.UpdateActor(types.ValidatorActor, &types.Actor{ - ActorType: types.ActorType_Val, + return p.UpdateActor(types.ValidatorActor, &coreTypes.Actor{ + ActorType: coreTypes.ActorType_ACTOR_TYPE_VAL, Address: hex.EncodeToString(address), StakedAmount: stakedAmount, GenericParam: serviceURL, diff --git a/rpc/doc/CHANGELOG.md b/rpc/doc/CHANGELOG.md index 0e7d19dd4..490508aa9 100644 --- a/rpc/doc/CHANGELOG.md +++ b/rpc/doc/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.4] - 2023-01-03 + +- Updated to use the new centralized config and genesis handling + ## [0.0.0.3] - 2022-12-14 - Updated to use `GetBus()` instead of `bus` wherever possible diff --git a/rpc/module.go b/rpc/module.go index 42204dced..d3f856d9e 100644 --- a/rpc/module.go +++ b/rpc/module.go @@ -1,13 +1,13 @@ package rpc import ( - "fmt" "log" // importing because used by code-generated files that are git ignored and to allow go mod tidy and go mod vendor to function properly _ "github.com/getkin/kin-openapi/openapi3" _ "github.com/labstack/echo/v4" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/shared/modules" ) @@ -17,7 +17,7 @@ var ( type rpcModule struct { bus modules.Bus - config modules.RPCConfig + config *configs.RPCConfig } const ( @@ -29,13 +29,9 @@ func Create(runtime modules.RuntimeMgr) (modules.Module, error) { } func (m *rpcModule) Create(runtime modules.RuntimeMgr) (modules.Module, error) { - cfg := runtime.GetConfig() - if err := m.ValidateConfig(cfg); err != nil { - return nil, fmt.Errorf("config validation failed: %w", err) - } - rpcCfg := cfg.GetRPCConfig() + rpcCfg := runtime.GetConfig().RPC - if !rpcCfg.GetEnabled() { + if !rpcCfg.Enabled { return &noopRpcModule{}, nil } @@ -45,7 +41,7 @@ func (m *rpcModule) Create(runtime modules.RuntimeMgr) (modules.Module, error) { } func (u *rpcModule) Start() error { - go NewRPCServer(u.GetBus()).StartRPC(u.config.GetPort(), u.config.GetTimeout()) + go NewRPCServer(u.GetBus()).StartRPC(u.config.Port, u.config.Timeout) return nil } @@ -67,8 +63,3 @@ func (u *rpcModule) GetBus() modules.Bus { } return u.bus } - -func (*rpcModule) ValidateConfig(cfg modules.Config) error { - // TODO (#334): implement this - return nil -} diff --git a/rpc/noop_module.go b/rpc/noop_module.go index 444684a9e..74340394c 100644 --- a/rpc/noop_module.go +++ b/rpc/noop_module.go @@ -34,7 +34,3 @@ func (m *noopRpcModule) Start() error { func (m *noopRpcModule) Stop() error { return nil } - -func (m *noopRpcModule) ValidateConfig(_ modules.Config) error { - return nil -} diff --git a/rpc/server.go b/rpc/server.go index 621f8ea4c..f862bcd8c 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -7,7 +7,6 @@ import ( "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" - "github.com/pokt-network/pocket/runtime/defaults" "github.com/pokt-network/pocket/shared/modules" ) @@ -33,10 +32,10 @@ func (s *rpcServer) StartRPC(port string, timeout uint64) { middleware.TimeoutWithConfig(middleware.TimeoutConfig{ Skipper: middleware.DefaultSkipper, ErrorMessage: "Request timed out", - Timeout: time.Duration(defaults.DefaultRpcTimeout) * time.Millisecond, + Timeout: time.Duration(timeout) * time.Millisecond, }), } - if s.GetBus().GetRuntimeMgr().GetConfig().GetRPCConfig().GetUseCors() { + if s.GetBus().GetRuntimeMgr().GetConfig().RPC.UseCors { log.Println("Enabling CORS middleware") middlewares = append(middlewares, middleware.CORS()) } diff --git a/runtime/base_config.go b/runtime/base_config.go deleted file mode 100644 index 149d9dd7d..000000000 --- a/runtime/base_config.go +++ /dev/null @@ -1,18 +0,0 @@ -package runtime - -import "github.com/pokt-network/pocket/shared/modules" - -var _ modules.BaseConfig = &BaseConfig{} - -type BaseConfig struct { - RootDirectory string `json:"root_directory"` - PrivateKey string `json:"private_key"` // TODO (#150) better architecture for key management (keybase, keyfiles, etc.) -} - -func (c *BaseConfig) GetRootDirectory() string { - return c.RootDirectory -} - -func (c *BaseConfig) GetPrivateKey() string { - return c.PrivateKey -} diff --git a/runtime/config.go b/runtime/config.go deleted file mode 100644 index c6d9aca50..000000000 --- a/runtime/config.go +++ /dev/null @@ -1,97 +0,0 @@ -package runtime - -import ( - typesCons "github.com/pokt-network/pocket/consensus/types" - typesLogger "github.com/pokt-network/pocket/logger" - typesP2P "github.com/pokt-network/pocket/p2p/types" - typesPers "github.com/pokt-network/pocket/persistence/types" - typesRPC "github.com/pokt-network/pocket/rpc/types" - "github.com/pokt-network/pocket/shared/modules" - typesTelemetry "github.com/pokt-network/pocket/telemetry" - typesUtil "github.com/pokt-network/pocket/utility/types" -) - -var _ modules.Config = &runtimeConfig{} - -type runtimeConfig struct { - Base *BaseConfig `json:"base"` - Consensus *typesCons.ConsensusConfig `json:"consensus"` - Utility *typesUtil.UtilityConfig `json:"utility"` - Persistence *typesPers.PersistenceConfig `json:"persistence"` - P2P *typesP2P.P2PConfig `json:"p2p"` - Telemetry *typesTelemetry.TelemetryConfig `json:"telemetry"` - Logger *typesLogger.LoggerConfig `json:"logger"` - RPC *typesRPC.RPCConfig `json:"rpc"` -} - -func NewConfig(base *BaseConfig, otherConfigs ...func(modules.Config)) *runtimeConfig { - rc := &runtimeConfig{ - Base: base, - } - for _, oc := range otherConfigs { - oc(rc) - } - return rc -} - -func WithConsensusConfig(consensusConfig modules.ConsensusConfig) func(modules.Config) { - return func(rc modules.Config) { - rc.(*runtimeConfig).Consensus = consensusConfig.(*typesCons.ConsensusConfig) - } -} - -func WithUtilityConfig(utilityConfig modules.UtilityConfig) func(modules.Config) { - return func(rc modules.Config) { - rc.(*runtimeConfig).Utility = utilityConfig.(*typesUtil.UtilityConfig) - } -} - -func WithPersistenceConfig(persistenceConfig modules.PersistenceConfig) func(modules.Config) { - return func(rc modules.Config) { - rc.(*runtimeConfig).Persistence = persistenceConfig.(*typesPers.PersistenceConfig) - } -} - -func WithP2PConfig(p2pConfig modules.P2PConfig) func(modules.Config) { - return func(rc modules.Config) { - rc.(*runtimeConfig).P2P = p2pConfig.(*typesP2P.P2PConfig) - } -} - -func WithTelemetryConfig(telemetryConfig modules.TelemetryConfig) func(modules.Config) { - return func(rc modules.Config) { - rc.(*runtimeConfig).Telemetry = telemetryConfig.(*typesTelemetry.TelemetryConfig) - } -} - -func (c *runtimeConfig) GetBaseConfig() modules.BaseConfig { - return c.Base -} - -func (c *runtimeConfig) GetConsensusConfig() modules.ConsensusConfig { - return c.Consensus -} - -func (c *runtimeConfig) GetUtilityConfig() modules.UtilityConfig { - return c.Utility -} - -func (c *runtimeConfig) GetPersistenceConfig() modules.PersistenceConfig { - return c.Persistence -} - -func (c *runtimeConfig) GetP2PConfig() modules.P2PConfig { - return c.P2P -} - -func (c *runtimeConfig) GetTelemetryConfig() modules.TelemetryConfig { - return c.Telemetry -} - -func (c *runtimeConfig) GetLoggerConfig() modules.LoggerConfig { - return c.Logger -} - -func (c *runtimeConfig) GetRPCConfig() modules.RPCConfig { - return c.RPC -} diff --git a/runtime/configs/config.go b/runtime/configs/config.go new file mode 100644 index 000000000..fe2864cb9 --- /dev/null +++ b/runtime/configs/config.go @@ -0,0 +1,80 @@ +package configs + +import "github.com/pokt-network/pocket/runtime/defaults" + +type Config struct { + RootDirectory string `json:"root_directory"` + PrivateKey string `json:"private_key"` // INVESTIGATE(#150): better architecture for key management (keybase, keyfiles, etc.) + + Consensus *ConsensusConfig `json:"consensus"` + Utility *UtilityConfig `json:"utility"` + Persistence *PersistenceConfig `json:"persistence"` + P2P *P2PConfig `json:"p2p"` + Telemetry *TelemetryConfig `json:"telemetry"` + Logger *LoggerConfig `json:"logger"` + RPC *RPCConfig `json:"rpc"` +} + +func NewDefaultConfig(options ...func(*Config)) *Config { + cfg := &Config{ + RootDirectory: "/go/src/github.com/pocket-network", + Consensus: &ConsensusConfig{ + MaxMempoolBytes: defaults.DefaultConsensusMaxMempoolBytes, + PacemakerConfig: &PacemakerConfig{ + TimeoutMsec: defaults.DefaultPacemakerTimeoutMsec, + Manual: defaults.DefaultPacemakerManual, + DebugTimeBetweenStepsMsec: defaults.DefaultPacemakerDebugTimeBetweenStepsMsec, + }, + }, + Utility: &UtilityConfig{ + MaxMempoolTransactionBytes: defaults.DefaultUtilityMaxMempoolTransactionBytes, + MaxMempoolTransactions: defaults.DefaultUtilityMaxMempoolTransactions, + }, + Persistence: &PersistenceConfig{ + PostgresUrl: defaults.DefaultPersistencePostgresUrl, + BlockStorePath: defaults.DefaultPersistenceBlockStorePath, + }, + P2P: &P2PConfig{ + ConsensusPort: defaults.DefaultP2PConsensusPort, + UseRainTree: defaults.DefaultP2PUseRainTree, + IsEmptyConnectionType: defaults.DefaultP2PIsEmptyConnectionType, + MaxMempoolCount: defaults.DefaultP2PMaxMempoolCount, + }, + Telemetry: &TelemetryConfig{ + Enabled: defaults.DefaultTelemetryEnabled, + Address: defaults.DefaultTelemetryAddress, + Endpoint: defaults.DefaultTelemetryEndpoint, + }, + Logger: &LoggerConfig{ + Level: defaults.DefaultLoggerLevel, + Format: defaults.DefaultLoggerFormat, + }, + RPC: &RPCConfig{ + Timeout: defaults.DefaultRpcTimeout, + Port: defaults.DefaultRpcPort, + }, + } + + for _, option := range options { + option(cfg) + } + + return cfg +} + +// WithPK is an option to configure module-specific keys in order to enable different "identities" +// for different purposes (i.e. validation, P2P, servicing, etc...). +func WithPK(pk string) func(*Config) { + return func(cfg *Config) { + cfg.PrivateKey = pk + cfg.Consensus.PrivateKey = pk + cfg.P2P.PrivateKey = pk + } +} + +// WithNodeSchema is an option to configure the schema for the node's database. +func WithNodeSchema(schema string) func(*Config) { + return func(cfg *Config) { + cfg.Persistence.NodeSchema = schema + } +} diff --git a/consensus/types/proto/consensus_config.proto b/runtime/configs/proto/consensus_config.proto similarity index 77% rename from consensus/types/proto/consensus_config.proto rename to runtime/configs/proto/consensus_config.proto index c7662cd80..9830a1672 100644 --- a/consensus/types/proto/consensus_config.proto +++ b/runtime/configs/proto/consensus_config.proto @@ -1,7 +1,8 @@ syntax = "proto3"; -package consensus; -option go_package = "github.com/pokt-network/pocket/consensus/types"; +package configs; + +option go_package = "github.com/pokt-network/pocket/runtime/configs"; message ConsensusConfig { string private_key = 1; diff --git a/logger/proto/logger_config.proto b/runtime/configs/proto/logger_config.proto similarity index 80% rename from logger/proto/logger_config.proto rename to runtime/configs/proto/logger_config.proto index ef64ec56f..8ff2e6eaa 100644 --- a/logger/proto/logger_config.proto +++ b/runtime/configs/proto/logger_config.proto @@ -1,7 +1,8 @@ syntax = "proto3"; -package logger; -option go_package = "github.com/pokt-network/pocket/logger"; +package configs; + +option go_package = "github.com/pokt-network/pocket/runtime/configs"; message LoggerConfig { string level = 1; diff --git a/p2p/types/proto/p2p_config.proto b/runtime/configs/proto/p2p_config.proto similarity index 84% rename from p2p/types/proto/p2p_config.proto rename to runtime/configs/proto/p2p_config.proto index 6b4700a55..492a8664a 100644 --- a/p2p/types/proto/p2p_config.proto +++ b/runtime/configs/proto/p2p_config.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package p2p; +package configs; -option go_package = "github.com/pokt-network/pocket/p2p/types"; +option go_package = "github.com/pokt-network/pocket/runtime/configs"; message P2PConfig { string private_key = 1; diff --git a/persistence/proto/persistence_config.proto b/runtime/configs/proto/persistence_config.proto similarity index 67% rename from persistence/proto/persistence_config.proto rename to runtime/configs/proto/persistence_config.proto index ffe70c3b3..9296902fb 100644 --- a/persistence/proto/persistence_config.proto +++ b/runtime/configs/proto/persistence_config.proto @@ -1,7 +1,8 @@ syntax = "proto3"; -package persistence; -option go_package = "github.com/pokt-network/pocket/persistence/types"; +package configs; + +option go_package = "github.com/pokt-network/pocket/runtime/configs"; message PersistenceConfig { string postgres_url = 1; @@ -9,4 +10,4 @@ message PersistenceConfig { string block_store_path = 3; string tx_indexer_path = 4; string trees_store_dir = 5; -} \ No newline at end of file +} diff --git a/rpc/types/proto/rpc_config.proto b/runtime/configs/proto/rpc_config.proto similarity index 59% rename from rpc/types/proto/rpc_config.proto rename to runtime/configs/proto/rpc_config.proto index 432fd1f67..a46b8d361 100644 --- a/rpc/types/proto/rpc_config.proto +++ b/runtime/configs/proto/rpc_config.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package rpc; +package configs; -option go_package = "github.com/pokt-network/pocket/rpc/types"; +option go_package = "github.com/pokt-network/pocket/runtime/configs"; message RPCConfig { bool enabled = 1; diff --git a/telemetry/proto/telemetry_config.proto b/runtime/configs/proto/telemetry_config.proto similarity index 77% rename from telemetry/proto/telemetry_config.proto rename to runtime/configs/proto/telemetry_config.proto index 36e4f2eea..27ad461eb 100644 --- a/telemetry/proto/telemetry_config.proto +++ b/runtime/configs/proto/telemetry_config.proto @@ -1,10 +1,11 @@ syntax = "proto3"; -package telemetry; -option go_package = "github.com/pokt-network/pocket/telemetry"; +package configs; + +option go_package = "github.com/pokt-network/pocket/runtime/configs"; message TelemetryConfig { bool enabled = 1; string address = 2; // The address the telemetry module will use to listen for metrics PULL requests (e.g. 0.0.0.0:9000 for prometheus) string endpoint = 3; // The endpoint available to fetch recorded metrics (e.g. /metrics for prometheus) -} \ No newline at end of file +} diff --git a/utility/types/proto/util_config.proto b/runtime/configs/proto/utility_config.proto similarity index 58% rename from utility/types/proto/util_config.proto rename to runtime/configs/proto/utility_config.proto index a56191f30..ca491a54f 100644 --- a/utility/types/proto/util_config.proto +++ b/runtime/configs/proto/utility_config.proto @@ -1,9 +1,10 @@ syntax = "proto3"; -package utility; -option go_package = "github.com/pokt-network/pocket/utility/types"; +package configs; + +option go_package = "github.com/pokt-network/pocket/runtime/configs"; message UtilityConfig { uint64 max_mempool_transaction_bytes = 1; uint32 max_mempool_transactions = 2; -} \ No newline at end of file +} diff --git a/runtime/defaults/defaults.go b/runtime/defaults/defaults.go index 7d6740d9a..99f0a1d23 100644 --- a/runtime/defaults/defaults.go +++ b/runtime/defaults/defaults.go @@ -2,9 +2,6 @@ package defaults import ( "fmt" - "math/big" - - "github.com/pokt-network/pocket/shared/converters" ) const ( @@ -13,23 +10,34 @@ const ( defaultRPCTimeout = 30000 ) -// TODO: some of these defaults are used for production while others are used for testing. Need to separate them. var ( - DefaultChains = []string{"0001"} - DefaultServiceURL = "" - DefaultStakeAmount = big.NewInt(1000000000000) - DefaultStakeAmountString = converters.BigIntToString(DefaultStakeAmount) - DefaultMaxRelays = big.NewInt(1000000) - DefaultMaxRelaysString = converters.BigIntToString(DefaultMaxRelays) - DefaultAccountAmount = big.NewInt(100000000000000) - DefaultAccountAmountString = converters.BigIntToString(DefaultAccountAmount) - DefaultPauseHeight = int64(-1) - DefaultUnstakingHeight = int64(-1) - DefaultChainID = "testnet" - DefaultMaxBlockBytes = uint64(4000000) - ServiceUrlFormat = "node%d.consensus:8080" - DefaultRpcPort = defaultRPCPort - DefaultRpcTimeout = uint64(defaultRPCTimeout) - DefaultRemoteCLIURL = fmt.Sprintf("http://%s:%s", defaultRPCHost, defaultRPCPort) - DefaultP2PMaxMempoolCount = uint64(1e6) + DefaultRemoteCLIURL = fmt.Sprintf("http://%s:%s", defaultRPCHost, defaultRPCPort) + + // consensus + DefaultConsensusMaxMempoolBytes = uint64(500000000) + // pacemaker + DefaultPacemakerTimeoutMsec = uint64(5000) + DefaultPacemakerManual = true + DefaultPacemakerDebugTimeBetweenStepsMsec = uint64(1000) + // utility + DefaultUtilityMaxMempoolTransactionBytes = uint64(1024 ^ 3) // 1GB V0 defaults + DefaultUtilityMaxMempoolTransactions = uint32(9000) + // persistence + DefaultPersistencePostgresUrl = "postgres://postgres:postgres@pocket-db:5432/postgres" + DefaultPersistenceBlockStorePath = "/var/blockstore" + // p2p + DefaultP2PConsensusPort = uint32(8080) + DefaultP2PUseRainTree = true + DefaultP2PIsEmptyConnectionType = false + DefaultP2PMaxMempoolCount = uint64(1e5) + // telemetry + DefaultTelemetryEnabled = true + DefaultTelemetryAddress = "0.0.0.0:9000" + DefaultTelemetryEndpoint = "/metrics" + // logger + DefaultLoggerLevel = "debug" + DefaultLoggerFormat = "pretty" + // rpc + DefaultRpcPort = defaultRPCPort + DefaultRpcTimeout = uint64(defaultRPCTimeout) ) diff --git a/runtime/docs/CHANGELOG.md b/runtime/docs/CHANGELOG.md index 2478b9279..945232db7 100644 --- a/runtime/docs/CHANGELOG.md +++ b/runtime/docs/CHANGELOG.md @@ -7,11 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [0.0.1] - 2022-12-14 +## [0.0.0.3] - 2023-01-03 + +- Split testing/development configs into separate files +- Centralized `NewDefaultConfig` logic with options used by the config generator +- Refactored Params handling, not hardcoded anymore but sourced from genesis + +## [0.0.0.2] - 2022-12-21 + +- Centralized config handling into a `config` package +- Config protos from the various modules are now in the `config` package +- Removed the `BaseConfig` struct +- Removed overlapping parts in `PersistenceGenesisState` and `ConsensusGenesisState` and consolidated under a single `GenesisState` struct +- Updated tests to use the new config and genesis handling +- Introduced a singleton `keyGenerator` capable of generating keys randomly or deterministically (#414) + +## [0.0.0.1] - 2022-12-14 - Added `DefaultP2PMaxMempoolCount` -## [0.0.0] - 2022-09-30 +## [0.0.0.0] - 2022-09-30 ### [#235](https://github.com/pokt-network/pocket/pull/235) Config and genesis handling diff --git a/runtime/docs/README.md b/runtime/docs/README.md index 4b5b8ecb2..19a4623bf 100644 --- a/runtime/docs/README.md +++ b/runtime/docs/README.md @@ -4,8 +4,10 @@ This document outlines the purpose of this module, its components and how they a ## Contents -- [Overview](#overview) -- [Components](#components) +- [RuntimeMgr](#runtimemgr) + - [Contents](#contents) + - [Overview](#overview) + - [Components](#components) ### Overview @@ -38,8 +40,7 @@ This module includes the following components: The genesis represents the initial state of the blockchain. This allows the binary to start with a specific initial state. - - Similarly to `Config`, these are scoped by module as well and currently we have `Persistence` and `Consensus` specific `GenesisState`s + - **Clock** diff --git a/runtime/genesis.go b/runtime/genesis.go index 8627e0649..cbc38b77d 100644 --- a/runtime/genesis.go +++ b/runtime/genesis.go @@ -4,43 +4,18 @@ import ( "encoding/json" "os" - consTypes "github.com/pokt-network/pocket/consensus/types" - persTypes "github.com/pokt-network/pocket/persistence/types" - "github.com/pokt-network/pocket/shared/modules" + "github.com/pokt-network/pocket/runtime/genesis" ) -var _ modules.GenesisState = &runtimeGenesis{} - -type runtimeGenesis struct { - ConsensusGenesisState *consTypes.ConsensusGenesisState `json:"consensus_genesis_state"` - PersistenceGenesisState *persTypes.PersistenceGenesisState `json:"persistence_genesis_state"` -} - -func NewGenesis( - consensusGenesisState modules.ConsensusGenesisState, - persistenceGenesisState modules.PersistenceGenesisState, -) *runtimeGenesis { - return &runtimeGenesis{ - ConsensusGenesisState: consensusGenesisState.(*consTypes.ConsensusGenesisState), - PersistenceGenesisState: persistenceGenesisState.(*persTypes.PersistenceGenesisState), - } -} - -func (g *runtimeGenesis) GetPersistenceGenesisState() modules.PersistenceGenesisState { - return g.PersistenceGenesisState -} -func (g *runtimeGenesis) GetConsensusGenesisState() modules.ConsensusGenesisState { - return g.ConsensusGenesisState -} - -func parseGenesisJSON(genesisPath string) (g *runtimeGenesis, err error) { - data, err := os.ReadFile(genesisPath) +// parseGenesis parses the genesis file in JSON format and returns a genesis.GenesisState +func parseGenesis(genesisJSONPath string) (g *genesis.GenesisState, err error) { + data, err := os.ReadFile(genesisJSONPath) if err != nil { return } // general genesis file - g = new(runtimeGenesis) + g = new(genesis.GenesisState) err = json.Unmarshal(data, &g) return } diff --git a/persistence/proto/persistence_genesis.proto b/runtime/genesis/proto/genesis.proto similarity index 90% rename from persistence/proto/persistence_genesis.proto rename to runtime/genesis/proto/genesis.proto index 4a6e34482..a556f14b2 100644 --- a/persistence/proto/persistence_genesis.proto +++ b/runtime/genesis/proto/genesis.proto @@ -1,52 +1,24 @@ syntax = "proto3"; -package persistence; -option go_package = "github.com/pokt-network/pocket/persistence/types"; +package genesis; -message PersistenceGenesisState { - repeated Account pools = 1; - repeated Account accounts = 2; - repeated Actor applications = 3; - repeated Actor validators = 4; - repeated Actor service_nodes = 5; - repeated Actor fishermen = 6; - Params params = 7; -} - -message Account { - string address = 1; - string amount = 2; -} +import "core/types/proto/account.proto"; +import "core/types/proto/actor.proto"; +import "google/protobuf/timestamp.proto"; -// TODO(#258): Follow protobuf best practices -enum PoolNames { - PoolNameUnspecified = 0; - DAO = 1; - FeeCollector = 2; - AppStakePool = 3; - ValidatorStakePool = 4; - ServiceNodeStakePool = 5; - FishermanStakePool = 7; -} +option go_package = "github.com/pokt-network/pocket/runtime/genesis"; -enum ActorType { - Undefined = 0; - App = 1; - Node = 2; - Fish = 3; - Val = 4; -} - -message Actor { - ActorType actor_type = 1; - string address = 2; - string public_key = 3; - repeated string chains = 4; - string generic_param = 5; - string staked_amount = 6; - int64 paused_height = 7; - int64 unstaking_height = 8; - string output = 9; +message GenesisState { + google.protobuf.Timestamp genesis_time = 1; + string chain_id = 2; // TODO/DISCUSS re-evaluate naming covention + uint64 max_block_bytes = 3; + repeated core.Account pools = 4; + repeated core.Account accounts = 5; + repeated core.Actor applications = 6; + repeated core.Actor validators = 7; + repeated core.Actor service_nodes = 8; + repeated core.Actor fishermen = 9; + Params params = 10; } // DISCUSS(drewskey): Explore a more general purpose "feature flag" like approach for this. @@ -274,4 +246,4 @@ message Params { string message_unpause_service_node_fee_owner = 108; //@gotags: pokt:"val_type=STRING" string message_change_parameter_fee_owner = 109; -} \ No newline at end of file +} diff --git a/runtime/manager.go b/runtime/manager.go index 1110de3c1..7cd6c291b 100644 --- a/runtime/manager.go +++ b/runtime/manager.go @@ -10,8 +10,8 @@ import ( "github.com/benbjohnson/clock" "github.com/mitchellh/mapstructure" - typesCons "github.com/pokt-network/pocket/consensus/types" - typesP2P "github.com/pokt-network/pocket/p2p/types" + "github.com/pokt-network/pocket/runtime/configs" + "github.com/pokt-network/pocket/runtime/genesis" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/modules" "github.com/spf13/viper" @@ -20,8 +20,8 @@ import ( var _ modules.RuntimeMgr = &Manager{} type Manager struct { - config *runtimeConfig - genesis *runtimeGenesis + config *configs.Config + genesisState *genesis.GenesisState clock clock.Clock } @@ -31,12 +31,12 @@ func NewManagerFromFiles(configPath, genesisPath string, options ...func(*Manage clock: clock.New(), } - cfg, genesis, err := mgr.init(configPath, genesisPath) + cfg, genesisState, err := mgr.init(configPath, genesisPath) if err != nil { log.Fatalf("[ERROR] Failed to initialize runtime builder: %v", err) } mgr.config = cfg - mgr.genesis = genesis + mgr.genesisState = genesisState for _, o := range options { o(mgr) @@ -47,20 +47,18 @@ func NewManagerFromFiles(configPath, genesisPath string, options ...func(*Manage // NewManagerFromReaders returns a *Manager given io.Readers for the config and the genesis. // -// Ideally useful when the user doesn't want to rely on the filesystem and instead intends plugging in different configuration management system. -// -// Note: currently unused, here as a reference +// Useful for testing and when the user doesn't want to rely on the filesystem and instead intends plugging in different configuration management system. func NewManagerFromReaders(configReader, genesisReader io.Reader, options ...func(*Manager)) *Manager { - var cfg *runtimeConfig + var cfg = configs.NewDefaultConfig() parse(configReader, cfg) - var genesis *runtimeGenesis - parse(genesisReader, genesis) + var genesisState = new(genesis.GenesisState) + parse(genesisReader, genesisState) mgr := &Manager{ - config: cfg, - genesis: genesis, - clock: clock.New(), + config: cfg, + genesisState: genesisState, + clock: clock.New(), } for _, o := range options { @@ -70,11 +68,11 @@ func NewManagerFromReaders(configReader, genesisReader io.Reader, options ...fun return mgr } -func NewManager(config modules.Config, genesis modules.GenesisState, options ...func(*Manager)) *Manager { +func NewManager(config *configs.Config, genesisState *genesis.GenesisState, options ...func(*Manager)) *Manager { mgr := &Manager{ - config: config.(*runtimeConfig), - genesis: genesis.(*runtimeGenesis), - clock: clock.New(), + config: config, + genesisState: genesisState, + clock: clock.New(), } for _, o := range options { @@ -84,9 +82,11 @@ func NewManager(config modules.Config, genesis modules.GenesisState, options ... return mgr } -func (rc *Manager) init(configPath, genesisPath string) (config *runtimeConfig, genesis *runtimeGenesis, err error) { - dir, file := path.Split(configPath) - filename := strings.TrimSuffix(file, filepath.Ext(file)) +func (m *Manager) init(configJSONPath, genesisJSONPath string) (config *configs.Config, genesisState *genesis.GenesisState, err error) { + config = configs.NewDefaultConfig() + + dir, configFile := path.Split(configJSONPath) + filename := strings.TrimSuffix(configFile, filepath.Ext(configFile)) viper.AddConfigPath(".") viper.AddConfigPath(dir) @@ -112,37 +112,29 @@ func (rc *Manager) init(configPath, genesisPath string) (config *runtimeConfig, return } - if config.Base == nil { - config.Base = &BaseConfig{} - } - - genesis, err = parseGenesisJSON(genesisPath) + genesisState, err = parseGenesis(genesisJSONPath) return } -func (b *Manager) GetConfig() modules.Config { - return b.config -} - -func (b *Manager) GetGenesis() modules.GenesisState { - return b.genesis +func (m *Manager) GetConfig() *configs.Config { + return m.config } -func (b *Manager) GetClock() clock.Clock { - return b.clock +func (m *Manager) GetGenesis() *genesis.GenesisState { + return m.genesisState } -type supportedStructs interface { - *runtimeConfig | *runtimeGenesis +func (m *Manager) GetClock() clock.Clock { + return m.clock } -func parse[T supportedStructs](reader io.Reader, target T) { +func parse[T *configs.Config | *genesis.GenesisState](reader io.Reader, target T) { bz, err := io.ReadAll(reader) if err != nil { log.Fatalf("[ERROR] Failed to read from reader: %v", err) } - if err := json.Unmarshal(bz, &target); err != nil { + if err := json.Unmarshal(bz, target); err != nil { log.Fatalf("[ERROR] Failed to unmarshal: %v", err) } } @@ -161,12 +153,12 @@ func WithRandomPK() func(*Manager) { func WithPK(pk string) func(*Manager) { return func(b *Manager) { if b.config.Consensus == nil { - b.config.Consensus = &typesCons.ConsensusConfig{} + b.config.Consensus = &configs.ConsensusConfig{} } b.config.Consensus.PrivateKey = pk if b.config.P2P == nil { - b.config.P2P = &typesP2P.P2PConfig{} + b.config.P2P = &configs.P2PConfig{} } b.config.P2P.PrivateKey = pk } diff --git a/runtime/manager_test.go b/runtime/manager_test.go new file mode 100644 index 000000000..5997e6f2a --- /dev/null +++ b/runtime/manager_test.go @@ -0,0 +1,289 @@ +package runtime + +import ( + "io" + "os" + "strings" + "testing" + + "github.com/benbjohnson/clock" + "github.com/pokt-network/pocket/runtime/configs" + "github.com/pokt-network/pocket/runtime/defaults" + "github.com/pokt-network/pocket/runtime/genesis" + "github.com/pokt-network/pocket/runtime/test_artifacts" + "github.com/pokt-network/pocket/shared/core/types" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/timestamppb" +) + +var expectedGenesis = &genesis.GenesisState{ + GenesisTime: ×tamppb.Timestamp{ + Seconds: 1663610702, + Nanos: 405401000, + }, + ChainId: "testnet", + MaxBlockBytes: 4000000, + Pools: []*types.Account{ + { + Address: "DAO", + Amount: "100000000000000", + }, + { + Address: "FeeCollector", + Amount: "0", + }, + { + Address: "AppStakePool", + Amount: "100000000000000", + }, + { + Address: "ValidatorStakePool", + Amount: "100000000000000", + }, + { + Address: "ServiceNodeStakePool", + Amount: "100000000000000", + }, + { + Address: "FishermanStakePool", + Amount: "100000000000000", + }, + }, + Accounts: []*types.Account{ + { + Address: "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", + Amount: "100000000000000", + }, + { + Address: "67eb3f0a50ae459fecf666be0e93176e92441317", + Amount: "100000000000000", + }, + { + Address: "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", + Amount: "100000000000000", + }, + { + Address: "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", + Amount: "100000000000000", + }, + { + Address: "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", + Amount: "100000000000000", + }, + { + Address: "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", + Amount: "100000000000000", + }, + { + Address: "88a792b7aca673620132ef01f50e62caa58eca83", + Amount: "100000000000000", + }, + }, + Applications: []*types.Actor{ + { + ActorType: types.ActorType_ACTOR_TYPE_APP, + Address: "88a792b7aca673620132ef01f50e62caa58eca83", + PublicKey: "5f78658599943dc3e623539ce0b3c9fe4e192034a1e3fef308bc9f96915754e0", + Chains: []string{"0001"}, + GenericParam: "1000000", + StakedAmount: "1000000000000", + PausedHeight: -1, + UnstakingHeight: -1, + Output: "88a792b7aca673620132ef01f50e62caa58eca83", + }, + }, + Validators: []*types.Actor{ + + { + ActorType: types.ActorType_ACTOR_TYPE_VAL, + Address: "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", + PublicKey: "b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4", + Chains: nil, + GenericParam: "node1.consensus:8080", + StakedAmount: "1000000000000", + PausedHeight: -1, + UnstakingHeight: -1, + Output: "6f66574e1f50f0ef72dff748c3f11b9e0e89d32a", + }, + { + ActorType: types.ActorType_ACTOR_TYPE_VAL, + Address: "67eb3f0a50ae459fecf666be0e93176e92441317", + PublicKey: "c16043323c83ffd901a8bf7d73543814b8655aa4695f7bfb49d01926fc161cdb", + Chains: nil, + GenericParam: "node2.consensus:8080", + StakedAmount: "1000000000000", + PausedHeight: -1, + UnstakingHeight: -1, + Output: "67eb3f0a50ae459fecf666be0e93176e92441317", + }, + { + ActorType: types.ActorType_ACTOR_TYPE_VAL, + Address: "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", + PublicKey: "a8b6be75d7551da093f788f7286c3a9cb885cfc8e52710eac5f1d5e5b4bf19b2", + Chains: nil, + GenericParam: "node3.consensus:8080", + StakedAmount: "1000000000000", + PausedHeight: -1, + UnstakingHeight: -1, + Output: "3f52e08c4b3b65ab7cf098d77df5bf8cedcf5f99", + }, + { + ActorType: types.ActorType_ACTOR_TYPE_VAL, + Address: "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", + PublicKey: "53ee26c82826694ffe1773d7b60d5f20dd9e91bdf8745544711bec5ff9c6fb4a", + Chains: nil, + GenericParam: "node4.consensus:8080", + StakedAmount: "1000000000000", + PausedHeight: -1, + UnstakingHeight: -1, + Output: "113fdb095d42d6e09327ab5b8df13fd8197a1eaf", + }, + }, + ServiceNodes: []*types.Actor{ + { + ActorType: types.ActorType_ACTOR_TYPE_SERVICENODE, + Address: "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", + PublicKey: "16cd0a304c38d76271f74dd3c90325144425d904ef1b9a6fbab9b201d75a998b", + Chains: []string{"0001"}, + GenericParam: "node1.consensus:8080", + StakedAmount: "1000000000000", + PausedHeight: -1, + UnstakingHeight: -1, + Output: "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", + }, + }, + Fishermen: []*types.Actor{ + { + ActorType: types.ActorType_ACTOR_TYPE_FISH, + Address: "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", + PublicKey: "68efd26af01692fcd77dc135ca1de69ede464e8243e6832bd6c37f282db8c9cb", + Chains: []string{"0001"}, + GenericParam: "node1.consensus:8080", + StakedAmount: "1000000000000", + PausedHeight: -1, + UnstakingHeight: -1, + Output: "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", + }, + }, + Params: test_artifacts.DefaultParams(), +} + +func TestNewManagerFromReaders(t *testing.T) { + type args struct { + configReader io.Reader + genesisReader io.Reader + options []func(*Manager) + } + + buildConfigBytes, err := os.ReadFile("../build/config/config1.json") + if err != nil { + require.NoError(t, err) + } + + buildGenesisBytes, err := os.ReadFile("../build/config/genesis.json") + if err != nil { + require.NoError(t, err) + } + + tests := []struct { + name string + args args + want *Manager + assertion require.ComparisonAssertionFunc + }{ + { + name: "reading from the build directory", + args: args{ + configReader: strings.NewReader(string(buildConfigBytes)), + genesisReader: strings.NewReader(string(buildGenesisBytes)), + }, + want: &Manager{ + &configs.Config{ + RootDirectory: "/go/src/github.com/pocket-network", + PrivateKey: "6fd0bc54cc2dd205eaf226eebdb0451629b321f11d279013ce6fdd5a33059256b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4", + Consensus: &configs.ConsensusConfig{ + PrivateKey: "6fd0bc54cc2dd205eaf226eebdb0451629b321f11d279013ce6fdd5a33059256b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4", + MaxMempoolBytes: 500000000, + PacemakerConfig: &configs.PacemakerConfig{ + TimeoutMsec: 5000, + Manual: true, + DebugTimeBetweenStepsMsec: 1000, + }, + }, + Utility: &configs.UtilityConfig{ + MaxMempoolTransactionBytes: 1073741824, + MaxMempoolTransactions: 9000, + }, + Persistence: &configs.PersistenceConfig{ + PostgresUrl: "postgres://postgres:postgres@pocket-db:5432/postgres", + NodeSchema: "node1", + BlockStorePath: "/var/blockstore", + TxIndexerPath: "", + TreesStoreDir: "/var/trees", + }, + P2P: &configs.P2PConfig{ + PrivateKey: "6fd0bc54cc2dd205eaf226eebdb0451629b321f11d279013ce6fdd5a33059256b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4", + ConsensusPort: 8080, + UseRainTree: true, + IsEmptyConnectionType: false, + MaxMempoolCount: 1e5, + }, + Telemetry: &configs.TelemetryConfig{ + Enabled: true, + Address: "0.0.0.0:9000", + Endpoint: "/metrics", + }, + Logger: &configs.LoggerConfig{ + Level: "debug", + Format: "pretty", + }, + RPC: &configs.RPCConfig{ + Enabled: true, + Port: "50832", + Timeout: 30000, + UseCors: false, + }, + }, + expectedGenesis, + clock.New(), + }, + assertion: require.Equal, + }, + { + name: "unset MaxMempoolCount should fallback to default value", + args: args{ + configReader: strings.NewReader(string(`{ + "p2p": { + "consensus_port": 8080, + "use_rain_tree": true, + "is_empty_connection_type": false, + "private_key": "6fd0bc54cc2dd205eaf226eebdb0451629b321f11d279013ce6fdd5a33059256b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4" + } + }`)), + genesisReader: strings.NewReader(string(buildGenesisBytes)), + }, + want: &Manager{ + &configs.Config{ + P2P: &configs.P2PConfig{ + PrivateKey: "6fd0bc54cc2dd205eaf226eebdb0451629b321f11d279013ce6fdd5a33059256b2eda2232ffb2750bf761141f70f75a03a025f65b2b2b417c7f8b3c9ca91e8e4", + ConsensusPort: 8080, + UseRainTree: true, + IsEmptyConnectionType: false, + MaxMempoolCount: defaults.DefaultP2PMaxMempoolCount, + }, + }, + expectedGenesis, + clock.New(), + }, + assertion: func(tt require.TestingT, want, got interface{}, _ ...interface{}) { + require.Equal(tt, want.(*Manager).config.P2P, got.(*Manager).config.P2P) + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := NewManagerFromReaders(tt.args.configReader, tt.args.genesisReader, tt.args.options...) + tt.assertion(t, tt.want, got) + }) + } +} diff --git a/runtime/test_artifacts/defaults.go b/runtime/test_artifacts/defaults.go new file mode 100644 index 000000000..4419a29d6 --- /dev/null +++ b/runtime/test_artifacts/defaults.go @@ -0,0 +1,23 @@ +package test_artifacts + +import ( + "math/big" + + "github.com/pokt-network/pocket/shared/converters" +) + +var ( + DefaultChains = []string{"0001"} + DefaultServiceURL = "" + DefaultStakeAmount = big.NewInt(1000000000000) + DefaultStakeAmountString = converters.BigIntToString(DefaultStakeAmount) + DefaultMaxRelays = big.NewInt(1000000) + DefaultMaxRelaysString = converters.BigIntToString(DefaultMaxRelays) + DefaultAccountAmount = big.NewInt(100000000000000) + DefaultAccountAmountString = converters.BigIntToString(DefaultAccountAmount) + DefaultPauseHeight = int64(-1) + DefaultUnstakingHeight = int64(-1) + DefaultChainID = "testnet" + ServiceUrlFormat = "node%d.consensus:8080" + DefaultMaxBlockBytes = uint64(4000000) +) diff --git a/runtime/test_artifacts/generator.go b/runtime/test_artifacts/generator.go index 313e4028f..3061065fd 100644 --- a/runtime/test_artifacts/generator.go +++ b/runtime/test_artifacts/generator.go @@ -2,163 +2,92 @@ package test_artifacts // Cross module imports are okay because this is only used for testing and not business logic import ( - "bytes" - "encoding/binary" "fmt" - "math/rand" - "os" "strconv" - typesCons "github.com/pokt-network/pocket/consensus/types" - typesP2P "github.com/pokt-network/pocket/p2p/types" - typesPers "github.com/pokt-network/pocket/persistence/types" - "github.com/pokt-network/pocket/runtime" - "github.com/pokt-network/pocket/runtime/defaults" + "github.com/pokt-network/pocket/runtime/configs" + "github.com/pokt-network/pocket/runtime/genesis" + "github.com/pokt-network/pocket/runtime/test_artifacts/keygenerator" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" - "github.com/pokt-network/pocket/shared/modules" - typesTelemetry "github.com/pokt-network/pocket/telemetry" - "github.com/pokt-network/pocket/utility/types" - typesUtil "github.com/pokt-network/pocket/utility/types" "google.golang.org/protobuf/types/known/timestamppb" ) -// HACK: This is a hack used to enable deterministic key generation via an environment variable. -// In order to avoid this, `NewGenesisState` and all downstream functions would need to be -// refactored. Alternatively, the seed would need to be passed via the runtime manager. -// To avoid these large scale changes, this is a temporary approach to enable deterministic -// key generation. -// IMPROVE(#361): Design a better way to generate deterministic keys for testing. -const PrivateKeySeedEnv = "DEFAULT_PRIVATE_KEY_SEED" - -var privateKeySeed int - -// Intentionally not using `init` in case the caller sets this before `NewGenesisState` is called.s -func loadPrivateKeySeed() { - privateKeySeedEnvValue := os.Getenv(PrivateKeySeedEnv) - if seedInt, err := strconv.Atoi(privateKeySeedEnvValue); err == nil { - privateKeySeed = seedInt - } else { - rand.Seed(timestamppb.Now().Seconds) - privateKeySeed = rand.Int() - } -} - // IMPROVE: Generate a proper genesis suite in the future. -func NewGenesisState(numValidators, numServiceNodes, numApplications, numFisherman int) (modules.GenesisState, []string) { - loadPrivateKeySeed() - - apps, appsPrivateKeys := NewActors(types.ActorType_App, numApplications) - vals, validatorPrivateKeys := NewActors(types.ActorType_Validator, numValidators) - serviceNodes, snPrivateKeys := NewActors(types.ActorType_ServiceNode, numServiceNodes) - fish, fishPrivateKeys := NewActors(types.ActorType_Fisherman, numFisherman) - - genesisState := runtime.NewGenesis( - &typesCons.ConsensusGenesisState{ - GenesisTime: timestamppb.Now(), - ChainId: defaults.DefaultChainID, - MaxBlockBytes: defaults.DefaultMaxBlockBytes, - Validators: typesCons.ToConsensusValidators(vals), - }, - &typesPers.PersistenceGenesisState{ - Pools: typesPers.ToPersistenceAccounts(NewPools()), - Accounts: typesPers.ToPersistenceAccounts(NewAccounts(numValidators+numServiceNodes+numApplications+numFisherman, append(append(append(validatorPrivateKeys, snPrivateKeys...), fishPrivateKeys...), appsPrivateKeys...)...)), // TODO(olshansky): clean this up - Applications: typesPers.ToPersistenceActors(apps), - Validators: typesPers.ToPersistenceActors(vals), - ServiceNodes: typesPers.ToPersistenceActors(serviceNodes), - Fishermen: typesPers.ToPersistenceActors(fish), - Params: typesPers.ToPersistenceParams(DefaultParams()), - }, - ) +func NewGenesisState(numValidators, numServiceNodes, numApplications, numFisherman int) (*genesis.GenesisState, []string) { + apps, appsPrivateKeys := NewActors(coreTypes.ActorType_ACTOR_TYPE_APP, numApplications) + vals, validatorPrivateKeys := NewActors(coreTypes.ActorType_ACTOR_TYPE_VAL, numValidators) + serviceNodes, snPrivateKeys := NewActors(coreTypes.ActorType_ACTOR_TYPE_SERVICENODE, numServiceNodes) + fish, fishPrivateKeys := NewActors(coreTypes.ActorType_ACTOR_TYPE_FISH, numFisherman) + + genesisState := &genesis.GenesisState{ + GenesisTime: timestamppb.Now(), + ChainId: DefaultChainID, + MaxBlockBytes: DefaultMaxBlockBytes, + Pools: NewPools(), + Accounts: NewAccounts(numValidators+numServiceNodes+numApplications+numFisherman, append(append(append(validatorPrivateKeys, snPrivateKeys...), fishPrivateKeys...), appsPrivateKeys...)...), // TODO(olshansky): clean this up + Applications: apps, + Validators: vals, + ServiceNodes: serviceNodes, + Fishermen: fish, + Params: DefaultParams(), + } // TODO: Generalize this to all actors and not just validators return genesisState, validatorPrivateKeys } -func NewDefaultConfigs(privateKeys []string) (configs []modules.Config) { +func NewDefaultConfigs(privateKeys []string) (cfgs []*configs.Config) { for i, pk := range privateKeys { - configs = append(configs, NewDefaultConfig(i, pk)) + cfgs = append(cfgs, configs.NewDefaultConfig( + configs.WithPK(pk), + configs.WithNodeSchema("node"+strconv.Itoa(i+1)), + )) } return } -func NewDefaultConfig(i int, pk string) modules.Config { - return runtime.NewConfig( - &runtime.BaseConfig{ - RootDirectory: "/go/src/github.com/pocket-network", - PrivateKey: pk, - }, - runtime.WithConsensusConfig( - &typesCons.ConsensusConfig{ - MaxMempoolBytes: 500000000, - PacemakerConfig: &typesCons.PacemakerConfig{ - TimeoutMsec: 5000, - Manual: true, - DebugTimeBetweenStepsMsec: 1000, - }, - PrivateKey: pk, - }), - runtime.WithUtilityConfig(&typesUtil.UtilityConfig{ - MaxMempoolTransactionBytes: 1024 * 1024 * 1024, // 1GB V0 defaults - MaxMempoolTransactions: 9000, - }), - runtime.WithPersistenceConfig(&typesPers.PersistenceConfig{ - PostgresUrl: "postgres://postgres:postgres@pocket-db:5432/postgres", - NodeSchema: "node" + strconv.Itoa(i+1), - BlockStorePath: "/var/blockstore", - }), - runtime.WithP2PConfig(&typesP2P.P2PConfig{ - ConsensusPort: 8080, - UseRainTree: true, - IsEmptyConnectionType: false, - PrivateKey: pk, - }), - runtime.WithTelemetryConfig(&typesTelemetry.TelemetryConfig{ - Enabled: true, - Address: "0.0.0.0:9000", - Endpoint: "/metrics", - }), - ) -} - -func NewPools() (pools []modules.Account) { // TODO (Team) in the real testing suite, we need to populate the pool amounts dependent on the actors - for _, name := range typesPers.PoolNames_name { - if name == typesPers.PoolNames_FeeCollector.String() { - pools = append(pools, &typesPers.Account{ +// REFACTOR: Test artifact generator should reflect the sum of the initial account values to populate the initial pool values +func NewPools() (pools []*coreTypes.Account) { + for _, name := range coreTypes.Pools_name { + if name == coreTypes.Pools_POOLS_FEE_COLLECTOR.FriendlyName() { + pools = append(pools, &coreTypes.Account{ Address: name, Amount: "0", }) continue } - pools = append(pools, &typesPers.Account{ + pools = append(pools, &coreTypes.Account{ Address: name, - Amount: defaults.DefaultAccountAmountString, + Amount: DefaultAccountAmountString, }) } return } -func NewAccounts(n int, privateKeys ...string) (accounts []modules.Account) { +func NewAccounts(n int, privateKeys ...string) (accounts []*coreTypes.Account) { for i := 0; i < n; i++ { - _, _, addr := generateNewKeysStrings() + _, _, addr := keygenerator.GetInstance().Next() if privateKeys != nil { pk, _ := crypto.NewPrivateKey(privateKeys[i]) addr = pk.Address().String() } - accounts = append(accounts, &typesPers.Account{ + accounts = append(accounts, &coreTypes.Account{ Address: addr, - Amount: defaults.DefaultAccountAmountString, + Amount: DefaultAccountAmountString, }) } return } // TODO: The current implementation of NewActors will have overlapping `ServiceUrl` for different -// types of actors which needs to be fixed. -func NewActors(actorType typesUtil.ActorType, n int) (actors []modules.Actor, privateKeys []string) { +// +// types of actors which needs to be fixed. +func NewActors(actorType coreTypes.ActorType, n int) (actors []*coreTypes.Actor, privateKeys []string) { for i := 0; i < n; i++ { genericParam := getServiceUrl(i + 1) - if int32(actorType) == int32(types.ActorType_App) { - genericParam = defaults.DefaultMaxRelaysString + if int32(actorType) == int32(coreTypes.ActorType_ACTOR_TYPE_APP) { + genericParam = DefaultMaxRelaysString } actor, pk := NewDefaultActor(int32(actorType), genericParam) actors = append(actors, actor) @@ -169,46 +98,26 @@ func NewActors(actorType typesUtil.ActorType, n int) (actors []modules.Actor, pr } func getServiceUrl(n int) string { - return fmt.Sprintf(defaults.ServiceUrlFormat, n) + return fmt.Sprintf(ServiceUrlFormat, n) } -func NewDefaultActor(actorType int32, genericParam string) (actor modules.Actor, privateKey string) { - privKey, pubKey, addr := generateNewKeysStrings() - chains := defaults.DefaultChains - if actorType == int32(typesPers.ActorType_Val) { +func NewDefaultActor(actorType int32, genericParam string) (actor *coreTypes.Actor, privateKey string) { + privKey, pubKey, addr := keygenerator.GetInstance().Next() + chains := DefaultChains + if actorType == int32(coreTypes.ActorType_ACTOR_TYPE_VAL) { chains = nil - } else if actorType == int32(types.ActorType_App) { - genericParam = defaults.DefaultMaxRelaysString + } else if actorType == int32(coreTypes.ActorType_ACTOR_TYPE_APP) { + genericParam = DefaultMaxRelaysString } - return &typesPers.Actor{ + return &coreTypes.Actor{ Address: addr, PublicKey: pubKey, Chains: chains, GenericParam: genericParam, - StakedAmount: defaults.DefaultStakeAmountString, - PausedHeight: defaults.DefaultPauseHeight, - UnstakingHeight: defaults.DefaultUnstakingHeight, + StakedAmount: DefaultStakeAmountString, + PausedHeight: DefaultPauseHeight, + UnstakingHeight: DefaultUnstakingHeight, Output: addr, - ActorType: typesPers.ActorType(actorType), + ActorType: coreTypes.ActorType(actorType), }, privKey } - -// TECHDEBT: This function has the side effect of incrementing the global variable `privateKeySeed` -// in order to guarantee unique keys, but that are still deterministic for testing purposes. -func generateNewKeysStrings() (privateKey, publicKey, address string) { - privateKeySeed += 1 // Different on every call but deterministic - cryptoSeed := make([]byte, crypto.SeedSize) - binary.LittleEndian.PutUint32(cryptoSeed, uint32(privateKeySeed)) - - reader := bytes.NewReader(cryptoSeed) - privateKeyBz, err := crypto.GeneratePrivateKeyWithReader(reader) - if err != nil { - panic(err) - } - - privateKey = privateKeyBz.String() - publicKey = privateKeyBz.PublicKey().String() - address = privateKeyBz.PublicKey().Address().String() - - return -} diff --git a/runtime/test_artifacts/gov.go b/runtime/test_artifacts/gov.go index febf92d25..61f8a584e 100644 --- a/runtime/test_artifacts/gov.go +++ b/runtime/test_artifacts/gov.go @@ -3,8 +3,7 @@ package test_artifacts import ( "math/big" - typesPers "github.com/pokt-network/pocket/persistence/types" - "github.com/pokt-network/pocket/shared/modules" + "github.com/pokt-network/pocket/runtime/genesis" "github.com/pokt-network/pocket/utility/types" "github.com/pokt-network/pocket/shared/crypto" @@ -16,8 +15,8 @@ var ( DefaultParamsOwner, _ = crypto.NewPrivateKey("ff538589deb7f28bbce1ba68b37d2efc0eaa03204b36513cf88422a875559e38d6cbe0430ddd85a5e48e0c99ef3dea47bf0d1a83c6e6ad1640f72201dc8a0120") ) -func DefaultParams() modules.Params { - return &typesPers.Params{ +func DefaultParams() *genesis.Params { + return &genesis.Params{ BlocksPerSession: 4, AppMinimumStake: types.BigIntToString(big.NewInt(15000000000)), AppMaxChains: 15, diff --git a/runtime/test_artifacts/keygenerator/keygen.go b/runtime/test_artifacts/keygenerator/keygen.go new file mode 100644 index 000000000..ef2f1f5cc --- /dev/null +++ b/runtime/test_artifacts/keygenerator/keygen.go @@ -0,0 +1,54 @@ +package keygenerator + +import ( + "bytes" + "encoding/binary" + "math/rand" + + "github.com/pokt-network/pocket/shared/crypto" + "google.golang.org/protobuf/types/known/timestamppb" +) + +var keygen *keyGenerator + +type keyGenerator struct { + privateKeySeed int +} + +func GetInstance() *keyGenerator { + if keygen == nil { + keygen = &keyGenerator{} + keygen.reset() + } + return keygen +} + +func (k *keyGenerator) reset() { + rand.Seed(timestamppb.Now().Seconds) + k.privateKeySeed = rand.Int() +} + +func (k *keyGenerator) SetSeed(seed int) (teardown func()) { + k.privateKeySeed = seed + return func() { + k.reset() + } +} + +func (k *keyGenerator) Next() (privateKey, publicKey, address string) { + k.privateKeySeed += 1 // Different on every call but deterministic + cryptoSeed := make([]byte, crypto.SeedSize) + binary.LittleEndian.PutUint32(cryptoSeed, uint32(k.privateKeySeed)) + + reader := bytes.NewReader(cryptoSeed) + privateKeyBz, err := crypto.GeneratePrivateKeyWithReader(reader) + if err != nil { + panic(err) + } + + privateKey = privateKeyBz.String() + publicKey = privateKeyBz.PublicKey().String() + address = privateKeyBz.PublicKey().Address().String() + + return +} diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 657e3ccc1..e7dd1d6d5 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.8] - 2023-01-03 + +- Added `PoolNames.FriendlyName` method +- Renamed enums as per code-review +- Updated `InitParams` logic to use genesisState instead of hardcoded values + +## [0.0.0.7] - 2022-12-21 + +- Updated to use the new centralized config and genesis handling +- Created `Actor` struct under `coreTypes` +- Created `Account` struct under `coreTypes` +- Created `PoolNames` enum under `coreTypes` +- Updated module to use the new `coreTypes` +- Simplified `*Module` interfaces +- Updated tests and mocks + ## [0.0.0.6] - 2022-12-14 - Added `GetMaxMempoolCount` diff --git a/utility/types/actor.go b/shared/core/types/actor.go similarity index 100% rename from utility/types/actor.go rename to shared/core/types/actor.go diff --git a/shared/core/types/pools.go b/shared/core/types/pools.go new file mode 100644 index 000000000..79092d265 --- /dev/null +++ b/shared/core/types/pools.go @@ -0,0 +1,18 @@ +package types + +var poolFriendlyNames map[Pools]string + +func init() { + poolFriendlyNames = map[Pools]string{ + Pools_POOLS_UNSPECIFIED: "Unspecified", + Pools_POOLS_DAO: "DAO", + Pools_POOLS_FEE_COLLECTOR: "FeeCollector", + Pools_POOLS_APP_STAKE: "AppStakePool", + Pools_POOLS_VALIDATOR_STAKE: "ValidatorStakePool", + Pools_POOLS_SERVICE_NODE_STAKE: "ServiceNodeStakePool", + } +} + +func (pn Pools) FriendlyName() string { + return poolFriendlyNames[pn] +} diff --git a/shared/core/types/proto/account.proto b/shared/core/types/proto/account.proto new file mode 100644 index 000000000..a062fa9fe --- /dev/null +++ b/shared/core/types/proto/account.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package core; + +option go_package = "github.com/pokt-network/pocket/shared/core/types"; + +message Account { + string address = 1; + string amount = 2; +} diff --git a/shared/core/types/proto/actor.proto b/shared/core/types/proto/actor.proto new file mode 100644 index 000000000..15bfecdaa --- /dev/null +++ b/shared/core/types/proto/actor.proto @@ -0,0 +1,25 @@ +syntax = "proto3"; + +package core; + +option go_package = "github.com/pokt-network/pocket/shared/core/types"; + +enum ActorType { + ACTOR_TYPE_UNSPECIFIED = 0; + ACTOR_TYPE_APP = 1; + ACTOR_TYPE_SERVICENODE = 2;// TODO: Consider renaming to `servicers` throughout the codebase. + ACTOR_TYPE_FISH = 3; + ACTOR_TYPE_VAL = 4; +} + +message Actor { + ActorType actor_type = 1; + string address = 2; + string public_key = 3; + repeated string chains = 4; + string generic_param = 5; // TODO(#313): Generalize `GenericParam` to a different name + string staked_amount = 6; + int64 paused_height = 7; + int64 unstaking_height = 8; + string output = 9; +} diff --git a/shared/core/types/proto/pools.proto b/shared/core/types/proto/pools.proto new file mode 100644 index 000000000..cd91d66d9 --- /dev/null +++ b/shared/core/types/proto/pools.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package core; + +option go_package = "github.com/pokt-network/pocket/shared/core/types"; + +enum Pools { + POOLS_UNSPECIFIED = 0; + POOLS_DAO = 1; + POOLS_FEE_COLLECTOR = 2; + POOLS_APP_STAKE = 3; + POOLS_VALIDATOR_STAKE = 4; + POOLS_SERVICE_NODE_STAKE = 5; + POOLS_FISHERMAN_STAKE = 6; +} diff --git a/shared/modules/consensus_module.go b/shared/modules/consensus_module.go index 689b8ec47..b9a575561 100644 --- a/shared/modules/consensus_module.go +++ b/shared/modules/consensus_module.go @@ -3,20 +3,19 @@ package modules //go:generate mockgen -source=$GOFILE -destination=./mocks/consensus_module_mock.go -aux_files=github.com/pokt-network/pocket/shared/modules=module.go import ( + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/messaging" "google.golang.org/protobuf/types/known/anypb" ) // TODO(olshansky): deprecate ValidatorMap or populate from persistence module -type ValidatorMap map[string]Actor +type ValidatorMap map[string]coreTypes.Actor // NOTE: Consensus is the core of the replicated state machine and is driven by various asynchronous events. // Consider adding a mutex lock to your implementation that is acquired at the beginning of each entrypoint/function implemented in this interface. // Make sure that you are not locking again within the same call to avoid deadlocks (for example when the methods below call each other in your implementation). type ConsensusModule interface { Module - ConfigurableModule - GenesisDependentModule KeyholderModule // Consensus Engine Handlers diff --git a/shared/modules/module.go b/shared/modules/module.go index a7da56fd5..bc82c16d8 100644 --- a/shared/modules/module.go +++ b/shared/modules/module.go @@ -1,7 +1,6 @@ package modules import ( - "github.com/pokt-network/pocket/shared/crypto" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" ) @@ -26,16 +25,8 @@ type InitializableModule interface { Create(runtime RuntimeMgr) (Module, error) } -type ConfigurableModule interface { - ValidateConfig(Config) error -} - -type GenesisDependentModule interface { - ValidateGenesis(GenesisState) error -} - type KeyholderModule interface { - GetPrivateKey() (crypto.PrivateKey, error) + GetPrivateKey() (cryptoPocket.PrivateKey, error) } type P2PAddressableModule interface { diff --git a/shared/modules/p2p_module.go b/shared/modules/p2p_module.go index d3ece2fe7..8f4d87b9e 100644 --- a/shared/modules/p2p_module.go +++ b/shared/modules/p2p_module.go @@ -9,7 +9,6 @@ import ( type P2PModule interface { Module - ConfigurableModule Broadcast(msg *anypb.Any) error Send(addr cryptoPocket.Address, msg *anypb.Any) error diff --git a/shared/modules/persistence_module.go b/shared/modules/persistence_module.go index 7532457a0..ea120eb62 100644 --- a/shared/modules/persistence_module.go +++ b/shared/modules/persistence_module.go @@ -4,13 +4,13 @@ package modules import ( "github.com/pokt-network/pocket/persistence/kvstore" + "github.com/pokt-network/pocket/runtime/genesis" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/messaging" ) type PersistenceModule interface { Module - ConfigurableModule - GenesisDependentModule // Context operations NewRWContext(height int64) (PersistenceRWContext, error) @@ -110,7 +110,7 @@ type PersistenceWriteContext interface { SetValidatorMissedBlocks(address []byte, missedBlocks int) error // Param Operations - InitParams() error + InitGenesisParams(params *genesis.Params) error SetParam(paramName string, value interface{}) error // Flag Operations @@ -133,16 +133,16 @@ type PersistenceReadContext interface { // Returns "0" if the account does not exist GetPoolAmount(name string, height int64) (amount string, err error) - GetAllPools(height int64) ([]Account, error) + GetAllPools(height int64) ([]*coreTypes.Account, error) // Account Queries // Returns "0" if the account does not exist GetAccountAmount(address []byte, height int64) (string, error) - GetAllAccounts(height int64) ([]Account, error) + GetAllAccounts(height int64) ([]*coreTypes.Account, error) // App Queries - GetAllApps(height int64) ([]Actor, error) + GetAllApps(height int64) ([]*coreTypes.Actor, error) GetAppExists(address []byte, height int64) (exists bool, err error) GetAppStakeAmount(height int64, address []byte) (string, error) GetAppsReadyToUnstake(height int64, status int32) (apps []IUnstakingActor, err error) @@ -151,7 +151,7 @@ type PersistenceReadContext interface { GetAppOutputAddress(operator []byte, height int64) (output []byte, err error) // ServiceNode Queries - GetAllServiceNodes(height int64) ([]Actor, error) + GetAllServiceNodes(height int64) ([]*coreTypes.Actor, error) GetServiceNodeExists(address []byte, height int64) (exists bool, err error) GetServiceNodeStakeAmount(height int64, address []byte) (string, error) GetServiceNodesReadyToUnstake(height int64, status int32) (serviceNodes []IUnstakingActor, err error) @@ -162,7 +162,7 @@ type PersistenceReadContext interface { GetServiceNodesPerSessionAt(height int64) (int, error) // TECHDEBT(#286): Deprecate this method // Fisherman Queries - GetAllFishermen(height int64) ([]Actor, error) + GetAllFishermen(height int64) ([]*coreTypes.Actor, error) GetFishermanExists(address []byte, height int64) (exists bool, err error) GetFishermanStakeAmount(height int64, address []byte) (string, error) GetFishermenReadyToUnstake(height int64, status int32) (fishermen []IUnstakingActor, err error) @@ -171,7 +171,7 @@ type PersistenceReadContext interface { GetFishermanOutputAddress(operator []byte, height int64) (output []byte, err error) // Validator Queries - GetAllValidators(height int64) ([]Actor, error) + GetAllValidators(height int64) ([]*coreTypes.Actor, error) GetValidatorExists(address []byte, height int64) (exists bool, err error) GetValidatorStakeAmount(height int64, address []byte) (string, error) GetValidatorsReadyToUnstake(height int64, status int32) (validators []IUnstakingActor, err error) @@ -181,7 +181,7 @@ type PersistenceReadContext interface { GetValidatorMissedBlocks(address []byte, height int64) (int, error) // Actors Queries - GetAllStakedActors(height int64) ([]Actor, error) + GetAllStakedActors(height int64) ([]*coreTypes.Actor, error) // Params GetIntParam(paramName string, height int64) (int, error) diff --git a/shared/modules/rpc_module.go b/shared/modules/rpc_module.go index 54bf62bb1..4cbc05d7d 100644 --- a/shared/modules/rpc_module.go +++ b/shared/modules/rpc_module.go @@ -4,5 +4,4 @@ package modules type RPCModule interface { Module - ConfigurableModule } diff --git a/shared/modules/runtime_module.go b/shared/modules/runtime_module.go index ef4ca8e9a..17e2ed3fb 100644 --- a/shared/modules/runtime_module.go +++ b/shared/modules/runtime_module.go @@ -1,11 +1,15 @@ package modules -import "github.com/benbjohnson/clock" +import ( + "github.com/benbjohnson/clock" + "github.com/pokt-network/pocket/runtime/configs" + "github.com/pokt-network/pocket/runtime/genesis" +) //go:generate mockgen -source=$GOFILE -destination=./mocks/runtime_module_mock.go -aux_files=github.com/pokt-network/pocket/shared/modules=module.go type RuntimeMgr interface { - GetConfig() Config - GetGenesis() GenesisState + GetConfig() *configs.Config + GetGenesis() *genesis.GenesisState GetClock() clock.Clock } diff --git a/shared/modules/telemetry_module.go b/shared/modules/telemetry_module.go index fbe398ada..21e83efa3 100644 --- a/shared/modules/telemetry_module.go +++ b/shared/modules/telemetry_module.go @@ -6,7 +6,6 @@ import "github.com/prometheus/client_golang/prometheus" type TelemetryModule interface { Module - ConfigurableModule GetTimeSeriesAgent() TimeSeriesAgent GetEventMetricsAgent() EventMetricsAgent diff --git a/shared/modules/types.go b/shared/modules/types.go index f224fd9d1..1bd74aa55 100644 --- a/shared/modules/types.go +++ b/shared/modules/types.go @@ -1,126 +1,5 @@ package modules -//go:generate mockgen -source=$GOFILE -destination=./mocks/types_mock.go -aux_files=github.com/pokt-network/pocket/shared/modules=module.go - -import ( - "google.golang.org/protobuf/types/known/timestamppb" -) - -// This file contains the minimum shared structures (GenesisState) and the many shared interfaces the modules implement -// the main purpose of this structure is to ensure the ownership of the - -type GenesisState interface { - GetPersistenceGenesisState() PersistenceGenesisState - GetConsensusGenesisState() ConsensusGenesisState -} - -type Config interface { - GetBaseConfig() BaseConfig - GetConsensusConfig() ConsensusConfig - GetUtilityConfig() UtilityConfig - GetPersistenceConfig() PersistenceConfig - GetP2PConfig() P2PConfig - GetTelemetryConfig() TelemetryConfig - GetLoggerConfig() LoggerConfig - GetRPCConfig() RPCConfig -} - -type BaseConfig interface { - GetRootDirectory() string - GetPrivateKey() string // TODO (#150) better architecture for key management (keybase, keyfiles, etc.) -} - -type ConsensusConfig interface { - GetMaxMempoolBytes() uint64 - GetPrivateKey() string // TODO (#150) better architecture for key management (keybase, keyfiles, etc.) -} - -type PacemakerConfig interface { - SetTimeoutMsec(uint64) - GetTimeoutMsec() uint64 - GetManual() bool - GetDebugTimeBetweenStepsMsec() uint64 -} - -type PersistenceConfig interface { - GetPostgresUrl() string - GetNodeSchema() string - GetBlockStorePath() string - GetTxIndexerPath() string - GetTreesStoreDir() string -} - -type P2PConfig interface { - GetPrivateKey() string - GetConsensusPort() uint32 - GetUseRainTree() bool - GetIsEmptyConnectionType() bool // TODO : make enum - GetMaxMempoolCount() uint64 -} - -type TelemetryConfig interface { - GetEnabled() bool - GetAddress() string - GetEndpoint() string -} - -type LoggerConfig interface { - // We have protobuf enums for the following values in `logger/proto` dir, but they are represented as - // `string` to avoid circular dependencies between this (`modules`) and `logger` packages. - GetLevel() string - GetFormat() string -} - -type UtilityConfig interface { - GetMaxMempoolTransactionBytes() uint64 - GetMaxMempoolTransactions() uint32 -} - -type RPCConfig interface { - GetEnabled() bool - GetPort() string - GetTimeout() uint64 - GetUseCors() bool -} - -type PersistenceGenesisState interface { - GetAccs() []Account - GetAccPools() []Account - GetApps() []Actor - GetVals() []Actor - GetFish() []Actor - GetNodes() []Actor - GetParameters() Params -} - -type ConsensusGenesisState interface { - GetGenesisTime() *timestamppb.Timestamp - GetChainId() string - GetMaxBlockBytes() uint64 - GetVals() []Actor -} - -type Account interface { - GetAddress() string - GetAmount() string -} - -type Actor interface { - GetAddress() string - GetPublicKey() string - GetChains() []string - GetGenericParam() string - GetStakedAmount() string - GetPausedHeight() int64 - GetUnstakingHeight() int64 - GetOutput() string - GetActorTyp() ActorType // RESEARCH: this method has to be implemented manually which is a pain -} - -type ActorType interface { - String() string -} - type IUnstakingActor interface { GetAddress() []byte SetAddress(address string) @@ -130,124 +9,6 @@ type IUnstakingActor interface { SetOutputAddress(address string) } -type Params interface { - GetAppMinimumStake() string - GetAppMaxChains() int32 - GetAppBaselineStakeRate() int32 - GetAppStakingAdjustment() int32 - GetAppUnstakingBlocks() int32 - GetAppMinimumPauseBlocks() int32 - GetAppMaxPauseBlocks() int32 - GetBlocksPerSession() int32 - - GetServiceNodeMinimumStake() string - GetServiceNodeMaxChains() int32 - GetServiceNodeUnstakingBlocks() int32 - GetServiceNodeMinimumPauseBlocks() int32 - GetServiceNodeMaxPauseBlocks() int32 - GetServiceNodesPerSession() int32 - - GetFishermanMinimumStake() string - GetFishermanMaxChains() int32 - GetFishermanUnstakingBlocks() int32 - GetFishermanMinimumPauseBlocks() int32 - GetFishermanMaxPauseBlocks() int32 - - GetValidatorMinimumStake() string - GetValidatorUnstakingBlocks() int32 - GetValidatorMinimumPauseBlocks() int32 - GetValidatorMaxPauseBlocks() int32 - GetValidatorMaximumMissedBlocks() int32 - GetProposerPercentageOfFees() int32 - GetValidatorMaxEvidenceAgeInBlocks() int32 - GetMissedBlocksBurnPercentage() int32 - GetDoubleSignBurnPercentage() int32 - - GetMessageDoubleSignFee() string - GetMessageSendFee() string - GetMessageStakeFishermanFee() string - GetMessageEditStakeFishermanFee() string - GetMessageUnstakeFishermanFee() string - GetMessagePauseFishermanFee() string - GetMessageUnpauseFishermanFee() string - GetMessageFishermanPauseServiceNodeFee() string - GetMessageTestScoreFee() string - GetMessageProveTestScoreFee() string - GetMessageStakeAppFee() string - GetMessageEditStakeAppFee() string - GetMessageUnstakeAppFee() string - GetMessagePauseAppFee() string - GetMessageUnpauseAppFee() string - GetMessageStakeValidatorFee() string - GetMessageEditStakeValidatorFee() string - GetMessageUnstakeValidatorFee() string - GetMessagePauseValidatorFee() string - GetMessageUnpauseValidatorFee() string - GetMessageStakeServiceNodeFee() string - GetMessageEditStakeServiceNodeFee() string - GetMessageUnstakeServiceNodeFee() string - GetMessagePauseServiceNodeFee() string - GetMessageUnpauseServiceNodeFee() string - GetMessageChangeParameterFee() string - - // ACL Queries - GetAclOwner() string - GetBlocksPerSessionOwner() string - GetAppMaxChainsOwner() string - GetAppMinimumStakeOwner() string - GetAppBaselineStakeRateOwner() string - GetAppStakingAdjustmentOwner() string - GetAppUnstakingBlocksOwner() string - GetAppMinimumPauseBlocksOwner() string - GetAppMaxPausedBlocksOwner() string - GetServiceNodeMinimumStakeOwner() string - GetServiceNodeMaxChainsOwner() string - GetServiceNodeUnstakingBlocksOwner() string - GetServiceNodeMinimumPauseBlocksOwner() string - GetServiceNodeMaxPausedBlocksOwner() string - GetFishermanMinimumStakeOwner() string - GetFishermanMaxChainsOwner() string - GetFishermanUnstakingBlocksOwner() string - GetFishermanMinimumPauseBlocksOwner() string - GetFishermanMaxPausedBlocksOwner() string - GetValidatorMinimumStakeOwner() string - GetValidatorUnstakingBlocksOwner() string - GetValidatorMinimumPauseBlocksOwner() string - GetValidatorMaxPausedBlocksOwner() string - GetValidatorMaximumMissedBlocksOwner() string - GetProposerPercentageOfFeesOwner() string - GetValidatorMaxEvidenceAgeInBlocksOwner() string - GetMissedBlocksBurnPercentageOwner() string - GetDoubleSignBurnPercentageOwner() string - GetServiceNodesPerSessionOwner() string - GetMessageDoubleSignFeeOwner() string - GetMessageSendFeeOwner() string - GetMessageStakeFishermanFeeOwner() string - GetMessageEditStakeFishermanFeeOwner() string - GetMessageUnstakeFishermanFeeOwner() string - GetMessagePauseFishermanFeeOwner() string - GetMessageUnpauseFishermanFeeOwner() string - GetMessageFishermanPauseServiceNodeFeeOwner() string - GetMessageTestScoreFeeOwner() string - GetMessageProveTestScoreFeeOwner() string - GetMessageStakeAppFeeOwner() string - GetMessageEditStakeAppFeeOwner() string - GetMessageUnstakeAppFeeOwner() string - GetMessagePauseAppFeeOwner() string - GetMessageUnpauseAppFeeOwner() string - GetMessageStakeValidatorFeeOwner() string - GetMessageEditStakeValidatorFeeOwner() string - GetMessageUnstakeValidatorFeeOwner() string - GetMessagePauseValidatorFeeOwner() string - GetMessageUnpauseValidatorFeeOwner() string - GetMessageStakeServiceNodeFeeOwner() string - GetMessageEditStakeServiceNodeFeeOwner() string - GetMessageUnstakeServiceNodeFeeOwner() string - GetMessagePauseServiceNodeFeeOwner() string - GetMessageUnpauseServiceNodeFeeOwner() string - GetMessageChangeParameterFeeOwner() string -} - // The result of executing a transaction against the blockchain state so that it is included in the block type TxResult interface { GetTx() []byte // the transaction object primitive diff --git a/shared/modules/utility_module.go b/shared/modules/utility_module.go index f60d97e8f..2e7d7aba7 100644 --- a/shared/modules/utility_module.go +++ b/shared/modules/utility_module.go @@ -8,7 +8,6 @@ import ( type UtilityModule interface { Module - ConfigurableModule HandleMessage(*anypb.Any) error diff --git a/telemetry/CHANGELOG.md b/telemetry/CHANGELOG.md new file mode 100644 index 000000000..3cfd02919 --- /dev/null +++ b/telemetry/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +All notable changes to this module will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.0.0.1] - 2023-01-03 + +- Refactored configs into `configs` package + +## [0.0.0.0] - 2023-01-03 + +- Introduced this `CHANGELOG.md` diff --git a/telemetry/module.go b/telemetry/module.go index afe331374..bef0d6682 100644 --- a/telemetry/module.go +++ b/telemetry/module.go @@ -5,8 +5,7 @@ import ( ) var ( - _ modules.Module = &telemetryModule{} - _ modules.TelemetryConfig = &TelemetryConfig{} + _ modules.Module = &telemetryModule{} ) const ( @@ -19,11 +18,8 @@ func Create(runtime modules.RuntimeMgr) (modules.Module, error) { // TODO(pocket/issues/99): Add a switch statement and configuration variable when support for other telemetry modules is added. func (*telemetryModule) Create(runtime modules.RuntimeMgr) (modules.Module, error) { - cfg := runtime.GetConfig() - - telemetryCfg := cfg.GetTelemetryConfig() - - if telemetryCfg.GetEnabled() { + telemetryCfg := runtime.GetConfig().Telemetry + if telemetryCfg.Enabled { return CreatePrometheusTelemetryModule(runtime) } else { return CreateNoopTelemetryModule(runtime) @@ -32,9 +28,8 @@ func (*telemetryModule) Create(runtime modules.RuntimeMgr) (modules.Module, erro type telemetryModule struct{} -func (t *telemetryModule) GetModuleName() string { return telemetryModuleName } -func (t *telemetryModule) InitGenesis(_ string) (genesis modules.GenesisState, err error) { return } -func (t *telemetryModule) SetBus(bus modules.Bus) {} -func (t *telemetryModule) GetBus() modules.Bus { return nil } -func (t *telemetryModule) Start() error { return nil } -func (t *telemetryModule) Stop() error { return nil } +func (t *telemetryModule) GetModuleName() string { return telemetryModuleName } +func (t *telemetryModule) SetBus(bus modules.Bus) {} +func (t *telemetryModule) GetBus() modules.Bus { return nil } +func (t *telemetryModule) Start() error { return nil } +func (t *telemetryModule) Stop() error { return nil } diff --git a/telemetry/noop_module.go b/telemetry/noop_module.go index 4dee405f0..95415cd81 100644 --- a/telemetry/noop_module.go +++ b/telemetry/noop_module.go @@ -59,10 +59,6 @@ func (m *NoopTelemetryModule) GetBus() modules.Bus { return m.bus } -func (*NoopTelemetryModule) ValidateConfig(cfg modules.Config) error { - return nil -} - func (m *NoopTelemetryModule) GetEventMetricsAgent() modules.EventMetricsAgent { return modules.EventMetricsAgent(m) } diff --git a/telemetry/prometheus_module.go b/telemetry/prometheus_module.go index 0adcb4483..454da92c8 100644 --- a/telemetry/prometheus_module.go +++ b/telemetry/prometheus_module.go @@ -1,10 +1,10 @@ package telemetry import ( - "fmt" "log" "net/http" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/shared/modules" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -12,18 +12,17 @@ import ( ) var ( - _ modules.Module = &PrometheusTelemetryModule{} - _ modules.ConfigurableModule = &PrometheusTelemetryModule{} - _ modules.TelemetryModule = &PrometheusTelemetryModule{} - _ modules.EventMetricsAgent = &PrometheusTelemetryModule{} - _ modules.TimeSeriesAgent = &PrometheusTelemetryModule{} + _ modules.Module = &PrometheusTelemetryModule{} + _ modules.TelemetryModule = &PrometheusTelemetryModule{} + _ modules.EventMetricsAgent = &PrometheusTelemetryModule{} + _ modules.TimeSeriesAgent = &PrometheusTelemetryModule{} ) // DISCUSS(team): Should the warning logs in this module be handled differently? type PrometheusTelemetryModule struct { bus modules.Bus - config modules.TelemetryConfig + config *configs.TelemetryConfig counters map[string]prometheus.Counter gauges map[string]prometheus.Gauge @@ -40,11 +39,7 @@ func CreatePrometheusTelemetryModule(runtime modules.RuntimeMgr) (modules.Module } func (m *PrometheusTelemetryModule) Create(runtime modules.RuntimeMgr) (modules.Module, error) { - cfg := runtime.GetConfig() - if err := m.ValidateConfig(cfg); err != nil { - return nil, fmt.Errorf("config validation failed: %w", err) - } - telemetryCfg := cfg.GetTelemetryConfig() + telemetryCfg := runtime.GetConfig().Telemetry return &PrometheusTelemetryModule{ config: telemetryCfg, @@ -55,10 +50,10 @@ func (m *PrometheusTelemetryModule) Create(runtime modules.RuntimeMgr) (modules. } func (m *PrometheusTelemetryModule) Start() error { - log.Printf("\nPrometheus metrics exporter: Starting at %s%s...\n", m.config.GetAddress(), m.config.GetEndpoint()) + log.Printf("\nPrometheus metrics exporter: Starting at %s%s...\n", m.config.Address, m.config.Endpoint) - http.Handle(m.config.GetEndpoint(), promhttp.Handler()) - go http.ListenAndServe(m.config.GetAddress(), nil) + http.Handle(m.config.Endpoint, promhttp.Handler()) + go http.ListenAndServe(m.config.Address, nil) log.Println("Prometheus metrics exporter started: OK") @@ -84,11 +79,6 @@ func (m *PrometheusTelemetryModule) GetBus() modules.Bus { return m.bus } -func (*PrometheusTelemetryModule) ValidateConfig(cfg modules.Config) error { - // TODO (#334): implement this - return nil -} - // EventMetricsAgent interface implementation func (m *PrometheusTelemetryModule) GetEventMetricsAgent() modules.EventMetricsAgent { return modules.EventMetricsAgent(m) diff --git a/utility/actor.go b/utility/actor.go index 878280ed8..1ac51391f 100644 --- a/utility/actor.go +++ b/utility/actor.go @@ -4,6 +4,7 @@ import ( "math" "math/big" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" typesUtil "github.com/pokt-network/pocket/utility/types" ) @@ -21,18 +22,18 @@ import ( // setters -func (u *UtilityContext) SetActorStakedTokens(actorType typesUtil.ActorType, tokens *big.Int, address []byte) typesUtil.Error { +func (u *UtilityContext) SetActorStakedTokens(actorType coreTypes.ActorType, tokens *big.Int, address []byte) typesUtil.Error { store := u.Store() var er error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: er = store.SetAppStakeAmount(address, typesUtil.BigIntToString(tokens)) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: er = store.SetFishermanStakeAmount(address, typesUtil.BigIntToString(tokens)) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: er = store.SetServiceNodeStakeAmount(address, typesUtil.BigIntToString(tokens)) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: er = store.SetValidatorStakeAmount(address, typesUtil.BigIntToString(tokens)) default: er = typesUtil.ErrUnknownActorType(actorType.String()) @@ -45,18 +46,18 @@ func (u *UtilityContext) SetActorStakedTokens(actorType typesUtil.ActorType, tok return nil } -func (u *UtilityContext) SetActorUnstaking(actorType typesUtil.ActorType, unstakingHeight int64, address []byte) typesUtil.Error { +func (u *UtilityContext) SetActorUnstaking(actorType coreTypes.ActorType, unstakingHeight int64, address []byte) typesUtil.Error { store := u.Store() var er error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: er = store.SetAppUnstakingHeightAndStatus(address, unstakingHeight, int32(typesUtil.StakeStatus_Unstaking)) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: er = store.SetFishermanUnstakingHeightAndStatus(address, unstakingHeight, int32(typesUtil.StakeStatus_Unstaking)) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: er = store.SetServiceNodeUnstakingHeightAndStatus(address, unstakingHeight, int32(typesUtil.StakeStatus_Unstaking)) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: er = store.SetValidatorUnstakingHeightAndStatus(address, unstakingHeight, int32(typesUtil.StakeStatus_Unstaking)) default: er = typesUtil.ErrUnknownActorType(actorType.String()) @@ -69,18 +70,18 @@ func (u *UtilityContext) SetActorUnstaking(actorType typesUtil.ActorType, unstak return nil } -func (u *UtilityContext) SetActorPauseHeight(actorType typesUtil.ActorType, address []byte, height int64) typesUtil.Error { +func (u *UtilityContext) SetActorPauseHeight(actorType coreTypes.ActorType, address []byte, height int64) typesUtil.Error { store := u.Store() var err error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: err = store.SetAppPauseHeight(address, height) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: err = store.SetFishermanPauseHeight(address, height) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: err = store.SetServiceNodePauseHeight(address, height) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: err = store.SetValidatorPauseHeight(address, height) default: err = typesUtil.ErrUnknownActorType(actorType.String()) @@ -95,7 +96,7 @@ func (u *UtilityContext) SetActorPauseHeight(actorType typesUtil.ActorType, addr // getters -func (u *UtilityContext) GetActorStakedTokens(actorType typesUtil.ActorType, address []byte) (*big.Int, typesUtil.Error) { +func (u *UtilityContext) GetActorStakedTokens(actorType coreTypes.ActorType, address []byte) (*big.Int, typesUtil.Error) { store, height, err := u.GetStoreAndHeight() if err != nil { return nil, err @@ -104,13 +105,13 @@ func (u *UtilityContext) GetActorStakedTokens(actorType typesUtil.ActorType, add var stakedTokens string var er error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: stakedTokens, er = store.GetAppStakeAmount(height, address) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: stakedTokens, er = store.GetFishermanStakeAmount(height, address) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: stakedTokens, er = store.GetServiceNodeStakeAmount(height, address) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: stakedTokens, er = store.GetValidatorStakeAmount(height, address) default: er = typesUtil.ErrUnknownActorType(actorType.String()) @@ -128,7 +129,7 @@ func (u *UtilityContext) GetActorStakedTokens(actorType typesUtil.ActorType, add return i, nil } -func (u *UtilityContext) GetMaxPausedBlocks(actorType typesUtil.ActorType) (maxPausedBlocks int, err typesUtil.Error) { +func (u *UtilityContext) GetMaxPausedBlocks(actorType coreTypes.ActorType) (maxPausedBlocks int, err typesUtil.Error) { store, height, err := u.GetStoreAndHeight() if err != nil { return 0, err @@ -136,13 +137,13 @@ func (u *UtilityContext) GetMaxPausedBlocks(actorType typesUtil.ActorType) (maxP var paramName string switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: paramName = typesUtil.AppMaxPauseBlocksParamName - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: paramName = typesUtil.FishermanMaxPauseBlocksParamName - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: paramName = typesUtil.ServiceNodeMaxPauseBlocksParamName - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: paramName = typesUtil.ValidatorMaxPausedBlocksParamName default: return 0, typesUtil.ErrUnknownActorType(actorType.String()) @@ -157,7 +158,7 @@ func (u *UtilityContext) GetMaxPausedBlocks(actorType typesUtil.ActorType) (maxP return } -func (u *UtilityContext) GetMinimumPauseBlocks(actorType typesUtil.ActorType) (minPauseBlocks int, err typesUtil.Error) { +func (u *UtilityContext) GetMinimumPauseBlocks(actorType coreTypes.ActorType) (minPauseBlocks int, err typesUtil.Error) { store, height, err := u.GetStoreAndHeight() if err != nil { return 0, err @@ -165,13 +166,13 @@ func (u *UtilityContext) GetMinimumPauseBlocks(actorType typesUtil.ActorType) (m var paramName string switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: paramName = typesUtil.AppMinimumPauseBlocksParamName - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: paramName = typesUtil.FishermanMinimumPauseBlocksParamName - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: paramName = typesUtil.ServiceNodeMinimumPauseBlocksParamName - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: paramName = typesUtil.ValidatorMinimumPauseBlocksParamName default: return 0, typesUtil.ErrUnknownActorType(actorType.String()) @@ -185,7 +186,7 @@ func (u *UtilityContext) GetMinimumPauseBlocks(actorType typesUtil.ActorType) (m return } -func (u *UtilityContext) GetPauseHeight(actorType typesUtil.ActorType, address []byte) (pauseHeight int64, err typesUtil.Error) { +func (u *UtilityContext) GetPauseHeight(actorType coreTypes.ActorType, address []byte) (pauseHeight int64, err typesUtil.Error) { store, height, err := u.GetStoreAndHeight() if err != nil { return 0, err @@ -193,13 +194,13 @@ func (u *UtilityContext) GetPauseHeight(actorType typesUtil.ActorType, address [ var er error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: pauseHeight, er = store.GetAppPauseHeightIfExists(address, height) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: pauseHeight, er = store.GetFishermanPauseHeightIfExists(address, height) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: pauseHeight, er = store.GetServiceNodePauseHeightIfExists(address, height) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: pauseHeight, er = store.GetValidatorPauseHeightIfExists(address, height) default: er = typesUtil.ErrUnknownActorType(actorType.String()) @@ -212,7 +213,7 @@ func (u *UtilityContext) GetPauseHeight(actorType typesUtil.ActorType, address [ return } -func (u *UtilityContext) GetActorStatus(actorType typesUtil.ActorType, address []byte) (status int32, err typesUtil.Error) { +func (u *UtilityContext) GetActorStatus(actorType coreTypes.ActorType, address []byte) (status int32, err typesUtil.Error) { store, height, err := u.GetStoreAndHeight() if err != nil { return 0, err @@ -220,13 +221,13 @@ func (u *UtilityContext) GetActorStatus(actorType typesUtil.ActorType, address [ var er error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: status, er = store.GetAppStatus(address, height) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: status, er = store.GetFishermanStatus(address, height) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: status, er = store.GetServiceNodeStatus(address, height) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: status, er = store.GetValidatorStatus(address, height) default: er = typesUtil.ErrUnknownActorType(actorType.String()) @@ -239,7 +240,7 @@ func (u *UtilityContext) GetActorStatus(actorType typesUtil.ActorType, address [ return status, nil } -func (u *UtilityContext) GetMinimumStake(actorType typesUtil.ActorType) (*big.Int, typesUtil.Error) { +func (u *UtilityContext) GetMinimumStake(actorType coreTypes.ActorType) (*big.Int, typesUtil.Error) { store, height, err := u.GetStoreAndHeight() if err != nil { return nil, err @@ -247,13 +248,13 @@ func (u *UtilityContext) GetMinimumStake(actorType typesUtil.ActorType) (*big.In var paramName string switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: paramName = typesUtil.AppMinimumStakeParamName - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: paramName = typesUtil.FishermanMinimumStakeParamName - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: paramName = typesUtil.ServiceNodeMinimumStakeParamName - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: paramName = typesUtil.ValidatorMinimumStakeParamName default: return nil, typesUtil.ErrUnknownActorType(actorType.String()) @@ -267,7 +268,7 @@ func (u *UtilityContext) GetMinimumStake(actorType typesUtil.ActorType) (*big.In return typesUtil.StringToBigInt(minStake) } -func (u *UtilityContext) GetStakeAmount(actorType typesUtil.ActorType, address []byte) (*big.Int, typesUtil.Error) { +func (u *UtilityContext) GetStakeAmount(actorType coreTypes.ActorType, address []byte) (*big.Int, typesUtil.Error) { var stakeAmount string store, height, er := u.GetStoreAndHeight() if er != nil { @@ -276,13 +277,13 @@ func (u *UtilityContext) GetStakeAmount(actorType typesUtil.ActorType, address [ var err error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: stakeAmount, err = store.GetAppStakeAmount(height, address) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: stakeAmount, err = store.GetFishermanStakeAmount(height, address) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: stakeAmount, err = store.GetServiceNodeStakeAmount(height, address) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: stakeAmount, err = store.GetValidatorStakeAmount(height, address) default: err = typesUtil.ErrUnknownActorType(actorType.String()) @@ -295,7 +296,7 @@ func (u *UtilityContext) GetStakeAmount(actorType typesUtil.ActorType, address [ return typesUtil.StringToBigInt(stakeAmount) } -func (u *UtilityContext) GetUnstakingHeight(actorType typesUtil.ActorType) (unstakingHeight int64, err typesUtil.Error) { +func (u *UtilityContext) GetUnstakingHeight(actorType coreTypes.ActorType) (unstakingHeight int64, err typesUtil.Error) { store, height, err := u.GetStoreAndHeight() if err != nil { return 0, err @@ -304,13 +305,13 @@ func (u *UtilityContext) GetUnstakingHeight(actorType typesUtil.ActorType) (unst var paramName string var unstakingBlocks int switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: paramName = typesUtil.AppUnstakingBlocksParamName - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: paramName = typesUtil.FishermanUnstakingBlocksParamName - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: paramName = typesUtil.ServiceNodeUnstakingBlocksParamName - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: paramName = typesUtil.ValidatorUnstakingBlocksParamName default: return 0, typesUtil.ErrUnknownActorType(actorType.String()) @@ -325,7 +326,7 @@ func (u *UtilityContext) GetUnstakingHeight(actorType typesUtil.ActorType) (unst return u.CalculateUnstakingHeight(int64(unstakingBlocks)) } -func (u *UtilityContext) GetMaxChains(actorType typesUtil.ActorType) (maxChains int, err typesUtil.Error) { +func (u *UtilityContext) GetMaxChains(actorType coreTypes.ActorType) (maxChains int, err typesUtil.Error) { store, height, err := u.GetStoreAndHeight() if err != nil { return 0, err @@ -333,11 +334,11 @@ func (u *UtilityContext) GetMaxChains(actorType typesUtil.ActorType) (maxChains var paramName string switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: paramName = typesUtil.AppMaxChainsParamName - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: paramName = typesUtil.FishermanMaxChainsParamName - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: paramName = typesUtil.ServiceNodeMaxChainsParamName default: return 0, typesUtil.ErrUnknownActorType(actorType.String()) @@ -352,7 +353,7 @@ func (u *UtilityContext) GetMaxChains(actorType typesUtil.ActorType) (maxChains return } -func (u *UtilityContext) GetActorExists(actorType typesUtil.ActorType, address []byte) (bool, typesUtil.Error) { +func (u *UtilityContext) GetActorExists(actorType coreTypes.ActorType, address []byte) (bool, typesUtil.Error) { store, height, er := u.GetStoreAndHeight() if er != nil { return false, er @@ -361,13 +362,13 @@ func (u *UtilityContext) GetActorExists(actorType typesUtil.ActorType, address [ var exists bool var err error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: exists, err = store.GetAppExists(address, height) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: exists, err = store.GetFishermanExists(address, height) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: exists, err = store.GetServiceNodeExists(address, height) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: exists, err = store.GetValidatorExists(address, height) default: return false, typesUtil.ErrUnknownActorType(actorType.String()) @@ -380,7 +381,7 @@ func (u *UtilityContext) GetActorExists(actorType typesUtil.ActorType, address [ return exists, nil } -func (u *UtilityContext) GetActorOutputAddress(actorType typesUtil.ActorType, operator []byte) (output []byte, err typesUtil.Error) { +func (u *UtilityContext) GetActorOutputAddress(actorType coreTypes.ActorType, operator []byte) (output []byte, err typesUtil.Error) { store, height, err := u.GetStoreAndHeight() if err != nil { return nil, err @@ -388,13 +389,13 @@ func (u *UtilityContext) GetActorOutputAddress(actorType typesUtil.ActorType, op var er error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: output, er = store.GetAppOutputAddress(operator, height) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: output, er = store.GetFishermanOutputAddress(operator, height) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: output, er = store.GetServiceNodeOutputAddress(operator, height) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: output, er = store.GetValidatorOutputAddress(operator, height) default: er = typesUtil.ErrUnknownActorType(actorType.String()) @@ -409,7 +410,7 @@ func (u *UtilityContext) GetActorOutputAddress(actorType typesUtil.ActorType, op // calculators -func (u *UtilityContext) BurnActor(actorType typesUtil.ActorType, percentage int, address []byte) typesUtil.Error { +func (u *UtilityContext) BurnActor(actorType coreTypes.ActorType, percentage int, address []byte) typesUtil.Error { tokens, err := u.GetActorStakedTokens(actorType, address) if err != nil { return err @@ -424,7 +425,7 @@ func (u *UtilityContext) BurnActor(actorType typesUtil.ActorType, percentage int } newTokensAfterBurn := big.NewInt(0).Sub(tokens, truncatedTokens) // remove from pool - if err := u.SubPoolAmount(typesUtil.PoolNames_ValidatorStakePool.String(), typesUtil.BigIntToString(truncatedTokens)); err != nil { + if err := u.SubPoolAmount(coreTypes.Pools_POOLS_VALIDATOR_STAKE.FriendlyName(), typesUtil.BigIntToString(truncatedTokens)); err != nil { return err } // remove from actor @@ -487,7 +488,7 @@ func (u *UtilityContext) CalculateAppRelays(stakedTokens string) (string, typesU return typesUtil.BigIntToString(result), nil } -func (u *UtilityContext) CheckAboveMinStake(actorType typesUtil.ActorType, amount string) (a *big.Int, err typesUtil.Error) { +func (u *UtilityContext) CheckAboveMinStake(actorType coreTypes.ActorType, amount string) (a *big.Int, err typesUtil.Error) { minStake, er := u.GetMinimumStake(actorType) if er != nil { return nil, er @@ -502,9 +503,10 @@ func (u *UtilityContext) CheckAboveMinStake(actorType typesUtil.ActorType, amoun return // for convenience this returns amount as a big.Int } -func (u *UtilityContext) CheckBelowMaxChains(actorType typesUtil.ActorType, chains []string) typesUtil.Error { +func (u *UtilityContext) CheckBelowMaxChains(actorType coreTypes.ActorType, chains []string) typesUtil.Error { // validators don't have chains field - if actorType == typesUtil.ActorType_Validator { + + if actorType == coreTypes.ActorType_ACTOR_TYPE_VAL { return nil } diff --git a/utility/block.go b/utility/block.go index a97b2cdbb..970ef2e6c 100644 --- a/utility/block.go +++ b/utility/block.go @@ -4,6 +4,7 @@ import ( "log" "math/big" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/modules" typesUtil "github.com/pokt-network/pocket/utility/types" ) @@ -193,7 +194,7 @@ func (u *UtilityContext) HandleByzantineValidators(lastBlockByzantineValidators if err != nil { return err } - if err = u.BurnActor(typesUtil.ActorType_Validator, burnPercentage, address); err != nil { + if err = u.BurnActor(coreTypes.ActorType_ACTOR_TYPE_VAL, burnPercentage, address); err != nil { return err } } else if err := u.SetValidatorMissedBlocks(address, numberOfMissedBlocks); err != nil { @@ -210,24 +211,24 @@ func (u *UtilityContext) UnstakeActorsThatAreReady() (err typesUtil.Error) { if err != nil { return err } - for _, actorTypeInt32 := range typesUtil.ActorType_value { + for _, actorTypeInt32 := range coreTypes.ActorType_value { var readyToUnstake []modules.IUnstakingActor - actorType := typesUtil.ActorType(actorTypeInt32) + actorType := coreTypes.ActorType(actorTypeInt32) var poolName string switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: readyToUnstake, er = store.GetAppsReadyToUnstake(latestHeight, int32(typesUtil.StakeStatus_Unstaking)) - poolName = typesUtil.PoolNames_AppStakePool.String() - case typesUtil.ActorType_Fisherman: + poolName = coreTypes.Pools_POOLS_APP_STAKE.FriendlyName() + case coreTypes.ActorType_ACTOR_TYPE_FISH: readyToUnstake, er = store.GetFishermenReadyToUnstake(latestHeight, int32(typesUtil.StakeStatus_Unstaking)) - poolName = typesUtil.PoolNames_FishermanStakePool.String() - case typesUtil.ActorType_ServiceNode: + poolName = coreTypes.Pools_POOLS_FISHERMAN_STAKE.FriendlyName() + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: readyToUnstake, er = store.GetServiceNodesReadyToUnstake(latestHeight, int32(typesUtil.StakeStatus_Unstaking)) - poolName = typesUtil.PoolNames_ServiceNodeStakePool.String() - case typesUtil.ActorType_Validator: + poolName = coreTypes.Pools_POOLS_SERVICE_NODE_STAKE.FriendlyName() + case coreTypes.ActorType_ACTOR_TYPE_VAL: readyToUnstake, er = store.GetValidatorsReadyToUnstake(latestHeight, int32(typesUtil.StakeStatus_Unstaking)) - poolName = typesUtil.PoolNames_ValidatorStakePool.String() - case typesUtil.ActorType_Undefined: + poolName = coreTypes.Pools_POOLS_VALIDATOR_STAKE.FriendlyName() + case coreTypes.ActorType_ACTOR_TYPE_UNSPECIFIED: continue } if er != nil { @@ -250,9 +251,9 @@ func (u *UtilityContext) BeginUnstakingMaxPaused() (err typesUtil.Error) { if err != nil { return err } - for _, actorTypeInt32 := range typesUtil.ActorType_value { - actorType := typesUtil.ActorType(actorTypeInt32) - if actorType == typesUtil.ActorType_Undefined { + for _, actorTypeInt32 := range coreTypes.ActorType_value { + actorType := coreTypes.ActorType(actorTypeInt32) + if actorType == coreTypes.ActorType_ACTOR_TYPE_UNSPECIFIED { continue } maxPausedBlocks, err := u.GetMaxPausedBlocks(actorType) @@ -271,7 +272,7 @@ func (u *UtilityContext) BeginUnstakingMaxPaused() (err typesUtil.Error) { return nil } -func (u *UtilityContext) UnstakeActorPausedBefore(pausedBeforeHeight int64, ActorType typesUtil.ActorType) (err typesUtil.Error) { +func (u *UtilityContext) UnstakeActorPausedBefore(pausedBeforeHeight int64, ActorType coreTypes.ActorType) (err typesUtil.Error) { var er error store := u.Store() unstakingHeight, err := u.GetUnstakingHeight(ActorType) @@ -279,13 +280,13 @@ func (u *UtilityContext) UnstakeActorPausedBefore(pausedBeforeHeight int64, Acto return err } switch ActorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: er = store.SetAppStatusAndUnstakingHeightIfPausedBefore(pausedBeforeHeight, unstakingHeight, int32(typesUtil.StakeStatus_Unstaking)) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: er = store.SetFishermanStatusAndUnstakingHeightIfPausedBefore(pausedBeforeHeight, unstakingHeight, int32(typesUtil.StakeStatus_Unstaking)) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: er = store.SetServiceNodeStatusAndUnstakingHeightIfPausedBefore(pausedBeforeHeight, unstakingHeight, int32(typesUtil.StakeStatus_Unstaking)) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: er = store.SetValidatorsStatusAndUnstakingHeightIfPausedBefore(pausedBeforeHeight, unstakingHeight, int32(typesUtil.StakeStatus_Unstaking)) } if er != nil { @@ -295,7 +296,7 @@ func (u *UtilityContext) UnstakeActorPausedBefore(pausedBeforeHeight int64, Acto } func (u *UtilityContext) HandleProposalRewards(proposer []byte) typesUtil.Error { - feePoolName := typesUtil.PoolNames_FeeCollector.String() + feePoolName := coreTypes.Pools_POOLS_FEE_COLLECTOR.FriendlyName() feesAndRewardsCollected, err := u.GetPoolAmount(feePoolName) if err != nil { return err @@ -319,7 +320,7 @@ func (u *UtilityContext) HandleProposalRewards(proposer []byte) typesUtil.Error if err = u.AddAccountAmount(proposer, amountToProposer); err != nil { return err } - if err = u.AddPoolAmount(typesUtil.PoolNames_DAO.String(), amountToDAO); err != nil { + if err = u.AddPoolAmount(coreTypes.Pools_POOLS_DAO.FriendlyName(), amountToDAO); err != nil { return err } return nil diff --git a/utility/doc/CHANGELOG.md b/utility/doc/CHANGELOG.md index 563e73c91..e16aea9d3 100644 --- a/utility/doc/CHANGELOG.md +++ b/utility/doc/CHANGELOG.md @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.15] - 2023-01-03 + +- Renamed enum names as per code-review +- Using defaults from `test_artifacts` for tests +- Updated tests to reflect the above changes + +## [0.0.0.14] - 2022-12-21 + +- Updated to use the new centralized config and genesis handling +- Updated to use the new `Actor` struct under `coreTypes` +- Updated tests and mocks + ## [0.0.0.13] - 2022-12-10 - Introduce `SetProposalBlock` and local vars to keep proposal state diff --git a/utility/gov.go b/utility/gov.go index f830cc7a9..0b5991d2e 100644 --- a/utility/gov.go +++ b/utility/gov.go @@ -4,6 +4,7 @@ import ( "log" "math/big" + coreTypes "github.com/pokt-network/pocket/shared/core/types" typesUtil "github.com/pokt-network/pocket/utility/types" "google.golang.org/protobuf/types/known/wrapperspb" ) @@ -487,7 +488,7 @@ func (u *UtilityContext) GetParamOwner(paramName string) ([]byte, error) { } } -func (u *UtilityContext) GetFee(msg typesUtil.Message, actorType typesUtil.ActorType) (amount *big.Int, err typesUtil.Error) { +func (u *UtilityContext) GetFee(msg typesUtil.Message, actorType coreTypes.ActorType) (amount *big.Int, err typesUtil.Error) { switch x := msg.(type) { case *typesUtil.MessageDoubleSign: return u.GetMessageDoubleSignFee() @@ -495,52 +496,52 @@ func (u *UtilityContext) GetFee(msg typesUtil.Message, actorType typesUtil.Actor return u.GetMessageSendFee() case *typesUtil.MessageStake: switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: return u.GetMessageStakeAppFee() - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: return u.GetMessageStakeFishermanFee() - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: return u.GetMessageStakeServiceNodeFee() - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: return u.GetMessageStakeValidatorFee() default: return nil, typesUtil.ErrUnknownActorType(actorType.String()) } case *typesUtil.MessageEditStake: switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: return u.GetMessageEditStakeAppFee() - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: return u.GetMessageEditStakeFishermanFee() - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: return u.GetMessageEditStakeServiceNodeFee() - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: return u.GetMessageEditStakeValidatorFee() default: return nil, typesUtil.ErrUnknownActorType(actorType.String()) } case *typesUtil.MessageUnstake: switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: return u.GetMessageUnstakeAppFee() - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: return u.GetMessageUnstakeFishermanFee() - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: return u.GetMessageUnstakeServiceNodeFee() - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: return u.GetMessageUnstakeValidatorFee() default: return nil, typesUtil.ErrUnknownActorType(actorType.String()) } case *typesUtil.MessageUnpause: switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: return u.GetMessageUnpauseAppFee() - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: return u.GetMessageUnpauseFishermanFee() - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: return u.GetMessageUnpauseServiceNodeFee() - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: return u.GetMessageUnpauseValidatorFee() default: return nil, typesUtil.ErrUnknownActorType(actorType.String()) diff --git a/utility/module.go b/utility/module.go index bf6941fe5..1fece8f73 100644 --- a/utility/module.go +++ b/utility/module.go @@ -4,6 +4,7 @@ import ( "fmt" "log" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/shared/codec" "github.com/pokt-network/pocket/shared/modules" "github.com/pokt-network/pocket/utility/types" @@ -11,12 +12,11 @@ import ( ) var _ modules.UtilityModule = &utilityModule{} -var _ modules.UtilityConfig = &types.UtilityConfig{} var _ modules.Module = &utilityModule{} type utilityModule struct { bus modules.Bus - config modules.UtilityConfig + config *configs.UtilityConfig Mempool types.Mempool } @@ -32,17 +32,11 @@ func Create(runtime modules.RuntimeMgr) (modules.Module, error) { } func (*utilityModule) Create(runtime modules.RuntimeMgr) (modules.Module, error) { - var m *utilityModule - - cfg := runtime.GetConfig() - if err := m.ValidateConfig(cfg); err != nil { - return nil, fmt.Errorf("config validation failed: %w", err) - } - utilityCfg := cfg.GetUtilityConfig() + utilityCfg := runtime.GetConfig().Utility return &utilityModule{ config: utilityCfg, - Mempool: types.NewMempool(utilityCfg.GetMaxMempoolTransactionBytes(), utilityCfg.GetMaxMempoolTransactions()), + Mempool: types.NewMempool(utilityCfg.MaxMempoolTransactionBytes, utilityCfg.MaxMempoolTransactions), }, nil } @@ -69,11 +63,6 @@ func (u *utilityModule) GetBus() modules.Bus { return u.bus } -func (*utilityModule) ValidateConfig(cfg modules.Config) error { - // TODO (#334): implement this - return nil -} - func (u *utilityModule) HandleMessage(message *anypb.Any) error { switch message.MessageName() { case TransactionGossipMessageContentType: diff --git a/utility/session.go b/utility/session.go index 11f2bc3b9..b6823f3cf 100644 --- a/utility/session.go +++ b/utility/session.go @@ -3,19 +3,20 @@ package utility import ( "encoding/binary" "encoding/hex" + + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" - "github.com/pokt-network/pocket/shared/modules" "github.com/pokt-network/pocket/utility/types" ) type Session interface { - NewSession(sessionHeight int64, blockHash string, geoZone GeoZone, relayChain RelayChain, application modules.Actor) (Session, types.Error) - GetServiceNodes() []modules.Actor // the ServiceNodes providing Web3 to the application - GetFishermen() []modules.Actor // the Fishermen monitoring the serviceNodes - GetApplication() modules.Actor // the Application consuming the web3 access - GetRelayChain() RelayChain // the chain identifier of the web3 - GetGeoZone() GeoZone // the geolocation zone where all are registered - GetSessionHeight() int64 // the block height when the session started + NewSession(sessionHeight int64, blockHash string, geoZone GeoZone, relayChain RelayChain, application *coreTypes.Actor) (Session, types.Error) + GetServiceNodes() []*coreTypes.Actor // the ServiceNodes providing Web3 to the application + GetFishermen() []*coreTypes.Actor // the Fishermen monitoring the serviceNodes + GetApplication() *coreTypes.Actor // the Application consuming the web3 access + GetRelayChain() RelayChain // the chain identifier of the web3 + GetGeoZone() GeoZone // the geolocation zone where all are registered + GetSessionHeight() int64 // the block height when the session started } type RelayChain Identifier @@ -30,9 +31,9 @@ type Identifier interface { var _ Session = &session{} type session struct { - serviceNodes []modules.Actor - fishermen []modules.Actor - application modules.Actor + serviceNodes []*coreTypes.Actor + fishermen []*coreTypes.Actor + application *coreTypes.Actor relayChain RelayChain geoZone GeoZone blockHash string @@ -40,7 +41,7 @@ type session struct { sessionHeight int64 } -func (s *session) NewSession(sessionHeight int64, blockHash string, geoZone GeoZone, relayChain RelayChain, application modules.Actor) (session Session, err types.Error) { +func (s *session) NewSession(sessionHeight int64, blockHash string, geoZone GeoZone, relayChain RelayChain, application *coreTypes.Actor) (session Session, err types.Error) { s.sessionHeight = sessionHeight s.blockHash = blockHash s.geoZone = geoZone @@ -77,7 +78,7 @@ func (s *session) sessionKey() ([]byte, types.Error) { // - staked within geo-zone // - staked for relay-chain // 2) calls `pseudoRandomSelection(serviceNodes, numberOfNodesPerSession)` -func (s *session) findClosestXServiceNodes() []modules.Actor { +func (s *session) findClosestXServiceNodes() []*coreTypes.Actor { // IMPORTANT: // THIS IS A DEMONSTRABLE FUNCTION THAT WILL NOT BE IMPLEMENTED AS SUCH // IT EXISTS IN THIS COMMIT PURELY TO COMMUNICATE THE EXPECTED BEHAVIOR @@ -90,7 +91,7 @@ func (s *session) findClosestXServiceNodes() []modules.Actor { // - staked within geo-zone // - staked for relay-chain // 2) calls `pseudoRandomSelection(fishermen, numberOfFishPerSession)` -func (s *session) findClosestYFishermen() []modules.Actor { +func (s *session) findClosestYFishermen() []*coreTypes.Actor { // IMPORTANT: // THIS IS A DEMONSTRABLE FUNCTION THAT WILL NOT BE IMPLEMENTED AS SUCH // IT EXISTS IN THIS COMMIT PURELY TO COMMUNICATE THE EXPECTED BEHAVIOR @@ -105,22 +106,22 @@ func (s *session) findClosestYFishermen() []modules.Actor { // Q) why do we hash to find a newKey between every actor selection? // A) pseudo-random selection only works if each iteration is re-randomized // or it would be subject to lexicographical proximity bias attacks -func (s *session) pseudoRandomSelection(orderedListOfPublicKeys []string, numberOfActorsInSession int) []modules.Actor { +func (s *session) pseudoRandomSelection(orderedListOfPublicKeys []string, numberOfActorsInSession int) []*coreTypes.Actor { // IMPORTANT: // THIS IS A DEMONSTRABLE FUNCTION THAT WILL NOT BE IMPLEMENTED AS SUCH // IT EXISTS IN THIS COMMIT PURELY TO COMMUNICATE THE EXPECTED BEHAVIOR return nil } -func (s *session) GetServiceNodes() []modules.Actor { +func (s *session) GetServiceNodes() []*coreTypes.Actor { return s.serviceNodes } -func (s *session) GetFishermen() []modules.Actor { +func (s *session) GetFishermen() []*coreTypes.Actor { return s.fishermen } -func (s *session) GetApplication() modules.Actor { +func (s *session) GetApplication() *coreTypes.Actor { return s.application } diff --git a/utility/test/account_test.go b/utility/test/account_test.go index 8a825dab7..6c8bccbc1 100644 --- a/utility/test/account_test.go +++ b/utility/test/account_test.go @@ -7,8 +7,8 @@ import ( "testing" "github.com/pokt-network/pocket/runtime/test_artifacts" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" - "github.com/pokt-network/pocket/shared/modules" "github.com/pokt-network/pocket/utility" "github.com/pokt-network/pocket/utility/types" "github.com/stretchr/testify/require" @@ -219,7 +219,7 @@ func TestUtilityContext_SubtractAccountAmount(t *testing.T) { test_artifacts.CleanupTest(ctx) } -func GetAllTestingAccounts(t *testing.T, ctx utility.UtilityContext) []modules.Account { +func GetAllTestingAccounts(t *testing.T, ctx utility.UtilityContext) []*coreTypes.Account { accs, err := (ctx.Context.PersistenceRWContext).GetAllAccounts(0) require.NoError(t, err) sort.Slice(accs, func(i, j int) bool { @@ -228,7 +228,7 @@ func GetAllTestingAccounts(t *testing.T, ctx utility.UtilityContext) []modules.A return accs } -func GetAllTestingPools(t *testing.T, ctx utility.UtilityContext) []modules.Account { +func GetAllTestingPools(t *testing.T, ctx utility.UtilityContext) []*coreTypes.Account { accs, err := (ctx.Context.PersistenceRWContext).GetAllPools(0) require.NoError(t, err) sort.Slice(accs, func(i, j int) bool { diff --git a/utility/test/actor_test.go b/utility/test/actor_test.go index adb9361b3..e3db7f974 100644 --- a/utility/test/actor_test.go +++ b/utility/test/actor_test.go @@ -8,10 +8,9 @@ import ( "sort" "testing" - "github.com/pokt-network/pocket/runtime/defaults" "github.com/pokt-network/pocket/runtime/test_artifacts" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" - "github.com/pokt-network/pocket/shared/modules" "github.com/pokt-network/pocket/utility" typesUtil "github.com/pokt-network/pocket/utility/types" "github.com/stretchr/testify/require" @@ -32,13 +31,13 @@ func TestUtilityContext_HandleMessageStake(t *testing.T) { outputAddress, err := crypto.GenerateAddress() require.NoError(t, err) - err = ctx.SetAccountAmount(outputAddress, defaults.DefaultAccountAmount) + err = ctx.SetAccountAmount(outputAddress, test_artifacts.DefaultAccountAmount) require.NoError(t, err, "error setting account amount error") msg := &typesUtil.MessageStake{ PublicKey: pubKey.Bytes(), - Chains: defaults.DefaultChains, - Amount: defaults.DefaultStakeAmountString, + Chains: test_artifacts.DefaultChains, + Amount: test_artifacts.DefaultStakeAmountString, ServiceUrl: "https://localhost.com", OutputAddress: outputAddress, Signer: outputAddress, @@ -51,11 +50,11 @@ func TestUtilityContext_HandleMessageStake(t *testing.T) { actor := getActorByAddr(t, ctx, actorType, pubKey.Address().String()) require.Equal(t, actor.GetAddress(), pubKey.Address().String(), "incorrect actor address") - if actorType != typesUtil.ActorType_Validator { + if actorType != coreTypes.ActorType_ACTOR_TYPE_VAL { require.Equal(t, msg.Chains, actor.GetChains(), "incorrect actor chains") } require.Equal(t, typesUtil.HeightNotUsed, actor.GetPausedHeight(), "incorrect actor height") - require.Equal(t, defaults.DefaultStakeAmountString, actor.GetStakedAmount(), "incorrect actor stake amount") + require.Equal(t, test_artifacts.DefaultStakeAmountString, actor.GetStakedAmount(), "incorrect actor stake amount") require.Equal(t, typesUtil.HeightNotUsed, actor.GetUnstakingHeight(), "incorrect actor unstaking height") require.Equal(t, outputAddress.String(), actor.GetOutput(), "incorrect actor output address") @@ -76,8 +75,8 @@ func TestUtilityContext_HandleMessageEditStake(t *testing.T) { msg := &typesUtil.MessageEditStake{ Address: addrBz, - Chains: defaults.DefaultChains, - Amount: defaults.DefaultStakeAmountString, + Chains: test_artifacts.DefaultChains, + Amount: test_artifacts.DefaultStakeAmountString, Signer: addrBz, ActorType: actorType, } @@ -88,13 +87,13 @@ func TestUtilityContext_HandleMessageEditStake(t *testing.T) { require.NoError(t, err, "handle edit stake message") actor = getActorByAddr(t, ctx, actorType, addr) - if actorType != typesUtil.ActorType_Validator { + if actorType != coreTypes.ActorType_ACTOR_TYPE_VAL { require.Equal(t, msgChainsEdited.Chains, actor.GetChains(), "incorrect edited chains") } - require.Equal(t, defaults.DefaultStakeAmountString, actor.GetStakedAmount(), "incorrect staked tokens") + require.Equal(t, test_artifacts.DefaultStakeAmountString, actor.GetStakedAmount(), "incorrect staked tokens") require.Equal(t, typesUtil.HeightNotUsed, actor.GetUnstakingHeight(), "incorrect unstaking height") - amountEdited := defaults.DefaultAccountAmount.Add(defaults.DefaultAccountAmount, big.NewInt(1)) + amountEdited := test_artifacts.DefaultAccountAmount.Add(test_artifacts.DefaultAccountAmount, big.NewInt(1)) amountEditedString := typesUtil.BigIntToString(amountEdited) msgAmountEdited := proto.Clone(msg).(*typesUtil.MessageEditStake) msgAmountEdited.Amount = amountEditedString @@ -114,13 +113,13 @@ func TestUtilityContext_HandleMessageUnpause(t *testing.T) { var err error switch actorType { - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: err = ctx.Context.SetParam(typesUtil.ValidatorMinimumPauseBlocksParamName, 0) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: err = ctx.Context.SetParam(typesUtil.ServiceNodeMinimumPauseBlocksParamName, 0) - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: err = ctx.Context.SetParam(typesUtil.AppMinimumPauseBlocksParamName, 0) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: err = ctx.Context.SetParam(typesUtil.FishermanMinimumPauseBlocksParamName, 0) default: t.Fatalf("unexpected actor type %s", actorType.String()) @@ -162,13 +161,13 @@ func TestUtilityContext_HandleMessageUnstake(t *testing.T) { var err error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: err = ctx.Context.SetParam(typesUtil.AppMinimumPauseBlocksParamName, 0) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: err = ctx.Context.SetParam(typesUtil.ValidatorMinimumPauseBlocksParamName, 0) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: err = ctx.Context.SetParam(typesUtil.FishermanMinimumPauseBlocksParamName, 0) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: err = ctx.Context.SetParam(typesUtil.ServiceNodeMinimumPauseBlocksParamName, 0) default: t.Fatalf("unexpected actor type %s", actorType.String()) @@ -207,13 +206,13 @@ func TestUtilityContext_BeginUnstakingMaxPaused(t *testing.T) { require.NoError(t, err) switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: err = ctx.Context.SetParam(typesUtil.AppMaxPauseBlocksParamName, 0) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: err = ctx.Context.SetParam(typesUtil.ValidatorMaxPausedBlocksParamName, 0) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: err = ctx.Context.SetParam(typesUtil.FishermanMaxPauseBlocksParamName, 0) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: err = ctx.Context.SetParam(typesUtil.ServiceNodeMaxPauseBlocksParamName, 0) default: t.Fatalf("unexpected actor type %s", actorType.String()) @@ -237,7 +236,7 @@ func TestUtilityContext_BeginUnstakingMaxPaused(t *testing.T) { func TestUtilityContext_CalculateMaxAppRelays(t *testing.T) { ctx := NewTestingUtilityContext(t, 1) - actor := getFirstActor(t, ctx, typesUtil.ActorType_App) + actor := getFirstActor(t, ctx, coreTypes.ActorType_ACTOR_TYPE_APP) newMaxRelays, err := ctx.CalculateAppRelays(actor.GetStakedAmount()) require.NoError(t, err) require.Equal(t, actor.GetGenericParam(), newMaxRelays) @@ -251,13 +250,13 @@ func TestUtilityContext_CalculateUnstakingHeight(t *testing.T) { var unstakingBlocks int64 var err error switch actorType { - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: unstakingBlocks, err = ctx.GetValidatorUnstakingBlocks() - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: unstakingBlocks, err = ctx.GetServiceNodeUnstakingBlocks() - case actorType: + case coreTypes.ActorType_ACTOR_TYPE_APP: unstakingBlocks, err = ctx.GetAppUnstakingBlocks() - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: unstakingBlocks, err = ctx.GetFishermanUnstakingBlocks() default: t.Fatalf("unexpected actor type %s", actorType.String()) @@ -355,8 +354,8 @@ func TestUtilityContext_GetMessageEditStakeSignerCandidates(t *testing.T) { msgEditStake := &typesUtil.MessageEditStake{ Address: addrBz, - Chains: defaults.DefaultChains, - Amount: defaults.DefaultStakeAmountString, + Chains: test_artifacts.DefaultChains, + Amount: test_artifacts.DefaultStakeAmountString, ActorType: actorType, } candidates, err := ctx.GetMessageEditStakeSignerCandidates(msgEditStake) @@ -438,13 +437,13 @@ func TestUtilityContext_UnstakePausedBefore(t *testing.T) { var er error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: er = ctx.Context.SetParam(typesUtil.AppMaxPauseBlocksParamName, 0) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: er = ctx.Context.SetParam(typesUtil.ValidatorMaxPausedBlocksParamName, 0) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: er = ctx.Context.SetParam(typesUtil.FishermanMaxPauseBlocksParamName, 0) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: er = ctx.Context.SetParam(typesUtil.ServiceNodeMaxPauseBlocksParamName, 0) default: t.Fatalf("unexpected actor type %s", actorType.String()) @@ -462,13 +461,13 @@ func TestUtilityContext_UnstakePausedBefore(t *testing.T) { var unstakingBlocks int64 switch actorType { - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: unstakingBlocks, err = ctx.GetValidatorUnstakingBlocks() - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: unstakingBlocks, err = ctx.GetServiceNodeUnstakingBlocks() - case actorType: + case coreTypes.ActorType_ACTOR_TYPE_APP: unstakingBlocks, err = ctx.GetAppUnstakingBlocks() - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: unstakingBlocks, err = ctx.GetFishermanUnstakingBlocks() default: t.Fatalf("unexpected actor type %s", actorType.String()) @@ -488,14 +487,14 @@ func TestUtilityContext_UnstakeActorsThatAreReady(t *testing.T) { var poolName string switch actorType { - case typesUtil.ActorType_App: - poolName = typesUtil.PoolNames_AppStakePool.String() - case typesUtil.ActorType_Validator: - poolName = typesUtil.PoolNames_ValidatorStakePool.String() - case typesUtil.ActorType_Fisherman: - poolName = typesUtil.PoolNames_FishermanStakePool.String() - case typesUtil.ActorType_ServiceNode: - poolName = typesUtil.PoolNames_ServiceNodeStakePool.String() + case coreTypes.ActorType_ACTOR_TYPE_APP: + poolName = coreTypes.Pools_POOLS_APP_STAKE.FriendlyName() + case coreTypes.ActorType_ACTOR_TYPE_VAL: + poolName = coreTypes.Pools_POOLS_VALIDATOR_STAKE.FriendlyName() + case coreTypes.ActorType_ACTOR_TYPE_FISH: + poolName = coreTypes.Pools_POOLS_FISHERMAN_STAKE.FriendlyName() + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: + poolName = coreTypes.Pools_POOLS_SERVICE_NODE_STAKE.FriendlyName() default: t.Fatalf("unexpected actor type %s", actorType.String()) } @@ -540,13 +539,13 @@ func TestUtilityContext_BeginUnstakingMaxPausedActors(t *testing.T) { var err error switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: err = ctx.Context.SetParam(typesUtil.AppMaxPauseBlocksParamName, 0) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: err = ctx.Context.SetParam(typesUtil.ValidatorMaxPausedBlocksParamName, 0) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: err = ctx.Context.SetParam(typesUtil.FishermanMaxPauseBlocksParamName, 0) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: err = ctx.Context.SetParam(typesUtil.ServiceNodeMaxPauseBlocksParamName, 0) default: t.Fatalf("unexpected actor type %s", actorType.String()) @@ -572,25 +571,25 @@ func TestUtilityContext_BeginUnstakingMaxPausedActors(t *testing.T) { // Helpers -func getAllTestingActors(t *testing.T, ctx utility.UtilityContext, actorType typesUtil.ActorType) (actors []modules.Actor) { - actors = make([]modules.Actor, 0) +func getAllTestingActors(t *testing.T, ctx utility.UtilityContext, actorType coreTypes.ActorType) (actors []*coreTypes.Actor) { + actors = make([]*coreTypes.Actor, 0) switch actorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: apps := getAllTestingApps(t, ctx) for _, a := range apps { actors = append(actors, a) } - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: nodes := getAllTestingNodes(t, ctx) for _, a := range nodes { actors = append(actors, a) } - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: vals := getAllTestingValidators(t, ctx) for _, a := range vals { actors = append(actors, a) } - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: fish := getAllTestingFish(t, ctx) for _, a := range fish { actors = append(actors, a) @@ -602,23 +601,23 @@ func getAllTestingActors(t *testing.T, ctx utility.UtilityContext, actorType typ return } -func getFirstActor(t *testing.T, ctx utility.UtilityContext, actorType typesUtil.ActorType) modules.Actor { +func getFirstActor(t *testing.T, ctx utility.UtilityContext, actorType coreTypes.ActorType) *coreTypes.Actor { return getAllTestingActors(t, ctx, actorType)[0] } -func getActorByAddr(t *testing.T, ctx utility.UtilityContext, actorType typesUtil.ActorType, addr string) (actor modules.Actor) { +func getActorByAddr(t *testing.T, ctx utility.UtilityContext, actorType coreTypes.ActorType, addr string) (actor *coreTypes.Actor) { actors := getAllTestingActors(t, ctx, actorType) - idx := slices.IndexFunc(actors, func(a modules.Actor) bool { return a.GetAddress() == addr }) + idx := slices.IndexFunc(actors, func(a *coreTypes.Actor) bool { return a.GetAddress() == addr }) return actors[idx] } -func getAllTestingApps(t *testing.T, ctx utility.UtilityContext) []modules.Actor { +func getAllTestingApps(t *testing.T, ctx utility.UtilityContext) []*coreTypes.Actor { actors, err := (ctx.Context.PersistenceRWContext).GetAllApps(ctx.Height) require.NoError(t, err) return actors } -func getAllTestingValidators(t *testing.T, ctx utility.UtilityContext) []modules.Actor { +func getAllTestingValidators(t *testing.T, ctx utility.UtilityContext) []*coreTypes.Actor { actors, err := (ctx.Context.PersistenceRWContext).GetAllValidators(ctx.Height) require.NoError(t, err) sort.Slice(actors, func(i, j int) bool { @@ -627,13 +626,13 @@ func getAllTestingValidators(t *testing.T, ctx utility.UtilityContext) []modules return actors } -func getAllTestingFish(t *testing.T, ctx utility.UtilityContext) []modules.Actor { +func getAllTestingFish(t *testing.T, ctx utility.UtilityContext) []*coreTypes.Actor { actors, err := (ctx.Context.PersistenceRWContext).GetAllFishermen(ctx.Height) require.NoError(t, err) return actors } -func getAllTestingNodes(t *testing.T, ctx utility.UtilityContext) []modules.Actor { +func getAllTestingNodes(t *testing.T, ctx utility.UtilityContext) []*coreTypes.Actor { actors, err := (ctx.Context.PersistenceRWContext).GetAllServiceNodes(ctx.Height) require.NoError(t, err) return actors diff --git a/utility/test/block_test.go b/utility/test/block_test.go index a0394f56a..043cc3d66 100644 --- a/utility/test/block_test.go +++ b/utility/test/block_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/pokt-network/pocket/runtime/test_artifacts" - typesUtil "github.com/pokt-network/pocket/utility/types" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/stretchr/testify/require" ) @@ -17,7 +17,7 @@ func TestUtilityContext_ApplyBlock(t *testing.T) { txBz, er := tx.Bytes() require.NoError(t, er) - proposer := getFirstActor(t, ctx, typesUtil.ActorType_Validator) + proposer := getFirstActor(t, ctx, coreTypes.ActorType_ACTOR_TYPE_VAL) addrBz, err := hex.DecodeString(proposer.GetAddress()) require.NoError(t, err) @@ -68,7 +68,7 @@ func TestUtilityContext_BeginBlock(t *testing.T) { ctx := NewTestingUtilityContext(t, 0) tx, _, _, _ := newTestingTransaction(t, ctx) - proposer := getFirstActor(t, ctx, typesUtil.ActorType_Validator) + proposer := getFirstActor(t, ctx, coreTypes.ActorType_ACTOR_TYPE_VAL) txBz, err := tx.Bytes() require.NoError(t, err) @@ -95,7 +95,7 @@ func TestUtilityContext_EndBlock(t *testing.T) { ctx := NewTestingUtilityContext(t, 0) tx, _, _, _ := newTestingTransaction(t, ctx) - proposer := getFirstActor(t, ctx, typesUtil.ActorType_Validator) + proposer := getFirstActor(t, ctx, coreTypes.ActorType_ACTOR_TYPE_VAL) txBz, err := tx.Bytes() require.NoError(t, err) diff --git a/utility/test/gov_test.go b/utility/test/gov_test.go index 42dacb8ed..40525c375 100644 --- a/utility/test/gov_test.go +++ b/utility/test/gov_test.go @@ -4,9 +4,9 @@ import ( "encoding/hex" "testing" + "github.com/pokt-network/pocket/runtime/genesis" "github.com/pokt-network/pocket/runtime/test_artifacts" "github.com/pokt-network/pocket/shared/codec" - "github.com/pokt-network/pocket/shared/modules" typesUtil "github.com/pokt-network/pocket/utility/types" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/wrapperspb" @@ -15,7 +15,7 @@ import ( // TODO : After we change the interface to pass param name, simply use reflection to // iterate over all the params and test them. Suggestion: [Google's go-cmp] (https://github.com/google/go-cmp) -func DefaultTestingParams(_ *testing.T) modules.Params { +func DefaultTestingParams(_ *testing.T) *genesis.Params { return test_artifacts.DefaultParams() } diff --git a/utility/test/module_test.go b/utility/test/module_test.go index 5edec96d5..76dc342d1 100644 --- a/utility/test/module_test.go +++ b/utility/test/module_test.go @@ -9,10 +9,10 @@ import ( "github.com/golang/mock/gomock" "github.com/pokt-network/pocket/persistence" - "github.com/pokt-network/pocket/persistence/types" "github.com/pokt-network/pocket/runtime" - "github.com/pokt-network/pocket/runtime/defaults" + "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/runtime/test_artifacts" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/messaging" "github.com/pokt-network/pocket/shared/modules" modulesMock "github.com/pokt-network/pocket/shared/modules/mocks" @@ -32,7 +32,7 @@ var ( defaultTestingChainsEdited = []string{"0002"} defaultUnstaking = int64(2017) - defaultNonceString = utilTypes.BigIntToString(defaults.DefaultAccountAmount) + defaultNonceString = utilTypes.BigIntToString(test_artifacts.DefaultAccountAmount) testNonce = "defaultNonceString" testSchema = "test_schema" @@ -42,11 +42,11 @@ var ( var testPersistenceMod modules.PersistenceModule // initialized in TestMain var testUtilityMod modules.UtilityModule // initialized in TestMain -var actorTypes = []utilTypes.ActorType{ - utilTypes.ActorType_App, - utilTypes.ActorType_ServiceNode, - utilTypes.ActorType_Fisherman, - utilTypes.ActorType_Validator, +var actorTypes = []coreTypes.ActorType{ + coreTypes.ActorType_ACTOR_TYPE_APP, + coreTypes.ActorType_ACTOR_TYPE_SERVICENODE, + coreTypes.ActorType_ACTOR_TYPE_FISH, + coreTypes.ActorType_ACTOR_TYPE_VAL, } func NewTestingMempool(_ *testing.T) utilTypes.Mempool { @@ -96,19 +96,19 @@ func NewTestingUtilityContext(t *testing.T, height int64) utility.UtilityContext } func newTestRuntimeConfig(databaseUrl string) *runtime.Manager { - cfg := runtime.NewConfig( - &runtime.BaseConfig{}, - runtime.WithPersistenceConfig(&types.PersistenceConfig{ + cfg := &configs.Config{ + Persistence: &configs.PersistenceConfig{ PostgresUrl: databaseUrl, NodeSchema: testSchema, BlockStorePath: "", TxIndexerPath: "", TreesStoreDir: "", - }), - runtime.WithUtilityConfig(&utilTypes.UtilityConfig{ + }, + Utility: &configs.UtilityConfig{ MaxMempoolTransactionBytes: 1000000, MaxMempoolTransactions: 1000, - })) + }, + } genesisState, _ := test_artifacts.NewGenesisState(5, 1, 1, 1) runtimeCfg := runtime.NewManager(cfg, genesisState) return runtimeCfg diff --git a/utility/test/transaction_test.go b/utility/test/transaction_test.go index 7aac18842..c8cd19d34 100644 --- a/utility/test/transaction_test.go +++ b/utility/test/transaction_test.go @@ -5,9 +5,9 @@ import ( "math/big" "testing" - "github.com/pokt-network/pocket/runtime/defaults" "github.com/pokt-network/pocket/runtime/test_artifacts" "github.com/pokt-network/pocket/shared/codec" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/utility" typesUtil "github.com/pokt-network/pocket/utility/types" @@ -101,7 +101,7 @@ func TestUtilityContext_CreateAndApplyBlock(t *testing.T) { ctx := NewTestingUtilityContext(t, 0) tx, _, _, _ := newTestingTransaction(t, ctx) - proposer := getFirstActor(t, ctx, typesUtil.ActorType_Validator) + proposer := getFirstActor(t, ctx, coreTypes.ActorType_ACTOR_TYPE_VAL) txBz, err := tx.Bytes() require.NoError(t, err) require.NoError(t, testUtilityMod.CheckTransaction(txBz)) @@ -147,7 +147,7 @@ func TestUtilityContext_HandleMessage(t *testing.T) { func newTestingTransaction(t *testing.T, ctx utility.UtilityContext) (transaction *typesUtil.Transaction, startingBalance, amountSent *big.Int, signer crypto.PrivateKey) { amountSent = new(big.Int).Set(defaultSendAmount) - startingBalance = new(big.Int).Set(defaults.DefaultAccountAmount) + startingBalance = new(big.Int).Set(test_artifacts.DefaultAccountAmount) recipientAddr, err := crypto.GenerateAddress() require.NoError(t, err) diff --git a/utility/transaction.go b/utility/transaction.go index 14fd84f55..a82bb68c8 100644 --- a/utility/transaction.go +++ b/utility/transaction.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "github.com/pokt-network/pocket/shared/codec" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/modules" typesUtil "github.com/pokt-network/pocket/utility/types" @@ -90,7 +91,7 @@ func (u *UtilityContext) AnteHandleMessage(tx *typesUtil.Transaction) (msg types if err := u.SetAccountAmount(address, accountAmount); err != nil { return nil, signer, err } - if err := u.AddPoolAmount(typesUtil.PoolNames_FeeCollector.String(), fee); err != nil { + if err := u.AddPoolAmount(coreTypes.Pools_POOLS_FEE_COLLECTOR.FriendlyName(), fee); err != nil { return nil, "", err } msg.SetSigner(address) @@ -183,24 +184,24 @@ func (u *UtilityContext) HandleStakeMessage(message *typesUtil.MessageStake) typ return err } // move funds from account to pool - if err = u.AddPoolAmount(typesUtil.PoolNames_AppStakePool.String(), amount); err != nil { + if err = u.AddPoolAmount(coreTypes.Pools_POOLS_APP_STAKE.FriendlyName(), amount); err != nil { return err } var er error store := u.Store() // insert actor switch message.ActorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: maxRelays, err := u.CalculateAppRelays(message.Amount) if err != nil { return err } er = store.InsertApp(publicKey.Address(), publicKey.Bytes(), message.OutputAddress, false, int32(typesUtil.StakeStatus_Staked), maxRelays, message.Amount, message.Chains, typesUtil.HeightNotUsed, typesUtil.HeightNotUsed) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: er = store.InsertFisherman(publicKey.Address(), publicKey.Bytes(), message.OutputAddress, false, int32(typesUtil.StakeStatus_Staked), message.ServiceUrl, message.Amount, message.Chains, typesUtil.HeightNotUsed, typesUtil.HeightNotUsed) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: er = store.InsertServiceNode(publicKey.Address(), publicKey.Bytes(), message.OutputAddress, false, int32(typesUtil.StakeStatus_Staked), message.ServiceUrl, message.Amount, message.Chains, typesUtil.HeightNotUsed, typesUtil.HeightNotUsed) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: er = store.InsertValidator(publicKey.Address(), publicKey.Bytes(), message.OutputAddress, false, int32(typesUtil.StakeStatus_Staked), message.ServiceUrl, message.Amount, typesUtil.HeightNotUsed, typesUtil.HeightNotUsed) } if er != nil { @@ -247,23 +248,23 @@ func (u *UtilityContext) HandleEditStakeMessage(message *typesUtil.MessageEditSt return err } // move funds from account to pool - if err := u.AddPoolAmount(typesUtil.PoolNames_AppStakePool.String(), amount); err != nil { + if err := u.AddPoolAmount(coreTypes.Pools_POOLS_APP_STAKE.FriendlyName(), amount); err != nil { return err } store := u.Store() var er error switch message.ActorType { - case typesUtil.ActorType_App: + case coreTypes.ActorType_ACTOR_TYPE_APP: maxRelays, err := u.CalculateAppRelays(message.Amount) if err != nil { return err } er = store.UpdateApp(message.Address, maxRelays, message.Amount, message.Chains) - case typesUtil.ActorType_Fisherman: + case coreTypes.ActorType_ACTOR_TYPE_FISH: er = store.UpdateFisherman(message.Address, message.ServiceUrl, message.Amount, message.Chains) - case typesUtil.ActorType_ServiceNode: + case coreTypes.ActorType_ACTOR_TYPE_SERVICENODE: er = store.UpdateServiceNode(message.Address, message.ServiceUrl, message.Amount, message.Chains) - case typesUtil.ActorType_Validator: + case coreTypes.ActorType_ACTOR_TYPE_VAL: er = store.UpdateValidator(message.Address, message.ServiceUrl, message.Amount) } if er != nil { @@ -337,7 +338,7 @@ func (u *UtilityContext) HandleMessageDoubleSign(message *typesUtil.MessageDoubl if err != nil { return err } - if err := u.BurnActor(typesUtil.ActorType_Validator, burnPercentage, doubleSigner); err != nil { + if err := u.BurnActor(coreTypes.ActorType_ACTOR_TYPE_VAL, burnPercentage, doubleSigner); err != nil { return err } return nil diff --git a/utility/types/error.go b/utility/types/error.go index 0034be174..e3e3c1705 100644 --- a/utility/types/error.go +++ b/utility/types/error.go @@ -126,7 +126,7 @@ const ( CodeEmptyParamValueError Code = 93 CodeGetOutputAddressError Code = 94 CodeTransactionAlreadyCommittedError Code = 95 - CodeInitParamsError Code = 96 + CodeInitGenesisParamsError Code = 96 CodeGetAllFishermenError Code = 97 CodeGetAllServiceNodesError Code = 98 CodeGetAllAppsError Code = 99 @@ -277,7 +277,7 @@ const ( ProtoUnmarshalError = "an error occurred unmarshalling the structure in protobuf" ProtoNewAnyError = "an error occurred creating the protobuf any" UpdateParamError = "an error occurred updating the parameter" - InitParamsError = "an error occurred initializing the params in genesis" + InitGenesisParamError = "an error occurred initializing the params in genesis" GetAllFishermenError = "an error occurred getting all of the fishermen¬" GetAllAppsError = "an error occurred getting all of the apps" GetAllServiceNodesError = "an error occurred getting all of the service nodes" @@ -784,8 +784,8 @@ func ErrUpdateParam(err error) Error { return NewError(CodeUpdateParamError, fmt.Sprintf("%s: %s", UpdateParamError, err.Error())) } -func ErrInitParams(err error) Error { - return NewError(CodeInitParamsError, fmt.Sprintf("%s: %s", InitParamsError, err.Error())) +func ErrInitGenesisParams(err error) Error { + return NewError(CodeInitGenesisParamsError, fmt.Sprintf("%s: %s", InitGenesisParamError, err.Error())) } func ErrUnknownActorType(actorType string) Error { diff --git a/utility/types/message.go b/utility/types/message.go index 0ea4a3208..7ddda49ec 100644 --- a/utility/types/message.go +++ b/utility/types/message.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/pokt-network/pocket/shared/codec" + coreTypes "github.com/pokt-network/pocket/shared/core/types" cryptoPocket "github.com/pokt-network/pocket/shared/crypto" "google.golang.org/protobuf/proto" ) @@ -44,7 +45,7 @@ type Message interface { SetSigner(signer []byte) ValidateBasic() Error GetCanonicalBytes() []byte - GetActorType() ActorType + GetActorType() coreTypes.ActorType GetMessageName() string GetMessageRecipient() string } @@ -57,8 +58,8 @@ var _ Message = &MessageUnpause{} var _ Message = &MessageChangeParameter{} var _ Message = &MessageDoubleSign{} -func (msg *MessageSend) GetActorType() ActorType { - return ActorType_Undefined // there's no actor type for message send, so return zero to allow fee retrieval +func (msg *MessageSend) GetActorType() coreTypes.ActorType { + return coreTypes.ActorType_ACTOR_TYPE_UNSPECIFIED // there's no actor type for message send, so return zero to allow fee retrieval } func (msg *MessageStake) ValidateBasic() Error { @@ -148,15 +149,15 @@ func (msg *MessageDoubleSign) GetMessageRecipient() string { return "" } func (msg *MessageUnstake) ValidateBasic() Error { return ValidateAddress(msg.Address) } func (msg *MessageUnpause) ValidateBasic() Error { return ValidateAddress(msg.Address) } -func (msg *MessageStake) SetSigner(signer []byte) { msg.Signer = signer } -func (msg *MessageEditStake) SetSigner(signer []byte) { msg.Signer = signer } -func (msg *MessageUnstake) SetSigner(signer []byte) { msg.Signer = signer } -func (msg *MessageUnpause) SetSigner(signer []byte) { msg.Signer = signer } -func (msg *MessageDoubleSign) SetSigner(signer []byte) { msg.ReporterAddress = signer } -func (msg *MessageSend) SetSigner(signer []byte) { /*no op*/ } -func (msg *MessageChangeParameter) SetSigner(signer []byte) { msg.Signer = signer } -func (x *MessageChangeParameter) GetActorType() ActorType { return -1 } -func (x *MessageDoubleSign) GetActorType() ActorType { return -1 } +func (msg *MessageStake) SetSigner(signer []byte) { msg.Signer = signer } +func (msg *MessageEditStake) SetSigner(signer []byte) { msg.Signer = signer } +func (msg *MessageUnstake) SetSigner(signer []byte) { msg.Signer = signer } +func (msg *MessageUnpause) SetSigner(signer []byte) { msg.Signer = signer } +func (msg *MessageDoubleSign) SetSigner(signer []byte) { msg.ReporterAddress = signer } +func (msg *MessageSend) SetSigner(signer []byte) { /*no op*/ } +func (msg *MessageChangeParameter) SetSigner(signer []byte) { msg.Signer = signer } +func (x *MessageChangeParameter) GetActorType() coreTypes.ActorType { return -1 } +func (x *MessageDoubleSign) GetActorType() coreTypes.ActorType { return -1 } func (msg *MessageStake) GetCanonicalBytes() []byte { return getCanonicalBytes(msg) } func (msg *MessageEditStake) GetCanonicalBytes() []byte { return getCanonicalBytes(msg) } @@ -235,13 +236,13 @@ func ValidateAmount(amount string) Error { return nil } -func ValidateActorType(_ ActorType) Error { +func ValidateActorType(_ coreTypes.ActorType) Error { // TODO (team) not sure if there's anything we can do here return nil } -func ValidateServiceUrl(actorType ActorType, uri string) Error { - if actorType == ActorType_App { +func ValidateServiceUrl(actorType coreTypes.ActorType, uri string) Error { + if actorType == coreTypes.ActorType_ACTOR_TYPE_APP { return nil } uri = strings.ToLower(uri) @@ -295,7 +296,7 @@ func (rc *RelayChain) Validate() Error { } type MessageStaker interface { - GetActorType() ActorType + GetActorType() coreTypes.ActorType GetAmount() string GetChains() []string GetServiceUrl() string diff --git a/utility/types/message_test.go b/utility/types/message_test.go index bf487e64b..45d1505da 100644 --- a/utility/types/message_test.go +++ b/utility/types/message_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/pokt-network/pocket/shared/codec" + coreTypes "github.com/pokt-network/pocket/shared/core/types" "github.com/pokt-network/pocket/shared/crypto" "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" @@ -115,7 +116,7 @@ func TestMessage_EditStake_ValidateBasic(t *testing.T) { require.NoError(t, err) msg := MessageEditStake{ - ActorType: ActorType_App, + ActorType: coreTypes.ActorType_ACTOR_TYPE_APP, Address: addr, Chains: defaultTestingChains, Amount: defaultAmount, @@ -197,7 +198,7 @@ func TestMessageStake_ValidateBasic(t *testing.T) { require.NoError(t, err) msg := MessageStake{ - ActorType: ActorType_App, + ActorType: coreTypes.ActorType_ACTOR_TYPE_APP, PublicKey: pk.Bytes(), Chains: defaultTestingChains, Amount: defaultAmount, diff --git a/utility/types/proto/actor.proto b/utility/types/proto/actor.proto deleted file mode 100644 index 6d3af1653..000000000 --- a/utility/types/proto/actor.proto +++ /dev/null @@ -1,31 +0,0 @@ -syntax = "proto3"; -package utility; - -option go_package = "github.com/pokt-network/pocket/utility/types"; - -// TODO(#258): Follow protobuf best practices -enum PoolNames { - Unspecified = 0; - DAO = 1; - FeeCollector = 2; - AppStakePool = 3; - ValidatorStakePool = 4; - ServiceNodeStakePool = 5; - FishermanStakePool = 6; -} - -enum ActorType { - Undefined = 0; - App = 1; - ServiceNode = 2; - Fisherman = 3; - Validator = 4; -} - - -// DISCUSS: *Design Decision* deprecating StakeStatus -enum StakeStatus { - UnknownStatus = 0; - Unstaking = 1; - Staked = 2; -} \ No newline at end of file diff --git a/utility/types/proto/message.proto b/utility/types/proto/message.proto index 458d05fa4..d61529807 100644 --- a/utility/types/proto/message.proto +++ b/utility/types/proto/message.proto @@ -4,7 +4,7 @@ package utility; option go_package = "github.com/pokt-network/pocket/utility/types"; import "google/protobuf/any.proto"; -import "actor.proto"; +import "core/types/proto/actor.proto"; message MessageSend { bytes from_address = 1; @@ -13,7 +13,7 @@ message MessageSend { } message MessageStake { - ActorType actor_type = 1; + core.ActorType actor_type = 1; bytes public_key = 2; repeated string chains = 3; string amount = 4; @@ -23,7 +23,7 @@ message MessageStake { } message MessageEditStake { - ActorType actor_type = 1; + core.ActorType actor_type = 1; bytes address = 2; repeated string chains = 3; string amount = 4; @@ -32,13 +32,13 @@ message MessageEditStake { } message MessageUnstake { - ActorType actor_type = 1; + core.ActorType actor_type = 1; bytes address = 2; optional bytes signer = 3; } message MessageUnpause { - ActorType actor_type = 1; + core.ActorType actor_type = 1; bytes address = 2; optional bytes signer = 3; } diff --git a/utility/types/proto/stake_status.proto b/utility/types/proto/stake_status.proto new file mode 100644 index 000000000..4ed646fd4 --- /dev/null +++ b/utility/types/proto/stake_status.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package utility; + +option go_package = "github.com/pokt-network/pocket/utility/types"; + +// DISCUSS: *Design Decision* deprecating StakeStatus +// REFACTOR(#258): Rename the protobuf types to follow best practices +enum StakeStatus { + UnknownStatus = 0; + Unstaking = 1; + Staked = 2; +}