finish up making the new serializations work

This commit is contained in:
whyrusleeping 2019-09-10 16:03:17 -07:00
parent 2f019158d0
commit a47969c76b
21 changed files with 712 additions and 262 deletions

View File

@ -183,6 +183,8 @@ func (ias *InitActorState) AddActor(cst *hamt.CborIpldStore, addr address.Addres
nid := ias.NextID
ias.NextID++
fmt.Println("ADD ACTOR: ", addr.String())
amap, err := hamt.LoadNode(context.TODO(), cst, ias.AddressMap)
if err != nil {
return address.Undef, err

View File

@ -5,6 +5,7 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/stretchr/testify/assert"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-lotus/chain/actors"
"github.com/filecoin-project/go-lotus/chain/address"
@ -23,7 +24,7 @@ func TestMultiSigCreate(t *testing.T) {
h := NewHarness(t, opts...)
ret, _ := h.CreateActor(t, creatorAddr, actors.MultisigActorCodeCid,
actors.MultiSigConstructorParams{
&actors.MultiSigConstructorParams{
Signers: []address.Address{creatorAddr, sig1Addr, sig2Addr},
Required: 2,
})
@ -49,8 +50,8 @@ func TestMultiSigOps(t *testing.T) {
HarnessAddr(&sig2Addr, 100000),
HarnessAddr(&outsideAddr, 100000),
HarnessActor(&multSigAddr, &creatorAddr, actors.MultisigActorCodeCid,
func() interface{} {
return actors.MultiSigConstructorParams{
func() cbg.CBORMarshaler {
return &actors.MultiSigConstructorParams{
Signers: []address.Address{creatorAddr, sig1Addr, sig2Addr},
Required: 2,
}
@ -71,8 +72,7 @@ func TestMultiSigOps(t *testing.T) {
// Transfer funds outside of multsig
const sendVal = 1000
ret, _ := h.Invoke(t, creatorAddr, multSigAddr, actors.MultiSigMethods.Propose,
actors.MultiSigProposeParams{
&actors.MultiSigProposeParams{
To: outsideAddr,
Value: types.NewInt(sendVal),
})
@ -82,12 +82,12 @@ func TestMultiSigOps(t *testing.T) {
assert.NoError(t, err, "decoding txid")
ret, _ = h.Invoke(t, outsideAddr, multSigAddr, actors.MultiSigMethods.Approve,
txIDParam)
&txIDParam)
assert.Equal(t, uint8(1), ret.ExitCode, "outsideAddr should not approve")
h.AssertBalanceChange(t, multSigAddr, 0)
ret2, _ := h.Invoke(t, sig1Addr, multSigAddr, actors.MultiSigMethods.Approve,
txIDParam)
&txIDParam)
ApplyOK(t, ret2)
h.AssertBalanceChange(t, outsideAddr, sendVal)

View File

@ -113,6 +113,7 @@ func (pca PaymentChannelActor) UpdateChannelState(act *types.Actor, vmctx types.
}
if err := vmctx.VerifySignature(sv.Signature, self.From, vb); err != nil {
fmt.Printf("bad bits: %x", vb)
return nil, err
}
@ -120,7 +121,7 @@ func (pca PaymentChannelActor) UpdateChannelState(act *types.Actor, vmctx types.
return nil, aerrors.New(2, "cannot use this voucher yet!")
}
if sv.SecretPreimage != nil {
if len(sv.SecretPreimage) > 0 {
if !bytes.Equal(hash(params.Secret), sv.SecretPreimage) {
return nil, aerrors.New(3, "incorrect secret!")
}

View File

@ -2,6 +2,7 @@ package actors_test
import (
"context"
"fmt"
"testing"
"github.com/filecoin-project/go-lotus/chain/actors"
@ -19,7 +20,7 @@ func TestPaychCreate(t *testing.T) {
h := NewHarness(t, opts...)
ret, _ := h.CreateActor(t, creatorAddr, actors.PaymentChannelActorCodeCid,
actors.PCAConstructorParams{
&actors.PCAConstructorParams{
To: targetAddr,
})
ApplyOK(t, ret)
@ -36,6 +37,7 @@ func signVoucher(t *testing.T, w *wallet.Wallet, addr address.Address, sv *types
t.Fatal(err)
}
fmt.Printf("SIGNING: %x\n", vb)
sv.Signature = sig
}
@ -48,7 +50,7 @@ func TestPaychUpdate(t *testing.T) {
h := NewHarness(t, opts...)
ret, _ := h.CreateActor(t, creatorAddr, actors.PaymentChannelActorCodeCid,
actors.PCAConstructorParams{
&actors.PCAConstructorParams{
To: targetAddr,
})
ApplyOK(t, ret)
@ -66,12 +68,12 @@ func TestPaychUpdate(t *testing.T) {
}
signVoucher(t, h.w, creatorAddr, sv)
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.UpdateChannelState, actors.PCAUpdateChannelStateParams{
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.UpdateChannelState, &actors.PCAUpdateChannelStateParams{
Sv: *sv,
})
ApplyOK(t, ret)
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.GetToSend, struct{}{})
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.GetToSend, nil)
ApplyOK(t, ret)
bi := types.BigFromBytes(ret.Return)
@ -79,13 +81,13 @@ func TestPaychUpdate(t *testing.T) {
t.Fatal("toSend amount was wrong: ", bi.String())
}
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.Close, struct{}{})
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.Close, nil)
ApplyOK(t, ret)
// now we have to 'wait' for the chain to advance.
h.vm.SetBlockHeight(1000)
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.Collect, struct{}{})
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.Collect, nil)
ApplyOK(t, ret)
h.AssertBalanceChange(t, targetAddr, 100)

View File

@ -13,11 +13,6 @@ import (
"github.com/stretchr/testify/assert"
)
func TestDumpEmpyStruct(t *testing.T) {
res, err := SerializeParams(struct{}{})
t.Logf("res: %x, err: %+v", res, err)
}
func TestStorageMarketCreateMiner(t *testing.T) {
var ownerAddr, workerAddr address.Address
@ -31,7 +26,7 @@ func TestStorageMarketCreateMiner(t *testing.T) {
var minerAddr address.Address
{
ret, _ := h.Invoke(t, ownerAddr, StorageMarketAddress, SMAMethods.CreateStorageMiner,
CreateStorageMinerParams{
&CreateStorageMinerParams{
Owner: ownerAddr,
Worker: workerAddr,
SectorSize: types.NewInt(build.SectorSize),
@ -45,7 +40,7 @@ func TestStorageMarketCreateMiner(t *testing.T) {
{
ret, _ := h.Invoke(t, ownerAddr, StorageMarketAddress, SMAMethods.IsMiner,
IsMinerParam{Addr: minerAddr})
&IsMinerParam{Addr: minerAddr})
ApplyOK(t, ret)
var output bool
@ -61,7 +56,7 @@ func TestStorageMarketCreateMiner(t *testing.T) {
{
ret, _ := h.Invoke(t, ownerAddr, StorageMarketAddress, SMAMethods.PowerLookup,
PowerLookupParams{Miner: minerAddr})
&PowerLookupParams{Miner: minerAddr})
ApplyOK(t, ret)
power := types.BigFromBytes(ret.Return)

View File

@ -3,9 +3,10 @@ package actors_test
import (
"context"
"encoding/binary"
"github.com/filecoin-project/go-lotus/build"
"testing"
"github.com/filecoin-project/go-lotus/build"
. "github.com/filecoin-project/go-lotus/chain/actors"
"github.com/filecoin-project/go-lotus/chain/address"
"github.com/filecoin-project/go-lotus/chain/gen"
@ -14,7 +15,6 @@ import (
"github.com/filecoin-project/go-lotus/chain/vm"
dstore "github.com/ipfs/go-datastore"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
)
func blsaddr(n uint64) address.Address {
@ -62,7 +62,8 @@ func TestVMInvokeMethod(t *testing.T) {
vm, addrs := setupVMTestEnv(t)
from := addrs[0]
cenc, err := cbor.DumpObject(StorageMinerConstructorParams{})
var err error
cenc, err := SerializeParams(&StorageMinerConstructorParams{})
if err != nil {
t.Fatal(err)
}
@ -71,7 +72,7 @@ func TestVMInvokeMethod(t *testing.T) {
Code: StorageMinerCodeCid,
Params: cenc,
}
enc, err := cbor.DumpObject(execparams)
enc, err := SerializeParams(execparams)
if err != nil {
t.Fatal(err)
}
@ -115,7 +116,8 @@ func TestStorageMarketActorCreateMiner(t *testing.T) {
SectorSize: types.NewInt(build.SectorSize),
PeerID: "fakepeerid",
}
enc, err := cbor.DumpObject(params)
var err error
enc, err := SerializeParams(params)
if err != nil {
t.Fatal(err)
}

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
package actors_test
import (
"bytes"
"context"
"testing"
@ -9,7 +10,7 @@ import (
hamt "github.com/ipfs/go-hamt-ipld"
blockstore "github.com/ipfs/go-ipfs-blockstore"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-lotus/chain/actors"
@ -91,7 +92,7 @@ func HarnessMiner(addr *address.Address) HarnessOpt {
}
}
func HarnessActor(actor *address.Address, creator *address.Address, code cid.Cid, params func() interface{}) HarnessOpt {
func HarnessActor(actor *address.Address, creator *address.Address, code cid.Cid, params func() cbg.CBORMarshaler) HarnessOpt {
return func(t testing.TB, h *Harness) error {
if h.Stage != HarnessPostInit {
return nil
@ -205,7 +206,7 @@ func (h *Harness) Apply(t testing.TB, msg types.Message) (*vm.ApplyRet, *state.S
}
func (h *Harness) CreateActor(t testing.TB, from address.Address,
code cid.Cid, params interface{}) (*vm.ApplyRet, *state.StateTree) {
code cid.Cid, params cbg.CBORMarshaler) (*vm.ApplyRet, *state.StateTree) {
t.Helper()
return h.Apply(t, types.Message{
@ -237,7 +238,7 @@ func (h *Harness) SendFunds(t testing.TB, from address.Address, to address.Addre
}
func (h *Harness) Invoke(t testing.TB, from address.Address, to address.Address,
method uint64, params interface{}) (*vm.ApplyRet, *state.StateTree) {
method uint64, params cbg.CBORMarshaler) (*vm.ApplyRet, *state.StateTree) {
t.Helper()
return h.Apply(t, types.Message{
To: to,
@ -297,11 +298,14 @@ func (h *Harness) AssertBalanceChange(t testing.TB, addr address.Address, amt in
}
}
func DumpObject(t testing.TB, obj interface{}) []byte {
func DumpObject(t testing.TB, obj cbg.CBORMarshaler) []byte {
if obj == nil {
return nil
}
t.Helper()
enc, err := cbor.DumpObject(obj)
if err != nil {
b := new(bytes.Buffer)
if err := obj.MarshalCBOR(b); err != nil {
t.Fatalf("dumping params: %+v", err)
}
return enc
return b.Bytes()
}

View File

@ -67,7 +67,7 @@ func (m mybs) Get(c cid.Cid) (block.Block, error) {
b, err := m.Blockstore.Get(c)
if err != nil {
// change to error for stacktraces, don't commit with that pls
log.Warnf("Get failed: %s %s", c, err)
//log.Warnf("Get failed: %s %s", c, err)
return nil, err
}
@ -119,6 +119,7 @@ func NewGenerator() (*ChainGen, error) {
if err != nil {
return nil, xerrors.Errorf("failed to generate receiver key: %w", err)
}
fmt.Println("RECEIVER KEY: ", receievers[r].String())
}
minercfg := &GenMinerCfg{

View File

@ -55,8 +55,6 @@ func SetupInitActor(bs bstore.Blockstore, addrs []address.Address) (*types.Actor
return nil, err
}
fmt.Println("INIT ACTOR HEAD: ", statecid)
act := &types.Actor{
Code: actors.InitActorCodeCid,
Head: statecid,

View File

@ -61,8 +61,6 @@ func (st *StateTree) SetActor(addr address.Address, act *types.Actor) error {
if act == cact {
return nil
}
} else {
st.actorcache[addr] = act
}
return st.root.Set(context.TODO(), string(addr.Bytes()), act)
@ -91,7 +89,7 @@ func (st *StateTree) GetActor(addr address.Address) (*types.Actor, error) {
iaddr, err := st.lookupID(addr)
if err != nil {
if xerrors.Is(err, hamt.ErrNotFound) {
return nil, xerrors.Errorf("lookup failed: %w", types.ErrActorNotFound)
return nil, xerrors.Errorf("resolution lookup failed (%s): %w", addr, types.ErrActorNotFound)
}
return nil, xerrors.Errorf("address resolution: %w", err)
}

View File

@ -14,6 +14,10 @@ import (
var _ = xerrors.Errorf
func (t *BlockHeader) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{140}); err != nil {
return err
}
@ -23,7 +27,7 @@ func (t *BlockHeader) MarshalCBOR(w io.Writer) error {
return err
}
// t.t.Tickets ([]*Ticket)
// t.t.Tickets ([]*types.Ticket)
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.Tickets)))); err != nil {
return err
}
@ -51,7 +55,7 @@ func (t *BlockHeader) MarshalCBOR(w io.Writer) error {
}
}
// t.t.ParentWeight (BigInt)
// t.t.ParentWeight (types.BigInt)
if err := t.ParentWeight.MarshalCBOR(w); err != nil {
return err
}
@ -71,7 +75,7 @@ func (t *BlockHeader) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("failed to write cid field t.Messages: %w", err)
}
// t.t.BLSAggregate (Signature)
// t.t.BLSAggregate (types.Signature)
if err := t.BLSAggregate.MarshalCBOR(w); err != nil {
return err
}
@ -86,14 +90,15 @@ func (t *BlockHeader) MarshalCBOR(w io.Writer) error {
return err
}
// t.t.BlockSig (Signature)
// t.t.BlockSig (types.Signature)
if err := t.BlockSig.MarshalCBOR(w); err != nil {
return err
}
return nil
}
func (t *BlockHeader) UnmarshalCBOR(br io.Reader) error {
func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
maj, extra, err := cbg.CborReadHeader(br)
if err != nil {
@ -109,10 +114,14 @@ func (t *BlockHeader) UnmarshalCBOR(br io.Reader) error {
// t.t.Miner (address.Address)
if err := t.Miner.UnmarshalCBOR(br); err != nil {
return err
{
if err := t.Miner.UnmarshalCBOR(br); err != nil {
return err
}
}
// t.t.Tickets ([]*Ticket)
// t.t.Tickets ([]*types.Ticket)
maj, extra, err = cbg.CborReadHeader(br)
if err != nil {
@ -179,10 +188,14 @@ func (t *BlockHeader) UnmarshalCBOR(br io.Reader) error {
t.Parents[i] = c
}
// t.t.ParentWeight (BigInt)
// t.t.ParentWeight (types.BigInt)
{
if err := t.ParentWeight.UnmarshalCBOR(br); err != nil {
return err
}
if err := t.ParentWeight.UnmarshalCBOR(br); err != nil {
return err
}
// t.t.Height (uint64)
@ -212,10 +225,14 @@ func (t *BlockHeader) UnmarshalCBOR(br io.Reader) error {
}
t.Messages = c
}
// t.t.BLSAggregate (Signature)
// t.t.BLSAggregate (types.Signature)
{
if err := t.BLSAggregate.UnmarshalCBOR(br); err != nil {
return err
}
if err := t.BLSAggregate.UnmarshalCBOR(br); err != nil {
return err
}
// t.t.MessageReceipts (cid.Cid)
@ -236,15 +253,23 @@ func (t *BlockHeader) UnmarshalCBOR(br io.Reader) error {
return fmt.Errorf("wrong type for uint64 field")
}
t.Timestamp = extra
// t.t.BlockSig (Signature)
// t.t.BlockSig (types.Signature)
{
if err := t.BlockSig.UnmarshalCBOR(br); err != nil {
return err
}
if err := t.BlockSig.UnmarshalCBOR(br); err != nil {
return err
}
return nil
}
func (t *Ticket) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{131}); err != nil {
return err
}
@ -275,7 +300,8 @@ func (t *Ticket) MarshalCBOR(w io.Writer) error {
return nil
}
func (t *Ticket) UnmarshalCBOR(br io.Reader) error {
func (t *Ticket) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
maj, extra, err := cbg.CborReadHeader(br)
if err != nil {
@ -344,6 +370,10 @@ func (t *Ticket) UnmarshalCBOR(br io.Reader) error {
}
func (t *Message) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{136}); err != nil {
return err
}
@ -363,17 +393,17 @@ func (t *Message) MarshalCBOR(w io.Writer) error {
return err
}
// t.t.Value (BigInt)
// t.t.Value (types.BigInt)
if err := t.Value.MarshalCBOR(w); err != nil {
return err
}
// t.t.GasPrice (BigInt)
// t.t.GasPrice (types.BigInt)
if err := t.GasPrice.MarshalCBOR(w); err != nil {
return err
}
// t.t.GasLimit (BigInt)
// t.t.GasLimit (types.BigInt)
if err := t.GasLimit.MarshalCBOR(w); err != nil {
return err
}
@ -393,7 +423,8 @@ func (t *Message) MarshalCBOR(w io.Writer) error {
return nil
}
func (t *Message) UnmarshalCBOR(br io.Reader) error {
func (t *Message) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
maj, extra, err := cbg.CborReadHeader(br)
if err != nil {
@ -409,13 +440,21 @@ func (t *Message) UnmarshalCBOR(br io.Reader) error {
// t.t.To (address.Address)
if err := t.To.UnmarshalCBOR(br); err != nil {
return err
{
if err := t.To.UnmarshalCBOR(br); err != nil {
return err
}
}
// t.t.From (address.Address)
if err := t.From.UnmarshalCBOR(br); err != nil {
return err
{
if err := t.From.UnmarshalCBOR(br); err != nil {
return err
}
}
// t.t.Nonce (uint64)
@ -427,20 +466,32 @@ func (t *Message) UnmarshalCBOR(br io.Reader) error {
return fmt.Errorf("wrong type for uint64 field")
}
t.Nonce = extra
// t.t.Value (BigInt)
// t.t.Value (types.BigInt)
{
if err := t.Value.UnmarshalCBOR(br); err != nil {
return err
}
if err := t.Value.UnmarshalCBOR(br); err != nil {
return err
}
// t.t.GasPrice (BigInt)
// t.t.GasPrice (types.BigInt)
{
if err := t.GasPrice.UnmarshalCBOR(br); err != nil {
return err
}
if err := t.GasPrice.UnmarshalCBOR(br); err != nil {
return err
}
// t.t.GasLimit (BigInt)
// t.t.GasLimit (types.BigInt)
{
if err := t.GasLimit.UnmarshalCBOR(br); err != nil {
return err
}
if err := t.GasLimit.UnmarshalCBOR(br); err != nil {
return err
}
// t.t.Method (uint64)
@ -473,23 +524,28 @@ func (t *Message) UnmarshalCBOR(br io.Reader) error {
}
func (t *SignedMessage) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{130}); err != nil {
return err
}
// t.t.Message (Message)
// t.t.Message (types.Message)
if err := t.Message.MarshalCBOR(w); err != nil {
return err
}
// t.t.Signature (Signature)
// t.t.Signature (types.Signature)
if err := t.Signature.MarshalCBOR(w); err != nil {
return err
}
return nil
}
func (t *SignedMessage) UnmarshalCBOR(br io.Reader) error {
func (t *SignedMessage) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
maj, extra, err := cbg.CborReadHeader(br)
if err != nil {
@ -503,20 +559,32 @@ func (t *SignedMessage) UnmarshalCBOR(br io.Reader) error {
return fmt.Errorf("cbor input had wrong number of fields")
}
// t.t.Message (Message)
// t.t.Message (types.Message)
{
if err := t.Message.UnmarshalCBOR(br); err != nil {
return err
}
if err := t.Message.UnmarshalCBOR(br); err != nil {
return err
}
// t.t.Signature (Signature)
// t.t.Signature (types.Signature)
{
if err := t.Signature.UnmarshalCBOR(br); err != nil {
return err
}
if err := t.Signature.UnmarshalCBOR(br); err != nil {
return err
}
return nil
}
func (t *MsgMeta) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{130}); err != nil {
return err
}
@ -533,7 +601,8 @@ func (t *MsgMeta) MarshalCBOR(w io.Writer) error {
return nil
}
func (t *MsgMeta) UnmarshalCBOR(br io.Reader) error {
func (t *MsgMeta) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
maj, extra, err := cbg.CborReadHeader(br)
if err != nil {
@ -569,6 +638,10 @@ func (t *MsgMeta) UnmarshalCBOR(br io.Reader) error {
}
func (t *SignedVoucher) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{137}); err != nil {
return err
}
@ -586,7 +659,7 @@ func (t *SignedVoucher) MarshalCBOR(w io.Writer) error {
return err
}
// t.t.Extra (ModVerifyParams)
// t.t.Extra (types.ModVerifyParams)
if err := t.Extra.MarshalCBOR(w); err != nil {
return err
}
@ -601,7 +674,7 @@ func (t *SignedVoucher) MarshalCBOR(w io.Writer) error {
return err
}
// t.t.Amount (BigInt)
// t.t.Amount (types.BigInt)
if err := t.Amount.MarshalCBOR(w); err != nil {
return err
}
@ -611,7 +684,7 @@ func (t *SignedVoucher) MarshalCBOR(w io.Writer) error {
return err
}
// t.t.Merges ([]Merge)
// t.t.Merges ([]types.Merge)
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.Merges)))); err != nil {
return err
}
@ -621,14 +694,15 @@ func (t *SignedVoucher) MarshalCBOR(w io.Writer) error {
}
}
// t.t.Signature (Signature)
// t.t.Signature (types.Signature)
if err := t.Signature.MarshalCBOR(w); err != nil {
return err
}
return nil
}
func (t *SignedVoucher) UnmarshalCBOR(br io.Reader) error {
func (t *SignedVoucher) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
maj, extra, err := cbg.CborReadHeader(br)
if err != nil {
@ -669,12 +743,26 @@ func (t *SignedVoucher) UnmarshalCBOR(br io.Reader) error {
if _, err := io.ReadFull(br, t.SecretPreimage); err != nil {
return err
}
// t.t.Extra (ModVerifyParams)
// t.t.Extra (types.ModVerifyParams)
t.Extra = new(ModVerifyParams)
{
pb, err := br.PeekByte()
if err != nil {
return err
}
if pb == cbg.CborNull[0] {
var nbuf [1]byte
if _, err := br.Read(nbuf[:]); err != nil {
return err
}
} else {
t.Extra = new(ModVerifyParams)
if err := t.Extra.UnmarshalCBOR(br); err != nil {
return err
}
}
if err := t.Extra.UnmarshalCBOR(br); err != nil {
return err
}
// t.t.Lane (uint64)
@ -696,10 +784,14 @@ func (t *SignedVoucher) UnmarshalCBOR(br io.Reader) error {
return fmt.Errorf("wrong type for uint64 field")
}
t.Nonce = extra
// t.t.Amount (BigInt)
// t.t.Amount (types.BigInt)
{
if err := t.Amount.UnmarshalCBOR(br); err != nil {
return err
}
if err := t.Amount.UnmarshalCBOR(br); err != nil {
return err
}
// t.t.MinCloseHeight (uint64)
@ -711,7 +803,7 @@ func (t *SignedVoucher) UnmarshalCBOR(br io.Reader) error {
return fmt.Errorf("wrong type for uint64 field")
}
t.MinCloseHeight = extra
// t.t.Merges ([]Merge)
// t.t.Merges ([]types.Merge)
maj, extra, err = cbg.CborReadHeader(br)
if err != nil {
@ -736,17 +828,35 @@ func (t *SignedVoucher) UnmarshalCBOR(br io.Reader) error {
t.Merges[i] = v
}
// t.t.Signature (Signature)
// t.t.Signature (types.Signature)
t.Signature = new(Signature)
{
pb, err := br.PeekByte()
if err != nil {
return err
}
if pb == cbg.CborNull[0] {
var nbuf [1]byte
if _, err := br.Read(nbuf[:]); err != nil {
return err
}
} else {
t.Signature = new(Signature)
if err := t.Signature.UnmarshalCBOR(br); err != nil {
return err
}
}
if err := t.Signature.UnmarshalCBOR(br); err != nil {
return err
}
return nil
}
func (t *ModVerifyParams) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{131}); err != nil {
return err
}
@ -771,7 +881,8 @@ func (t *ModVerifyParams) MarshalCBOR(w io.Writer) error {
return nil
}
func (t *ModVerifyParams) UnmarshalCBOR(br io.Reader) error {
func (t *ModVerifyParams) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
maj, extra, err := cbg.CborReadHeader(br)
if err != nil {
@ -787,8 +898,12 @@ func (t *ModVerifyParams) UnmarshalCBOR(br io.Reader) error {
// t.t.Actor (address.Address)
if err := t.Actor.UnmarshalCBOR(br); err != nil {
return err
{
if err := t.Actor.UnmarshalCBOR(br); err != nil {
return err
}
}
// t.t.Method (uint64)
@ -821,6 +936,10 @@ func (t *ModVerifyParams) UnmarshalCBOR(br io.Reader) error {
}
func (t *Merge) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{130}); err != nil {
return err
}
@ -837,7 +956,8 @@ func (t *Merge) MarshalCBOR(w io.Writer) error {
return nil
}
func (t *Merge) UnmarshalCBOR(br io.Reader) error {
func (t *Merge) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
maj, extra, err := cbg.CborReadHeader(br)
if err != nil {

View File

@ -6,8 +6,6 @@ import (
"fmt"
"io"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/polydawn/refmt/obj/atlas"
cbg "github.com/whyrusleeping/cbor-gen"
)
@ -25,21 +23,6 @@ const (
IKTBLS
)
func init() {
cbor.RegisterCborType(atlas.BuildEntry(Signature{}).Transform().
TransformMarshal(atlas.MakeMarshalTransformFunc(
func(s Signature) ([]byte, error) {
buf := make([]byte, 4)
n := binary.PutUvarint(buf, uint64(s.TypeCode()))
return append(buf[:n], s.Data...), nil
})).
TransformUnmarshal(atlas.MakeUnmarshalTransformFunc(
func(x []byte) (Signature, error) {
return SignatureFromBytes(x)
})).
Complete())
}
type Signature struct {
Type string
Data []byte
@ -80,6 +63,11 @@ func (s *Signature) TypeCode() int {
}
func (s *Signature) MarshalCBOR(w io.Writer) error {
if s == nil {
_, err := w.Write(cbg.CborNull)
return err
}
header := cbg.CborEncodeMajorType(cbg.MajByteString, uint64(len(s.Data)+1))
if _, err := w.Write(header); err != nil {

View File

@ -8,12 +8,6 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
)
func init() {
cbor.RegisterCborType(Merge{})
cbor.RegisterCborType(SignedVoucher{})
cbor.RegisterCborType(ModVerifyParams{})
}
type SignedVoucher struct {
TimeLock uint64
SecretPreimage []byte
@ -31,16 +25,22 @@ type SignedVoucher struct {
func (sv *SignedVoucher) SigningBytes() ([]byte, error) {
osv := *sv
osv.Signature = nil
return cbor.DumpObject(osv)
buf := new(bytes.Buffer)
if err := osv.MarshalCBOR(buf); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func (sv *SignedVoucher) EncodedString() (string, error) {
data, err := cbor.DumpObject(sv)
if err != nil {
buf := new(bytes.Buffer)
if err := sv.MarshalCBOR(buf); err != nil {
return "", err
}
return base64.RawURLEncoding.EncodeToString(data), nil
return base64.RawURLEncoding.EncodeToString(buf.Bytes()), nil
}
func (sv *SignedVoucher) Equals(other *SignedVoucher) bool {

View File

@ -1,11 +1,15 @@
package vm
import (
"fmt"
"io"
"testing"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/stretchr/testify/assert"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-lotus/chain/actors"
"github.com/filecoin-project/go-lotus/chain/actors/aerrors"
"github.com/filecoin-project/go-lotus/chain/types"
)
@ -15,6 +19,25 @@ type basicParams struct {
B byte
}
func (b *basicParams) MarshalCBOR(w io.Writer) error {
_, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(b.B)))
return err
}
func (b *basicParams) UnmarshalCBOR(r io.Reader) error {
maj, val, err := cbg.CborReadHeader(r)
if err != nil {
return err
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("bad cbor type")
}
b.B = byte(val)
return nil
}
func init() {
cbor.RegisterCborType(basicParams{})
}
@ -39,6 +62,7 @@ func (basicContract) InvokeSomething0(act *types.Actor, vmctx types.VMContext,
params *basicParams) ([]byte, aerrors.ActorError) {
return nil, aerrors.New(params.B, "params.B")
}
func (basicContract) BadParam(act *types.Actor, vmctx types.VMContext,
params *basicParams) ([]byte, aerrors.ActorError) {
return nil, aerrors.New(255, "bad params")
@ -55,7 +79,7 @@ func TestInvokerBasic(t *testing.T) {
assert.NoError(t, err)
{
bParam, err := cbor.DumpObject(basicParams{B: 1})
bParam, err := actors.SerializeParams(&basicParams{B: 1})
assert.NoError(t, err)
_, aerr := code[0](nil, &VMContext{}, bParam)
@ -67,7 +91,7 @@ func TestInvokerBasic(t *testing.T) {
}
{
bParam, err := cbor.DumpObject(basicParams{B: 2})
bParam, err := actors.SerializeParams(&basicParams{B: 2})
assert.NoError(t, err)
_, aerr := code[10](nil, &VMContext{}, bParam)
@ -77,7 +101,7 @@ func TestInvokerBasic(t *testing.T) {
}
}
_, aerr := code[1](nil, &VMContext{}, []byte{0})
_, aerr := code[1](nil, &VMContext{}, []byte{99})
if aerrors.IsFatal(aerr) {
t.Fatal("err should not be fatal")
}

View File

@ -2,9 +2,9 @@ package vm
import (
"context"
"fmt"
"github.com/filecoin-project/go-lotus/chain/actors"
"github.com/filecoin-project/go-lotus/chain/actors/aerrors"
"github.com/filecoin-project/go-lotus/chain/address"
"github.com/filecoin-project/go-lotus/chain/state"
"github.com/filecoin-project/go-lotus/chain/types"
@ -27,42 +27,41 @@ func init() {
var EmptyObjectCid cid.Cid
func TryCreateAccountActor(st *state.StateTree, addr address.Address) (*types.Actor, error) {
func TryCreateAccountActor(st *state.StateTree, addr address.Address) (*types.Actor, aerrors.ActorError) {
act, err := makeActor(st, addr)
if err != nil {
return nil, err
}
_, err = st.RegisterNewAddress(addr, act)
if err != nil {
return nil, err
if _, err := st.RegisterNewAddress(addr, act); err != nil {
return nil, aerrors.Escalate(err, "registering actor address")
}
return act, nil
}
func makeActor(st *state.StateTree, addr address.Address) (*types.Actor, error) {
func makeActor(st *state.StateTree, addr address.Address) (*types.Actor, aerrors.ActorError) {
switch addr.Protocol() {
case address.BLS:
return NewBLSAccountActor(st, addr)
case address.SECP256K1:
return NewSecp256k1AccountActor(st, addr)
case address.ID:
return nil, fmt.Errorf("no actor with given ID")
return nil, aerrors.New(1, "no actor with given ID")
case address.Actor:
return nil, fmt.Errorf("no such actor: %s", addr)
return nil, aerrors.Newf(1, "no such actor: %s", addr)
default:
return nil, fmt.Errorf("address has unsupported protocol: %d", addr.Protocol())
return nil, aerrors.Newf(1, "address has unsupported protocol: %d", addr.Protocol())
}
}
func NewBLSAccountActor(st *state.StateTree, addr address.Address) (*types.Actor, error) {
func NewBLSAccountActor(st *state.StateTree, addr address.Address) (*types.Actor, aerrors.ActorError) {
var acstate actors.AccountActorState
acstate.Address = addr
c, err := st.Store.Put(context.TODO(), acstate)
c, err := st.Store.Put(context.TODO(), &acstate)
if err != nil {
return nil, err
return nil, aerrors.Escalate(err, "serializing account actor state")
}
nact := &types.Actor{
@ -74,7 +73,7 @@ func NewBLSAccountActor(st *state.StateTree, addr address.Address) (*types.Actor
return nact, nil
}
func NewSecp256k1AccountActor(st *state.StateTree, addr address.Address) (*types.Actor, error) {
func NewSecp256k1AccountActor(st *state.StateTree, addr address.Address) (*types.Actor, aerrors.ActorError) {
nact := &types.Actor{
Code: actors.AccountActorCodeCid,
Balance: types.NewInt(0),

View File

@ -319,6 +319,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *VMContext,
toActor, err := st.GetActor(msg.To)
if err != nil {
if xerrors.Is(err, types.ErrActorNotFound) {
fmt.Println("actor not found on send: ", msg.To.String())
a, err := TryCreateAccountActor(st, msg.To)
if err != nil {
return nil, aerrors.Absorb(err, 1, "could not create account"), nil

View File

@ -62,7 +62,7 @@ var createMinerCmd = &cli.Command{
return xerrors.Errorf("failed to get default address: %w", err)
}
params, err := actors.SerializeParams(createMinerArgs)
params, err := actors.SerializeParams(&createMinerArgs)
if err != nil {
return err
}

View File

@ -224,7 +224,7 @@ func createStorageMiner(ctx context.Context, api api.FullNode, peerid peer.ID) (
collateral := types.NewInt(1000) // TODO: Get this from params
params, err := actors.SerializeParams(actors.CreateStorageMinerParams{
params, err := actors.SerializeParams(&actors.CreateStorageMinerParams{
Owner: defOwner,
Worker: k,
SectorSize: types.NewInt(build.SectorSize),

2
go.mod
View File

@ -67,7 +67,7 @@ require (
github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a
github.com/stretchr/testify v1.4.0
github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba
github.com/whyrusleeping/cbor-gen v0.0.0-20190910040623-f29470053db6
github.com/whyrusleeping/cbor-gen v0.0.0-20190910224804-fde80d83b106
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7
github.com/whyrusleeping/pubsub v0.0.0-20131020042734-02de8aa2db3d
github.com/whyrusleeping/sharray v0.0.0-20190718051354-e41931821e33

2
go.sum
View File

@ -536,6 +536,8 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20190910031516-c1cbffdb01bb h1:8yBVx6dg
github.com/whyrusleeping/cbor-gen v0.0.0-20190910031516-c1cbffdb01bb/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY=
github.com/whyrusleeping/cbor-gen v0.0.0-20190910040623-f29470053db6 h1:e46mGjWNMelsw+YLq/5TyMfwGz8p0cBY2cf91y6tSBA=
github.com/whyrusleeping/cbor-gen v0.0.0-20190910040623-f29470053db6/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY=
github.com/whyrusleeping/cbor-gen v0.0.0-20190910224804-fde80d83b106 h1:PRWDVakEjB5ju0toKWbXSExfi5BB+oU87/8GhBKXIWE=
github.com/whyrusleeping/cbor-gen v0.0.0-20190910224804-fde80d83b106/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=