Skip to content

Commit

Permalink
Add '-maxTotalEV' flag (#2897)
Browse files Browse the repository at this point in the history
  • Loading branch information
leszko committed Oct 25, 2023
1 parent d116a4c commit 366c2d6
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 17 deletions.
4 changes: 3 additions & 1 deletion cmd/livepeer/livepeer.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,9 @@ func parseLivepeerConfig() starter.LivepeerConfig {
cfg.TicketEV = flag.String("ticketEV", *cfg.TicketEV, "The expected value for PM tickets")
cfg.MaxFaceValue = flag.String("maxFaceValue", *cfg.MaxFaceValue, "set max ticket face value in WEI")
// Broadcaster max acceptable ticket EV
cfg.MaxTicketEV = flag.String("maxTicketEV", *cfg.MaxTicketEV, "The maximum acceptable expected value for PM tickets")
cfg.MaxTicketEV = flag.String("maxTicketEV", *cfg.MaxTicketEV, "The maximum acceptable expected value for one PM ticket")
// Broadcaster max acceptable total EV for one payment
cfg.MaxTotalEV = flag.String("maxTotalEV", *cfg.MaxTotalEV, "The maximum acceptable expected value for one PM payment")
// Broadcaster deposit multiplier to determine max acceptable ticket faceValue
cfg.DepositMultiplier = flag.Int("depositMultiplier", *cfg.DepositMultiplier, "The deposit multiplier used to determine max acceptable faceValue for PM tickets")
// Orchestrator base pricing info
Expand Down
20 changes: 13 additions & 7 deletions cmd/livepeer/starter/starter.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ type LivepeerConfig struct {
TicketEV *string
MaxFaceValue *string
MaxTicketEV *string
MaxTotalEV *string
DepositMultiplier *int
PricePerUnit *int
PixelsPerUnit *int
Expand Down Expand Up @@ -195,11 +196,12 @@ func DefaultLivepeerConfig() LivepeerConfig {
defaultTicketEV := "1000000000000"
defaultMaxFaceValue := "0"
defaultMaxTicketEV := "3000000000000"
defaultMaxTotalEV := "20000000000000"
defaultDepositMultiplier := 1
defaultMaxPricePerUnit := 0
defaultPixelsPerUnit := 1
defaultAutoAdjustPrice := true
defaultpricePerBroadcaster := ""
defaultPricePerBroadcaster := ""
defaultBlockPollingInterval := 5
defaultRedeemer := false
defaultRedeemerAddr := ""
Expand Down Expand Up @@ -279,11 +281,12 @@ func DefaultLivepeerConfig() LivepeerConfig {
TicketEV: &defaultTicketEV,
MaxFaceValue: &defaultMaxFaceValue,
MaxTicketEV: &defaultMaxTicketEV,
MaxTotalEV: &defaultMaxTotalEV,
DepositMultiplier: &defaultDepositMultiplier,
MaxPricePerUnit: &defaultMaxPricePerUnit,
PixelsPerUnit: &defaultPixelsPerUnit,
AutoAdjustPrice: &defaultAutoAdjustPrice,
PricePerBroadcaster: &defaultpricePerBroadcaster,
PricePerBroadcaster: &defaultPricePerBroadcaster,
BlockPollingInterval: &defaultBlockPollingInterval,
Redeemer: &defaultRedeemer,
RedeemerAddr: &defaultRedeemerAddr,
Expand Down Expand Up @@ -856,14 +859,17 @@ func StartLivepeer(ctx context.Context, cfg LivepeerConfig) {

}
if n.NodeType == core.BroadcasterNode {
ev, _ := new(big.Rat).SetString(*cfg.MaxTicketEV)
if ev == nil {
maxEV, _ := new(big.Rat).SetString(*cfg.MaxTicketEV)
if maxEV == nil {
panic(fmt.Errorf("-maxTicketEV must be a valid rational number, but %v provided. Restart the node with a valid value for -maxTicketEV", *cfg.MaxTicketEV))
}

if ev.Cmp(big.NewRat(0, 1)) < 0 {
if maxEV.Cmp(big.NewRat(0, 1)) < 0 {
panic(fmt.Errorf("-maxTicketEV must not be negative, but %v provided. Restart the node with a valid value for -maxTicketEV", *cfg.MaxTicketEV))
}
maxTotalEV, _ := new(big.Rat).SetString(*cfg.MaxTotalEV)
if maxTotalEV.Cmp(big.NewRat(0, 1)) < 0 {
panic(fmt.Errorf("-maxTotalEV must not be negative, but %v provided. Restart the node with a valid value for -maxTotalEV", *cfg.MaxTotalEV))
}

if *cfg.DepositMultiplier <= 0 {
panic(fmt.Errorf("-depositMultiplier must be greater than 0, but %v provided. Restart the node with a valid value for -depositMultiplier", *cfg.DepositMultiplier))
Expand All @@ -878,7 +884,7 @@ func StartLivepeer(ctx context.Context, cfg LivepeerConfig) {
glog.Info("Broadcaster Deposit: ", eth.FormatUnits(info.Deposit, "ETH"))
glog.Info("Broadcaster Reserve: ", eth.FormatUnits(info.Reserve.FundsRemaining, "ETH"))

n.Sender = pm.NewSender(n.Eth, timeWatcher, senderWatcher, ev, *cfg.DepositMultiplier)
n.Sender = pm.NewSender(n.Eth, timeWatcher, senderWatcher, maxEV, maxTotalEV, *cfg.DepositMultiplier)

if *cfg.PixelsPerUnit <= 0 {
// Can't divide by 0
Expand Down
11 changes: 8 additions & 3 deletions pm/sender.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,20 @@ type sender struct {
timeManager TimeManager
senderManager SenderManager
maxEV *big.Rat
maxTotalEV *big.Rat
depositMultiplier int

sessions sync.Map
}

// NewSender creates a new Sender instance.
func NewSender(signer Signer, timeManager TimeManager, senderManager SenderManager, maxEV *big.Rat, depositMultiplier int) Sender {
func NewSender(signer Signer, timeManager TimeManager, senderManager SenderManager, maxEV *big.Rat, maxTotalEV *big.Rat, depositMultiplier int) Sender {
return &sender{
signer: signer,
timeManager: timeManager,
senderManager: senderManager,
maxEV: maxEV,
maxTotalEV: maxTotalEV,
depositMultiplier: depositMultiplier,
}
}
Expand Down Expand Up @@ -169,6 +171,9 @@ func (s *sender) validateTicketParams(ticketParams *TicketParams, numTickets int
if ev.Cmp(new(big.Rat).SetInt(ticketParams.FaceValue)) >= 0 {
return fmt.Errorf("ticket faceValue too low faceValue=%v", ticketParams.FaceValue)
}
if ev.Cmp(s.maxEV) > 0 {
return fmt.Errorf("ticket EV %v > max ticket EV %v", ev.FloatString(5), s.maxEV.FloatString(5))
}

info, err := s.senderManager.GetSenderInfo(s.signer.Account().Address)
if err != nil {
Expand All @@ -180,8 +185,8 @@ func (s *sender) validateTicketParams(ticketParams *TicketParams, numTickets int
}

totalEV := ev.Mul(ev, new(big.Rat).SetInt64(int64(numTickets)))
if totalEV.Cmp(s.maxEV) > 0 {
return fmt.Errorf("total ticket EV %v for %v tickets > max total ticket EV %v", totalEV.FloatString(5), numTickets, s.maxEV.FloatString(5))
if totalEV.Cmp(s.maxTotalEV) > 0 {
return fmt.Errorf("total ticket EV %v for %v tickets > max total ticket EV %v", totalEV.FloatString(5), numTickets, s.maxTotalEV.FloatString(5))
}

maxFaceValue := new(big.Int).Div(info.Deposit, big.NewInt(int64(s.depositMultiplier)))
Expand Down
17 changes: 11 additions & 6 deletions pm/sender_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,14 +194,15 @@ func TestCreateTicketBatch_EVTooHigh_ReturnsError(t *testing.T) {
ticketParams.WinProb = new(big.Int).Div(maxWinProb, big.NewInt(2))
ev := ticketEV(ticketParams.FaceValue, ticketParams.WinProb)
sessionID := sender.StartSession(ticketParams)
expErrStr := maxEVErrStr(ev, 1, sender.maxEV)
expErrStr := maxTicketEVErrStr(ev, sender.maxEV)
_, err := sender.CreateTicketBatch(sessionID, 1)
assert.EqualError(t, err, expErrStr)

// Test multiple tickets EV too high
sender.maxEV = big.NewRat(200, 1)
sender.maxEV = big.NewRat(150, 1)
sender.maxTotalEV = big.NewRat(200, 1)

expErrStr = maxEVErrStr(ev.Mul(ev, new(big.Rat).SetInt64(2)), 2, sender.maxEV)
expErrStr = maxTotalEVErrStr(ev.Mul(ev, new(big.Rat).SetInt64(2)), 2, sender.maxTotalEV)
_, err = sender.CreateTicketBatch(sessionID, 2)
assert.EqualError(t, err, expErrStr)

Expand Down Expand Up @@ -456,7 +457,7 @@ func TestValidateTicketParams_EVTooHigh_ReturnsError(t *testing.T) {
WinProb: new(big.Int).Div(maxWinProb, big.NewInt(2)),
ExpirationBlock: big.NewInt(100),
}
expErrStr := maxEVErrStr(ticketEV(ticketParams.FaceValue, ticketParams.WinProb), 1, sender.maxEV)
expErrStr := maxTicketEVErrStr(ticketEV(ticketParams.FaceValue, ticketParams.WinProb), sender.maxEV)
err := sender.ValidateTicketParams(ticketParams)
assert.EqualError(t, err, expErrStr)
}
Expand Down Expand Up @@ -621,7 +622,7 @@ func defaultSender(t *testing.T) *sender {
Reserve: &ReserveInfo{FundsRemaining: big.NewInt(10)},
WithdrawRound: big.NewInt(0),
}
s := NewSender(am, tm, sm, big.NewRat(100, 1), 2)
s := NewSender(am, tm, sm, big.NewRat(100, 1), big.NewRat(100, 1), 2)
return s.(*sender)
}

Expand All @@ -642,6 +643,10 @@ func maxFaceValueErrStr(faceValue, maxFaceValue *big.Int) string {
return fmt.Sprintf("ticket faceValue %v > max faceValue %v", faceValue, maxFaceValue)
}

func maxEVErrStr(ev *big.Rat, numTickets int, maxEV *big.Rat) string {
func maxTicketEVErrStr(ev *big.Rat, maxEV *big.Rat) string {
return fmt.Sprintf("ticket EV %v > max ticket EV %v", ev.FloatString(5), maxEV.FloatString(5))
}

func maxTotalEVErrStr(ev *big.Rat, numTickets int, maxEV *big.Rat) string {
return fmt.Sprintf("total ticket EV %v for %v tickets > max total ticket EV %v", ev.FloatString(5), numTickets, maxEV.FloatString(5))
}

0 comments on commit 366c2d6

Please sign in to comment.