Change WinCount to int64, wire it to BlockMessage
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
This commit is contained in:
parent
88352c74fc
commit
4895c895aa
@ -143,7 +143,7 @@ type BlockMessages struct {
|
|||||||
Miner address.Address
|
Miner address.Address
|
||||||
BlsMessages []types.ChainMsg
|
BlsMessages []types.ChainMsg
|
||||||
SecpkMessages []types.ChainMsg
|
SecpkMessages []types.ChainMsg
|
||||||
TicketCount int64
|
WinCount int64
|
||||||
}
|
}
|
||||||
|
|
||||||
type ExecCallback func(cid.Cid, *types.Message, *vm.ApplyRet) error
|
type ExecCallback func(cid.Cid, *types.Message, *vm.ApplyRet) error
|
||||||
@ -311,7 +311,7 @@ func (sm *StateManager) computeTipSetState(ctx context.Context, blks []*types.Bl
|
|||||||
Miner: b.Miner,
|
Miner: b.Miner,
|
||||||
BlsMessages: make([]types.ChainMsg, 0, len(bms)),
|
BlsMessages: make([]types.ChainMsg, 0, len(bms)),
|
||||||
SecpkMessages: make([]types.ChainMsg, 0, len(sms)),
|
SecpkMessages: make([]types.ChainMsg, 0, len(sms)),
|
||||||
TicketCount: 1, //int64(len(b.EPostProof.Proofs)), // TODO fix this
|
WinCount: b.ElectionProof.WinCount,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, m := range bms {
|
for _, m := range bms {
|
||||||
|
@ -59,14 +59,14 @@ func (cs *ChainStore) Weight(ctx context.Context, ts *types.TipSet) (types.BigIn
|
|||||||
|
|
||||||
// (wFunction(totalPowerAtTipset(ts)) * sum(ts.blocks[].ElectionProof.WinCount) * wRatio_num * 2^8) / (e * wRatio_den)
|
// (wFunction(totalPowerAtTipset(ts)) * sum(ts.blocks[].ElectionProof.WinCount) * wRatio_num * 2^8) / (e * wRatio_den)
|
||||||
|
|
||||||
totalJ := uint64(0)
|
totalJ := int64(0)
|
||||||
for _, b := range ts.Blocks() {
|
for _, b := range ts.Blocks() {
|
||||||
totalJ += b.ElectionProof.WinCount
|
totalJ += b.ElectionProof.WinCount
|
||||||
}
|
}
|
||||||
|
|
||||||
eWeight := big.NewInt((log2P * build.WRatioNum))
|
eWeight := big.NewInt((log2P * build.WRatioNum))
|
||||||
eWeight = eWeight.Lsh(eWeight, 8)
|
eWeight = eWeight.Lsh(eWeight, 8)
|
||||||
eWeight = eWeight.Mul(eWeight, new(big.Int).SetUint64(totalJ))
|
eWeight = eWeight.Mul(eWeight, new(big.Int).SetInt64(totalJ))
|
||||||
eWeight = eWeight.Div(eWeight, big.NewInt(int64(build.BlocksPerEpoch*build.WRatioDen)))
|
eWeight = eWeight.Div(eWeight, big.NewInt(int64(build.BlocksPerEpoch*build.WRatioDen)))
|
||||||
|
|
||||||
out = out.Add(out, eWeight)
|
out = out.Add(out, eWeight)
|
||||||
|
@ -518,11 +518,16 @@ func (t *ElectionProof) MarshalCBOR(w io.Writer) error {
|
|||||||
|
|
||||||
scratch := make([]byte, 9)
|
scratch := make([]byte, 9)
|
||||||
|
|
||||||
// t.WinCount (uint64) (uint64)
|
// t.WinCount (int64) (int64)
|
||||||
|
if t.WinCount >= 0 {
|
||||||
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.WinCount)); err != nil {
|
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.WinCount)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.WinCount-1)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// t.VRFProof ([]uint8) (slice)
|
// t.VRFProof ([]uint8) (slice)
|
||||||
if len(t.VRFProof) > cbg.ByteArrayMaxLen {
|
if len(t.VRFProof) > cbg.ByteArrayMaxLen {
|
||||||
@ -555,19 +560,30 @@ func (t *ElectionProof) UnmarshalCBOR(r io.Reader) error {
|
|||||||
return fmt.Errorf("cbor input had wrong number of fields")
|
return fmt.Errorf("cbor input had wrong number of fields")
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.WinCount (uint64) (uint64)
|
// t.WinCount (int64) (int64)
|
||||||
|
|
||||||
{
|
{
|
||||||
|
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
|
||||||
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
|
var extraI int64
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if maj != cbg.MajUnsignedInt {
|
switch maj {
|
||||||
return fmt.Errorf("wrong type for uint64 field")
|
case cbg.MajUnsignedInt:
|
||||||
|
extraI = int64(extra)
|
||||||
|
if extraI < 0 {
|
||||||
|
return fmt.Errorf("int64 positive overflow")
|
||||||
|
}
|
||||||
|
case cbg.MajNegativeInt:
|
||||||
|
extraI = int64(extra)
|
||||||
|
if extraI < 0 {
|
||||||
|
return fmt.Errorf("int64 negative oveflow")
|
||||||
|
}
|
||||||
|
extraI = -1 - extraI
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("wrong type for int64 field: %d", maj)
|
||||||
}
|
}
|
||||||
t.WinCount = uint64(extra)
|
|
||||||
|
|
||||||
|
t.WinCount = int64(extraI)
|
||||||
}
|
}
|
||||||
// t.VRFProof ([]uint8) (slice)
|
// t.VRFProof ([]uint8) (slice)
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type ElectionProof struct {
|
type ElectionProof struct {
|
||||||
WinCount uint64
|
WinCount int64
|
||||||
VRFProof []byte
|
VRFProof []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ func lambda(power, totalPower *big.Int) *big.Int {
|
|||||||
return lam
|
return lam
|
||||||
}
|
}
|
||||||
|
|
||||||
var MaxWinCount = 3 * build.BlocksPerEpoch
|
var MaxWinCount = 3 * int64(build.BlocksPerEpoch)
|
||||||
|
|
||||||
type poiss struct {
|
type poiss struct {
|
||||||
lam *big.Int
|
lam *big.Int
|
||||||
@ -175,7 +175,7 @@ func (p *poiss) next() *big.Int {
|
|||||||
// ComputeWinCount uses VRFProof to compute number of wins
|
// ComputeWinCount uses VRFProof to compute number of wins
|
||||||
// The algorithm is based on Algorand's Sortition with Binomial distribution
|
// The algorithm is based on Algorand's Sortition with Binomial distribution
|
||||||
// replaced by Poisson distribution.
|
// replaced by Poisson distribution.
|
||||||
func (ep *ElectionProof) ComputeWinCount(power BigInt, totalPower BigInt) uint64 {
|
func (ep *ElectionProof) ComputeWinCount(power BigInt, totalPower BigInt) int64 {
|
||||||
h := blake2b.Sum256(ep.VRFProof)
|
h := blake2b.Sum256(ep.VRFProof)
|
||||||
|
|
||||||
lhs := BigFromBytes(h[:]).Int // 256bits, assume Q.256 so [0, 1)
|
lhs := BigFromBytes(h[:]).Int // 256bits, assume Q.256 so [0, 1)
|
||||||
@ -195,7 +195,7 @@ func (ep *ElectionProof) ComputeWinCount(power BigInt, totalPower BigInt) uint64
|
|||||||
|
|
||||||
p, rhs := newPoiss(lam)
|
p, rhs := newPoiss(lam)
|
||||||
|
|
||||||
var j uint64
|
var j int64
|
||||||
for lhs.Cmp(rhs) < 0 && j < MaxWinCount {
|
for lhs.Cmp(rhs) < 0 && j < MaxWinCount {
|
||||||
rhs = p.next()
|
rhs = p.next()
|
||||||
j++
|
j++
|
||||||
|
@ -110,13 +110,13 @@ func TestElectionLam(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var Res uint64
|
var Res int64
|
||||||
|
|
||||||
func BenchmarkWinCounts(b *testing.B) {
|
func BenchmarkWinCounts(b *testing.B) {
|
||||||
totalPower := NewInt(100)
|
totalPower := NewInt(100)
|
||||||
power := NewInt(100)
|
power := NewInt(100)
|
||||||
ep := &ElectionProof{VRFProof: nil}
|
ep := &ElectionProof{VRFProof: nil}
|
||||||
var res uint64
|
var res int64
|
||||||
|
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
|
@ -2,6 +2,7 @@ package validation
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi"
|
"github.com/filecoin-project/specs-actors/actors/abi"
|
||||||
@ -73,7 +74,7 @@ func (a *Applier) ApplyTipSetMessages(epoch abi.ChainEpoch, blocks []vtypes.Bloc
|
|||||||
for _, b := range blocks {
|
for _, b := range blocks {
|
||||||
bm := stmgr.BlockMessages{
|
bm := stmgr.BlockMessages{
|
||||||
Miner: b.Miner,
|
Miner: b.Miner,
|
||||||
TicketCount: 1,
|
WinCount: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, m := range b.BLSMessages {
|
for _, m := range b.BLSMessages {
|
||||||
|
Loading…
Reference in New Issue
Block a user