Merge pull request #1488 from filecoin-project/feat/rbf
Add Replace by Fee
This commit is contained in:
commit
565099f06f
@ -34,6 +34,13 @@ var log = logging.Logger("messagepool")
|
|||||||
|
|
||||||
const futureDebug = false
|
const futureDebug = false
|
||||||
|
|
||||||
|
const ReplaceByFeeRatio = 1.25
|
||||||
|
|
||||||
|
var (
|
||||||
|
rbfNum = types.NewInt(uint64((ReplaceByFeeRatio - 1) * 256))
|
||||||
|
rbfDenom = types.NewInt(256)
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrMessageTooBig = errors.New("message too big")
|
ErrMessageTooBig = errors.New("message too big")
|
||||||
|
|
||||||
@ -97,10 +104,20 @@ func (ms *msgSet) add(m *types.SignedMessage) error {
|
|||||||
if len(ms.msgs) == 0 || m.Message.Nonce >= ms.nextNonce {
|
if len(ms.msgs) == 0 || m.Message.Nonce >= ms.nextNonce {
|
||||||
ms.nextNonce = m.Message.Nonce + 1
|
ms.nextNonce = m.Message.Nonce + 1
|
||||||
}
|
}
|
||||||
if _, has := ms.msgs[m.Message.Nonce]; has {
|
exms, has := ms.msgs[m.Message.Nonce]
|
||||||
if m.Cid() != ms.msgs[m.Message.Nonce].Cid() {
|
if has {
|
||||||
log.Info("add with duplicate nonce")
|
if m.Cid() != exms.Cid() {
|
||||||
return xerrors.Errorf("message to %s with nonce %d already in mpool", m.Message.To, m.Message.Nonce)
|
// check if RBF passes
|
||||||
|
minPrice := exms.Message.GasPrice
|
||||||
|
minPrice = types.BigAdd(minPrice, types.BigDiv(types.BigMul(minPrice, rbfNum), rbfDenom))
|
||||||
|
minPrice = types.BigAdd(minPrice, types.NewInt(1))
|
||||||
|
if types.BigCmp(m.Message.GasPrice, minPrice) > 0 {
|
||||||
|
log.Infow("add with RBF", "oldprice", exms.Message.GasPrice,
|
||||||
|
"newprice", m.Message.GasPrice, "addr", m.Message.From, "nonce", m.Message.Nonce)
|
||||||
|
} else {
|
||||||
|
log.Info("add with duplicate nonce")
|
||||||
|
return xerrors.Errorf("message to %s with nonce %d already in mpool", m.Message.To, m.Message.Nonce)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ms.msgs[m.Message.Nonce] = m
|
ms.msgs[m.Message.Nonce] = m
|
||||||
|
24
cli/send.go
24
cli/send.go
@ -22,6 +22,11 @@ var sendCmd = &cli.Command{
|
|||||||
Usage: "specify gas price to use in AttoFIL",
|
Usage: "specify gas price to use in AttoFIL",
|
||||||
Value: "0",
|
Value: "0",
|
||||||
},
|
},
|
||||||
|
&cli.Int64Flag{
|
||||||
|
Name: "nonce",
|
||||||
|
Usage: "specify the nonce to use",
|
||||||
|
Value: -1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, closer, err := GetFullNodeAPI(cctx)
|
api, closer, err := GetFullNodeAPI(cctx)
|
||||||
@ -76,9 +81,22 @@ var sendCmd = &cli.Command{
|
|||||||
GasPrice: gp,
|
GasPrice: gp,
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = api.MpoolPushMessage(ctx, msg)
|
if cctx.Int64("nonce") > 0 {
|
||||||
if err != nil {
|
msg.Nonce = uint64(cctx.Int64("nonce"))
|
||||||
return err
|
sm, err := api.WalletSignMessage(ctx, fromAddr, msg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = api.MpoolPush(ctx, sm)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_, err = api.MpoolPushMessage(ctx, msg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -4,5 +4,7 @@ set -o xtrace
|
|||||||
|
|
||||||
export TRUST_PARAMS=1
|
export TRUST_PARAMS=1
|
||||||
|
|
||||||
go run -tags=debug ./cmd/lotus-seed pre-seal
|
go run -tags=debug ./cmd/lotus-seed pre-seal --sector-size 2048 --num-sectors 2
|
||||||
go run -tags=debug ./cmd/lotus daemon --lotus-make-random-genesis=devel.gen --genesis-presealed-sectors=~/.genesis-sectors/pre-seal-t0101.json
|
go run -tags=debug ./cmd/lotus-seed genesis new localnet.json
|
||||||
|
go run -tags=debug ./cmd/lotus-seed genesis add-miner localnet.json ~/.genesis-sectors/pre-seal-t01000.json
|
||||||
|
go run -tags=debug ./cmd/lotus daemon --lotus-make-genesis=devel.gen --genesis-template=localnet.json --bootstrap=false
|
||||||
|
Loading…
Reference in New Issue
Block a user