Update to specs-actors 0.9.9
This patch changes the runtime interfaces, to make it possible to abstract over them.
This commit is contained in:
parent
8a21198f56
commit
32eeb96ce7
@ -74,8 +74,8 @@ func (ta *testActor) Exports() []interface{} {
|
|||||||
|
|
||||||
func (ta *testActor) Constructor(rt runtime.Runtime, params *abi.EmptyValue) *abi.EmptyValue {
|
func (ta *testActor) Constructor(rt runtime.Runtime, params *abi.EmptyValue) *abi.EmptyValue {
|
||||||
rt.ValidateImmediateCallerAcceptAny()
|
rt.ValidateImmediateCallerAcceptAny()
|
||||||
rt.State().Create(&testActorState{11})
|
rt.StateCreate(&testActorState{11})
|
||||||
fmt.Println("NEW ACTOR ADDRESS IS: ", rt.Message().Receiver())
|
fmt.Println("NEW ACTOR ADDRESS IS: ", rt.Receiver())
|
||||||
|
|
||||||
return abi.Empty
|
return abi.Empty
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ func (ta *testActor) Constructor(rt runtime.Runtime, params *abi.EmptyValue) *ab
|
|||||||
func (ta *testActor) TestMethod(rt runtime.Runtime, params *abi.EmptyValue) *abi.EmptyValue {
|
func (ta *testActor) TestMethod(rt runtime.Runtime, params *abi.EmptyValue) *abi.EmptyValue {
|
||||||
rt.ValidateImmediateCallerAcceptAny()
|
rt.ValidateImmediateCallerAcceptAny()
|
||||||
var st testActorState
|
var st testActorState
|
||||||
rt.State().Readonly(&st)
|
rt.StateReadonly(&st)
|
||||||
|
|
||||||
if rt.CurrEpoch() > testForkHeight {
|
if rt.CurrEpoch() > testForkHeight {
|
||||||
if st.HasUpgraded != 55 {
|
if st.HasUpgraded != 55 {
|
||||||
|
@ -64,7 +64,7 @@ func (inv *Invoker) Invoke(codeCid cid.Cid, rt runtime.Runtime, method abi.Metho
|
|||||||
|
|
||||||
code, ok := inv.builtInCode[codeCid]
|
code, ok := inv.builtInCode[codeCid]
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Errorf("no code for actor %s (Addr: %s)", codeCid, rt.Message().Receiver())
|
log.Errorf("no code for actor %s (Addr: %s)", codeCid, rt.Receiver())
|
||||||
return nil, aerrors.Newf(exitcode.SysErrorIllegalActor, "no code for actor %s(%d)(%s)", codeCid, method, hex.EncodeToString(params))
|
return nil, aerrors.Newf(exitcode.SysErrorIllegalActor, "no code for actor %s(%d)(%s)", codeCid, method, hex.EncodeToString(params))
|
||||||
}
|
}
|
||||||
if method >= abi.MethodNum(len(code)) || code[method] == nil {
|
if method >= abi.MethodNum(len(code)) || code[method] == nil {
|
||||||
|
@ -8,7 +8,9 @@ import (
|
|||||||
gruntime "runtime"
|
gruntime "runtime"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-state-types/cbor"
|
||||||
"github.com/filecoin-project/go-state-types/network"
|
"github.com/filecoin-project/go-state-types/network"
|
||||||
|
rtt "github.com/filecoin-project/go-state-types/rt"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
@ -16,11 +18,9 @@ import (
|
|||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"github.com/filecoin-project/go-state-types/crypto"
|
||||||
"github.com/filecoin-project/go-state-types/exitcode"
|
"github.com/filecoin-project/go-state-types/exitcode"
|
||||||
"github.com/filecoin-project/specs-actors/actors/builtin"
|
"github.com/filecoin-project/specs-actors/actors/builtin"
|
||||||
"github.com/filecoin-project/specs-actors/actors/runtime"
|
rt0 "github.com/filecoin-project/specs-actors/actors/runtime"
|
||||||
vmr "github.com/filecoin-project/specs-actors/actors/runtime"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
cbor "github.com/ipfs/go-ipld-cbor"
|
ipldcbor "github.com/ipfs/go-ipld-cbor"
|
||||||
cbg "github.com/whyrusleeping/cbor-gen"
|
|
||||||
"go.opencensus.io/trace"
|
"go.opencensus.io/trace"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
@ -31,20 +31,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Runtime struct {
|
type Runtime struct {
|
||||||
|
types.Message
|
||||||
|
rt0.Syscalls
|
||||||
|
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
|
|
||||||
vm *VM
|
vm *VM
|
||||||
state *state.StateTree
|
state *state.StateTree
|
||||||
vmsg vmr.Message
|
|
||||||
height abi.ChainEpoch
|
height abi.ChainEpoch
|
||||||
cst cbor.IpldStore
|
cst ipldcbor.IpldStore
|
||||||
pricelist Pricelist
|
pricelist Pricelist
|
||||||
|
|
||||||
gasAvailable int64
|
gasAvailable int64
|
||||||
gasUsed int64
|
gasUsed int64
|
||||||
|
|
||||||
sys runtime.Syscalls
|
|
||||||
|
|
||||||
// address that started invoke chain
|
// address that started invoke chain
|
||||||
origin address.Address
|
origin address.Address
|
||||||
originNonce uint64
|
originNonce uint64
|
||||||
@ -85,11 +85,11 @@ type notFoundErr interface {
|
|||||||
IsNotFound() bool
|
IsNotFound() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) Get(c cid.Cid, o vmr.CBORUnmarshaler) bool {
|
func (rt *Runtime) StoreGet(c cid.Cid, o cbor.Unmarshaler) bool {
|
||||||
if err := rt.cst.Get(context.TODO(), c, o); err != nil {
|
if err := rt.cst.Get(context.TODO(), c, o); err != nil {
|
||||||
var nfe notFoundErr
|
var nfe notFoundErr
|
||||||
if xerrors.As(err, &nfe) && nfe.IsNotFound() {
|
if xerrors.As(err, &nfe) && nfe.IsNotFound() {
|
||||||
if xerrors.As(err, new(cbor.SerializationError)) {
|
if xerrors.As(err, new(ipldcbor.SerializationError)) {
|
||||||
panic(aerrors.Newf(exitcode.ErrSerialization, "failed to unmarshal cbor object %s", err))
|
panic(aerrors.Newf(exitcode.ErrSerialization, "failed to unmarshal cbor object %s", err))
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@ -100,10 +100,10 @@ func (rt *Runtime) Get(c cid.Cid, o vmr.CBORUnmarshaler) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) Put(x vmr.CBORMarshaler) cid.Cid {
|
func (rt *Runtime) StorePut(x cbor.Marshaler) cid.Cid {
|
||||||
c, err := rt.cst.Put(context.TODO(), x)
|
c, err := rt.cst.Put(context.TODO(), x)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if xerrors.As(err, new(cbor.SerializationError)) {
|
if xerrors.As(err, new(ipldcbor.SerializationError)) {
|
||||||
panic(aerrors.Newf(exitcode.ErrSerialization, "failed to marshal cbor object %s", err))
|
panic(aerrors.Newf(exitcode.ErrSerialization, "failed to marshal cbor object %s", err))
|
||||||
}
|
}
|
||||||
panic(aerrors.Fatalf("failed to put cbor object: %s", err))
|
panic(aerrors.Fatalf("failed to put cbor object: %s", err))
|
||||||
@ -111,7 +111,7 @@ func (rt *Runtime) Put(x vmr.CBORMarshaler) cid.Cid {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ vmr.Runtime = (*Runtime)(nil)
|
var _ rt0.Runtime = (*Runtime)(nil)
|
||||||
|
|
||||||
func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.ActorError) {
|
func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.ActorError) {
|
||||||
defer func() {
|
defer func() {
|
||||||
@ -139,7 +139,7 @@ func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.Act
|
|||||||
return ret, nil
|
return ret, nil
|
||||||
case *abi.EmptyValue:
|
case *abi.EmptyValue:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case cbg.CBORMarshaler:
|
case cbor.Marshaler:
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
if err := ret.MarshalCBOR(buf); err != nil {
|
if err := ret.MarshalCBOR(buf); err != nil {
|
||||||
return nil, aerrors.Absorb(err, 2, "failed to marshal response to cbor")
|
return nil, aerrors.Absorb(err, 2, "failed to marshal response to cbor")
|
||||||
@ -152,17 +152,13 @@ func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.Act
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) Message() vmr.Message {
|
|
||||||
return rt.vmsg
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rt *Runtime) ValidateImmediateCallerAcceptAny() {
|
func (rt *Runtime) ValidateImmediateCallerAcceptAny() {
|
||||||
rt.abortIfAlreadyValidated()
|
rt.abortIfAlreadyValidated()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) CurrentBalance() abi.TokenAmount {
|
func (rt *Runtime) CurrentBalance() abi.TokenAmount {
|
||||||
b, err := rt.GetBalance(rt.Message().Receiver())
|
b, err := rt.GetBalance(rt.Receiver())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rt.Abortf(err.RetCode(), "get current balance: %v", err)
|
rt.Abortf(err.RetCode(), "get current balance: %v", err)
|
||||||
}
|
}
|
||||||
@ -198,10 +194,6 @@ func (rt *Runtime) GetRandomnessFromBeacon(personalization crypto.DomainSeparati
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) Store() vmr.Store {
|
|
||||||
return rt
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rt *Runtime) NewActorAddress() address.Address {
|
func (rt *Runtime) NewActorAddress() address.Address {
|
||||||
var b bytes.Buffer
|
var b bytes.Buffer
|
||||||
oa, _ := ResolveToKeyAddr(rt.vm.cstate, rt.vm.cst, rt.origin)
|
oa, _ := ResolveToKeyAddr(rt.vm.cstate, rt.vm.cst, rt.origin)
|
||||||
@ -258,7 +250,7 @@ func (rt *Runtime) CreateActor(codeID cid.Cid, address address.Address) {
|
|||||||
// May only be called by the actor itself.
|
// May only be called by the actor itself.
|
||||||
func (rt *Runtime) DeleteActor(beneficiary address.Address) {
|
func (rt *Runtime) DeleteActor(beneficiary address.Address) {
|
||||||
rt.chargeGas(rt.Pricelist().OnDeleteActor())
|
rt.chargeGas(rt.Pricelist().OnDeleteActor())
|
||||||
act, err := rt.state.GetActor(rt.Message().Receiver())
|
act, err := rt.state.GetActor(rt.Receiver())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if xerrors.Is(err, types.ErrActorNotFound) {
|
if xerrors.Is(err, types.ErrActorNotFound) {
|
||||||
rt.Abortf(exitcode.SysErrorIllegalActor, "failed to load actor in delete actor: %s", err)
|
rt.Abortf(exitcode.SysErrorIllegalActor, "failed to load actor in delete actor: %s", err)
|
||||||
@ -267,36 +259,32 @@ func (rt *Runtime) DeleteActor(beneficiary address.Address) {
|
|||||||
}
|
}
|
||||||
if !act.Balance.IsZero() {
|
if !act.Balance.IsZero() {
|
||||||
// Transfer the executing actor's balance to the beneficiary
|
// Transfer the executing actor's balance to the beneficiary
|
||||||
if err := rt.vm.transfer(rt.Message().Receiver(), beneficiary, act.Balance); err != nil {
|
if err := rt.vm.transfer(rt.Receiver(), beneficiary, act.Balance); err != nil {
|
||||||
panic(aerrors.Fatalf("failed to transfer balance to beneficiary actor: %s", err))
|
panic(aerrors.Fatalf("failed to transfer balance to beneficiary actor: %s", err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete the executing actor
|
// Delete the executing actor
|
||||||
if err := rt.state.DeleteActor(rt.Message().Receiver()); err != nil {
|
if err := rt.state.DeleteActor(rt.Receiver()); err != nil {
|
||||||
panic(aerrors.Fatalf("failed to delete actor: %s", err))
|
panic(aerrors.Fatalf("failed to delete actor: %s", err))
|
||||||
}
|
}
|
||||||
_ = rt.chargeGasSafe(gasOnActorExec)
|
_ = rt.chargeGasSafe(gasOnActorExec)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) Syscalls() vmr.Syscalls {
|
func (rt *Runtime) StartSpan(name string) func() {
|
||||||
return rt.sys
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rt *Runtime) StartSpan(name string) vmr.TraceSpan {
|
|
||||||
panic("implement me")
|
panic("implement me")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) ValidateImmediateCallerIs(as ...address.Address) {
|
func (rt *Runtime) ValidateImmediateCallerIs(as ...address.Address) {
|
||||||
rt.abortIfAlreadyValidated()
|
rt.abortIfAlreadyValidated()
|
||||||
imm := rt.Message().Caller()
|
imm := rt.Caller()
|
||||||
|
|
||||||
for _, a := range as {
|
for _, a := range as {
|
||||||
if imm == a {
|
if imm == a {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rt.Abortf(exitcode.SysErrForbidden, "caller %s is not one of %s", rt.Message().Caller(), as)
|
rt.Abortf(exitcode.SysErrForbidden, "caller %s is not one of %s", rt.Caller(), as)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) Context() context.Context {
|
func (rt *Runtime) Context() context.Context {
|
||||||
@ -314,7 +302,7 @@ func (rt *Runtime) AbortStateMsg(msg string) {
|
|||||||
|
|
||||||
func (rt *Runtime) ValidateImmediateCallerType(ts ...cid.Cid) {
|
func (rt *Runtime) ValidateImmediateCallerType(ts ...cid.Cid) {
|
||||||
rt.abortIfAlreadyValidated()
|
rt.abortIfAlreadyValidated()
|
||||||
callerCid, ok := rt.GetActorCodeCID(rt.Message().Caller())
|
callerCid, ok := rt.GetActorCodeCID(rt.Caller())
|
||||||
if !ok {
|
if !ok {
|
||||||
panic(aerrors.Fatalf("failed to lookup code cid for caller"))
|
panic(aerrors.Fatalf("failed to lookup code cid for caller"))
|
||||||
}
|
}
|
||||||
@ -334,11 +322,11 @@ type dumbWrapperType struct {
|
|||||||
val []byte
|
val []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dwt *dumbWrapperType) Into(um vmr.CBORUnmarshaler) error {
|
func (dwt *dumbWrapperType) Into(um cbor.Unmarshaler) error {
|
||||||
return um.UnmarshalCBOR(bytes.NewReader(dwt.val))
|
return um.UnmarshalCBOR(bytes.NewReader(dwt.val))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) Send(to address.Address, method abi.MethodNum, m vmr.CBORMarshaler, value abi.TokenAmount) (vmr.SendReturn, exitcode.ExitCode) {
|
func (rt *Runtime) Send(to address.Address, method abi.MethodNum, m cbor.Marshaler, value abi.TokenAmount, out cbor.Er) exitcode.ExitCode {
|
||||||
if !rt.allowInternal {
|
if !rt.allowInternal {
|
||||||
rt.Abortf(exitcode.SysErrorIllegalActor, "runtime.Send() is currently disallowed")
|
rt.Abortf(exitcode.SysErrorIllegalActor, "runtime.Send() is currently disallowed")
|
||||||
}
|
}
|
||||||
@ -351,16 +339,20 @@ func (rt *Runtime) Send(to address.Address, method abi.MethodNum, m vmr.CBORMars
|
|||||||
params = buf.Bytes()
|
params = buf.Bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
ret, err := rt.internalSend(rt.Message().Receiver(), to, method, value, params)
|
ret, err := rt.internalSend(rt.Receiver(), to, method, value, params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err.IsFatal() {
|
if err.IsFatal() {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
log.Warnf("vmctx send failed: to: %s, method: %d: ret: %d, err: %s", to, method, ret, err)
|
log.Warnf("vmctx send failed: to: %s, method: %d: ret: %d, err: %s", to, method, ret, err)
|
||||||
return &dumbWrapperType{nil}, err.RetCode()
|
return err.RetCode()
|
||||||
}
|
}
|
||||||
_ = rt.chargeGasSafe(gasOnActorExec)
|
_ = rt.chargeGasSafe(gasOnActorExec)
|
||||||
return &dumbWrapperType{ret}, 0
|
|
||||||
|
if err := out.UnmarshalCBOR(bytes.NewReader(ret)); err != nil {
|
||||||
|
rt.Abortf(exitcode.ErrSerialization, "failed to unmarshal return value: %s", err)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) internalSend(from, to address.Address, method abi.MethodNum, value types.BigInt, params []byte) ([]byte, aerrors.ActorError) {
|
func (rt *Runtime) internalSend(from, to address.Address, method abi.MethodNum, value types.BigInt, params []byte) ([]byte, aerrors.ActorError) {
|
||||||
@ -404,49 +396,41 @@ func (rt *Runtime) internalSend(from, to address.Address, method abi.MethodNum,
|
|||||||
return ret, errSend
|
return ret, errSend
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) State() vmr.StateHandle {
|
func (rt *Runtime) StateCreate(obj cbor.Marshaler) {
|
||||||
return &shimStateHandle{rt: rt}
|
c := rt.StorePut(obj)
|
||||||
}
|
err := rt.stateCommit(EmptyObjectCid, c)
|
||||||
|
|
||||||
type shimStateHandle struct {
|
|
||||||
rt *Runtime
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ssh *shimStateHandle) Create(obj vmr.CBORMarshaler) {
|
|
||||||
c := ssh.rt.Put(obj)
|
|
||||||
err := ssh.rt.stateCommit(EmptyObjectCid, c)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("failed to commit state after creating object: %w", err))
|
panic(fmt.Errorf("failed to commit state after creating object: %w", err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ssh *shimStateHandle) Readonly(obj vmr.CBORUnmarshaler) {
|
func (rt *Runtime) StateReadonly(obj cbor.Unmarshaler) {
|
||||||
act, err := ssh.rt.state.GetActor(ssh.rt.Message().Receiver())
|
act, err := rt.state.GetActor(rt.Receiver())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ssh.rt.Abortf(exitcode.SysErrorIllegalArgument, "failed to get actor for Readonly state: %s", err)
|
rt.Abortf(exitcode.SysErrorIllegalArgument, "failed to get actor for Readonly state: %s", err)
|
||||||
}
|
}
|
||||||
ssh.rt.Get(act.Head, obj)
|
rt.StoreGet(act.Head, obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ssh *shimStateHandle) Transaction(obj vmr.CBORer, f func()) {
|
func (rt *Runtime) StateTransaction(obj cbor.Er, f func()) {
|
||||||
if obj == nil {
|
if obj == nil {
|
||||||
ssh.rt.Abortf(exitcode.SysErrorIllegalActor, "Must not pass nil to Transaction()")
|
rt.Abortf(exitcode.SysErrorIllegalActor, "Must not pass nil to Transaction()")
|
||||||
}
|
}
|
||||||
|
|
||||||
act, err := ssh.rt.state.GetActor(ssh.rt.Message().Receiver())
|
act, err := rt.state.GetActor(rt.Receiver())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ssh.rt.Abortf(exitcode.SysErrorIllegalActor, "failed to get actor for Transaction: %s", err)
|
rt.Abortf(exitcode.SysErrorIllegalActor, "failed to get actor for Transaction: %s", err)
|
||||||
}
|
}
|
||||||
baseState := act.Head
|
baseState := act.Head
|
||||||
ssh.rt.Get(baseState, obj)
|
rt.StoreGet(baseState, obj)
|
||||||
|
|
||||||
ssh.rt.allowInternal = false
|
rt.allowInternal = false
|
||||||
f()
|
f()
|
||||||
ssh.rt.allowInternal = true
|
rt.allowInternal = true
|
||||||
|
|
||||||
c := ssh.rt.Put(obj)
|
c := rt.StorePut(obj)
|
||||||
|
|
||||||
err = ssh.rt.stateCommit(baseState, c)
|
err = rt.stateCommit(baseState, c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("failed to commit state after transaction: %w", err))
|
panic(fmt.Errorf("failed to commit state after transaction: %w", err))
|
||||||
}
|
}
|
||||||
@ -466,7 +450,7 @@ func (rt *Runtime) GetBalance(a address.Address) (types.BigInt, aerrors.ActorErr
|
|||||||
|
|
||||||
func (rt *Runtime) stateCommit(oldh, newh cid.Cid) aerrors.ActorError {
|
func (rt *Runtime) stateCommit(oldh, newh cid.Cid) aerrors.ActorError {
|
||||||
// TODO: we can make this more efficient in the future...
|
// TODO: we can make this more efficient in the future...
|
||||||
act, err := rt.state.GetActor(rt.Message().Receiver())
|
act, err := rt.state.GetActor(rt.Receiver())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return aerrors.Escalate(err, "failed to get actor to commit state")
|
return aerrors.Escalate(err, "failed to get actor to commit state")
|
||||||
}
|
}
|
||||||
@ -477,7 +461,7 @@ func (rt *Runtime) stateCommit(oldh, newh cid.Cid) aerrors.ActorError {
|
|||||||
|
|
||||||
act.Head = newh
|
act.Head = newh
|
||||||
|
|
||||||
if err := rt.state.SetActor(rt.Message().Receiver(), act); err != nil {
|
if err := rt.state.SetActor(rt.Receiver(), act); err != nil {
|
||||||
return aerrors.Fatalf("failed to set actor in commit state: %s", err)
|
return aerrors.Fatalf("failed to set actor in commit state: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,15 +556,15 @@ func (rt *Runtime) abortIfAlreadyValidated() {
|
|||||||
rt.callerValidated = true
|
rt.callerValidated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) Log(level vmr.LogLevel, msg string, args ...interface{}) {
|
func (rt *Runtime) Log(level rtt.LogLevel, msg string, args ...interface{}) {
|
||||||
switch level {
|
switch level {
|
||||||
case vmr.DEBUG:
|
case rtt.DEBUG:
|
||||||
actorLog.Debugf(msg, args...)
|
actorLog.Debugf(msg, args...)
|
||||||
case vmr.INFO:
|
case rtt.INFO:
|
||||||
actorLog.Infof(msg, args...)
|
actorLog.Infof(msg, args...)
|
||||||
case vmr.WARN:
|
case rtt.WARN:
|
||||||
actorLog.Warnf(msg, args...)
|
actorLog.Warnf(msg, args...)
|
||||||
case vmr.ERROR:
|
case rtt.ERROR:
|
||||||
actorLog.Errorf(msg, args...)
|
actorLog.Errorf(msg, args...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,6 @@ func TestRuntimePutErrors(t *testing.T) {
|
|||||||
cst: cbor.NewCborStore(nil),
|
cst: cbor.NewCborStore(nil),
|
||||||
}
|
}
|
||||||
|
|
||||||
rt.Put(&NotAVeryGoodMarshaler{})
|
rt.StorePut(&NotAVeryGoodMarshaler{})
|
||||||
t.Error("expected panic")
|
t.Error("expected panic")
|
||||||
}
|
}
|
||||||
|
@ -116,7 +116,7 @@ func (vm *VM) makeRuntime(ctx context.Context, msg *types.Message, origin addres
|
|||||||
Blocks: &gasChargingBlocks{rt.chargeGasFunc(2), rt.pricelist, vm.cst.Blocks},
|
Blocks: &gasChargingBlocks{rt.chargeGasFunc(2), rt.pricelist, vm.cst.Blocks},
|
||||||
Atlas: vm.cst.Atlas,
|
Atlas: vm.cst.Atlas,
|
||||||
}
|
}
|
||||||
rt.sys = pricedSyscalls{
|
rt.Syscalls = pricedSyscalls{
|
||||||
under: vm.Syscalls(ctx, vm.cstate, rt.cst),
|
under: vm.Syscalls(ctx, vm.cstate, rt.cst),
|
||||||
chargeGas: rt.chargeGasFunc(1),
|
chargeGas: rt.chargeGasFunc(1),
|
||||||
pl: rt.pricelist,
|
pl: rt.pricelist,
|
||||||
@ -128,7 +128,7 @@ func (vm *VM) makeRuntime(ctx context.Context, msg *types.Message, origin addres
|
|||||||
rt.Abortf(exitcode.SysErrInvalidReceiver, "resolve msg.From address failed")
|
rt.Abortf(exitcode.SysErrInvalidReceiver, "resolve msg.From address failed")
|
||||||
}
|
}
|
||||||
vmm.From = resF
|
vmm.From = resF
|
||||||
rt.vmsg = &vmm
|
rt.Message = vmm
|
||||||
|
|
||||||
return rt
|
return rt
|
||||||
}
|
}
|
||||||
@ -700,9 +700,9 @@ func (vm *VM) Invoke(act *types.Actor, rt *Runtime, method abi.MethodNum, params
|
|||||||
defer span.End()
|
defer span.End()
|
||||||
if span.IsRecordingEvents() {
|
if span.IsRecordingEvents() {
|
||||||
span.AddAttributes(
|
span.AddAttributes(
|
||||||
trace.StringAttribute("to", rt.Message().Receiver().String()),
|
trace.StringAttribute("to", rt.Receiver().String()),
|
||||||
trace.Int64Attribute("method", int64(method)),
|
trace.Int64Attribute("method", int64(method)),
|
||||||
trace.StringAttribute("value", rt.Message().ValueReceived().String()),
|
trace.StringAttribute("value", rt.ValueReceived().String()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,18 +100,14 @@ type SendReturn struct {
|
|||||||
// passed parameters.
|
// passed parameters.
|
||||||
func (a Actor) Send(rt runtime.Runtime, args *SendArgs) *SendReturn {
|
func (a Actor) Send(rt runtime.Runtime, args *SendArgs) *SendReturn {
|
||||||
rt.ValidateImmediateCallerAcceptAny()
|
rt.ValidateImmediateCallerAcceptAny()
|
||||||
ret, code := rt.Send(
|
var out runtime.CBORBytes
|
||||||
|
code := rt.Send(
|
||||||
args.To,
|
args.To,
|
||||||
args.Method,
|
args.Method,
|
||||||
runtime.CBORBytes(args.Params),
|
runtime.CBORBytes(args.Params),
|
||||||
args.Value,
|
args.Value,
|
||||||
|
&out,
|
||||||
)
|
)
|
||||||
var out runtime.CBORBytes
|
|
||||||
if ret != nil {
|
|
||||||
if err := ret.Into(&out); err != nil {
|
|
||||||
rt.Abortf(exitcode.ErrIllegalState, "failed to unmarshal send return: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &SendReturn{
|
return &SendReturn{
|
||||||
Return: out,
|
Return: out,
|
||||||
Code: code,
|
Code: code,
|
||||||
@ -217,14 +213,14 @@ func (a Actor) MutateState(rt runtime.Runtime, args *MutateStateArgs) *abi.Empty
|
|||||||
var st State
|
var st State
|
||||||
switch args.Branch {
|
switch args.Branch {
|
||||||
case MutateInTransaction:
|
case MutateInTransaction:
|
||||||
rt.State().Transaction(&st, func() {
|
rt.StateTransaction(&st, func() {
|
||||||
st.Value = args.Value
|
st.Value = args.Value
|
||||||
})
|
})
|
||||||
case MutateReadonly:
|
case MutateReadonly:
|
||||||
rt.State().Readonly(&st)
|
rt.StateReadonly(&st)
|
||||||
st.Value = args.Value
|
st.Value = args.Value
|
||||||
case MutateAfterTransaction:
|
case MutateAfterTransaction:
|
||||||
rt.State().Transaction(&st, func() {
|
rt.StateTransaction(&st, func() {
|
||||||
st.Value = args.Value + "-in"
|
st.Value = args.Value + "-in"
|
||||||
})
|
})
|
||||||
st.Value = args.Value
|
st.Value = args.Value
|
||||||
|
@ -46,7 +46,7 @@ func TestMutateStateInTransaction(t *testing.T) {
|
|||||||
var a Actor
|
var a Actor
|
||||||
|
|
||||||
rt.ExpectValidateCallerAny()
|
rt.ExpectValidateCallerAny()
|
||||||
rt.Create(&State{})
|
rt.StateCreate(&State{})
|
||||||
|
|
||||||
val := "__mutstat test"
|
val := "__mutstat test"
|
||||||
rt.Call(a.MutateState, &MutateStateArgs{
|
rt.Call(a.MutateState, &MutateStateArgs{
|
||||||
@ -72,7 +72,7 @@ func TestMutateStateAfterTransaction(t *testing.T) {
|
|||||||
var a Actor
|
var a Actor
|
||||||
|
|
||||||
rt.ExpectValidateCallerAny()
|
rt.ExpectValidateCallerAny()
|
||||||
rt.Create(&State{})
|
rt.StateCreate(&State{})
|
||||||
|
|
||||||
val := "__mutstat test"
|
val := "__mutstat test"
|
||||||
rt.Call(a.MutateState, &MutateStateArgs{
|
rt.Call(a.MutateState, &MutateStateArgs{
|
||||||
@ -99,7 +99,7 @@ func TestMutateStateReadonly(t *testing.T) {
|
|||||||
var a Actor
|
var a Actor
|
||||||
|
|
||||||
rt.ExpectValidateCallerAny()
|
rt.ExpectValidateCallerAny()
|
||||||
rt.Create(&State{})
|
rt.StateCreate(&State{})
|
||||||
|
|
||||||
val := "__mutstat test"
|
val := "__mutstat test"
|
||||||
rt.Call(a.MutateState, &MutateStateArgs{
|
rt.Call(a.MutateState, &MutateStateArgs{
|
||||||
|
4
go.mod
4
go.mod
@ -32,11 +32,11 @@ require (
|
|||||||
github.com/filecoin-project/go-multistore v0.0.3
|
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.20200701152213-3e0f0afdc261
|
github.com/filecoin-project/go-paramfetch v0.0.2-0.20200701152213-3e0f0afdc261
|
||||||
github.com/filecoin-project/go-state-types v0.0.0-20200909080127-001afaca718c
|
github.com/filecoin-project/go-state-types v0.0.0-20200911004822-964d6c679cfc
|
||||||
github.com/filecoin-project/go-statemachine v0.0.0-20200813232949-df9b130df370
|
github.com/filecoin-project/go-statemachine v0.0.0-20200813232949-df9b130df370
|
||||||
github.com/filecoin-project/go-statestore v0.1.0
|
github.com/filecoin-project/go-statestore v0.1.0
|
||||||
github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b
|
github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b
|
||||||
github.com/filecoin-project/specs-actors v0.9.8
|
github.com/filecoin-project/specs-actors v0.9.9
|
||||||
github.com/filecoin-project/specs-storage v0.1.1-0.20200907031224-ed2e5cd13796
|
github.com/filecoin-project/specs-storage v0.1.1-0.20200907031224-ed2e5cd13796
|
||||||
github.com/filecoin-project/test-vectors/schema v0.0.1
|
github.com/filecoin-project/test-vectors/schema v0.0.1
|
||||||
github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1
|
github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1
|
||||||
|
8
go.sum
8
go.sum
@ -241,8 +241,8 @@ github.com/filecoin-project/go-paramfetch v0.0.2-0.20200701152213-3e0f0afdc261/g
|
|||||||
github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I=
|
github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I=
|
||||||
github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I=
|
github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I=
|
||||||
github.com/filecoin-project/go-state-types v0.0.0-20200905071437-95828685f9df/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I=
|
github.com/filecoin-project/go-state-types v0.0.0-20200905071437-95828685f9df/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I=
|
||||||
github.com/filecoin-project/go-state-types v0.0.0-20200909080127-001afaca718c h1:HHRMFpU8OrODDUja5NmGWNBAVGoSy4MRjxgZa+a0qIw=
|
github.com/filecoin-project/go-state-types v0.0.0-20200911004822-964d6c679cfc h1:1vr/LoqGq5m5g37Q3sNSAjfwF1uJY0zmiHcvnxY6hik=
|
||||||
github.com/filecoin-project/go-state-types v0.0.0-20200909080127-001afaca718c/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I=
|
github.com/filecoin-project/go-state-types v0.0.0-20200911004822-964d6c679cfc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g=
|
||||||
github.com/filecoin-project/go-statemachine v0.0.0-20200714194326-a77c3ae20989/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig=
|
github.com/filecoin-project/go-statemachine v0.0.0-20200714194326-a77c3ae20989/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig=
|
||||||
github.com/filecoin-project/go-statemachine v0.0.0-20200813232949-df9b130df370 h1:Jbburj7Ih2iaJ/o5Q9A+EAeTabME6YII7FLi9SKUf5c=
|
github.com/filecoin-project/go-statemachine v0.0.0-20200813232949-df9b130df370 h1:Jbburj7Ih2iaJ/o5Q9A+EAeTabME6YII7FLi9SKUf5c=
|
||||||
github.com/filecoin-project/go-statemachine v0.0.0-20200813232949-df9b130df370/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig=
|
github.com/filecoin-project/go-statemachine v0.0.0-20200813232949-df9b130df370/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig=
|
||||||
@ -252,8 +252,8 @@ github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b
|
|||||||
github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8=
|
github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8=
|
||||||
github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4=
|
github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4=
|
||||||
github.com/filecoin-project/specs-actors v0.9.7/go.mod h1:wM2z+kwqYgXn5Z7scV1YHLyd1Q1cy0R8HfTIWQ0BFGU=
|
github.com/filecoin-project/specs-actors v0.9.7/go.mod h1:wM2z+kwqYgXn5Z7scV1YHLyd1Q1cy0R8HfTIWQ0BFGU=
|
||||||
github.com/filecoin-project/specs-actors v0.9.8 h1:45fnx/BsseFL3CtvSoR6CszFY26TFtsh9AHwCW2vkg8=
|
github.com/filecoin-project/specs-actors v0.9.9 h1:hc1iCks6dv7mpGQXcbYU3hL1WfBRZaVTYE4x2d1l2yw=
|
||||||
github.com/filecoin-project/specs-actors v0.9.8/go.mod h1:xFObDoWPySBNTNBrGXVVrutmgSZH/mMo46Q1bec/0hw=
|
github.com/filecoin-project/specs-actors v0.9.9/go.mod h1:czlvLQGEX0fjLLfdNHD7xLymy6L3n7aQzRWzsYGf+ys=
|
||||||
github.com/filecoin-project/specs-storage v0.1.1-0.20200907031224-ed2e5cd13796 h1:dJsTPWpG2pcTeojO2pyn0c6l+x/3MZYCBgo/9d11JEk=
|
github.com/filecoin-project/specs-storage v0.1.1-0.20200907031224-ed2e5cd13796 h1:dJsTPWpG2pcTeojO2pyn0c6l+x/3MZYCBgo/9d11JEk=
|
||||||
github.com/filecoin-project/specs-storage v0.1.1-0.20200907031224-ed2e5cd13796/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g=
|
github.com/filecoin-project/specs-storage v0.1.1-0.20200907031224-ed2e5cd13796/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g=
|
||||||
github.com/filecoin-project/test-vectors/schema v0.0.1 h1:5fNF76nl4qolEvcIsjc0kUADlTMVHO73tW4kXXPnsus=
|
github.com/filecoin-project/test-vectors/schema v0.0.1 h1:5fNF76nl4qolEvcIsjc0kUADlTMVHO73tW4kXXPnsus=
|
||||||
|
Loading…
Reference in New Issue
Block a user