65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
|
package validation
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
vchain "github.com/filecoin-project/chain-validation/pkg/chain"
|
||
|
vstate "github.com/filecoin-project/chain-validation/pkg/state"
|
||
|
|
||
|
"github.com/filecoin-project/lotus/chain/address"
|
||
|
"github.com/filecoin-project/lotus/chain/types"
|
||
|
"github.com/filecoin-project/lotus/chain/vm"
|
||
|
)
|
||
|
|
||
|
// Applier applies messages to state trees and storage.
|
||
|
type Applier struct {
|
||
|
}
|
||
|
|
||
|
var _ vchain.Applier = &Applier{}
|
||
|
|
||
|
func NewApplier() *Applier {
|
||
|
return &Applier{}
|
||
|
}
|
||
|
|
||
|
func (a *Applier) ApplyMessage(eCtx *vchain.ExecutionContext, state vstate.Wrapper, message interface{}) (vchain.MessageReceipt, error) {
|
||
|
ctx := context.TODO()
|
||
|
st := state.(*StateWrapper)
|
||
|
|
||
|
base := st.Cid()
|
||
|
randSrc := &vmRand{eCtx}
|
||
|
minerAddr, err := address.NewFromBytes([]byte(eCtx.MinerOwner))
|
||
|
if err != nil {
|
||
|
return vchain.MessageReceipt{}, err
|
||
|
}
|
||
|
lotusVM, err := vm.NewVM(base, eCtx.Epoch, randSrc, minerAddr, st.bs)
|
||
|
if err != nil {
|
||
|
return vchain.MessageReceipt{}, err
|
||
|
}
|
||
|
|
||
|
ret, err := lotusVM.ApplyMessage(ctx, message.(*types.Message))
|
||
|
if err != nil {
|
||
|
return vchain.MessageReceipt{}, err
|
||
|
}
|
||
|
|
||
|
st.stateRoot, err = lotusVM.Flush(ctx)
|
||
|
if err != nil {
|
||
|
return vchain.MessageReceipt{}, err
|
||
|
}
|
||
|
|
||
|
mr := vchain.MessageReceipt{
|
||
|
ExitCode: ret.ExitCode,
|
||
|
ReturnValue: ret.Return,
|
||
|
GasUsed: vstate.GasUnit(ret.GasUsed.Uint64()),
|
||
|
}
|
||
|
|
||
|
return mr, nil
|
||
|
}
|
||
|
|
||
|
type vmRand struct {
|
||
|
eCtx *vchain.ExecutionContext
|
||
|
}
|
||
|
|
||
|
func (*vmRand) GetRandomness(ctx context.Context, h int64) ([]byte, error) {
|
||
|
panic("implement me")
|
||
|
}
|