filter out messages that have insufficient funds from block production
This commit is contained in:
parent
78fa12d2b9
commit
f5ae64bf94
@ -66,3 +66,10 @@ func (m *Message) Cid() cid.Cid {
|
|||||||
|
|
||||||
return b.Cid()
|
return b.Cid()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Message) RequiredFunds() BigInt {
|
||||||
|
return BigAdd(
|
||||||
|
m.Value,
|
||||||
|
BigMul(m.GasPrice, m.GasLimit),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
@ -299,7 +299,10 @@ func (m *Miner) createBlock(base *MiningBase, ticket *types.Ticket, proof types.
|
|||||||
return nil, errors.Wrapf(err, "failed to get pending messages")
|
return nil, errors.Wrapf(err, "failed to get pending messages")
|
||||||
}
|
}
|
||||||
|
|
||||||
msgs := m.selectMessages(pending)
|
msgs, err := m.selectMessages(context.TODO(), base, pending)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("message filtering failed: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
uts := time.Now().Unix() // TODO: put smallest valid timestamp
|
uts := time.Now().Unix() // TODO: put smallest valid timestamp
|
||||||
|
|
||||||
@ -307,7 +310,20 @@ func (m *Miner) createBlock(base *MiningBase, ticket *types.Ticket, proof types.
|
|||||||
return m.api.MinerCreateBlock(context.TODO(), m.addresses[0], base.ts, append(base.tickets, ticket), proof, msgs, uint64(uts))
|
return m.api.MinerCreateBlock(context.TODO(), m.addresses[0], base.ts, append(base.tickets, ticket), proof, msgs, uint64(uts))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Miner) selectMessages(msgs []*types.SignedMessage) []*types.SignedMessage {
|
func (m *Miner) selectMessages(ctx context.Context, base *MiningBase, msgs []*types.SignedMessage) ([]*types.SignedMessage, error) {
|
||||||
// TODO: filter and select 'best' message if too many to fit in one block
|
out := make([]*types.SignedMessage, 0, len(msgs))
|
||||||
return msgs
|
for _, msg := range msgs {
|
||||||
|
act, err := m.api.StateGetActor(ctx, msg.Message.From, base.ts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("failed to check message sender balance: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if act.Balance.LessThan(msg.Message.RequiredFunds()) {
|
||||||
|
log.Warningf("message in mempool does not have enough funds: %s", msg.Cid())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
out = append(out, msg)
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user