vm: implement NewActorAddress

This commit is contained in:
Łukasz Magiera 2020-02-17 08:59:53 +01:00
parent b6354dfb74
commit 9f7bd983b3
3 changed files with 51 additions and 5 deletions

View File

@ -48,6 +48,26 @@ func Newf(retCode uint8, format string, args ...interface{}) ActorError {
} }
} }
// todo: bit hacky
func NewfSkip(skip int, retCode uint8, format string, args ...interface{}) ActorError {
if retCode == 0 {
return &actorError{
fatal: true,
retCode: 0,
msg: "tried creating an error and setting RetCode to 0",
frame: xerrors.Caller(skip),
err: fmt.Errorf(format, args...),
}
}
return &actorError{
retCode: retCode,
msg: fmt.Sprintf(format, args...),
frame: xerrors.Caller(skip),
}
}
func Fatal(message string, args ...interface{}) ActorError { func Fatal(message string, args ...interface{}) ActorError {
return &actorError{ return &actorError{
fatal: true, fatal: true,

View File

@ -2,7 +2,6 @@ package genesis
import ( import (
"context" "context"
"fmt"
"github.com/filecoin-project/go-address" "github.com/filecoin-project/go-address"
"github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/specs-actors/actors/abi"
@ -47,7 +46,7 @@ func doExecValue(ctx context.Context, vm *vm.VM, to, from address.Address, value
} }
if ret.ExitCode != 0 { if ret.ExitCode != 0 {
return nil, fmt.Errorf("failed to call method: %s", ret.ActorErr) return nil, xerrors.Errorf("failed to call method: %w", ret.ActorErr)
} }
return ret.Return, nil return ret.Return, nil

View File

@ -3,6 +3,7 @@ package vm
import ( import (
"bytes" "bytes"
"context" "context"
"encoding/binary"
"fmt" "fmt"
"runtime/debug" "runtime/debug"
@ -110,7 +111,33 @@ func (rs *runtimeShim) Store() vmr.Store {
} }
func (rs *runtimeShim) NewActorAddress() address.Address { func (rs *runtimeShim) NewActorAddress() address.Address {
panic("implement me") var b bytes.Buffer
if err := rs.ImmediateCaller().MarshalCBOR(&b); err != nil { // todo: spec says cbor; why not just bytes?
rs.Abortf(exitcode.ErrSerialization, "writing caller address into a buffer: %v", err)
}
var err error
st, err := rs.vmctx.StateTree()
if err != nil {
rs.Abortf(exitcode.SysErrInternal, "getting statetree: %v", err)
}
act, err := st.GetActor(rs.vmctx.Origin())
if err != nil {
rs.Abortf(exitcode.SysErrInternal, "getting top level actor: %v", err)
}
if err := binary.Write(&b, binary.BigEndian, act.Nonce); err != nil {
rs.Abortf(exitcode.ErrSerialization, "writing nonce address into a buffer: %v", err)
}
if err := binary.Write(&b, binary.BigEndian, uint64(0)); err != nil { // TODO: expose on vm
rs.Abortf(exitcode.ErrSerialization, "writing callSeqNum address into a buffer: %v", err)
}
addr, err := address.NewActorAddress(b.Bytes())
if err != nil {
rs.Abortf(exitcode.ErrSerialization, "create actor address: %v", err)
}
return addr
} }
func (rs *runtimeShim) CreateActor(codeId cid.Cid, address address.Address) { func (rs *runtimeShim) CreateActor(codeId cid.Cid, address address.Address) {
@ -148,11 +175,11 @@ func (rs *runtimeShim) Context() context.Context {
} }
func (rs *runtimeShim) Abortf(code exitcode.ExitCode, msg string, args ...interface{}) { func (rs *runtimeShim) Abortf(code exitcode.ExitCode, msg string, args ...interface{}) {
panic(aerrors.Newf(uint8(code), msg, args...)) panic(aerrors.NewfSkip(2, uint8(code), msg, args...))
} }
func (rs *runtimeShim) AbortStateMsg(msg string) { func (rs *runtimeShim) AbortStateMsg(msg string) {
rs.Abortf(101, msg) panic(aerrors.NewfSkip(3, 101, msg))
} }
func (rs *runtimeShim) ValidateImmediateCallerType(...cid.Cid) { func (rs *runtimeShim) ValidateImmediateCallerType(...cid.Cid) {