implement a few of the TODOs

This commit is contained in:
whyrusleeping 2019-07-16 23:05:11 -07:00
parent 9a7823ab84
commit 05b8158285
6 changed files with 52 additions and 14 deletions

View File

@ -26,6 +26,11 @@ type Import struct {
Size uint64 Size uint64
} }
type MsgWait struct {
InBlock cid.Cid
Receipt types.MessageReceipt
}
// API is a low-level interface to the Filecoin network // API is a low-level interface to the Filecoin network
type API interface { type API interface {
// chain // chain
@ -33,7 +38,7 @@ type API interface {
ChainHead(context.Context) (*chain.TipSet, error) // TODO: check serialization ChainHead(context.Context) (*chain.TipSet, error) // TODO: check serialization
ChainSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error // TODO: check serialization ChainSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error // TODO: check serialization
ChainGetRandomness(context.Context, *chain.TipSet) ([]byte, error) ChainGetRandomness(context.Context, *chain.TipSet) ([]byte, error)
ChainWaitMsg(context.Context, cid.Cid) (cid.Cid, *types.MessageReceipt, error) ChainWaitMsg(context.Context, cid.Cid) (*MsgWait, error)
// messages // messages
@ -80,7 +85,7 @@ type API interface {
WalletDefaultAddress(context.Context) (address.Address, error) WalletDefaultAddress(context.Context) (address.Address, error)
// Really not sure where this belongs. It could go on the wallet, or the message pool, or the chain... // Really not sure where this belongs. It could go on the wallet, or the message pool, or the chain...
WalletGetNonce(context.Context, address.Address) (uint64, error) MpoolGetNonce(context.Context, address.Address) (uint64, error)
// // import // // import
// // export // // export

View File

@ -5,7 +5,6 @@ import (
"github.com/filecoin-project/go-lotus/chain" "github.com/filecoin-project/go-lotus/chain"
"github.com/filecoin-project/go-lotus/chain/address" "github.com/filecoin-project/go-lotus/chain/address"
"github.com/filecoin-project/go-lotus/chain/types"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
"github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/peer"
@ -20,7 +19,7 @@ type Struct struct {
ChainSubmitBlock func(ctx context.Context, blk *chain.BlockMsg) error ChainSubmitBlock func(ctx context.Context, blk *chain.BlockMsg) error
ChainHead func(context.Context) (*chain.TipSet, error) ChainHead func(context.Context) (*chain.TipSet, error)
ChainGetRandomness func(context.Context, *chain.TipSet) ([]byte, error) ChainGetRandomness func(context.Context, *chain.TipSet) ([]byte, error)
ChainWaitMsg func(context.Context, cid.Cid) (cid.Cid, *types.MessageReceipt, error) ChainWaitMsg func(context.Context, cid.Cid) (*MsgWait, error)
MpoolPending func(context.Context, *chain.TipSet) ([]*chain.SignedMessage, error) MpoolPending func(context.Context, *chain.TipSet) ([]*chain.SignedMessage, error)
MpoolPush func(context.Context, *chain.SignedMessage) error MpoolPush func(context.Context, *chain.SignedMessage) error
@ -33,7 +32,7 @@ type Struct struct {
WalletBalance func(context.Context, address.Address) (types.BigInt, error) WalletBalance func(context.Context, address.Address) (types.BigInt, error)
WalletSign func(context.Context, address.Address, []byte) (*chain.Signature, error) WalletSign func(context.Context, address.Address, []byte) (*chain.Signature, error)
WalletDefaultAddress func(context.Context) (address.Address, error) WalletDefaultAddress func(context.Context) (address.Address, error)
WalletGetNonce func(context.Context, address.Address) (uint64, error) MpoolGetNonce func(context.Context, address.Address) (uint64, error)
ClientImport func(ctx context.Context, path string) (cid.Cid, error) ClientImport func(ctx context.Context, path string) (cid.Cid, error)
ClientListImports func(ctx context.Context) ([]Import, error) ClientListImports func(ctx context.Context) ([]Import, error)
@ -92,7 +91,7 @@ func (c *Struct) ChainGetRandomness(ctx context.Context, pts *chain.TipSet) ([]b
return c.Internal.ChainGetRandomness(ctx, pts) return c.Internal.ChainGetRandomness(ctx, pts)
} }
func (c *Struct) ChainWaitMsg(ctx context.Context, msgc cid.Cid) (cid.Cid, *types.MessageReceipt, error) { func (c *Struct) ChainWaitMsg(ctx context.Context, msgc cid.Cid) (*MsgWait, error) {
return c.Internal.ChainWaitMsg(ctx, msgc) return c.Internal.ChainWaitMsg(ctx, msgc)
} }
@ -126,8 +125,8 @@ func (c *Struct) WalletDefaultAddress(ctx context.Context) (address.Address, err
return c.Internal.WalletDefaultAddress(ctx) return c.Internal.WalletDefaultAddress(ctx)
} }
func (c *Struct) WalletGetNonce(ctx context.Context, addr address.Address) (uint64, error) { func (c *Struct) MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) {
return c.Internal.WalletGetNonce(ctx, addr) return c.Internal.MpoolGetNonce(ctx, addr)
} }
var _ API = &Struct{} var _ API = &Struct{}

View File

@ -4,6 +4,7 @@ import (
"sync" "sync"
"github.com/filecoin-project/go-lotus/chain/address" "github.com/filecoin-project/go-lotus/chain/address"
hamt "github.com/ipfs/go-hamt-ipld"
) )
type MessagePool struct { type MessagePool struct {
@ -74,6 +75,36 @@ func (mp *MessagePool) Add(m *SignedMessage) error {
return nil return nil
} }
func (mp *MessagePool) GetNonce(addr address.Address) (uint64, error) {
mp.lk.Lock()
defer mp.lk.Unlock()
mset, ok := mp.pending[addr]
if ok {
return mset.startNonce + uint64(len(mset.msgs)), nil
}
head := mp.cs.GetHeaviestTipSet()
state, err := mp.cs.TipSetState(head.Cids())
if err != nil {
return 0, err
}
cst := hamt.CSTFromBstore(mp.cs.bs)
st, err := LoadStateTree(cst, state)
if err != nil {
return 0, err
}
act, err := st.GetActor(addr)
if err != nil {
return 0, err
}
return act.Nonce, nil
}
func (mp *MessagePool) Remove(m *SignedMessage) { func (mp *MessagePool) Remove(m *SignedMessage) {
mp.lk.Lock() mp.lk.Lock()
defer mp.lk.Unlock() defer mp.lk.Unlock()

View File

@ -67,7 +67,7 @@ var createMinerCmd = &cli.Command{
return err return err
} }
nonce, err := api.WalletGetNonce(ctx, addr) nonce, err := api.MpoolGetNonce(ctx, addr)
if err != nil { if err != nil {
return err return err
} }
@ -101,17 +101,17 @@ var createMinerCmd = &cli.Command{
return err return err
} }
inblk, rect, err := api.ChainWaitMsg(ctx, smsg.Cid()) mwait, err := api.ChainWaitMsg(ctx, smsg.Cid())
if err != nil { if err != nil {
return err return err
} }
maddr, err := address.NewFromBytes(rect.Return) maddr, err := address.NewFromBytes(mwait.Receipt.Return)
if err != nil { if err != nil {
return err return err
} }
fmt.Printf("miner created in block %s\n", inblk) fmt.Printf("miner created in block %s\n", mwait.InBlock)
fmt.Println("new miner address: %s\n", maddr) fmt.Println("new miner address: %s\n", maddr)
return nil return nil

View File

@ -2,6 +2,7 @@ package jsonrpc
import ( import (
"encoding/json" "encoding/json"
"fmt"
"reflect" "reflect"
) )
@ -42,7 +43,8 @@ func processFuncOut(funcType reflect.Type) (valOut int, errOut int, n int) {
panic("expected error as second return value") panic("expected error as second return value")
} }
default: default:
panic("too many error values") errstr := fmt.Sprintf("too many return values: %s", funcType)
panic(errstr)
} }
return return

View File

@ -51,7 +51,8 @@ func (a *API) ChainGetRandomness(ctx context.Context, pts *chain.TipSet) ([]byte
return []byte("foo bar random"), nil return []byte("foo bar random"), nil
} }
func (a *API) ChainWaitMsg(ctx context.Context, msg cid.Cid) (*api.WaitMsg, error) { func (a *API) ChainWaitMsg(ctx context.Context, msg cid.Cid) (*api.MsgWait, error) {
panic("TODO")
} }
func (a *API) ID(context.Context) (peer.ID, error) { func (a *API) ID(context.Context) (peer.ID, error) {