Add and test IsMiner
License: MIT Signed-off-by: Jakub Sztandera <kubuxu@protonmail.ch>
This commit is contained in:
parent
6ee1b6fc84
commit
81f03a9f68
@ -13,6 +13,7 @@ const SectorSize = 1024
|
||||
func init() {
|
||||
cbor.RegisterCborType(StorageMarketState{})
|
||||
cbor.RegisterCborType(CreateStorageMinerParams{})
|
||||
cbor.RegisterCborType(IsMinerParam{})
|
||||
}
|
||||
|
||||
type StorageMarketActor struct{}
|
||||
@ -25,7 +26,7 @@ func (sma StorageMarketActor) Exports() []interface{} {
|
||||
3: sma.UpdateStorage,
|
||||
4: sma.GetTotalStorage,
|
||||
5: sma.PowerLookup,
|
||||
//6: sma.IsMiner,
|
||||
6: sma.IsMiner,
|
||||
//7: sma.StorageCollateralForSize,
|
||||
}
|
||||
}
|
||||
@ -65,17 +66,17 @@ func (sma StorageMarketActor) CreateStorageMiner(act *types.Actor, vmctx types.V
|
||||
return types.InvokeRet{}, err
|
||||
}
|
||||
|
||||
naddr, err := address.NewFromBytes(ret)
|
||||
if err != nil {
|
||||
return types.InvokeRet{}, err
|
||||
}
|
||||
|
||||
if exit != 0 {
|
||||
return types.InvokeRet{
|
||||
ReturnCode: 2,
|
||||
}, nil
|
||||
}
|
||||
|
||||
naddr, err := address.NewFromBytes(ret)
|
||||
if err != nil {
|
||||
return types.InvokeRet{}, err
|
||||
}
|
||||
|
||||
var self StorageMarketState
|
||||
old := vmctx.Storage().GetHead()
|
||||
if err := vmctx.Storage().Get(old, &self); err != nil {
|
||||
@ -171,3 +172,22 @@ func (sma StorageMarketActor) PowerLookup(act *types.Actor, vmctx types.VMContex
|
||||
Result: ret,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type IsMinerParam struct {
|
||||
Addr address.Address
|
||||
}
|
||||
|
||||
func (sma StorageMarketActor) IsMiner(act *types.Actor, vmctx types.VMContext, param *IsMinerParam) (types.InvokeRet, error) {
|
||||
var self StorageMarketState
|
||||
if err := vmctx.Storage().Get(vmctx.Storage().GetHead(), &self); err != nil {
|
||||
return types.InvokeRet{}, err
|
||||
}
|
||||
_, ok := self.Miners[param.Addr]
|
||||
out, err := SerializeParams(ok)
|
||||
if err != nil {
|
||||
return types.InvokeRet{}, err
|
||||
}
|
||||
return types.InvokeRet{
|
||||
Result: out,
|
||||
}, nil
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ import (
|
||||
|
||||
func TestStorageMarketCreateMiner(t *testing.T) {
|
||||
h := NewHarness(t)
|
||||
var outaddr address.Address
|
||||
var sminer address.Address
|
||||
h.Steps = []Step{
|
||||
{
|
||||
M: types.Message{
|
||||
@ -34,19 +34,46 @@ func TestStorageMarketCreateMiner(t *testing.T) {
|
||||
}
|
||||
|
||||
var err error
|
||||
outaddr, err = address.NewFromBytes(ret.Return)
|
||||
sminer, err = address.NewFromBytes(ret.Return)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if outaddr.String() != "t0102" {
|
||||
if sminer.String() != "t0102" {
|
||||
t.Fatal("hold up")
|
||||
}
|
||||
h.Steps[1].M.Params = h.DumpObject(&IsMinerParam{Addr: sminer})
|
||||
},
|
||||
},
|
||||
{
|
||||
M: types.Message{
|
||||
To: StorageMarketAddress,
|
||||
From: h.From,
|
||||
Method: 6,
|
||||
GasPrice: types.NewInt(1),
|
||||
GasLimit: types.NewInt(1),
|
||||
Value: types.NewInt(0),
|
||||
Nonce: 1,
|
||||
// Params is sent in previous set
|
||||
},
|
||||
Ret: func(t *testing.T, ret *types.MessageReceipt) {
|
||||
if ret.ExitCode != 0 {
|
||||
t.Fatal("invokation failed: ", ret.ExitCode)
|
||||
}
|
||||
var output bool
|
||||
err := cbor.DecodeInto(ret.Return, &output)
|
||||
if err != nil {
|
||||
t.Fatalf("error decoding: %+v", err)
|
||||
}
|
||||
|
||||
if !output {
|
||||
t.Fatalf("%s is miner but IsMiner call returned false", sminer)
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
state := h.Execute()
|
||||
act, err := state.GetActor(outaddr)
|
||||
act, err := state.GetActor(sminer)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ func (h *Harness) DumpObject(obj interface{}) []byte {
|
||||
}
|
||||
func (h *Harness) NoError(t *testing.T, err error) {
|
||||
if err != nil {
|
||||
t.Fatalf("Error in step %d: %s", h.currStep, err)
|
||||
t.Fatalf("Error in step %d: %+v", h.currStep, err)
|
||||
}
|
||||
}
|
||||
|
||||
|
9
chain/actors/params.go
Normal file
9
chain/actors/params.go
Normal file
@ -0,0 +1,9 @@
|
||||
package actors
|
||||
|
||||
import (
|
||||
cbor "github.com/ipfs/go-ipld-cbor"
|
||||
)
|
||||
|
||||
func SerializeParams(i interface{}) ([]byte, error) {
|
||||
return cbor.DumpObject(i)
|
||||
}
|
@ -30,7 +30,7 @@ type VMContext struct {
|
||||
// address that started invokation chain
|
||||
origin address.Address
|
||||
|
||||
storage types.Storage
|
||||
storage *storage
|
||||
}
|
||||
|
||||
// Message is the message that kicked off the current invocation
|
||||
@ -226,6 +226,8 @@ func (vm *VM) ApplyMessage(msg *types.Message) (*types.MessageReceipt, error) {
|
||||
panic("invariant violated: " + err.Error())
|
||||
}
|
||||
} else {
|
||||
// Update actor head reference
|
||||
toActor.Head = vmctx.storage.head
|
||||
// refund unused gas
|
||||
refund := types.BigMul(types.BigSub(msg.GasLimit, vmctx.GasUsed()), msg.GasPrice)
|
||||
DepositFunds(fromActor, refund)
|
||||
|
Loading…
Reference in New Issue
Block a user