Node/Acct: Renaming (#2245)

Change-Id: I20783b4ae4e445a54d45280e19332af87336a92a
This commit is contained in:
bruce-riley 2023-01-17 07:30:50 -06:00 committed by GitHub
parent 499c8424e4
commit 09aee3cfde
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 159 additions and 159 deletions

View File

@ -113,11 +113,11 @@ spec:
# - /tmp/mounted-keys/wormchain/wormchainKey # - /tmp/mounted-keys/wormchain/wormchainKey
# - --wormchainKeyPassPhrase # - --wormchainKeyPassPhrase
# - test0000 # - test0000
# - --accountingWS # - --accountantWS
# - http://guardian-validator:26657 # - http://guardian-validator:26657
# - --accountingContract # - --accountantContract
# - wormhole1466nf3zuxpya8q9emxukd7vftaf6h4psr0a07srl5zw74zh84yjq4lyjmh # - wormhole1466nf3zuxpya8q9emxukd7vftaf6h4psr0a07srl5zw74zh84yjq4lyjmh
# - --accountingCheckEnabled=true # - --accountantCheckEnabled=true
# - --terraWS # - --terraWS
# - ws://terra-terrad:26657/websocket # - ws://terra-terrad:26657/websocket
# - --terraLCD # - --terraLCD

View File

@ -37,7 +37,7 @@ import (
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/certusone/wormhole/node/pkg/accounting" "github.com/certusone/wormhole/node/pkg/accountant"
"github.com/certusone/wormhole/node/pkg/common" "github.com/certusone/wormhole/node/pkg/common"
"github.com/certusone/wormhole/node/pkg/devnet" "github.com/certusone/wormhole/node/pkg/devnet"
"github.com/certusone/wormhole/node/pkg/governor" "github.com/certusone/wormhole/node/pkg/governor"
@ -146,11 +146,11 @@ var (
wormchainLCD *string wormchainLCD *string
wormchainURL *string wormchainURL *string
wormchainKeyPath *string wormchainKeyPath *string
wormchainKeyPassPhrase *string // TODO Is there a better way to do this?? wormchainKeyPassPhrase *string
accountingContract *string accountantContract *string
accountingWS *string accountantWS *string
accountingCheckEnabled *bool accountantCheckEnabled *bool
aptosRPC *string aptosRPC *string
aptosAccount *string aptosAccount *string
@ -294,9 +294,9 @@ func init() {
wormchainKeyPath = NodeCmd.Flags().String("wormchainKeyPath", "", "path to wormhole-chain private key for signing transactions") wormchainKeyPath = NodeCmd.Flags().String("wormchainKeyPath", "", "path to wormhole-chain private key for signing transactions")
wormchainKeyPassPhrase = NodeCmd.Flags().String("wormchainKeyPassPhrase", "", "pass phrase used to unarmor the wormchain key file") wormchainKeyPassPhrase = NodeCmd.Flags().String("wormchainKeyPassPhrase", "", "pass phrase used to unarmor the wormchain key file")
accountingWS = NodeCmd.Flags().String("accountingWS", "", "Websocket used to listen to the accounting smart contract on wormchain") accountantWS = NodeCmd.Flags().String("accountantWS", "", "Websocket used to listen to the accountant smart contract on wormchain")
accountingContract = NodeCmd.Flags().String("accountingContract", "", "Address of the accounting smart contract on wormchain") accountantContract = NodeCmd.Flags().String("accountantContract", "", "Address of the accountant smart contract on wormchain")
accountingCheckEnabled = NodeCmd.Flags().Bool("accountingCheckEnabled", false, "Should accounting be enforced on transfers") accountantCheckEnabled = NodeCmd.Flags().Bool("accountantCheckEnabled", false, "Should accountant be enforced on transfers")
aptosRPC = NodeCmd.Flags().String("aptosRPC", "", "aptos RPC URL") aptosRPC = NodeCmd.Flags().String("aptosRPC", "", "aptos RPC URL")
aptosAccount = NodeCmd.Flags().String("aptosAccount", "", "aptos account") aptosAccount = NodeCmd.Flags().String("aptosAccount", "", "aptos account")
@ -955,10 +955,10 @@ func runNode(cmd *cobra.Command, args []string) {
} }
} }
// Set up accounting. If the accounting smart contract is configured, we will instantiate accounting and VAAs // Set up the accountant. If the accountant smart contract is configured, we will instantiate the accountant and VAAs
// will be passed to it for processing. It will forward all token bridge transfers to the accounting contract. // will be passed to it for processing. It will forward all token bridge transfers to the accountant contract.
// If accountingCheckEnabled is set to true, token bridge transfers will not be signed and published until they // If accountantCheckEnabled is set to true, token bridge transfers will not be signed and published until they
// are approved by the accounting smart contract. // are approved by the accountant smart contract.
// TODO: Use this once PR #1931 is merged. // TODO: Use this once PR #1931 is merged.
//acctReadC, acctWriteC := makeChannelPair[*common.MessagePublication](0) //acctReadC, acctWriteC := makeChannelPair[*common.MessagePublication](0)
@ -966,43 +966,43 @@ func runNode(cmd *cobra.Command, args []string) {
var acctReadC <-chan *common.MessagePublication = acctChan var acctReadC <-chan *common.MessagePublication = acctChan
var acctWriteC chan<- *common.MessagePublication = acctChan var acctWriteC chan<- *common.MessagePublication = acctChan
var acct *accounting.Accounting var acct *accountant.Accountant
if *accountingContract != "" { if *accountantContract != "" {
if *accountingWS == "" { if *accountantWS == "" {
logger.Fatal("acct: if accountingContract is specified, accountingWS is required") logger.Fatal("acct: if accountantContract is specified, accountantWS is required")
} }
if *wormchainLCD == "" { if *wormchainLCD == "" {
logger.Fatal("acct: if accountingContract is specified, wormchainLCD is required") logger.Fatal("acct: if accountantContract is specified, wormchainLCD is required")
} }
if wormchainConn == nil { if wormchainConn == nil {
logger.Fatal("acct: if accountingContract is specified, the wormchain sending connection must be enabled") logger.Fatal("acct: if accountantContract is specified, the wormchain sending connection must be enabled")
} }
if *accountingCheckEnabled { if *accountantCheckEnabled {
logger.Info("acct: accounting is enabled and will be enforced") logger.Info("acct: accountant is enabled and will be enforced")
} else { } else {
logger.Info("acct: accounting is enabled but will not be enforced") logger.Info("acct: accountant is enabled but will not be enforced")
} }
env := accounting.MainNetMode env := accountant.MainNetMode
if *testnetMode { if *testnetMode {
env = accounting.TestNetMode env = accountant.TestNetMode
} else if *unsafeDevMode { } else if *unsafeDevMode {
env = accounting.DevNetMode env = accountant.DevNetMode
} }
acct = accounting.NewAccounting( acct = accountant.NewAccountant(
rootCtx, rootCtx,
logger, logger,
db, db,
*accountingContract, *accountantContract,
*accountingWS, *accountantWS,
wormchainConn, wormchainConn,
*accountingCheckEnabled, *accountantCheckEnabled,
gk, gk,
gst, gst,
acctWriteC, acctWriteC,
env, env,
) )
} else { } else {
logger.Info("acct: accounting is disabled") logger.Info("acct: accountant is disabled")
} }
var gov *governor.ChainGovernor var gov *governor.ChainGovernor
@ -1332,7 +1332,7 @@ func runNode(cmd *cobra.Command, args []string) {
if acct != nil { if acct != nil {
if err := acct.Start(ctx); err != nil { if err := acct.Start(ctx); err != nil {
logger.Fatal("acct: failed to start accounting", zap.Error(err)) logger.Fatal("acct: failed to start accountant", zap.Error(err))
} }
} }

View File

@ -12,7 +12,7 @@ import (
"os" "os"
"time" "time"
"github.com/certusone/wormhole/node/pkg/accounting" "github.com/certusone/wormhole/node/pkg/accountant"
"github.com/certusone/wormhole/node/pkg/common" "github.com/certusone/wormhole/node/pkg/common"
nodev1 "github.com/certusone/wormhole/node/pkg/proto/node/v1" nodev1 "github.com/certusone/wormhole/node/pkg/proto/node/v1"
"github.com/certusone/wormhole/node/pkg/wormconn" "github.com/certusone/wormhole/node/pkg/wormconn"
@ -121,7 +121,7 @@ func testSubmit(
Payload: Payload, Payload: Payload,
} }
txResp, err := accounting.SubmitObservationToContract(ctx, logger, gk, gsIndex, guardianIndex, wormchainConn, contract, &msg) txResp, err := accountant.SubmitObservationToContract(ctx, logger, gk, gsIndex, guardianIndex, wormchainConn, contract, &msg)
if err != nil { if err != nil {
logger.Error("acct: failed to broadcast Observation request", zap.String("test", tag), zap.Error(err)) logger.Error("acct: failed to broadcast Observation request", zap.String("test", tag), zap.Error(err))
return false return false
@ -133,7 +133,7 @@ func testSubmit(
// return false // return false
// } // }
alreadyCommitted, err := accounting.CheckSubmitObservationResult(txResp) alreadyCommitted, err := accountant.CheckSubmitObservationResult(txResp)
if err != nil { if err != nil {
if !errorExpected { if !errorExpected {
logger.Error("acct: unexpected error", zap.String("test", tag), zap.Error(err)) logger.Error("acct: unexpected error", zap.String("test", tag), zap.Error(err))

View File

@ -1,10 +1,10 @@
// The accounting package manages the interface to the accounting smart contract on wormchain. It is passed all VAAs before // The accountant package manages the interface to the accountant smart contract on wormchain. It is passed all VAAs before
// they are signed and published. It determines if the VAA is for a token bridge transfer, and if it is, it submits an observation // they are signed and published. It determines if the VAA is for a token bridge transfer, and if it is, it submits an observation
// request to the accounting contract. When that happens, the VAA is queued up until the accounting contract responds indicating // request to the accountant contract. When that happens, the VAA is queued up until the accountant contract responds indicating
// that the VAA has been approved. If the VAA is approved, this module will forward the VAA back to the processor loop to be signed // that the VAA has been approved. If the VAA is approved, this module will forward the VAA back to the processor loop to be signed
// and published. // and published.
package accounting package accountant
import ( import (
"context" "context"
@ -58,11 +58,11 @@ type (
} }
) )
// Accounting is the object that manages the interface to the wormchain accounting smart contract. // Accountant is the object that manages the interface to the wormchain accountant smart contract.
type Accounting struct { type Accountant struct {
ctx context.Context ctx context.Context
logger *zap.Logger logger *zap.Logger
db db.AccountingDB db db.AccountantDB
contract string contract string
wsUrl string wsUrl string
wormchainConn *wormconn.ClientConn wormchainConn *wormconn.ClientConn
@ -80,21 +80,21 @@ type Accounting struct {
const subChanSize = 50 const subChanSize = 50
// NewAccounting creates a new instance of the Accounting object. // NewAccountant creates a new instance of the Accountant object.
func NewAccounting( func NewAccountant(
ctx context.Context, ctx context.Context,
logger *zap.Logger, logger *zap.Logger,
db db.AccountingDB, db db.AccountantDB,
contract string, // the address of the smart contract on wormchain contract string, // the address of the smart contract on wormchain
wsUrl string, // the URL of the wormchain websocket interface wsUrl string, // the URL of the wormchain websocket interface
wormchainConn *wormconn.ClientConn, // used for communicating with the smart contract wormchainConn *wormconn.ClientConn, // used for communicating with the smart contract
enforceFlag bool, // whether or not accounting should be enforced enforceFlag bool, // whether or not accountant should be enforced
gk *ecdsa.PrivateKey, // the guardian key used for signing observation requests gk *ecdsa.PrivateKey, // the guardian key used for signing observation requests
gst *common.GuardianSetState, // used to get the current guardian set index when sending observation requests gst *common.GuardianSetState, // used to get the current guardian set index when sending observation requests
msgChan chan<- *common.MessagePublication, // the channel where transfers received by the accounting runnable should be published msgChan chan<- *common.MessagePublication, // the channel where transfers received by the accountant runnable should be published
env int, // Controls the set of token bridges to be monitored env int, // Controls the set of token bridges to be monitored
) *Accounting { ) *Accountant {
return &Accounting{ return &Accountant{
ctx: ctx, ctx: ctx,
logger: logger, logger: logger,
db: db, db: db,
@ -113,8 +113,8 @@ func NewAccounting(
} }
} }
// Run initializes the accounting module and starts the watcher runnable. // Run initializes the accountant and starts the watcher runnable.
func (acct *Accounting) Start(ctx context.Context) error { func (acct *Accountant) Start(ctx context.Context) error {
acct.logger.Debug("acct: entering run") acct.logger.Debug("acct: entering run")
acct.pendingTransfersLock.Lock() acct.pendingTransfersLock.Lock()
defer acct.pendingTransfersLock.Unlock() defer acct.pendingTransfersLock.Unlock()
@ -163,24 +163,24 @@ func (acct *Accounting) Start(ctx context.Context) error {
return nil return nil
} }
func (acct *Accounting) Close() { func (acct *Accountant) Close() {
if acct.wormchainConn != nil { if acct.wormchainConn != nil {
acct.wormchainConn.Close() acct.wormchainConn.Close()
acct.wormchainConn = nil acct.wormchainConn = nil
} }
} }
func (acct *Accounting) FeatureString() string { func (acct *Accountant) FeatureString() string {
if !acct.enforceFlag { if !acct.enforceFlag {
return "acct:logonly" return "acct:logonly"
} }
return "acct:enforced" return "acct:enforced"
} }
// SubmitObservation will submit token bridge transfers to the accounting smart contract. This is called from the processor // SubmitObservation will submit token bridge transfers to the accountant smart contract. This is called from the processor
// loop when a local observation is received from a watcher. It returns true if the observation can be published immediately, // loop when a local observation is received from a watcher. It returns true if the observation can be published immediately,
// false if not (because it has been submitted to accounting). // false if not (because it has been submitted to accountant).
func (acct *Accounting) SubmitObservation(msg *common.MessagePublication) (bool, error) { func (acct *Accountant) SubmitObservation(msg *common.MessagePublication) (bool, error) {
msgId := msg.MessageIDString() msgId := msg.MessageIDString()
acct.logger.Debug("acct: in SubmitObservation", zap.String("msgID", msgId)) acct.logger.Debug("acct: in SubmitObservation", zap.String("msgID", msgId))
// We only care about token bridges. // We only care about token bridges.
@ -227,18 +227,18 @@ func (acct *Accounting) SubmitObservation(msg *common.MessagePublication) (bool,
// This transaction may take a while. Pass it off to the worker so we don't block the processor. // This transaction may take a while. Pass it off to the worker so we don't block the processor.
if acct.env != GoTestMode { if acct.env != GoTestMode {
acct.logger.Info("acct: submitting transfer to accounting for approval", zap.String("msgID", msgId), zap.Bool("canPublish", !acct.enforceFlag)) acct.logger.Info("acct: submitting transfer to accountant for approval", zap.String("msgID", msgId), zap.Bool("canPublish", !acct.enforceFlag))
acct.submitObservation(msg) acct.submitObservation(msg)
} }
// If we are not enforcing accounting, the event can be published. Otherwise we have to wait to hear back from the contract. // If we are not enforcing accountant, the event can be published. Otherwise we have to wait to hear back from the contract.
return !acct.enforceFlag, nil return !acct.enforceFlag, nil
} }
// AuditPending audits the set of pending transfers for any that have been in the pending state too long. This is called from the processor loop // AuditPending audits the set of pending transfers for any that have been in the pending state too long. This is called from the processor loop
// each timer interval. Any transfers that have been in the pending state too long will be resubmitted. Any that has been retried too many times // each timer interval. Any transfers that have been in the pending state too long will be resubmitted. Any that has been retried too many times
// will be logged and dropped. // will be logged and dropped.
func (acct *Accounting) AuditPendingTransfers() { func (acct *Accountant) AuditPendingTransfers() {
acct.logger.Debug("acct: in AuditPendingTransfers") acct.logger.Debug("acct: in AuditPendingTransfers")
acct.pendingTransfersLock.Lock() acct.pendingTransfersLock.Lock()
defer acct.pendingTransfersLock.Unlock() defer acct.pendingTransfersLock.Unlock()
@ -272,8 +272,8 @@ func (acct *Accounting) AuditPendingTransfers() {
acct.logger.Debug("acct: leaving AuditPendingTransfers") acct.logger.Debug("acct: leaving AuditPendingTransfers")
} }
// publishTransfer publishes a pending transfer to the accounting channel and updates the timestamp. It assumes the caller holds the lock. // publishTransfer publishes a pending transfer to the accountant channel and updates the timestamp. It assumes the caller holds the lock.
func (acct *Accounting) publishTransfer(pe *pendingEntry) { func (acct *Accountant) publishTransfer(pe *pendingEntry) {
if acct.enforceFlag { if acct.enforceFlag {
acct.logger.Debug("acct: publishTransfer: notifying the processor", zap.String("msgId", pe.msgId)) acct.logger.Debug("acct: publishTransfer: notifying the processor", zap.String("msgId", pe.msgId))
acct.msgChan <- pe.msg acct.msgChan <- pe.msg
@ -283,7 +283,7 @@ func (acct *Accounting) publishTransfer(pe *pendingEntry) {
} }
// addPendingTransfer adds a pending transfer to both the map and the database. It assumes the caller holds the lock. // addPendingTransfer adds a pending transfer to both the map and the database. It assumes the caller holds the lock.
func (acct *Accounting) addPendingTransfer(msgId string, msg *common.MessagePublication, digest string) error { func (acct *Accountant) addPendingTransfer(msgId string, msg *common.MessagePublication, digest string) error {
acct.logger.Debug("acct: addPendingTransfer", zap.String("msgId", msgId)) acct.logger.Debug("acct: addPendingTransfer", zap.String("msgId", msgId))
if err := acct.db.AcctStorePendingTransfer(msg); err != nil { if err := acct.db.AcctStorePendingTransfer(msg); err != nil {
return err return err
@ -296,7 +296,7 @@ func (acct *Accounting) addPendingTransfer(msgId string, msg *common.MessagePubl
} }
// deletePendingTransfer deletes the transfer from both the map and the database. It assumes the caller holds the lock. // deletePendingTransfer deletes the transfer from both the map and the database. It assumes the caller holds the lock.
func (acct *Accounting) deletePendingTransfer(msgId string) { func (acct *Accountant) deletePendingTransfer(msgId string) {
acct.logger.Debug("acct: deletePendingTransfer", zap.String("msgId", msgId)) acct.logger.Debug("acct: deletePendingTransfer", zap.String("msgId", msgId))
if _, exists := acct.pendingTransfers[msgId]; exists { if _, exists := acct.pendingTransfers[msgId]; exists {
transfersOutstanding.Dec() transfersOutstanding.Dec()
@ -309,7 +309,7 @@ func (acct *Accounting) deletePendingTransfer(msgId string) {
} }
// loadPendingTransfers loads any pending transfers that are present in the database. This method assumes the caller holds the lock. // loadPendingTransfers loads any pending transfers that are present in the database. This method assumes the caller holds the lock.
func (acct *Accounting) loadPendingTransfers() error { func (acct *Accountant) loadPendingTransfers() error {
pendingTransfers, err := acct.db.AcctGetData(acct.logger) pendingTransfers, err := acct.db.AcctGetData(acct.logger)
if err != nil { if err != nil {
return err return err
@ -337,7 +337,7 @@ func (acct *Accounting) loadPendingTransfers() error {
// submitObservation sends an observation request to the worker so it can be submited to the contract. // submitObservation sends an observation request to the worker so it can be submited to the contract.
// If writing to the channel would block, this function resets the timestamp on the entry so it will be // If writing to the channel would block, this function resets the timestamp on the entry so it will be
// retried next audit interval. This method assumes the caller holds the lock. // retried next audit interval. This method assumes the caller holds the lock.
func (acct *Accounting) submitObservation(msg *common.MessagePublication) { func (acct *Accountant) submitObservation(msg *common.MessagePublication) {
select { select {
case acct.subChan <- msg: case acct.subChan <- msg:
acct.logger.Debug("acct: submitted observation to channel", zap.String("msgId", msg.MessageIDString())) acct.logger.Debug("acct: submitted observation to channel", zap.String("msgId", msg.MessageIDString()))

View File

@ -1,4 +1,4 @@
package accounting package accountant
import ( import (
"context" "context"
@ -21,18 +21,18 @@ import (
) )
const ( const (
enforceAccounting = true enforceAccountant = true
dontEnforceAccounting = false dontEnforceAccountant = false
) )
func newAccountingForTest( func newAccountantForTest(
t *testing.T, t *testing.T,
ctx context.Context, ctx context.Context,
accountingCheckEnabled bool, accountantCheckEnabled bool,
acctWriteC chan<- *common.MessagePublication, acctWriteC chan<- *common.MessagePublication,
) *Accounting { ) *Accountant {
logger := zap.NewNop() logger := zap.NewNop()
var db db.MockAccountingDB var db db.MockAccountantDB
gk := devnet.InsecureDeterministicEcdsaKeyByIndex(ethCrypto.S256(), uint64(0)) gk := devnet.InsecureDeterministicEcdsaKeyByIndex(ethCrypto.S256(), uint64(0))
@ -40,14 +40,14 @@ func newAccountingForTest(
gs := &common.GuardianSet{} gs := &common.GuardianSet{}
gst.Set(gs) gst.Set(gs)
acct := NewAccounting( acct := NewAccountant(
ctx, ctx,
logger, logger,
&db, &db,
"0xdeadbeef", // accountingContract "0xdeadbeef", // accountantContract
"none", // accountingWS "none", // accountantWS
nil, // wormchainConn nil, // wormchainConn
accountingCheckEnabled, accountantCheckEnabled,
gk, gk,
gst, gst,
acctWriteC, acctWriteC,
@ -101,7 +101,7 @@ func buildMockTransferPayloadBytes(
func TestVaaFromUninterestingEmitter(t *testing.T) { func TestVaaFromUninterestingEmitter(t *testing.T) {
ctx := context.Background() ctx := context.Background()
acctChan := make(chan *common.MessagePublication, 10) acctChan := make(chan *common.MessagePublication, 10)
acct := newAccountingForTest(t, ctx, enforceAccounting, acctChan) acct := newAccountantForTest(t, ctx, enforceAccountant, acctChan)
require.NotNil(t, acct) require.NotNil(t, acct)
emitterAddr, _ := vaa.StringToAddress("0x00") emitterAddr, _ := vaa.StringToAddress("0x00")
@ -127,7 +127,7 @@ func TestVaaFromUninterestingEmitter(t *testing.T) {
func TestVaaForUninterestingPayloadType(t *testing.T) { func TestVaaForUninterestingPayloadType(t *testing.T) {
ctx := context.Background() ctx := context.Background()
acctChan := make(chan *common.MessagePublication, 10) acctChan := make(chan *common.MessagePublication, 10)
acct := newAccountingForTest(t, ctx, enforceAccounting, acctChan) acct := newAccountantForTest(t, ctx, enforceAccountant, acctChan)
require.NotNil(t, acct) require.NotNil(t, acct)
emitterAddr, _ := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16") emitterAddr, _ := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16")
@ -150,10 +150,10 @@ func TestVaaForUninterestingPayloadType(t *testing.T) {
assert.Equal(t, 0, len(acct.pendingTransfers)) assert.Equal(t, 0, len(acct.pendingTransfers))
} }
func TestInterestingTransferShouldNotBeBlockedWhenNotEnforcingAccounting(t *testing.T) { func TestInterestingTransferShouldNotBeBlockedWhenNotEnforcingAccountant(t *testing.T) {
ctx := context.Background() ctx := context.Background()
acctChan := make(chan *common.MessagePublication, 10) acctChan := make(chan *common.MessagePublication, 10)
acct := newAccountingForTest(t, ctx, dontEnforceAccounting, acctChan) acct := newAccountantForTest(t, ctx, dontEnforceAccountant, acctChan)
require.NotNil(t, acct) require.NotNil(t, acct)
emitterAddr, _ := vaa.StringToAddress("0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16") emitterAddr, _ := vaa.StringToAddress("0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16")
@ -192,10 +192,10 @@ func TestInterestingTransferShouldNotBeBlockedWhenNotEnforcingAccounting(t *test
assert.Equal(t, 0, len(acct.pendingTransfers)) assert.Equal(t, 0, len(acct.pendingTransfers))
} }
func TestInterestingTransferShouldBeBlockedWhenEnforcingAccounting(t *testing.T) { func TestInterestingTransferShouldBeBlockedWhenEnforcingAccountant(t *testing.T) {
ctx := context.Background() ctx := context.Background()
acctChan := make(chan *common.MessagePublication, 10) acctChan := make(chan *common.MessagePublication, 10)
acct := newAccountingForTest(t, ctx, enforceAccounting, acctChan) acct := newAccountantForTest(t, ctx, enforceAccountant, acctChan)
require.NotNil(t, acct) require.NotNil(t, acct)
emitterAddr, _ := vaa.StringToAddress("0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16") emitterAddr, _ := vaa.StringToAddress("0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16")

View File

@ -0,0 +1,50 @@
package accountant
import (
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus"
)
var (
transfersOutstanding = promauto.NewGauge(
prometheus.GaugeOpts{
Name: "global_accountant_transfer_vaas_outstanding",
Help: "Current number of accountant transfers vaas in the pending state",
})
transfersSubmitted = promauto.NewCounter(
prometheus.CounterOpts{
Name: "global_accountant_transfer_vaas_submitted",
Help: "Total number of accountant transfer vaas submitted",
})
transfersApproved = promauto.NewCounter(
prometheus.CounterOpts{
Name: "global_accountant_transfer_vaas_submitted_and_approved",
Help: "Total number of accountant transfer vaas that were submitted and approved",
})
eventsReceived = promauto.NewCounter(
prometheus.CounterOpts{
Name: "global_accountant_events_received",
Help: "Total number of accountant events received from the smart contract",
})
submitFailures = promauto.NewCounter(
prometheus.CounterOpts{
Name: "global_accountant_submit_failures",
Help: "Total number of accountant transfer vaas submit failures",
})
balanceErrors = promauto.NewCounter(
prometheus.CounterOpts{
Name: "global_accountant_total_balance_errors",
Help: "Total number of balance errors detected by accountant",
})
digestMismatches = promauto.NewCounter(
prometheus.CounterOpts{
Name: "global_accountant_total_digest_mismatches",
Help: "Total number of digest mismatches on accountant",
})
connectionErrors = promauto.NewCounter(
prometheus.CounterOpts{
Name: "global_accountant_connection_errors_total",
Help: "Total number of connection errors on accountant",
})
)

View File

@ -1,4 +1,4 @@
package accounting package accountant
import ( import (
"context" "context"
@ -21,7 +21,7 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
) )
func (acct *Accounting) worker(ctx context.Context) error { func (acct *Accountant) worker(ctx context.Context) error {
for { for {
select { select {
case <-ctx.Done(): case <-ctx.Done():
@ -108,7 +108,7 @@ func (sb SignatureBytes) MarshalJSON() ([]byte, error) {
// submitObservationToContract makes a call to the smart contract to submit an observation request. // submitObservationToContract makes a call to the smart contract to submit an observation request.
// It should be called from a go routine because it can block. // It should be called from a go routine because it can block.
func (acct *Accounting) submitObservationToContract(msg *common.MessagePublication, gsIndex uint32, guardianIndex uint32) { func (acct *Accountant) submitObservationToContract(msg *common.MessagePublication, gsIndex uint32, guardianIndex uint32) {
msgId := msg.MessageIDString() msgId := msg.MessageIDString()
acct.logger.Debug("acct: in submitObservationToContract", zap.String("msgID", msgId)) acct.logger.Debug("acct: in submitObservationToContract", zap.String("msgID", msgId))
txResp, err := SubmitObservationToContract(acct.ctx, acct.logger, acct.gk, gsIndex, guardianIndex, acct.wormchainConn, acct.contract, msg) txResp, err := SubmitObservationToContract(acct.ctx, acct.logger, acct.gk, gsIndex, guardianIndex, acct.wormchainConn, acct.contract, msg)
@ -173,14 +173,14 @@ func SubmitObservationToContract(
bytes, err := json.Marshal(obs) bytes, err := json.Marshal(obs)
if err != nil { if err != nil {
return nil, fmt.Errorf("acct: failed to marshal accounting observation request: %w", err) return nil, fmt.Errorf("acct: failed to marshal accountant observation request: %w", err)
} }
digest := vaa.SigningMsg(bytes) digest := vaa.SigningMsg(bytes)
sigBytes, err := ethCrypto.Sign(digest.Bytes(), gk) sigBytes, err := ethCrypto.Sign(digest.Bytes(), gk)
if err != nil { if err != nil {
return nil, fmt.Errorf("acct: failed to sign accounting Observation request: %w", err) return nil, fmt.Errorf("acct: failed to sign accountant Observation request: %w", err)
} }
sig := SignatureType{Index: guardianIndex, Signature: sigBytes} sig := SignatureType{Index: guardianIndex, Signature: sigBytes}
@ -195,7 +195,7 @@ func SubmitObservationToContract(
msgBytes, err := json.Marshal(msgData) msgBytes, err := json.Marshal(msgData)
if err != nil { if err != nil {
return nil, fmt.Errorf("acct: failed to marshal accounting observation request: %w", err) return nil, fmt.Errorf("acct: failed to marshal accountant observation request: %w", err)
} }
subMsg := wasmdtypes.MsgExecuteContract{ subMsg := wasmdtypes.MsgExecuteContract{

View File

@ -1,4 +1,4 @@
package accounting package accountant
import ( import (
"context" "context"
@ -22,7 +22,7 @@ import (
) )
// watcher reads transaction events from the smart contract and publishes them. // watcher reads transaction events from the smart contract and publishes them.
func (acct *Accounting) watcher(ctx context.Context) error { func (acct *Accountant) watcher(ctx context.Context) error {
errC := make(chan error) errC := make(chan error)
acct.logger.Info("acctwatch: creating watcher", zap.String("url", acct.wsUrl), zap.String("contract", acct.contract)) acct.logger.Info("acctwatch: creating watcher", zap.String("url", acct.wsUrl), zap.String("contract", acct.contract))
@ -51,7 +51,7 @@ func (acct *Accounting) watcher(ctx context.Context) error {
64, // channel capacity 64, // channel capacity
) )
if err != nil { if err != nil {
return fmt.Errorf("failed to subscribe to accounting events: %w", err) return fmt.Errorf("failed to subscribe to accountant events: %w", err)
} }
defer func() { defer func() {
if err := tmConn.UnsubscribeAll(ctx, "guardiand"); err != nil { if err := tmConn.UnsubscribeAll(ctx, "guardiand"); err != nil {
@ -70,7 +70,7 @@ func (acct *Accounting) watcher(ctx context.Context) error {
} }
// handleEvents handles events from the tendermint client library. // handleEvents handles events from the tendermint client library.
func (acct *Accounting) handleEvents(ctx context.Context, evts <-chan tmCoreTypes.ResultEvent, errC chan error) { func (acct *Accountant) handleEvents(ctx context.Context, evts <-chan tmCoreTypes.ResultEvent, errC chan error) {
defer close(errC) defer close(errC)
for { for {
@ -146,7 +146,7 @@ func parseWasmTransfer(logger *zap.Logger, event tmAbci.Event, contractAddress s
} }
// processPendingTransfer takes a WasmTransfer event, determines if we are expecting it, and if so, publishes it. // processPendingTransfer takes a WasmTransfer event, determines if we are expecting it, and if so, publishes it.
func (acct *Accounting) processPendingTransfer(xfer *WasmTransfer) { func (acct *Accountant) processPendingTransfer(xfer *WasmTransfer) {
acct.logger.Info("acctwatch: transfer event detected", acct.logger.Info("acctwatch: transfer event detected",
zap.String("tx_hash", hex.EncodeToString(xfer.TxHashBytes)), zap.String("tx_hash", hex.EncodeToString(xfer.TxHashBytes)),
zap.Uint32("timestamp", xfer.Timestamp), zap.Uint32("timestamp", xfer.Timestamp),

View File

@ -1,4 +1,4 @@
package accounting package accountant
import ( import (
"encoding/hex" "encoding/hex"

View File

@ -1,50 +0,0 @@
package accounting
import (
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus"
)
var (
transfersOutstanding = promauto.NewGauge(
prometheus.GaugeOpts{
Name: "wormhole_accounting_transfer_vaas_outstanding",
Help: "Current number of accounting transfers vaas in the pending state",
})
transfersSubmitted = promauto.NewCounter(
prometheus.CounterOpts{
Name: "wormhole_accounting_transfer_vaas_submitted",
Help: "Total number of accounting transfer vaas submitted",
})
transfersApproved = promauto.NewCounter(
prometheus.CounterOpts{
Name: "wormhole_accounting_transfer_vaas_submitted_and_approved",
Help: "Total number of accounting transfer vaas that were submitted and approved",
})
eventsReceived = promauto.NewCounter(
prometheus.CounterOpts{
Name: "wormhole_accounting_events_received",
Help: "Total number of accounting events received from the smart contract",
})
submitFailures = promauto.NewCounter(
prometheus.CounterOpts{
Name: "wormhole_accounting_submit_failures",
Help: "Total number of accounting transfer vaas submit failures",
})
balanceErrors = promauto.NewCounter(
prometheus.CounterOpts{
Name: "wormhole_accounting_total_balance_errors",
Help: "Total number of balance errors detected by accounting",
})
digestMismatches = promauto.NewCounter(
prometheus.CounterOpts{
Name: "wormhole_accounting_total_digest_mismatches",
Help: "Total number of digest mismatches on accounting",
})
connectionErrors = promauto.NewCounter(
prometheus.CounterOpts{
Name: "wormhole_accounting_connection_errors_total",
Help: "Total number of connection errors on accounting",
})
)

View File

@ -10,24 +10,24 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
) )
type AccountingDB interface { type AccountantDB interface {
AcctStorePendingTransfer(msg *common.MessagePublication) error AcctStorePendingTransfer(msg *common.MessagePublication) error
AcctDeletePendingTransfer(msgId string) error AcctDeletePendingTransfer(msgId string) error
AcctGetData(logger *zap.Logger) ([]*common.MessagePublication, error) AcctGetData(logger *zap.Logger) ([]*common.MessagePublication, error)
} }
type MockAccountingDB struct { type MockAccountantDB struct {
} }
func (d *MockAccountingDB) AcctStorePendingTransfer(msg *common.MessagePublication) error { func (d *MockAccountantDB) AcctStorePendingTransfer(msg *common.MessagePublication) error {
return nil return nil
} }
func (d *MockAccountingDB) AcctDeletePendingTransfer(msgId string) error { func (d *MockAccountantDB) AcctDeletePendingTransfer(msgId string) error {
return nil return nil
} }
func (d *MockAccountingDB) AcctGetData(logger *zap.Logger) ([]*common.MessagePublication, error) { func (d *MockAccountantDB) AcctGetData(logger *zap.Logger) ([]*common.MessagePublication, error) {
return nil, nil return nil, nil
} }
@ -44,7 +44,7 @@ func acctIsPendingTransfer(keyBytes []byte) bool {
return (len(keyBytes) >= acctPendingTransferLen+acctMinMsgIdLen) && (string(keyBytes[0:acctPendingTransferLen]) == acctPendingTransfer) return (len(keyBytes) >= acctPendingTransferLen+acctMinMsgIdLen) && (string(keyBytes[0:acctPendingTransferLen]) == acctPendingTransfer)
} }
// This is called by the accounting module on start up to reload pending transfers. // This is called by the accountant on start up to reload pending transfers.
func (d *Database) AcctGetData(logger *zap.Logger) ([]*common.MessagePublication, error) { func (d *Database) AcctGetData(logger *zap.Logger) ([]*common.MessagePublication, error) {
pendingTransfers := []*common.MessagePublication{} pendingTransfers := []*common.MessagePublication{}
prefixBytes := []byte(acctPendingTransfer) prefixBytes := []byte(acctPendingTransfer)
@ -71,7 +71,7 @@ func (d *Database) AcctGetData(logger *zap.Logger) ([]*common.MessagePublication
pendingTransfers = append(pendingTransfers, &pt) pendingTransfers = append(pendingTransfers, &pt)
} else { } else {
return fmt.Errorf("unexpected accounting pending transfer key '%s'", string(key)) return fmt.Errorf("unexpected accountant pending transfer key '%s'", string(key))
} }
} }
@ -92,7 +92,7 @@ func (d *Database) AcctStorePendingTransfer(msg *common.MessagePublication) erro
}) })
if err != nil { if err != nil {
return fmt.Errorf("failed to commit accounting pending transfer for tx %s: %w", msg.MessageIDString(), err) return fmt.Errorf("failed to commit accountant pending transfer for tx %s: %w", msg.MessageIDString(), err)
} }
return nil return nil
@ -104,7 +104,7 @@ func (d *Database) AcctDeletePendingTransfer(msgId string) error {
err := txn.Delete(key) err := txn.Delete(key)
return err return err
}); err != nil { }); err != nil {
return fmt.Errorf("failed to delete accounting pending transfer for tx %s: %w", msgId, err) return fmt.Errorf("failed to delete accountant pending transfer for tx %s: %w", msgId, err)
} }
return nil return nil

View File

@ -8,7 +8,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/certusone/wormhole/node/pkg/accounting" "github.com/certusone/wormhole/node/pkg/accountant"
node_common "github.com/certusone/wormhole/node/pkg/common" node_common "github.com/certusone/wormhole/node/pkg/common"
"github.com/certusone/wormhole/node/pkg/governor" "github.com/certusone/wormhole/node/pkg/governor"
"github.com/certusone/wormhole/node/pkg/version" "github.com/certusone/wormhole/node/pkg/version"
@ -83,7 +83,7 @@ func Run(
nodeName string, nodeName string,
disableHeartbeatVerify bool, disableHeartbeatVerify bool,
rootCtxCancel context.CancelFunc, rootCtxCancel context.CancelFunc,
acct *accounting.Accounting, acct *accountant.Accountant,
gov *governor.ChainGovernor, gov *governor.ChainGovernor,
signedGovCfg chan *gossipv1.SignedChainGovernorConfig, signedGovCfg chan *gossipv1.SignedChainGovernorConfig,
signedGovSt chan *gossipv1.SignedChainGovernorStatus, signedGovSt chan *gossipv1.SignedChainGovernorStatus,

View File

@ -15,7 +15,7 @@ import (
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/certusone/wormhole/node/pkg/accounting" "github.com/certusone/wormhole/node/pkg/accountant"
"github.com/certusone/wormhole/node/pkg/common" "github.com/certusone/wormhole/node/pkg/common"
gossipv1 "github.com/certusone/wormhole/node/pkg/proto/gossip/v1" gossipv1 "github.com/certusone/wormhole/node/pkg/proto/gossip/v1"
"github.com/certusone/wormhole/node/pkg/reporter" "github.com/certusone/wormhole/node/pkg/reporter"
@ -133,7 +133,7 @@ type Processor struct {
notifier *discord.DiscordNotifier notifier *discord.DiscordNotifier
governor *governor.ChainGovernor governor *governor.ChainGovernor
acct *accounting.Accounting acct *accountant.Accountant
acctReadC <-chan *common.MessagePublication acctReadC <-chan *common.MessagePublication
pythnetVaas map[string]PythNetVaaEntry pythnetVaas map[string]PythNetVaaEntry
} }
@ -157,7 +157,7 @@ func NewProcessor(
attestationEvents *reporter.AttestationEventReporter, attestationEvents *reporter.AttestationEventReporter,
notifier *discord.DiscordNotifier, notifier *discord.DiscordNotifier,
g *governor.ChainGovernor, g *governor.ChainGovernor,
acct *accounting.Accounting, acct *accountant.Accountant,
acctReadC <-chan *common.MessagePublication, acctReadC <-chan *common.MessagePublication,
) *Processor { ) *Processor {
@ -229,7 +229,7 @@ func (p *Processor) Run(ctx context.Context) error {
case k := <-p.acctReadC: case k := <-p.acctReadC:
if p.acct == nil { if p.acct == nil {
return fmt.Errorf("acct: received an accounting event when accounting is not configured") return fmt.Errorf("acct: received an accountant event when accountant is not configured")
} }
p.handleMessage(ctx, k) p.handleMessage(ctx, k)
case v := <-p.injectC: case v := <-p.injectC: