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 {
return &actorError{
fatal: true,

View File

@ -2,7 +2,6 @@ package genesis
import (
"context"
"fmt"
"github.com/filecoin-project/go-address"
"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 {
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

View File

@ -3,6 +3,7 @@ package vm
import (
"bytes"
"context"
"encoding/binary"
"fmt"
"runtime/debug"
@ -110,7 +111,33 @@ func (rs *runtimeShim) Store() vmr.Store {
}
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) {
@ -148,11 +175,11 @@ func (rs *runtimeShim) Context() context.Context {
}
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) {
rs.Abortf(101, msg)
panic(aerrors.NewfSkip(3, 101, msg))
}
func (rs *runtimeShim) ValidateImmediateCallerType(...cid.Cid) {