lotus/lib/sectorbuilder/sectorbuilder_test.go

254 lines
5.2 KiB
Go
Raw Normal View History

2019-08-14 22:17:27 +00:00
package sectorbuilder_test
import (
"context"
"io"
2019-11-08 18:55:23 +00:00
"io/ioutil"
"math/rand"
2019-11-07 16:39:27 +00:00
"os"
"runtime"
2019-11-14 18:26:09 +00:00
"sync"
"testing"
2019-11-14 18:26:09 +00:00
"time"
"github.com/ipfs/go-datastore"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2019-10-22 06:43:14 +00:00
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/lib/sectorbuilder"
)
2019-10-27 11:58:15 +00:00
const sectorSize = 1024
2019-11-14 18:26:09 +00:00
type seal struct {
sid uint64
2019-11-05 17:09:42 +00:00
2019-11-14 18:26:09 +00:00
pco sectorbuilder.RawSealPreCommitOutput
ppi sectorbuilder.PublicPieceInfo
2019-10-27 11:58:15 +00:00
2019-11-14 18:26:09 +00:00
ticket sectorbuilder.SealTicket
}
2019-11-14 18:26:09 +00:00
func (s *seal) precommit(t *testing.T, sb *sectorbuilder.SectorBuilder, sid uint64, done func()) {
2019-10-27 11:58:15 +00:00
dlen := sectorbuilder.UserBytesForSectorSize(sectorSize)
2019-11-14 18:26:09 +00:00
var err error
r := io.LimitReader(rand.New(rand.NewSource(42+int64(sid))), int64(dlen))
2019-11-14 18:26:09 +00:00
s.ppi, err = sb.AddPiece(dlen, sid, r, []uint64{})
2019-10-27 11:58:15 +00:00
if err != nil {
2019-11-07 16:39:27 +00:00
t.Fatalf("%+v", err)
2019-10-27 11:58:15 +00:00
}
2019-11-14 18:26:09 +00:00
s.ticket = sectorbuilder.SealTicket{
BlockHeight: 5,
TicketBytes: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2},
}
2019-11-14 18:26:09 +00:00
s.pco, err = sb.SealPreCommit(sid, s.ticket, []sectorbuilder.PublicPieceInfo{s.ppi})
if err != nil {
2019-11-07 16:39:27 +00:00
t.Fatalf("%+v", err)
}
2019-11-14 18:26:09 +00:00
done()
}
func (s *seal) commit(t *testing.T, sb *sectorbuilder.SectorBuilder, done func()) {
seed := sectorbuilder.SealSeed{
BlockHeight: 15,
TicketBytes: [32]byte{0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 45, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9},
}
2019-11-14 18:26:09 +00:00
proof, err := sb.SealCommit(s.sid, s.ticket, seed, []sectorbuilder.PublicPieceInfo{s.ppi}, []string{"foo"}, s.pco)
if err != nil {
2019-11-07 16:39:27 +00:00
t.Fatalf("%+v", err)
}
2019-11-14 18:26:09 +00:00
ok, err := sectorbuilder.VerifySeal(sectorSize, s.pco.CommR[:], s.pco.CommD[:], sb.Miner, s.ticket.TicketBytes[:], seed.TicketBytes[:], s.sid, proof)
if err != nil {
2019-11-07 16:39:27 +00:00
t.Fatalf("%+v", err)
}
if !ok {
t.Fatal("proof failed to validate")
}
2019-11-07 16:43:59 +00:00
2019-11-14 18:26:09 +00:00
done()
}
func (s *seal) post(t *testing.T, sb *sectorbuilder.SectorBuilder) {
2019-11-07 16:43:59 +00:00
cSeed := [32]byte{0, 9, 2, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 45, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9}
ssi := sectorbuilder.NewSortedSectorInfo([]sectorbuilder.SectorInfo{{
2019-11-14 18:26:09 +00:00
SectorID: s.sid,
CommR: s.pco.CommR,
2019-11-07 16:43:59 +00:00
}})
postProof, err := sb.GeneratePoSt(ssi, cSeed, []uint64{})
if err != nil {
t.Fatalf("%+v", err)
}
ok, err := sectorbuilder.VerifyPost(context.TODO(), sb.SectorSize(), ssi, cSeed, postProof, []uint64{})
2019-11-07 16:43:59 +00:00
if err != nil {
t.Fatalf("%+v", err)
}
if !ok {
t.Fatal("bad post")
}
2019-11-14 18:26:09 +00:00
}
func TestSealAndVerify(t *testing.T) {
if runtime.NumCPU() < 10 && os.Getenv("CI") == "" { // don't bother on slow hardware
t.Skip("this is slow")
}
2019-11-14 18:26:09 +00:00
os.Setenv("BELLMAN_NO_GPU", "1")
os.Setenv("RUST_LOG", "info")
build.SectorSizes = []uint64{sectorSize}
if err := build.GetParams(true, true); err != nil {
2019-11-14 18:26:09 +00:00
t.Fatalf("%+v", err)
}
ds := datastore.NewMapDatastore()
dir, err := ioutil.TempDir("", "sbtest")
if err != nil {
t.Fatal(err)
}
sb, err := sectorbuilder.TempSectorbuilderDir(dir, sectorSize, ds)
if err != nil {
t.Fatalf("%+v", err)
}
cleanup := func() {
sb.Destroy()
if err := os.RemoveAll(dir); err != nil {
t.Error(err)
}
}
defer cleanup()
si, err := sb.AcquireSectorId()
if err != nil {
t.Fatalf("%+v", err)
}
s := seal{sid: si}
2019-11-14 18:26:09 +00:00
s.precommit(t, sb, 1, func() {})
s.commit(t, sb, func() {})
s.post(t, sb)
// Restart sectorbuilder, re-run post
sb.Destroy()
sb, err = sectorbuilder.TempSectorbuilderDir(dir, sectorSize, ds)
if err != nil {
t.Fatalf("%+v", err)
}
2019-11-14 18:26:09 +00:00
s.post(t, sb)
}
func TestSealAndVerify2(t *testing.T) {
if runtime.NumCPU() < 10 && os.Getenv("CI") == "" { // don't bother on slow hardware
t.Skip("this is slow")
}
2019-11-14 18:26:09 +00:00
os.Setenv("BELLMAN_NO_GPU", "1")
os.Setenv("RUST_LOG", "info")
build.SectorSizes = []uint64{sectorSize}
if err := build.GetParams(true, true); err != nil {
t.Fatalf("%+v", err)
}
2019-11-14 18:26:09 +00:00
ds := datastore.NewMapDatastore()
dir, err := ioutil.TempDir("", "sbtest")
if err != nil {
t.Fatal(err)
}
sb, err := sectorbuilder.TempSectorbuilderDir(dir, sectorSize, ds)
if err != nil {
t.Fatalf("%+v", err)
}
2019-11-14 18:26:09 +00:00
cleanup := func() {
sb.Destroy()
if err := os.RemoveAll(dir); err != nil {
t.Error(err)
}
}
2019-11-14 18:26:09 +00:00
defer cleanup()
var wg sync.WaitGroup
si1, err := sb.AcquireSectorId()
if err != nil {
t.Fatalf("%+v", err)
}
si2, err := sb.AcquireSectorId()
if err != nil {
t.Fatalf("%+v", err)
}
s1 := seal{sid: si1}
s2 := seal{sid: si2}
2019-11-14 18:26:09 +00:00
wg.Add(2)
go s1.precommit(t, sb, 1, wg.Done)
time.Sleep(100 * time.Millisecond)
go s2.precommit(t, sb, 2, wg.Done)
wg.Wait()
wg.Add(2)
go s1.commit(t, sb, wg.Done)
go s2.commit(t, sb, wg.Done)
wg.Wait()
}
func TestAcquireID(t *testing.T) {
ds := datastore.NewMapDatastore()
2019-11-08 18:55:23 +00:00
dir, err := ioutil.TempDir("", "sbtest")
if err != nil {
t.Fatal(err)
}
sb, err := sectorbuilder.TempSectorbuilderDir(dir, sectorSize, ds)
if err != nil {
t.Fatalf("%+v", err)
}
assertAcquire := func(expect uint64) {
id, err := sb.AcquireSectorId()
require.NoError(t, err)
assert.Equal(t, expect, id)
}
assertAcquire(1)
assertAcquire(2)
assertAcquire(3)
2019-11-08 18:55:23 +00:00
sb.Destroy()
2019-11-08 18:55:23 +00:00
sb, err = sectorbuilder.TempSectorbuilderDir(dir, sectorSize, ds)
if err != nil {
t.Fatalf("%+v", err)
}
assertAcquire(4)
assertAcquire(5)
assertAcquire(6)
2019-11-08 18:55:23 +00:00
sb.Destroy()
if err := os.RemoveAll(dir); err != nil {
t.Error(err)
}
}