Skip to content
This repository has been archived by the owner on Dec 5, 2022. It is now read-only.

feat: fix account sequence mismatch #101

Open
wants to merge 31 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1e615ed
feat: implement request an oracle upgrade
gyuguen Oct 20, 2022
526d256
fix
gyuguen Oct 20, 2022
4dc1f30
fix
gyuguen Oct 21, 2022
8a88171
feat: implement oracle upgrade handling
gyuguen Oct 21, 2022
f6e3c20
fix
gyuguen Oct 21, 2022
2a09d6e
fix
gyuguen Oct 25, 2022
28ab8b7
fix
gyuguen Oct 25, 2022
1bdd8e1
fix
gyuguen Oct 25, 2022
aaca482
fix
gyuguen Oct 26, 2022
a31ec24
Merge branch 'main' into ft/86/implement_oracle_upgrade_handling
gyuguen Oct 26, 2022
3748281
fix
gyuguen Oct 31, 2022
c6de39f
fix
gyuguen Oct 31, 2022
385b106
Merge branch 'main' into ft/86/implement_oracle_upgrade_handling
gyuguen Oct 31, 2022
35fece6
fix
gyuguen Oct 31, 2022
7982652
Merge branch 'ft/86/implement_oracle_upgrade_handling' of github.com:…
gyuguen Oct 31, 2022
5a73138
fix
gyuguen Nov 1, 2022
0f657a2
fix
gyuguen Nov 1, 2022
c440498
fix
gyuguen Nov 1, 2022
cd629e6
fix
gyuguen Nov 1, 2022
23fa01a
fix
gyuguen Nov 1, 2022
12abfea
refactorying and fix offline discussion
gyuguen Nov 2, 2022
e932493
Merge branch 'main' into ft/86/implement_oracle_upgrade_handling
gyuguen Nov 2, 2022
93ae308
fix
gyuguen Nov 2, 2022
46765a3
feat: added voterUniqueID in oracleRegistrationVote transaction
gyuguen Nov 3, 2022
a6ddb40
feat: added lightClient logLevel in config.toml
gyuguen Nov 3, 2022
8b44890
fix
gyuguen Nov 4, 2022
157415d
fix
gyuguen Nov 7, 2022
c9298a2
fix
gyuguen Nov 8, 2022
f92a6b6
fix
gyuguen Nov 9, 2022
6ca32d0
Merge branch 'main' into ft/98/fix_account_sequence_mismatch
gyuguen Nov 9, 2022
1e96503
fix
gyuguen Nov 9, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion cmd/doracled/cmd/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"os/signal"
"syscall"

"github.com/medibloc/panacea-doracle/event"
datadealevent "github.com/medibloc/panacea-doracle/event/datadeal"
oracleevent "github.com/medibloc/panacea-doracle/event/oracle"
"github.com/medibloc/panacea-doracle/service"
Expand All @@ -29,11 +30,16 @@ func startCmd() *cobra.Command {
}
defer svc.Close()

err = svc.StartSubscriptions(
voteEvents := []event.Event{
oracleevent.NewRegisterOracleEvent(svc),
oracleevent.NewUpgradeOracleEvent(svc),
datadealevent.NewDataVerificationEvent(svc),
datadealevent.NewDataDeliveryVoteEvent(svc),
}
upgradedOracleEvent := oracleevent.NewUpgradedOracleEvent(svc, voteEvents)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UpragedOracleEvent need to voteEvents parameter.


err = svc.StartSubscriptions(
append(voteEvents, upgradedOracleEvent)...,
)
if err != nil {
return fmt.Errorf("failed to start event subscription: %w", err)
Expand Down
32 changes: 25 additions & 7 deletions event/datadeal/data_delivery_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,36 @@ import (

type DataDeliveryVoteEvent struct {
reactor event.Reactor
enable bool
}

func NewDataDeliveryVoteEvent(s event.Reactor) DataDeliveryVoteEvent {
return DataDeliveryVoteEvent{s}
func NewDataDeliveryVoteEvent(r event.Reactor) *DataDeliveryVoteEvent {
return &DataDeliveryVoteEvent{
reactor: r,
}
}

func (e DataDeliveryVoteEvent) GetEventQuery() string {
func (e *DataDeliveryVoteEvent) Prepare() error {
return nil
}

func (e *DataDeliveryVoteEvent) GetEventName() string {
return "DataDeliveryVoteEvent"
}

func (e *DataDeliveryVoteEvent) GetEventQuery() string {
return "tm.event='NewBlock' AND data_delivery.vote_status='started'"
}

func (e DataDeliveryVoteEvent) EventHandler(event ctypes.ResultEvent) error {
func (e *DataDeliveryVoteEvent) SetEnable(enable bool) {
e.enable = enable
}

func (e *DataDeliveryVoteEvent) Enabled() bool {
return e.enable
}

func (e *DataDeliveryVoteEvent) EventHandler(event ctypes.ResultEvent) error {
dealIDStr := event.Events[datadealtypes.EventTypeDataDeliveryVote+"."+datadealtypes.AttributeKeyDealID][0]
dataHash := event.Events[datadealtypes.EventTypeDataDeliveryVote+"."+datadealtypes.AttributeKeyDataHash][0]

Expand Down Expand Up @@ -81,7 +99,7 @@ func (e DataDeliveryVoteEvent) EventHandler(event ctypes.ResultEvent) error {

}

func (e DataDeliveryVoteEvent) verifyAndGetVoteOption(dealID uint64, dataHash string) (oracletypes.VoteOption, string, error) {
func (e *DataDeliveryVoteEvent) verifyAndGetVoteOption(dealID uint64, dataHash string) (oracletypes.VoteOption, string, error) {

dataSale, err := e.reactor.QueryClient().GetDataSale(dataHash, dealID)
if err != nil {
Expand Down Expand Up @@ -110,7 +128,7 @@ func (e DataDeliveryVoteEvent) verifyAndGetVoteOption(dealID uint64, dataHash st

}

func (e DataDeliveryVoteEvent) convertBuyerDataAndAddToIpfs(deal *datadealtypes.Deal, dataSale *datadealtypes.DataSale, oraclePrivKey *btcec.PrivateKey) (string, error) {
func (e *DataDeliveryVoteEvent) convertBuyerDataAndAddToIpfs(deal *datadealtypes.Deal, dataSale *datadealtypes.DataSale, oraclePrivKey *btcec.PrivateKey) (string, error) {
// get encrypted data from ipfs
encryptedDataBz, err := e.reactor.Ipfs().Get(dataSale.VerifiableCid)
if err != nil {
Expand Down Expand Up @@ -164,7 +182,7 @@ func (e DataDeliveryVoteEvent) convertBuyerDataAndAddToIpfs(deal *datadealtypes.
return deliveredCid, nil
}

func (e DataDeliveryVoteEvent) makeDataDeliveryVote(voterAddress, dataHash, deliveredCid string, dealID uint64, voteOption oracletypes.VoteOption, oraclePrivKey []byte) (*datadealtypes.MsgVoteDataDelivery, error) {
func (e *DataDeliveryVoteEvent) makeDataDeliveryVote(voterAddress, dataHash, deliveredCid string, dealID uint64, voteOption oracletypes.VoteOption, oraclePrivKey []byte) (*datadealtypes.MsgVoteDataDelivery, error) {

dataDeliveryVote := &datadealtypes.DataDeliveryVote{
VoterAddress: voterAddress,
Expand Down
35 changes: 27 additions & 8 deletions event/datadeal/data_verification_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,36 @@ var _ event.Event = (*DataVerificationEvent)(nil)

type DataVerificationEvent struct {
reactor event.Reactor
enable bool
}

func NewDataVerificationEvent(r event.Reactor) DataVerificationEvent {
return DataVerificationEvent{r}
func NewDataVerificationEvent(r event.Reactor) *DataVerificationEvent {
return &DataVerificationEvent{
reactor: r,
}
}

func (d *DataVerificationEvent) Prepare() error {
return nil
}

func (d *DataVerificationEvent) GetEventName() string {
return "DataVerificationEvent"
}

func (d *DataVerificationEvent) SetEnable(enable bool) {
d.enable = enable
}

func (d *DataVerificationEvent) Enabled() bool {
return d.enable
}

func (e DataVerificationEvent) GetEventQuery() string {
func (e *DataVerificationEvent) GetEventQuery() string {
return "message.action = 'SellData'"
}

func (e DataVerificationEvent) EventHandler(event ctypes.ResultEvent) error {
func (e *DataVerificationEvent) EventHandler(event ctypes.ResultEvent) error {
dealIDStr := event.Events[datadealtypes.EventTypeDataVerificationVote+"."+datadealtypes.AttributeKeyDealID][0]
dataHash := event.Events[datadealtypes.EventTypeDataVerificationVote+"."+datadealtypes.AttributeKeyDataHash][0]

Expand Down Expand Up @@ -75,18 +94,18 @@ func (e DataVerificationEvent) EventHandler(event ctypes.ResultEvent) error {
return nil
}

func (e DataVerificationEvent) decryptData(decryptedSharedKey, nonce, encryptedDataBz []byte) ([]byte, error) {
func (e *DataVerificationEvent) decryptData(decryptedSharedKey, nonce, encryptedDataBz []byte) ([]byte, error) {
return crypto.DecryptWithAES256(decryptedSharedKey, nonce, encryptedDataBz)
}

func (e DataVerificationEvent) compareDataHash(dataSale *datadealtypes.DataSale, decryptedData []byte) bool {
func (e *DataVerificationEvent) compareDataHash(dataSale *datadealtypes.DataSale, decryptedData []byte) bool {
decryptedDataHash := sha256.Sum256(decryptedData)
decryptedDataHashStr := hex.EncodeToString(decryptedDataHash[:])

return decryptedDataHashStr == dataSale.DataHash
}

func (e DataVerificationEvent) convertSellerData(deal *datadealtypes.Deal, dataSale *datadealtypes.DataSale) ([]byte, error) {
func (e *DataVerificationEvent) convertSellerData(deal *datadealtypes.Deal, dataSale *datadealtypes.DataSale) ([]byte, error) {
encryptedDataBz, err := e.reactor.Ipfs().Get(dataSale.VerifiableCid)
if err != nil {
log.Infof("failed to get data from IPFS: %v", err)
Expand Down Expand Up @@ -117,7 +136,7 @@ func (e DataVerificationEvent) convertSellerData(deal *datadealtypes.Deal, dataS
return decryptedData, nil
}

func (e DataVerificationEvent) verifyAndGetVoteOption(dealID uint64, dataHash string) (oracletypes.VoteOption, error) {
func (e *DataVerificationEvent) verifyAndGetVoteOption(dealID uint64, dataHash string) (oracletypes.VoteOption, error) {
deal, err := e.reactor.QueryClient().GetDeal(dealID)
if err != nil {
return oracletypes.VOTE_OPTION_NO, fmt.Errorf("failed to get deal. %v", err)
Expand Down
11 changes: 10 additions & 1 deletion event/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ import (
)

type Event interface {
Prepare() error

GetEventName() string

GetEventQuery() string
EventHandler(event ctypes.ResultEvent) error

SetEnable(bool)

Enabled() bool

EventHandler(ctypes.ResultEvent) error
}
35 changes: 29 additions & 6 deletions event/oracle/register_oracle_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,36 @@ var _ event.Event = (*RegisterOracleEvent)(nil)

type RegisterOracleEvent struct {
reactor event.Reactor
enable bool
}

func NewRegisterOracleEvent(s event.Reactor) RegisterOracleEvent {
return RegisterOracleEvent{s}
func NewRegisterOracleEvent(r event.Reactor) *RegisterOracleEvent {
return &RegisterOracleEvent{
reactor: r,
}
}

func (e *RegisterOracleEvent) Prepare() error {
return nil
}

func (e *RegisterOracleEvent) GetEventName() string {
return "RegisterOracleEvent"
}

func (e RegisterOracleEvent) GetEventQuery() string {
func (e *RegisterOracleEvent) GetEventQuery() string {
return "message.action = 'RegisterOracle'"
}

func (e RegisterOracleEvent) EventHandler(event ctypes.ResultEvent) error {
func (e *RegisterOracleEvent) SetEnable(enable bool) {
e.enable = enable
}

func (e *RegisterOracleEvent) Enabled() bool {
return e.enable
}

func (e *RegisterOracleEvent) EventHandler(event ctypes.ResultEvent) error {
uniqueID := event.Events[oracletypes.EventTypeRegistrationVote+"."+oracletypes.AttributeKeyUniqueID][0]
votingTargetAddress := event.Events[oracletypes.EventTypeRegistrationVote+"."+oracletypes.AttributeKeyOracleAddress][0]

Expand Down Expand Up @@ -58,7 +77,9 @@ func (e RegisterOracleEvent) EventHandler(event ctypes.ResultEvent) error {
return nil
}

func (e RegisterOracleEvent) verifyAndGetMsgVoteOracleRegistration(uniqueID, votingTargetAddress string) (*oracletypes.MsgVoteOracleRegistration, error) {
func (e *RegisterOracleEvent) verifyAndGetMsgVoteOracleRegistration(uniqueID, votingTargetAddress string) (*oracletypes.MsgVoteOracleRegistration, error) {
log.Infof("verifing oracleRegistration. uniqueID(%s), votingTargetAddress(%s)", uniqueID, votingTargetAddress)

queryClient := e.reactor.QueryClient()
voterAddress := e.reactor.OracleAcc().GetAddress()
oraclePrivKeyBz := e.reactor.OraclePrivKey().Serialize()
Expand Down Expand Up @@ -91,6 +112,8 @@ func (e RegisterOracleEvent) verifyAndGetMsgVoteOracleRegistration(uniqueID, vot
voteOption, err := e.verifyAndGetVoteOption(oracleRegistration)
if err != nil {
log.Infof("vote No due to error while verify: %v", err)
} else {
log.Infof("verification success. uniqueID(%s), votingTargetAddress(%s)", uniqueID, votingTargetAddress)
}

return makeMsgVoteOracleRegistration(
Expand All @@ -109,7 +132,7 @@ func (e RegisterOracleEvent) verifyAndGetMsgVoteOracleRegistration(uniqueID, vot
// verifyAndGetVoteOption performs a verification to determine a vote.
// - Verify that trustedBlockInfo registered in OracleRegistration is valid
// - Verify that the RemoteReport is valid
func (e RegisterOracleEvent) verifyAndGetVoteOption(oracleRegistration *oracletypes.OracleRegistration) (oracletypes.VoteOption, error) {
func (e *RegisterOracleEvent) verifyAndGetVoteOption(oracleRegistration *oracletypes.OracleRegistration) (oracletypes.VoteOption, error) {
if err := verifyTrustedBlockInfo(e.reactor.QueryClient(), oracleRegistration.TrustedBlockHeight, oracleRegistration.TrustedBlockHash); err != nil {
return oracletypes.VOTE_OPTION_NO, err
}
Expand Down
6 changes: 5 additions & 1 deletion event/oracle/register_oracle_event_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@ import (
"github.com/stretchr/testify/require"
)

var _ event.Reactor = (*service.TestServiceWithoutSGX)(nil)
var _ event.Reactor = (*service.Service)(nil)

type registerOracleEventTestSuite struct {
suite.TestSuite

chainID string
validatorMnemonic string
uniqueID string
}

func TestRegisterOracleEvent(t *testing.T) {
Expand All @@ -34,17 +35,20 @@ func TestRegisterOracleEvent(t *testing.T) {
require.NoError(t, err)
validatorMnemonic, err := bip39.NewMnemonic(entropy)
require.NoError(t, err)
uniqueID := "uniqueID"

suite.Run(t, &registerOracleEventTestSuite{
suite.NewTestSuite(
initScriptPath,
[]string{
fmt.Sprintf("CHAIN_ID=%s", chainID),
fmt.Sprintf("MNEMONIC=%s", validatorMnemonic),
fmt.Sprintf("UNIQUE_ID=%s", uniqueID),
},
),
chainID,
validatorMnemonic,
uniqueID,
})
}

Expand Down
35 changes: 28 additions & 7 deletions event/oracle/upgrade_oracle_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,38 @@ import (

type UpgradeOracleEvent struct {
reactor event.Reactor
enable bool
}

var _ event.Event = (*UpgradeOracleEvent)(nil)

func NewUpgradeOracleEvent(s event.Reactor) UpgradeOracleEvent {
return UpgradeOracleEvent{s}
func NewUpgradeOracleEvent(r event.Reactor) *UpgradeOracleEvent {
return &UpgradeOracleEvent{
reactor: r,
}
}

func (e *UpgradeOracleEvent) Prepare() error {
return nil
}

func (e *UpgradeOracleEvent) GetEventName() string {
return "UpgradeOracleEvent"
}

func (e UpgradeOracleEvent) GetEventQuery() string {
func (e *UpgradeOracleEvent) GetEventQuery() string {
return "message.action = 'OracleUpgrade'"
}

func (e UpgradeOracleEvent) EventHandler(event ctypes.ResultEvent) error {
func (e *UpgradeOracleEvent) SetEnable(enable bool) {
e.enable = enable
}

func (e *UpgradeOracleEvent) Enabled() bool {
return e.enable
}

func (e *UpgradeOracleEvent) EventHandler(event ctypes.ResultEvent) error {
uniqueID := event.Events[oracletypes.EventTypeUpgradeVote+"."+oracletypes.AttributeKeyUniqueID][0]
votingTargetAddress := event.Events[oracletypes.EventTypeUpgradeVote+"."+oracletypes.AttributeKeyOracleAddress][0]

Expand Down Expand Up @@ -62,7 +81,7 @@ func (e UpgradeOracleEvent) EventHandler(event ctypes.ResultEvent) error {
return nil
}

func (e UpgradeOracleEvent) verifyAndGetMsgVoteOracleRegistration(uniqueID, votingTargetAddress string) (*oracletypes.MsgVoteOracleRegistration, error) {
func (e *UpgradeOracleEvent) verifyAndGetMsgVoteOracleRegistration(uniqueID, votingTargetAddress string) (*oracletypes.MsgVoteOracleRegistration, error) {
queryClient := e.reactor.QueryClient()
voterAddress := e.reactor.OracleAcc().GetAddress()
oraclePrivKeyBz := e.reactor.OraclePrivKey().Serialize()
Expand All @@ -77,6 +96,8 @@ func (e UpgradeOracleEvent) verifyAndGetMsgVoteOracleRegistration(uniqueID, voti
voteOption, err := e.verifyAndGetVoteOption(oracleRegistration)
if err != nil {
log.Infof("vote No due to error while verify: %v", err)
} else {
log.Infof("UpgradeOracle verification success. uniqueID(%s), votingTargetAddress(%s)", uniqueID, votingTargetAddress)
}

return makeMsgVoteOracleRegistration(
Expand All @@ -92,7 +113,7 @@ func (e UpgradeOracleEvent) verifyAndGetMsgVoteOracleRegistration(uniqueID, voti

}

func (e UpgradeOracleEvent) verifyAndGetVoteOption(oracleRegistration *oracletypes.OracleRegistration) (oracletypes.VoteOption, error) {
func (e *UpgradeOracleEvent) verifyAndGetVoteOption(oracleRegistration *oracletypes.OracleRegistration) (oracletypes.VoteOption, error) {
queryClient := e.reactor.QueryClient()
upgradeInfo, err := queryClient.GetOracleUpgradeInfo()
if err != nil {
Expand All @@ -117,7 +138,7 @@ func (e UpgradeOracleEvent) verifyAndGetVoteOption(oracleRegistration *oracletyp

}

func (e UpgradeOracleEvent) verifyRemoteReport(oracleRegistration *oracletypes.OracleRegistration) error {
func (e *UpgradeOracleEvent) verifyRemoteReport(oracleRegistration *oracletypes.OracleRegistration) error {
reportBz := oracleRegistration.NodePubKeyRemoteReport
expectedNodePubKeyHash := crypto.KDFSHA256(oracleRegistration.NodePubKey)
expectedUniqueID := oracleRegistration.UniqueId
Expand Down
2 changes: 1 addition & 1 deletion event/oracle/upgrade_oracle_event_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
"github.com/stretchr/testify/require"
)

var _ event.Reactor = (*service.TestServiceWithoutSGX)(nil)
var _ event.Reactor = (*service.Service)(nil)

type upgradeOracleEventTestSuite struct {
suite.TestSuite
Expand Down
Loading