add tests and merge master
This commit is contained in:
commit
35b39063ac
@ -806,6 +806,11 @@ workflows:
|
|||||||
suite: itest-gateway
|
suite: itest-gateway
|
||||||
target: "./itests/gateway_test.go"
|
target: "./itests/gateway_test.go"
|
||||||
|
|
||||||
|
- test:
|
||||||
|
name: test-itest-get_messages_in_ts
|
||||||
|
suite: itest-get_messages_in_ts
|
||||||
|
target: "./itests/get_messages_in_ts_test.go"
|
||||||
|
|
||||||
- test:
|
- test:
|
||||||
name: test-itest-multisig
|
name: test-itest-multisig
|
||||||
suite: itest-multisig
|
suite: itest-multisig
|
||||||
|
@ -104,6 +104,9 @@ type FullNode interface {
|
|||||||
// specified block.
|
// specified block.
|
||||||
ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]Message, error) //perm:read
|
ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]Message, error) //perm:read
|
||||||
|
|
||||||
|
// ChainGetMessagesInTipset returns message stores in current tipset
|
||||||
|
ChainGetMessagesInTipset(ctx context.Context, tsk types.TipSetKey) ([]Message, error) //perm:read
|
||||||
|
|
||||||
// ChainGetTipSetByHeight looks back for a tipset at the specified epoch.
|
// ChainGetTipSetByHeight looks back for a tipset at the specified epoch.
|
||||||
// If there are no blocks at the specified epoch, a tipset at an earlier epoch
|
// If there are no blocks at the specified epoch, a tipset at an earlier epoch
|
||||||
// will be returned.
|
// will be returned.
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-bitfield"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
|
"github.com/filecoin-project/go-multistore"
|
||||||
"github.com/filecoin-project/lotus/node/repo/importmgr"
|
"github.com/filecoin-project/lotus/node/repo/importmgr"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
@ -88,6 +89,7 @@ func init() {
|
|||||||
addExample(pid)
|
addExample(pid)
|
||||||
addExample(&pid)
|
addExample(&pid)
|
||||||
|
|
||||||
|
multistoreIDExample := multistore.StoreID(50)
|
||||||
storeIDExample := importmgr.ImportID(50)
|
storeIDExample := importmgr.ImportID(50)
|
||||||
|
|
||||||
addExample(bitfield.NewFromSet([]uint64{5}))
|
addExample(bitfield.NewFromSet([]uint64{5}))
|
||||||
@ -121,6 +123,8 @@ func init() {
|
|||||||
addExample(datatransfer.Ongoing)
|
addExample(datatransfer.Ongoing)
|
||||||
addExample(storeIDExample)
|
addExample(storeIDExample)
|
||||||
addExample(&storeIDExample)
|
addExample(&storeIDExample)
|
||||||
|
addExample(multistoreIDExample)
|
||||||
|
addExample(&multistoreIDExample)
|
||||||
addExample(retrievalmarket.ClientEventDealAccepted)
|
addExample(retrievalmarket.ClientEventDealAccepted)
|
||||||
addExample(retrievalmarket.DealStatusNew)
|
addExample(retrievalmarket.DealStatusNew)
|
||||||
addExample(network.ReachabilityPublic)
|
addExample(network.ReachabilityPublic)
|
||||||
|
@ -194,6 +194,21 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessage(arg0, arg1 interface{}) *gom
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessage", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessage), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessage", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessage), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChainGetMessagesInTipset mocks base method.
|
||||||
|
func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 types.TipSetKey) ([]api.Message, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "ChainGetMessagesInTipset", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].([]api.Message)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChainGetMessagesInTipset indicates an expected call of ChainGetMessagesInTipset.
|
||||||
|
func (mr *MockFullNodeMockRecorder) ChainGetMessagesInTipset(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessagesInTipset", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessagesInTipset), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
// ChainGetNode mocks base method.
|
// ChainGetNode mocks base method.
|
||||||
func (m *MockFullNode) ChainGetNode(arg0 context.Context, arg1 string) (*api.IpldObject, error) {
|
func (m *MockFullNode) ChainGetNode(arg0 context.Context, arg1 string) (*api.IpldObject, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
@ -127,6 +127,8 @@ type FullNodeStruct struct {
|
|||||||
|
|
||||||
ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"`
|
ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"`
|
||||||
|
|
||||||
|
ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]Message, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetNode func(p0 context.Context, p1 string) (*IpldObject, error) `perm:"read"`
|
ChainGetNode func(p0 context.Context, p1 string) (*IpldObject, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]Message, error) `perm:"read"`
|
ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]Message, error) `perm:"read"`
|
||||||
@ -1101,6 +1103,14 @@ func (s *FullNodeStub) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.M
|
|||||||
return nil, xerrors.New("method not supported")
|
return nil, xerrors.New("method not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]Message, error) {
|
||||||
|
return s.Internal.ChainGetMessagesInTipset(p0, p1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStub) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]Message, error) {
|
||||||
|
return *new([]Message), xerrors.New("method not supported")
|
||||||
|
}
|
||||||
|
|
||||||
func (s *FullNodeStruct) ChainGetNode(p0 context.Context, p1 string) (*IpldObject, error) {
|
func (s *FullNodeStruct) ChainGetNode(p0 context.Context, p1 string) (*IpldObject, error) {
|
||||||
return s.Internal.ChainGetNode(p0, p1)
|
return s.Internal.ChainGetNode(p0, p1)
|
||||||
}
|
}
|
||||||
|
@ -92,6 +92,9 @@ type FullNode interface {
|
|||||||
// specified block.
|
// specified block.
|
||||||
ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]api.Message, error) //perm:read
|
ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]api.Message, error) //perm:read
|
||||||
|
|
||||||
|
// ChainGetMessagesInTipset returns message stores in current tipset
|
||||||
|
ChainGetMessagesInTipset(ctx context.Context, tsk types.TipSetKey) ([]api.Message, error) //perm:read
|
||||||
|
|
||||||
// ChainGetTipSetByHeight looks back for a tipset at the specified epoch.
|
// ChainGetTipSetByHeight looks back for a tipset at the specified epoch.
|
||||||
// If there are no blocks at the specified epoch, a tipset at an earlier epoch
|
// If there are no blocks at the specified epoch, a tipset at an earlier epoch
|
||||||
// will be returned.
|
// will be returned.
|
||||||
|
@ -45,6 +45,8 @@ type FullNodeStruct struct {
|
|||||||
|
|
||||||
ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"`
|
ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"`
|
||||||
|
|
||||||
|
ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]api.Message, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetNode func(p0 context.Context, p1 string) (*api.IpldObject, error) `perm:"read"`
|
ChainGetNode func(p0 context.Context, p1 string) (*api.IpldObject, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]api.Message, error) `perm:"read"`
|
ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]api.Message, error) `perm:"read"`
|
||||||
@ -514,6 +516,14 @@ func (s *FullNodeStub) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.M
|
|||||||
return nil, xerrors.New("method not supported")
|
return nil, xerrors.New("method not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]api.Message, error) {
|
||||||
|
return s.Internal.ChainGetMessagesInTipset(p0, p1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStub) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]api.Message, error) {
|
||||||
|
return *new([]api.Message), xerrors.New("method not supported")
|
||||||
|
}
|
||||||
|
|
||||||
func (s *FullNodeStruct) ChainGetNode(p0 context.Context, p1 string) (*api.IpldObject, error) {
|
func (s *FullNodeStruct) ChainGetNode(p0 context.Context, p1 string) (*api.IpldObject, error) {
|
||||||
return s.Internal.ChainGetNode(p0, p1)
|
return s.Internal.ChainGetNode(p0, p1)
|
||||||
}
|
}
|
||||||
|
@ -194,6 +194,21 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessage(arg0, arg1 interface{}) *gom
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessage", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessage), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessage", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessage), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChainGetMessagesInTipset mocks base method.
|
||||||
|
func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 types.TipSetKey) ([]api.Message, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "ChainGetMessagesInTipset", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].([]api.Message)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChainGetMessagesInTipset indicates an expected call of ChainGetMessagesInTipset.
|
||||||
|
func (mr *MockFullNodeMockRecorder) ChainGetMessagesInTipset(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessagesInTipset", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessagesInTipset), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
// ChainGetNode mocks base method.
|
// ChainGetNode mocks base method.
|
||||||
func (m *MockFullNode) ChainGetNode(arg0 context.Context, arg1 string) (*api.IpldObject, error) {
|
func (m *MockFullNode) ChainGetNode(arg0 context.Context, arg1 string) (*api.IpldObject, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -297,22 +297,26 @@ func TestForkRefuseCall(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pts, err := cg.ChainStore().LoadTipSet(ts.TipSet.TipSet().Parents())
|
||||||
|
require.NoError(t, err)
|
||||||
|
parentHeight := pts.Height()
|
||||||
|
currentHeight := ts.TipSet.TipSet().Height()
|
||||||
|
|
||||||
|
// CallWithGas calls _at_ the current tipset.
|
||||||
ret, err := sm.CallWithGas(ctx, m, nil, ts.TipSet.TipSet())
|
ret, err := sm.CallWithGas(ctx, m, nil, ts.TipSet.TipSet())
|
||||||
switch ts.TipSet.TipSet().Height() {
|
if parentHeight <= testForkHeight && currentHeight >= testForkHeight {
|
||||||
case testForkHeight, testForkHeight + 1:
|
|
||||||
// If I had a fork, or I _will_ have a fork, it should fail.
|
// If I had a fork, or I _will_ have a fork, it should fail.
|
||||||
require.Equal(t, ErrExpensiveFork, err)
|
require.Equal(t, ErrExpensiveFork, err)
|
||||||
default:
|
} else {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.True(t, ret.MsgRct.ExitCode.IsSuccess())
|
require.True(t, ret.MsgRct.ExitCode.IsSuccess())
|
||||||
}
|
}
|
||||||
// Call just runs on the parent state for a tipset, so we only
|
|
||||||
// expect an error at the fork height.
|
// Call always applies the message to the "next block" after the tipset's parent state.
|
||||||
ret, err = sm.Call(ctx, m, ts.TipSet.TipSet())
|
ret, err = sm.Call(ctx, m, ts.TipSet.TipSet())
|
||||||
switch ts.TipSet.TipSet().Height() {
|
if parentHeight == testForkHeight {
|
||||||
case testForkHeight + 1:
|
|
||||||
require.Equal(t, ErrExpensiveFork, err)
|
require.Equal(t, ErrExpensiveFork, err)
|
||||||
default:
|
} else {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.True(t, ret.MsgRct.ExitCode.IsSuccess())
|
require.True(t, ret.MsgRct.ExitCode.IsSuccess())
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -17,6 +17,7 @@
|
|||||||
* [ChainGetBlockMessages](#ChainGetBlockMessages)
|
* [ChainGetBlockMessages](#ChainGetBlockMessages)
|
||||||
* [ChainGetGenesis](#ChainGetGenesis)
|
* [ChainGetGenesis](#ChainGetGenesis)
|
||||||
* [ChainGetMessage](#ChainGetMessage)
|
* [ChainGetMessage](#ChainGetMessage)
|
||||||
|
* [ChainGetMessagesInTipset](#ChainGetMessagesInTipset)
|
||||||
* [ChainGetNode](#ChainGetNode)
|
* [ChainGetNode](#ChainGetNode)
|
||||||
* [ChainGetParentMessages](#ChainGetParentMessages)
|
* [ChainGetParentMessages](#ChainGetParentMessages)
|
||||||
* [ChainGetParentReceipts](#ChainGetParentReceipts)
|
* [ChainGetParentReceipts](#ChainGetParentReceipts)
|
||||||
@ -533,6 +534,28 @@ Response:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### ChainGetMessagesInTipset
|
||||||
|
ChainGetMessagesInTipset returns message stores in current tipset
|
||||||
|
|
||||||
|
|
||||||
|
Perms: read
|
||||||
|
|
||||||
|
Inputs:
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Response: `null`
|
||||||
|
|
||||||
### ChainGetNode
|
### ChainGetNode
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
* [ChainGetBlockMessages](#ChainGetBlockMessages)
|
* [ChainGetBlockMessages](#ChainGetBlockMessages)
|
||||||
* [ChainGetGenesis](#ChainGetGenesis)
|
* [ChainGetGenesis](#ChainGetGenesis)
|
||||||
* [ChainGetMessage](#ChainGetMessage)
|
* [ChainGetMessage](#ChainGetMessage)
|
||||||
|
* [ChainGetMessagesInTipset](#ChainGetMessagesInTipset)
|
||||||
* [ChainGetNode](#ChainGetNode)
|
* [ChainGetNode](#ChainGetNode)
|
||||||
* [ChainGetParentMessages](#ChainGetParentMessages)
|
* [ChainGetParentMessages](#ChainGetParentMessages)
|
||||||
* [ChainGetParentReceipts](#ChainGetParentReceipts)
|
* [ChainGetParentReceipts](#ChainGetParentReceipts)
|
||||||
@ -535,6 +536,28 @@ Response:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### ChainGetMessagesInTipset
|
||||||
|
ChainGetMessagesInTipset returns message stores in current tipset
|
||||||
|
|
||||||
|
|
||||||
|
Perms: read
|
||||||
|
|
||||||
|
Inputs:
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Response: `null`
|
||||||
|
|
||||||
### ChainGetNode
|
### ChainGetNode
|
||||||
|
|
||||||
|
|
||||||
|
3
go.mod
3
go.mod
@ -36,6 +36,7 @@ require (
|
|||||||
github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a
|
github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a
|
||||||
github.com/filecoin-project/go-fil-markets v1.6.0-rc1.0.20210715083804-52c35483392f
|
github.com/filecoin-project/go-fil-markets v1.6.0-rc1.0.20210715083804-52c35483392f
|
||||||
github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec
|
github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec
|
||||||
|
github.com/filecoin-project/go-multistore v0.0.3
|
||||||
github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20
|
github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20
|
||||||
github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498
|
github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498
|
||||||
github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48
|
github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48
|
||||||
@ -156,6 +157,8 @@ require (
|
|||||||
gotest.tools v2.2.0+incompatible
|
gotest.tools v2.2.0+incompatible
|
||||||
)
|
)
|
||||||
|
|
||||||
|
replace github.com/multiformats/go-multihash => github.com/multiformats/go-multihash v0.0.14
|
||||||
|
|
||||||
replace github.com/libp2p/go-libp2p-yamux => github.com/libp2p/go-libp2p-yamux v0.5.1
|
replace github.com/libp2p/go-libp2p-yamux => github.com/libp2p/go-libp2p-yamux v0.5.1
|
||||||
|
|
||||||
replace github.com/filecoin-project/lotus => ./
|
replace github.com/filecoin-project/lotus => ./
|
||||||
|
20
go.sum
20
go.sum
@ -827,8 +827,6 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL
|
|||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
|
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw=
|
|
||||||
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
|
github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
|
||||||
@ -1228,9 +1226,8 @@ github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+
|
|||||||
github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||||
github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||||
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
||||||
|
github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
|
||||||
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
||||||
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
|
|
||||||
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
|
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
@ -1290,16 +1287,8 @@ github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77
|
|||||||
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
|
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
|
||||||
github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae h1:wfljHPpiR0UDOjeqld9ds0Zxl3Nt/j+0wnvyBc01JgY=
|
github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae h1:wfljHPpiR0UDOjeqld9ds0Zxl3Nt/j+0wnvyBc01JgY=
|
||||||
github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ=
|
github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ=
|
||||||
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
|
github.com/multiformats/go-multihash v0.0.14 h1:QoBceQYQQtNUuf6s7wHxnE2c8bhbMqhfGzNI032se/I=
|
||||||
github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po=
|
|
||||||
github.com/multiformats/go-multihash v0.0.7/go.mod h1:XuKXPp8VHcTygube3OWZC+aZrA+H1IhmjoCDtJc7PXM=
|
|
||||||
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
|
|
||||||
github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
|
|
||||||
github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
|
|
||||||
github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
|
|
||||||
github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
|
github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
|
||||||
github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM=
|
|
||||||
github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg=
|
|
||||||
github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
||||||
github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
||||||
github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
||||||
@ -1712,7 +1701,6 @@ golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnf
|
|||||||
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
@ -1734,7 +1722,6 @@ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPh
|
|||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
|
||||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o=
|
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o=
|
||||||
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||||
@ -1861,7 +1848,6 @@ golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@ -1916,12 +1902,10 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83 h1:kHSDPqCtsHZOg0nVylfTo20DDhE9gG4Y0jn7hKQ0QAM=
|
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83 h1:kHSDPqCtsHZOg0nVylfTo20DDhE9gG4Y0jn7hKQ0QAM=
|
||||||
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M=
|
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M=
|
||||||
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
@ -39,4 +39,9 @@ func TestDealsWithSealingAndRPC(t *testing.T) {
|
|||||||
dh.RunConcurrentDeals(kit.RunConcurrentDealsOpts{N: 1, FastRetrieval: true})
|
dh.RunConcurrentDeals(kit.RunConcurrentDealsOpts{N: 1, FastRetrieval: true})
|
||||||
dh.RunConcurrentDeals(kit.RunConcurrentDealsOpts{N: 1, FastRetrieval: true})
|
dh.RunConcurrentDeals(kit.RunConcurrentDealsOpts{N: 1, FastRetrieval: true})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("stdretrieval-carv1", func(t *testing.T) {
|
||||||
|
dh.RunConcurrentDeals(kit.RunConcurrentDealsOpts{N: 1, UseCARFileForStorageDeal: true})
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
104
itests/get_messages_in_ts_test.go
Normal file
104
itests/get_messages_in_ts_test.go
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
package itests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
"github.com/filecoin-project/lotus/chain/store"
|
||||||
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/itests/kit"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-state-types/big"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestChainGetMessagesInTs(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
kit.QuietMiningLogs()
|
||||||
|
|
||||||
|
client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs())
|
||||||
|
ens.InterconnectAll().BeginMining(10 * time.Millisecond)
|
||||||
|
|
||||||
|
// create a new address where to send funds.
|
||||||
|
addr, err := client.WalletNew(ctx, types.KTBLS)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// get the existing balance from the default wallet to then split it.
|
||||||
|
bal, err := client.WalletBalance(ctx, client.DefaultKey.Address)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
const iterations = 100
|
||||||
|
|
||||||
|
// we'll send half our balance (saving the other half for gas),
|
||||||
|
// in `iterations` increments.
|
||||||
|
toSend := big.Div(bal, big.NewInt(2))
|
||||||
|
each := big.Div(toSend, big.NewInt(iterations))
|
||||||
|
|
||||||
|
waitAllCh := make(chan struct{})
|
||||||
|
go func() {
|
||||||
|
headChangeCh, err := client.ChainNotify(ctx)
|
||||||
|
require.NoError(t, err)
|
||||||
|
<-headChangeCh //skip hccurrent
|
||||||
|
|
||||||
|
count := 0
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case headChanges := <-headChangeCh:
|
||||||
|
for _, change := range headChanges {
|
||||||
|
if change.Type == store.HCApply {
|
||||||
|
msgs, err := client.ChainGetMessagesInTipset(ctx, change.Val.Key())
|
||||||
|
require.NoError(t, err)
|
||||||
|
count += len(msgs)
|
||||||
|
if count == iterations {
|
||||||
|
waitAllCh <- struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
var sms []*types.SignedMessage
|
||||||
|
for i := 0; i < iterations; i++ {
|
||||||
|
msg := &types.Message{
|
||||||
|
From: client.DefaultKey.Address,
|
||||||
|
To: addr,
|
||||||
|
Value: each,
|
||||||
|
}
|
||||||
|
|
||||||
|
sm, err := client.MpoolPushMessage(ctx, msg, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.EqualValues(t, i, sm.Message.Nonce)
|
||||||
|
|
||||||
|
sms = append(sms, sm)
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-waitAllCh:
|
||||||
|
case <-time.After(time.Minute):
|
||||||
|
t.Errorf("timeout to wait for pack messages")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sm := range sms {
|
||||||
|
msgLookup, err := client.StateWaitMsg(ctx, sm.Cid(), 3, api.LookbackNoLimit, true)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
ts, err := client.ChainGetTipSet(ctx, msgLookup.TipSet)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
msgs, err := client.ChainGetMessagesInTipset(ctx, ts.Parents())
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
var found bool
|
||||||
|
for _, msg := range msgs {
|
||||||
|
if msg.Cid == sm.Cid() {
|
||||||
|
found = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require.EqualValues(t, true, found, "expect got message in tipset %v", msgLookup.TipSet)
|
||||||
|
}
|
||||||
|
}
|
@ -33,9 +33,10 @@ type DealHarness struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MakeFullDealParams struct {
|
type MakeFullDealParams struct {
|
||||||
Rseed int
|
Rseed int
|
||||||
FastRet bool
|
FastRet bool
|
||||||
StartEpoch abi.ChainEpoch
|
StartEpoch abi.ChainEpoch
|
||||||
|
UseCARFileForStorageDeal bool
|
||||||
|
|
||||||
// SuspendUntilCryptoeconStable suspends deal-making, until cryptoecon
|
// SuspendUntilCryptoeconStable suspends deal-making, until cryptoecon
|
||||||
// parameters are stabilised. This affects projected collateral, and tests
|
// parameters are stabilised. This affects projected collateral, and tests
|
||||||
@ -78,7 +79,11 @@ func NewDealHarness(t *testing.T, client *TestFullNode, main *TestMiner, market
|
|||||||
//
|
//
|
||||||
// TODO: convert input parameters to struct, and add size as an input param.
|
// TODO: convert input parameters to struct, and add size as an input param.
|
||||||
func (dh *DealHarness) MakeOnlineDeal(ctx context.Context, params MakeFullDealParams) (deal *cid.Cid, res *api.ImportRes, path string) {
|
func (dh *DealHarness) MakeOnlineDeal(ctx context.Context, params MakeFullDealParams) (deal *cid.Cid, res *api.ImportRes, path string) {
|
||||||
res, path = dh.client.CreateImportFile(ctx, params.Rseed, 0)
|
if params.UseCARFileForStorageDeal {
|
||||||
|
res, _, path = dh.client.ClientImportCARFile(ctx, params.Rseed, 200)
|
||||||
|
} else {
|
||||||
|
res, path = dh.client.CreateImportFile(ctx, params.Rseed, 0)
|
||||||
|
}
|
||||||
|
|
||||||
dh.t.Logf("FILE CID: %s", res.Root)
|
dh.t.Logf("FILE CID: %s", res.Root)
|
||||||
|
|
||||||
@ -281,10 +286,11 @@ func (dh *DealHarness) ExtractFileFromCAR(ctx context.Context, file *os.File) (o
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RunConcurrentDealsOpts struct {
|
type RunConcurrentDealsOpts struct {
|
||||||
N int
|
N int
|
||||||
FastRetrieval bool
|
FastRetrieval bool
|
||||||
CarExport bool
|
CarExport bool
|
||||||
StartEpoch abi.ChainEpoch
|
StartEpoch abi.ChainEpoch
|
||||||
|
UseCARFileForStorageDeal bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) {
|
func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) {
|
||||||
@ -300,9 +306,10 @@ func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
deal, res, inPath := dh.MakeOnlineDeal(context.Background(), MakeFullDealParams{
|
deal, res, inPath := dh.MakeOnlineDeal(context.Background(), MakeFullDealParams{
|
||||||
Rseed: 5 + i,
|
Rseed: 5 + i,
|
||||||
FastRet: opts.FastRetrieval,
|
FastRet: opts.FastRetrieval,
|
||||||
StartEpoch: opts.StartEpoch,
|
StartEpoch: opts.StartEpoch,
|
||||||
|
UseCARFileForStorageDeal: opts.UseCARFileForStorageDeal,
|
||||||
})
|
})
|
||||||
outPath := dh.PerformRetrieval(context.Background(), deal, res.Root, opts.CarExport)
|
outPath := dh.PerformRetrieval(context.Background(), deal, res.Root, opts.CarExport)
|
||||||
AssertFilesEqual(dh.t, inPath, outPath)
|
AssertFilesEqual(dh.t, inPath, outPath)
|
||||||
|
@ -1,17 +1,38 @@
|
|||||||
package kit
|
package kit
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/ipfs/go-blockservice"
|
||||||
|
"github.com/ipfs/go-cid"
|
||||||
|
cidutil "github.com/ipfs/go-cidutil"
|
||||||
|
ds "github.com/ipfs/go-datastore"
|
||||||
|
dssync "github.com/ipfs/go-datastore/sync"
|
||||||
|
bstore "github.com/ipfs/go-ipfs-blockstore"
|
||||||
|
chunk "github.com/ipfs/go-ipfs-chunker"
|
||||||
|
offline "github.com/ipfs/go-ipfs-exchange-offline"
|
||||||
|
files "github.com/ipfs/go-ipfs-files"
|
||||||
|
ipldformat "github.com/ipfs/go-ipld-format"
|
||||||
|
"github.com/ipfs/go-merkledag"
|
||||||
|
"github.com/ipfs/go-unixfs/importer/balanced"
|
||||||
|
ihelper "github.com/ipfs/go-unixfs/importer/helpers"
|
||||||
|
"github.com/ipld/go-car"
|
||||||
"github.com/minio/blake2b-simd"
|
"github.com/minio/blake2b-simd"
|
||||||
|
mh "github.com/multiformats/go-multihash"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const unixfsChunkSize uint64 = 1 << 10
|
||||||
|
|
||||||
|
var defaultHashFunction = uint64(mh.BLAKE2B_MIN + 31)
|
||||||
|
|
||||||
// CreateRandomFile creates a random file with the provided seed and the
|
// CreateRandomFile creates a random file with the provided seed and the
|
||||||
// provided size.
|
// provided size.
|
||||||
func CreateRandomFile(t *testing.T, rseed, size int) (path string) {
|
func CreateRandomFile(t *testing.T, rseed, size int) (path string) {
|
||||||
@ -31,6 +52,79 @@ func CreateRandomFile(t *testing.T, rseed, size int) (path string) {
|
|||||||
return file.Name()
|
return file.Name()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateRandomFile creates a normal file with the provided seed and the
|
||||||
|
// provided size and then transforms it to a CARv1 file and returns it.
|
||||||
|
func CreateRandomCARv1(t *testing.T, rseed, size int) (carV1FilePath string, origFilePath string) {
|
||||||
|
ctx := context.Background()
|
||||||
|
if size == 0 {
|
||||||
|
size = 1600
|
||||||
|
}
|
||||||
|
|
||||||
|
source := io.LimitReader(rand.New(rand.NewSource(int64(rseed))), int64(size))
|
||||||
|
|
||||||
|
file, err := os.CreateTemp(t.TempDir(), "sourcefile.dat")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
n, err := io.Copy(file, source)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.EqualValues(t, n, size)
|
||||||
|
|
||||||
|
//
|
||||||
|
_, err = file.Seek(0, io.SeekStart)
|
||||||
|
require.NoError(t, err)
|
||||||
|
bs := bstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore()))
|
||||||
|
dagSvc := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs)))
|
||||||
|
|
||||||
|
root := writeUnixfsDAG(ctx, t, file, dagSvc)
|
||||||
|
|
||||||
|
// create a CARv1 file from the DAG
|
||||||
|
tmp, err := os.CreateTemp(t.TempDir(), "randcarv1")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NoError(t, car.WriteCar(ctx, dagSvc, []cid.Cid{root}, tmp))
|
||||||
|
_, err = tmp.Seek(0, io.SeekStart)
|
||||||
|
require.NoError(t, err)
|
||||||
|
hd, _, err := car.ReadHeader(bufio.NewReader(tmp))
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.EqualValues(t, 1, hd.Version)
|
||||||
|
require.Len(t, hd.Roots, 1)
|
||||||
|
require.NoError(t, tmp.Close())
|
||||||
|
|
||||||
|
return tmp.Name(), file.Name()
|
||||||
|
}
|
||||||
|
|
||||||
|
func writeUnixfsDAG(ctx context.Context, t *testing.T, rd io.Reader, dag ipldformat.DAGService) cid.Cid {
|
||||||
|
rpf := files.NewReaderFile(rd)
|
||||||
|
|
||||||
|
// generate the dag and get the root
|
||||||
|
// import to UnixFS
|
||||||
|
prefix, err := merkledag.PrefixForCidVersion(1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
prefix.MhType = defaultHashFunction
|
||||||
|
|
||||||
|
bufferedDS := ipldformat.NewBufferedDAG(ctx, dag)
|
||||||
|
params := ihelper.DagBuilderParams{
|
||||||
|
Maxlinks: 1024,
|
||||||
|
RawLeaves: true,
|
||||||
|
CidBuilder: cidutil.InlineBuilder{
|
||||||
|
Builder: prefix,
|
||||||
|
Limit: 126,
|
||||||
|
},
|
||||||
|
Dagserv: bufferedDS,
|
||||||
|
}
|
||||||
|
|
||||||
|
db, err := params.New(chunk.NewSizeSplitter(rpf, int64(unixfsChunkSize)))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
nd, err := balanced.Layout(db)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotEqualValues(t, cid.Undef, nd.Cid())
|
||||||
|
|
||||||
|
err = bufferedDS.Commit()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NoError(t, rpf.Close())
|
||||||
|
return nd.Cid()
|
||||||
|
}
|
||||||
|
|
||||||
// AssertFilesEqual compares two files by blake2b hash equality and
|
// AssertFilesEqual compares two files by blake2b hash equality and
|
||||||
// fails the test if unequal.
|
// fails the test if unequal.
|
||||||
func AssertFilesEqual(t *testing.T, left, right string) {
|
func AssertFilesEqual(t *testing.T, left, right string) {
|
||||||
|
@ -28,6 +28,13 @@ type TestFullNode struct {
|
|||||||
options nodeOpts
|
options nodeOpts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *TestFullNode) ClientImportCARFile(ctx context.Context, rseed int, size int) (res *api.ImportRes, carv1FilePath string, origFilePath string) {
|
||||||
|
carv1FilePath, origFilePath = CreateRandomCARv1(f.t, rseed, size)
|
||||||
|
res, err := f.ClientImport(ctx, api.FileRef{Path: carv1FilePath, IsCAR: true})
|
||||||
|
require.NoError(f.t, err)
|
||||||
|
return res, carv1FilePath, origFilePath
|
||||||
|
}
|
||||||
|
|
||||||
// CreateImportFile creates a random file with the specified seed and size, and
|
// CreateImportFile creates a random file with the specified seed and size, and
|
||||||
// imports it into the full node.
|
// imports it into the full node.
|
||||||
func (f *TestFullNode) CreateImportFile(ctx context.Context, rseed int, size int) (res *api.ImportRes, path string) {
|
func (f *TestFullNode) CreateImportFile(ctx context.Context, rseed int, size int) (res *api.ImportRes, path string) {
|
||||||
|
@ -473,25 +473,41 @@ func (a *API) ClientImport(ctx context.Context, ref api.FileRef) (res *api.Impor
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
carV2File, err := a.imgr().NewTempFile(id)
|
|
||||||
if err != nil {
|
|
||||||
return nil, xerrors.Errorf("failed to create temp CARv2 file: %w", err)
|
|
||||||
}
|
|
||||||
// make sure to remove the CARv2 file if anything goes wrong from here on.
|
|
||||||
defer func() {
|
|
||||||
if finalErr != nil {
|
|
||||||
_ = os.Remove(carV2File)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
var root cid.Cid
|
var root cid.Cid
|
||||||
|
var carFile string
|
||||||
if ref.IsCAR {
|
if ref.IsCAR {
|
||||||
root, err = transformCarToCARv2(ref.Path, carV2File)
|
// if user has given us a CAR file -> just ensure it's either a v1 or a v2, has one root and save it as it is as markets can do deal making for both.
|
||||||
|
f, err := os.Open(ref.Path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to import CAR file: %w", err)
|
return nil, xerrors.Errorf("failed to open CAR file: %w", err)
|
||||||
}
|
}
|
||||||
|
defer f.Close() //nolint:errcheck
|
||||||
|
hd, _, err := car.ReadHeader(bufio.NewReader(f))
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("failed to read CAR header: %w", err)
|
||||||
|
}
|
||||||
|
if len(hd.Roots) != 1 {
|
||||||
|
return nil, xerrors.New("car file can have one and only one header")
|
||||||
|
}
|
||||||
|
if hd.Version != 1 && hd.Version != 2 {
|
||||||
|
return nil, xerrors.Errorf("car version must be 1 or 2, is %d", hd.Version)
|
||||||
|
}
|
||||||
|
|
||||||
|
carFile = ref.Path
|
||||||
|
root = hd.Roots[0]
|
||||||
} else {
|
} else {
|
||||||
root, err = a.importNormalFileToFilestoreCARv2(ctx, id, ref.Path, carV2File)
|
carFile, err = a.imgr().NewTempFile(id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("failed to create temp CARv2 file: %w", err)
|
||||||
|
}
|
||||||
|
// make sure to remove the CARv2 file if anything goes wrong from here on.
|
||||||
|
defer func() {
|
||||||
|
if finalErr != nil {
|
||||||
|
_ = os.Remove(carFile)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
root, err = a.importNormalFileToFilestoreCARv2(ctx, id, ref.Path, carFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to import normal file to CARv2: %w", err)
|
return nil, xerrors.Errorf("failed to import normal file to CARv2: %w", err)
|
||||||
}
|
}
|
||||||
@ -503,7 +519,7 @@ func (a *API) ClientImport(ctx context.Context, ref api.FileRef) (res *api.Impor
|
|||||||
if err := a.imgr().AddLabel(id, importmgr.LFileName, ref.Path); err != nil {
|
if err := a.imgr().AddLabel(id, importmgr.LFileName, ref.Path); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := a.imgr().AddLabel(id, importmgr.LFileStoreCARv2FilePath, carV2File); err != nil {
|
if err := a.imgr().AddLabel(id, importmgr.LFileStoreCARv2FilePath, carFile); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := a.imgr().AddLabel(id, importmgr.LRootCid, root.String()); err != nil {
|
if err := a.imgr().AddLabel(id, importmgr.LRootCid, root.String()); err != nil {
|
||||||
@ -854,6 +870,7 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
finish(files.WriteTo(file, ref.Path))
|
finish(files.WriteTo(file, ref.Path))
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"context"
|
"context"
|
||||||
"io"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-fil-markets/filestorecaradapter"
|
"github.com/filecoin-project/go-fil-markets/filestorecaradapter"
|
||||||
@ -23,8 +21,6 @@ import (
|
|||||||
"github.com/ipfs/go-merkledag"
|
"github.com/ipfs/go-merkledag"
|
||||||
"github.com/ipfs/go-unixfs/importer/balanced"
|
"github.com/ipfs/go-unixfs/importer/balanced"
|
||||||
ihelper "github.com/ipfs/go-unixfs/importer/helpers"
|
ihelper "github.com/ipfs/go-unixfs/importer/helpers"
|
||||||
"github.com/ipld/go-car"
|
|
||||||
carv2 "github.com/ipld/go-car/v2"
|
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -124,52 +120,3 @@ func importNormalFileToUnixfsDAG(ctx context.Context, inputFilePath string, dag
|
|||||||
|
|
||||||
return nd.Cid(), nil
|
return nd.Cid(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// transformCarToCARv2 transforms a client's CAR file to a CARv2 file.
|
|
||||||
func transformCarToCARv2(inputCARPath string, outputCARv2Path string) (root cid.Cid, err error) {
|
|
||||||
inputF, err := os.Open(inputCARPath)
|
|
||||||
if err != nil {
|
|
||||||
return cid.Undef, xerrors.Errorf("failed to open input CAR: %w", err)
|
|
||||||
}
|
|
||||||
defer inputF.Close() //nolint:errcheck
|
|
||||||
|
|
||||||
// read the CAR header to determine the DAG root and the CAR version.
|
|
||||||
hd, _, err := car.ReadHeader(bufio.NewReader(inputF))
|
|
||||||
if err != nil {
|
|
||||||
return cid.Undef, xerrors.Errorf("failed to read CAR header: %w", err)
|
|
||||||
}
|
|
||||||
if len(hd.Roots) != 1 {
|
|
||||||
return cid.Undef, xerrors.New("cannot import CAR with more than one root")
|
|
||||||
}
|
|
||||||
|
|
||||||
// we read the file to read the header -> seek to the start again to be able to read again.
|
|
||||||
if _, err := inputF.Seek(0, io.SeekStart); err != nil {
|
|
||||||
return cid.Undef, xerrors.Errorf("failed to seek to start of input CAR: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
switch hd.Version {
|
|
||||||
case 2:
|
|
||||||
|
|
||||||
// This is a CARv2, we can import it as it is by simply copying it.
|
|
||||||
outF, err := os.Open(outputCARv2Path)
|
|
||||||
if err != nil {
|
|
||||||
return cid.Undef, xerrors.Errorf("failed to open output CARv2 file: %w", err)
|
|
||||||
}
|
|
||||||
defer outF.Close() //nolint:errcheck
|
|
||||||
_, err = io.Copy(outF, inputF)
|
|
||||||
if err != nil {
|
|
||||||
return cid.Undef, xerrors.Errorf("failed to copy CARv2 file: %w", err)
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
|
|
||||||
// This is a CARv1, let's transform it to a CARv2.
|
|
||||||
if err := carv2.WrapV1File(inputCARPath, outputCARv2Path); err != nil {
|
|
||||||
return cid.Undef, xerrors.Errorf("failed to transform CARv1 to CARv2: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
return cid.Undef, xerrors.Errorf("unrecognized CAR version %d", hd.Version)
|
|
||||||
}
|
|
||||||
|
|
||||||
return hd.Roots[0], nil
|
|
||||||
}
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@ -11,7 +10,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-fil-markets/filestorecaradapter"
|
"github.com/filecoin-project/go-fil-markets/filestorecaradapter"
|
||||||
bstore "github.com/filecoin-project/lotus/blockstore"
|
|
||||||
"github.com/filecoin-project/lotus/node/repo/importmgr"
|
"github.com/filecoin-project/lotus/node/repo/importmgr"
|
||||||
"github.com/ipfs/go-blockservice"
|
"github.com/ipfs/go-blockservice"
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
@ -19,12 +17,7 @@ import (
|
|||||||
files "github.com/ipfs/go-ipfs-files"
|
files "github.com/ipfs/go-ipfs-files"
|
||||||
"github.com/ipfs/go-merkledag"
|
"github.com/ipfs/go-merkledag"
|
||||||
unixfile "github.com/ipfs/go-unixfs/file"
|
unixfile "github.com/ipfs/go-unixfs/file"
|
||||||
"github.com/ipld/go-car"
|
|
||||||
carv2 "github.com/ipld/go-car/v2"
|
|
||||||
"github.com/ipld/go-car/v2/blockstore"
|
"github.com/ipld/go-car/v2/blockstore"
|
||||||
basicnode "github.com/ipld/go-ipld-prime/node/basic"
|
|
||||||
"github.com/ipld/go-ipld-prime/traversal/selector"
|
|
||||||
"github.com/ipld/go-ipld-prime/traversal/selector/builder"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -110,94 +103,6 @@ func TestImportNormalFileToCARv2(t *testing.T) {
|
|||||||
require.Equal(t, inputContents, bz2)
|
require.Equal(t, inputContents, bz2)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTransformCarv1ToCARv2(t *testing.T) {
|
|
||||||
inputFilePath, _ := genNormalInputFile(t)
|
|
||||||
defer os.Remove(inputFilePath) //nolint:errcheck
|
|
||||||
|
|
||||||
carv1FilePath := genCARv1(t, inputFilePath)
|
|
||||||
defer os.Remove(carv1FilePath) //nolint:errcheck
|
|
||||||
|
|
||||||
outputCARv2 := genTmpFile(t)
|
|
||||||
defer os.Remove(outputCARv2) //nolint:errcheck
|
|
||||||
|
|
||||||
root, err := transformCarToCARv2(carv1FilePath, outputCARv2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.NotEqual(t, cid.Undef, root)
|
|
||||||
|
|
||||||
// assert what we got back is a valid CARv2 and that the CARv1 payload is exactly what we gave it
|
|
||||||
f2, err := os.Open(outputCARv2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
hd, _, err := car.ReadHeader(bufio.NewReader(f2))
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.EqualValues(t, 2, hd.Version)
|
|
||||||
require.NoError(t, f2.Close())
|
|
||||||
|
|
||||||
v2r, err := carv2.NewReaderMmap(outputCARv2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
bzout, err := ioutil.ReadAll(v2r.CarV1Reader())
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.NotNil(t, bzout)
|
|
||||||
require.NoError(t, v2r.Close())
|
|
||||||
|
|
||||||
fi, err := os.Open(carv1FilePath)
|
|
||||||
require.NoError(t, err)
|
|
||||||
bzin, err := ioutil.ReadAll(fi)
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.NoError(t, fi.Close())
|
|
||||||
require.NotNil(t, bzin)
|
|
||||||
|
|
||||||
require.Equal(t, bzin, bzout)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestLoadCARv2ToBlockstore(t *testing.T) {
|
|
||||||
inputFilePath, _ := genNormalInputFile(t)
|
|
||||||
defer os.Remove(inputFilePath) //nolint:errcheck
|
|
||||||
|
|
||||||
carv1FilePath := genCARv1(t, inputFilePath)
|
|
||||||
defer os.Remove(carv1FilePath) //nolint:errcheck
|
|
||||||
|
|
||||||
outputCARv2 := genTmpFile(t)
|
|
||||||
defer os.Remove(outputCARv2) //nolint:errcheck
|
|
||||||
|
|
||||||
root, err := transformCarToCARv2(carv1FilePath, outputCARv2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.NotEqual(t, cid.Undef, root)
|
|
||||||
|
|
||||||
bs := bstore.NewMemorySync()
|
|
||||||
|
|
||||||
carv2, err := carv2.NewReaderMmap(outputCARv2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
defer carv2.Close() //nolint:errcheck
|
|
||||||
header, err := car.LoadCar(bs, carv2.CarV1Reader())
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.EqualValues(t, root, header.Roots[0])
|
|
||||||
require.EqualValues(t, 1, header.Version)
|
|
||||||
}
|
|
||||||
|
|
||||||
func genCARv1(t *testing.T, normalFilePath string) string {
|
|
||||||
ctx := context.Background()
|
|
||||||
bs := bstore.NewMemorySync()
|
|
||||||
root, err := importNormalFileToUnixfsDAG(ctx, normalFilePath, merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs))))
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any)
|
|
||||||
allSelector := ssb.ExploreRecursive(selector.RecursionLimitNone(),
|
|
||||||
ssb.ExploreAll(ssb.ExploreRecursiveEdge())).Node()
|
|
||||||
sc := car.NewSelectiveCar(ctx, bs, []car.Dag{{Root: root, Selector: allSelector}})
|
|
||||||
f, err := os.CreateTemp("", "")
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.NoError(t, sc.Write(f))
|
|
||||||
|
|
||||||
_, err = f.Seek(0, io.SeekStart)
|
|
||||||
require.NoError(t, err)
|
|
||||||
hd, _, err := car.ReadHeader(bufio.NewReader(f))
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.EqualValues(t, 1, hd.Version)
|
|
||||||
|
|
||||||
require.NoError(t, f.Close())
|
|
||||||
return f.Name()
|
|
||||||
}
|
|
||||||
|
|
||||||
func genTmpFile(t *testing.T) string {
|
func genTmpFile(t *testing.T) string {
|
||||||
f, err := os.CreateTemp("", "")
|
f, err := os.CreateTemp("", "")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -228,6 +228,33 @@ func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *ChainAPI) ChainGetMessagesInTipset(ctx context.Context, tsk types.TipSetKey) ([]api.Message, error) {
|
||||||
|
ts, err := a.Chain.GetTipSetFromKey(tsk)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// genesis block has no parent messages...
|
||||||
|
if ts.Height() == 0 {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
cm, err := a.Chain.MessagesForTipset(ts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var out []api.Message
|
||||||
|
for _, m := range cm {
|
||||||
|
out = append(out, api.Message{
|
||||||
|
Cid: m.Cid(),
|
||||||
|
Message: m.VMMessage(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *ChainModule) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) {
|
func (m *ChainModule) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) {
|
||||||
ts, err := m.Chain.GetTipSetFromKey(tsk)
|
ts, err := m.Chain.GetTipSetFromKey(tsk)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user