Skip to content

Commit

Permalink
[action] move Verify to SealedEnvelope (#3197)
Browse files Browse the repository at this point in the history
  • Loading branch information
RobertKwiatkowski committed Mar 16, 2022
1 parent bde7db5 commit 887ebab
Show file tree
Hide file tree
Showing 15 changed files with 48 additions and 48 deletions.
28 changes: 0 additions & 28 deletions action/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,11 @@
package action

import (
"encoding/hex"
"math"
"math/big"

"github.com/iotexproject/go-pkgs/crypto"
"github.com/pkg/errors"
"go.uber.org/zap"

"github.com/iotexproject/iotex-core/pkg/log"
)

// Action is the action can be Executed in protocols. The method is added to avoid mistakenly used empty interface as action.
Expand Down Expand Up @@ -78,30 +74,6 @@ func AssembleSealedEnvelope(act Envelope, pk crypto.PublicKey, sig []byte) Seale
return sealed
}

// Verify verifies the action using sender's public key
func Verify(sealed SealedEnvelope) error {
if sealed.SrcPubkey() == nil {
return errors.New("empty public key")
}
// Reject action with insufficient gas limit
intrinsicGas, err := sealed.IntrinsicGas()
if intrinsicGas > sealed.GasLimit() || err != nil {
return ErrIntrinsicGas
}

h, err := sealed.envelopeHash()
if err != nil {
return errors.Wrap(err, "failed to generate envelope hash")
}
if !sealed.SrcPubkey().Verify(h[:], sealed.Signature()) {
log.L().Info("failed to verify action hash",
zap.String("hash", hex.EncodeToString(h[:])),
zap.String("signature", hex.EncodeToString(sealed.Signature())))
return ErrInvalidSender
}
return nil
}

// ClassifyActions classfies actions
func ClassifyActions(actions []SealedEnvelope) ([]*Transfer, []*Execution) {
tsfs := make([]*Transfer, 0)
Expand Down
8 changes: 4 additions & 4 deletions action/action_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func TestActionProtoAndVerify(t *testing.T) {
selp, err := Sign(elp, identityset.PrivateKey(28))
require.NoError(err)

require.NoError(Verify(selp))
require.NoError(selp.Verify())

nselp := &SealedEnvelope{}
require.NoError(nselp.LoadProto(selp.Proto()))
Expand All @@ -55,7 +55,7 @@ func TestActionProtoAndVerify(t *testing.T) {

selp.srcPubkey = nil

require.EqualError(Verify(selp), "empty public key")
require.EqualError(selp.Verify(), "empty public key")
})
t.Run("gas limit too low", func(t *testing.T) {
bd := &EnvelopeBuilder{}
Expand All @@ -66,7 +66,7 @@ func TestActionProtoAndVerify(t *testing.T) {
selp, err := Sign(elp, identityset.PrivateKey(28))
require.NoError(err)

require.Equal(ErrIntrinsicGas, errors.Cause(Verify(selp)))
require.Equal(ErrIntrinsicGas, errors.Cause(selp.Verify()))
})
t.Run("invalid signature", func(t *testing.T) {
bd := &EnvelopeBuilder{}
Expand All @@ -77,7 +77,7 @@ func TestActionProtoAndVerify(t *testing.T) {
selp, err := Sign(elp, identityset.PrivateKey(28))
require.NoError(err)
selp.signature = []byte("invalid signature")
require.Equal(ErrInvalidSender, errors.Cause(Verify(selp)))
require.Equal(ErrInvalidSender, errors.Cause(selp.Verify()))
})
}

Expand Down
2 changes: 1 addition & 1 deletion action/candidateregister_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ func TestCandidateRegister(t *testing.T) {
require.NoError(err)
require.Equal(test.SelpHash, hex.EncodeToString(hash[:]))
// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

}
Expand Down
2 changes: 1 addition & 1 deletion action/candidateupdate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ func TestCandidateUpdateSignVerify(t *testing.T) {
require.NoError(err)
require.Equal("ca1a28f0e9a58ffc67037cc75066dbdd8e024aa2b2e416e4d6ce16c3d86282e5", hex.EncodeToString(hash[:]))
// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

func TestCandidateUpdateABIEncodeAndDecode(t *testing.T) {
Expand Down
4 changes: 2 additions & 2 deletions action/execution_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func TestExecutionSignVerify(t *testing.T) {
require.True(ok)

w := AssembleSealedEnvelope(elp, executorKey.PublicKey(), []byte("lol"))
require.Error(Verify(w))
require.Error(w.Verify())
ex2, ok := w.Envelope.Action().(*Execution)
require.True(ok)
require.Equal(ex, ex2)
Expand All @@ -50,7 +50,7 @@ func TestExecutionSignVerify(t *testing.T) {
require.NotNil(selp)

// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

func TestExecutionSanityCheck(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion action/protocol/generic_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func NewGenericValidator(sr StateReader, accountState AccountState) *GenericVali
// Validate validates a generic action
func (v *GenericValidator) Validate(ctx context.Context, selp action.SealedEnvelope) error {
// Verify action using action sender's public key
if err := action.Verify(selp); err != nil {
if err := selp.Verify(); err != nil {
return err
}
caller := selp.SrcPubkey().Address()
Expand Down
2 changes: 1 addition & 1 deletion action/rlp_tx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ func TestRlpDecodeVerify(t *testing.T) {
require.NoError(err)
require.True(bytes.Equal(rawHash[:], raw[:]))
require.NotEqual(raw, h)
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}
}

Expand Down
28 changes: 28 additions & 0 deletions action/sealedenvelope.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
package action

import (
"encoding/hex"

"github.com/iotexproject/go-pkgs/crypto"
"github.com/iotexproject/go-pkgs/hash"
"github.com/iotexproject/iotex-address/address"
"github.com/iotexproject/iotex-proto/golang/iotextypes"
"github.com/pkg/errors"
"go.uber.org/zap"
"google.golang.org/protobuf/proto"

"github.com/iotexproject/iotex-core/config"
"github.com/iotexproject/iotex-core/pkg/log"
"github.com/iotexproject/iotex-core/pkg/util/byteutil"
)

Expand Down Expand Up @@ -179,3 +183,27 @@ func wrapStakingActionIntoExecution(ab AbstractAction, toAddr []byte, pb proto.M
data: data,
}, nil
}

// Verify verifies the action using sender's public key
func (sealed *SealedEnvelope) Verify() error {
if sealed.SrcPubkey() == nil {
return errors.New("empty public key")
}
// Reject action with insufficient gas limit
intrinsicGas, err := sealed.IntrinsicGas()
if intrinsicGas > sealed.GasLimit() || err != nil {
return ErrIntrinsicGas
}

h, err := sealed.envelopeHash()
if err != nil {
return errors.Wrap(err, "failed to generate envelope hash")
}
if !sealed.SrcPubkey().Verify(h[:], sealed.Signature()) {
log.L().Info("failed to verify action hash",
zap.String("hash", hex.EncodeToString(h[:])),
zap.String("signature", hex.EncodeToString(sealed.Signature())))
return ErrInvalidSender
}
return nil
}
2 changes: 1 addition & 1 deletion action/stake_changecandidate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func TestChangeCandidateSignVerify(t *testing.T) {
require.NoError(err)
require.Equal("186526b5b9fe74e25beb52c83c41780a69108160bef2ddaf3bffb9f1f1e5e73a", hex.EncodeToString(hash[:]))
// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

func TestChangeCandidateABIEncodeAndDecode(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion action/stake_transferownership_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func TestStakingTransferSignVerify(t *testing.T) {
require.NoError(err)
require.Equal("74b2e1d6a09ba5d1298fa422d5850991ae516865077282196295a38f93c78b85", hex.EncodeToString(hash[:]))
// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

func TestStakingTransferABIEncodeAndDecode(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion action/stakeadddeposit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func TestDeposit(t *testing.T) {
require.NoError(err)
require.Equal(test.SelpHash, hex.EncodeToString(hash[:]))
// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}
}

Expand Down
2 changes: 1 addition & 1 deletion action/stakecreate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ func TestCreateStake(t *testing.T) {
require.NoError(err)
require.Equal(test.SelpHash, hex.EncodeToString(hash[:]))
// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

}
Expand Down
4 changes: 2 additions & 2 deletions action/stakereclaim_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ func TestUnstakeSignVerify(t *testing.T) {
require.NoError(err)
require.Equal("bed58b64a6c4e959eca60a86f0b2149ce0e1dd527ac5fd26aef725ebf7c22a7d", hex.EncodeToString(hash[:]))
// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

func TestUnstakeABIEncodeAndDecode(t *testing.T) {
Expand Down Expand Up @@ -148,7 +148,7 @@ func TestWithdrawSignVerify(t *testing.T) {
require.NoError(err)
require.Equal("28049348cf34f1aa927caa250e7a1b08778c44efaf73b565b6fa9abe843871b4", hex.EncodeToString(hash[:]))
// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

func TestWithdrawABIEncodeAndDecode(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion action/stakerestake_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func TestRestakeSignVerify(t *testing.T) {
require.NoError(err)
require.Equal("8816e8f784a1fce40b54d1cd172bb6976fd9552f1570c73d1d9fcdc5635424a9", hex.EncodeToString(hash[:]))
// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

func TestRestakeABIEncodeAndDecode(t *testing.T) {
Expand Down
6 changes: 3 additions & 3 deletions action/transfer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func TestTransferSignVerify(t *testing.T) {
require.True(ok)

w := AssembleSealedEnvelope(elp, senderKey.PublicKey(), []byte("lol"))
require.Error(Verify(w))
require.Error(w.Verify())
tsf2, ok := w.Envelope.Action().(*Transfer)
require.True(ok)
require.Equal(tsf, tsf2)
Expand All @@ -46,7 +46,7 @@ func TestTransferSignVerify(t *testing.T) {
require.NotNil(selp)

// verify signature
require.NoError(Verify(selp))
require.NoError(selp.Verify())
}

func TestTransfer(t *testing.T) {
Expand All @@ -67,7 +67,7 @@ func TestTransfer(t *testing.T) {
require.True(ok)

w := AssembleSealedEnvelope(elp, senderKey.PublicKey(), []byte("lol"))
require.Error(Verify(w))
require.Error(w.Verify())

require.NoError(err)
require.Equal("10", tsf.Amount().Text(10))
Expand Down

0 comments on commit 887ebab

Please sign in to comment.