Commit 9c99406d authored by 董子豪's avatar 董子豪

add user api

parent 37a99ccf
package user
import(
"context"
)
func TestUser() error {
}
\ No newline at end of file
package user
import(
"io"
"context"
"fil_integrate/build/state-types/abi"
"fil_integrate/build/storage"
)
type UserAPI interface {
EncodeDataToPieces(ctx context.Context, file storage.Data) (storage.Piece, []storage.Piece, error)
ReadPieceRange(ctx context.Context, out io.Writer, piece storage.Piece, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) error
}
\ No newline at end of file
package user
import(
"context"
"fil_integrate/build/storage"
"fil_integrate/seal"
)
type User struct{
sectorSize abi.SectorSize
encoder seal.PieceEncoder
}
var _ UserAPI = &User{}
func (u *User) EncodeDataToPieces(ctx context.Context, file storage.Data) (storage.Piece, []storage.Piece, error) {
finalPiece, pieces, err := u.encoder.EncodeDataToPieces(ctx, u.sectorSize, file)
// map(file) -> finalPiece ...
// err := PostPiecesToProvider(pieces)
return finalPiece, pieces, err
}
func (u *User) ReadPieceRange(
ctx context.Context,
out io.Writer,
piece storage.Piece,
offset uint64,
size uint64,
) error {
UnpaddedSectorSize := abi.PaddedPieceSize(u.sectorSize).Unpadded()
DataLen := uint32(UnpaddedSectorSize) - seal.TagLen
data, err := u.getPiece(ctx, piece.Hash)
if err != nil {
return err
}
piecesHash := data.PieceHash
for data.HasPre {
data, err = u.getPiece(ctx, data.PreHash)
if err != nil {
return err
}
piecesHash = append(data.PieceHash, piecesHash...)
}
buf := data.Data[:]
maxSize := uint64(len(piecesHash)) * uint64(DataLen) + uint64(len(buf))
if offset == 0 && size == 0{
size = maxSize
}
if size + offset > maxSize {
return xerrors.Errorf("Piece Size is Out of Range [offset: %w, size:%w, max_size:%w]", offset, size, max_size)
}
piecesHash = piecesHash[offset/uint64(DataLen):]
rangePiece := RangePiece{
offset: offset,
size: size,
lenth: uint64(DataLen),
}
for{
rstart, rsize := rangePiece.nextRange()
if rsize == 0 {
break
}
if len(piecesHash) != 0 {
data, err := u.getPiece(ctx, piecesHash[0])
if err != nil {
return err
}
wbuf = data.Data[rstart:]
piecesHash = piecesHash[1:]
} else {
wbuf = buf[rstart:]
}
_, err = out.Write(wbuf[:rsize])
if err != nil {
return err
}
}
return nil
}
func (u *User) getPiece(ctx context.Context, pieceHash storage.Hash) (*storage.DecodedData, error) {
// GET from chian/provider
// buf, err := GetPieceFromProvider(pieceHash)
unpaddedSectorSize := abi.PaddedPieceSize(u.sectorSize).Unpadded()
buf := make([]byte, unpaddedSectorSize)
read, err := in.Read(buf[:])
if err != nil && err != io.EOF {
return storage.DecodedData{}, err
}
var data *storage.DecodedData = &storage.DecodedData{}
err = data.Deserialize(buf[:read])
return data, err
}
type RangePiece struct {
offset uint64
size uint64
lenth uint64
}
func (rp RangePiece) nextRange() (uint64, uint64) {
start := rp.offset % rp.lenth
size := min(rp.size, rp.lenth-rp.start)
rp.offset = rp.offset + size
rp.size = rp.size - size
return start, size
}
\ No newline at end of file
package pieces
import (
"github.com/minio/sha256-simd"
"math/bits"
"golang.org/x/xerrors"
"github.com/minio/sha256-simd"
"fil_integrate/build/fr32"
"fil_integrate/build/state-types/abi"
......
......@@ -17,6 +17,8 @@ type Data = io.Reader
type Hash = [32]byte
type PieceRef Hash
type SectorRef struct {
ID abi.SectorID
ProofType abi.RegisteredSealProof
......
......@@ -4,11 +4,11 @@ import (
"context"
"io"
"fil_integrate/build/state-types/abi"
"github.com/ipfs/go-cid"
"github.com/minio/blake2b-simd"
spproof "fil_integrate/build/proof"
"fil_integrate/build/state-types/abi"
"fil_integrate/build/storage"
"fil_integrate/build/storiface"
"fil_integrate/seal/basicfs"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment