migrate actor creation suite. (#239)
This commit is contained in:
parent
ad17dc227c
commit
6954e6cb0e
@ -53,14 +53,17 @@ jobs:
|
||||
name: "build tvx"
|
||||
command: pushd tvx && go build .
|
||||
- run:
|
||||
name: "run messages test vector suite (new api) - msg_application"
|
||||
name: "run messages test vector suite: msg_application"
|
||||
command: pushd tvx/scripts/msg_application && go build . && ./msg_application | ../../tvx exec-lotus
|
||||
- run:
|
||||
name: "run messages test vector suite (new api) - nested send"
|
||||
name: "run messages test vector suite: nested send"
|
||||
command: pushd tvx/scripts/nested && go build . && ./nested | ../../tvx exec-lotus
|
||||
- run:
|
||||
name: "run messages test vector suite (new api) - paych"
|
||||
name: "run messages test vector suite: paych"
|
||||
command: pushd tvx/scripts/paych && go build . && ./paych | ../../tvx exec-lotus
|
||||
- run:
|
||||
name: "run messages test vector suite: actor_creation"
|
||||
command: pushd tvx/scripts/actor_creation && go build . && ./actor_creation | ../../tvx exec-lotus
|
||||
soup-build-linux:
|
||||
executor: linux
|
||||
steps:
|
||||
|
@ -1,156 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"github.com/hashicorp/go-multierror"
|
||||
"github.com/urfave/cli/v2"
|
||||
|
||||
"github.com/filecoin-project/go-address"
|
||||
|
||||
abi_spec "github.com/filecoin-project/specs-actors/actors/abi"
|
||||
big_spec "github.com/filecoin-project/specs-actors/actors/abi/big"
|
||||
exitcode_spec "github.com/filecoin-project/specs-actors/actors/runtime/exitcode"
|
||||
|
||||
"github.com/filecoin-project/oni/tvx/chain"
|
||||
"github.com/filecoin-project/oni/tvx/drivers"
|
||||
)
|
||||
|
||||
var suiteMessagesCmd = &cli.Command{
|
||||
Name: "suite-messages",
|
||||
Description: "generate test vectors from the messages test suite adapted from github.com/filecoin-project/chain-validation",
|
||||
Action: suiteMessages,
|
||||
}
|
||||
|
||||
func suiteMessages(c *cli.Context) error {
|
||||
var err *multierror.Error
|
||||
err = multierror.Append(MessageTest_AccountActorCreation())
|
||||
err = multierror.Append(MessageTest_InitActorSequentialIDAddressCreate())
|
||||
err = multierror.Append(MessageTest_MultiSigActor())
|
||||
err = multierror.Append(MessageTest_ValueTransferSimple())
|
||||
err = multierror.Append(MessageTest_ValueTransferAdvance())
|
||||
return err.ErrorOrNil()
|
||||
}
|
||||
|
||||
func MessageTest_AccountActorCreation() error {
|
||||
testCases := []struct {
|
||||
desc string
|
||||
|
||||
existingActorType address.Protocol
|
||||
existingActorBal abi_spec.TokenAmount
|
||||
|
||||
newActorAddr address.Address
|
||||
newActorInitBal abi_spec.TokenAmount
|
||||
|
||||
expExitCode exitcode_spec.ExitCode
|
||||
}{
|
||||
{
|
||||
"success create SECP256K1 account actor",
|
||||
address.SECP256K1,
|
||||
abi_spec.NewTokenAmount(10_000_000_000),
|
||||
|
||||
chain.MustNewSECP256K1Addr("publickeyfoo"),
|
||||
abi_spec.NewTokenAmount(10_000),
|
||||
|
||||
exitcode_spec.Ok,
|
||||
},
|
||||
{
|
||||
"success create BLS account actor",
|
||||
address.SECP256K1,
|
||||
abi_spec.NewTokenAmount(10_000_000_000),
|
||||
|
||||
chain.MustNewBLSAddr(1),
|
||||
abi_spec.NewTokenAmount(10_000),
|
||||
|
||||
exitcode_spec.Ok,
|
||||
},
|
||||
{
|
||||
"fail create SECP256K1 account actor insufficient balance",
|
||||
address.SECP256K1,
|
||||
abi_spec.NewTokenAmount(9_999),
|
||||
|
||||
chain.MustNewSECP256K1Addr("publickeybar"),
|
||||
abi_spec.NewTokenAmount(10_000),
|
||||
|
||||
exitcode_spec.SysErrSenderStateInvalid,
|
||||
},
|
||||
{
|
||||
"fail create BLS account actor insufficient balance",
|
||||
address.SECP256K1,
|
||||
abi_spec.NewTokenAmount(9_999),
|
||||
|
||||
chain.MustNewBLSAddr(1),
|
||||
abi_spec.NewTokenAmount(10_000),
|
||||
|
||||
exitcode_spec.SysErrSenderStateInvalid,
|
||||
},
|
||||
// TODO add edge case tests that have insufficient balance after gas fees
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
err := func() error {
|
||||
td := drivers.NewTestDriver()
|
||||
td.Vector.Meta.Desc = tc.desc
|
||||
|
||||
existingAccountAddr, _ := td.NewAccountActor(tc.existingActorType, tc.existingActorBal)
|
||||
|
||||
td.UpdatePreStateRoot()
|
||||
|
||||
msg := td.MessageProducer.Transfer(existingAccountAddr, tc.newActorAddr, chain.Value(tc.newActorInitBal), chain.Nonce(0))
|
||||
result := td.ApplyFailure(
|
||||
msg,
|
||||
tc.expExitCode,
|
||||
)
|
||||
|
||||
// new actor balance will only exist if message was applied successfully.
|
||||
if tc.expExitCode.IsSuccess() {
|
||||
td.AssertBalance(tc.newActorAddr, tc.newActorInitBal)
|
||||
td.AssertBalance(existingAccountAddr, big_spec.Sub(big_spec.Sub(tc.existingActorBal, result.Receipt.GasUsed.Big()), tc.newActorInitBal))
|
||||
}
|
||||
|
||||
td.MustSerialize(os.Stdout)
|
||||
|
||||
return nil
|
||||
}()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func MessageTest_InitActorSequentialIDAddressCreate() error {
|
||||
td := drivers.NewTestDriver()
|
||||
|
||||
var initialBal = abi_spec.NewTokenAmount(200_000_000_000)
|
||||
var toSend = abi_spec.NewTokenAmount(10_000)
|
||||
|
||||
sender, _ := td.NewAccountActor(drivers.SECP, initialBal)
|
||||
|
||||
receiver, receiverID := td.NewAccountActor(drivers.SECP, initialBal)
|
||||
|
||||
firstPaychAddr := chain.MustNewIDAddr(chain.MustIDFromAddress(receiverID) + 1)
|
||||
secondPaychAddr := chain.MustNewIDAddr(chain.MustIDFromAddress(receiverID) + 2)
|
||||
|
||||
firstInitRet := td.ComputeInitActorExecReturn(sender, 0, 0, firstPaychAddr)
|
||||
secondInitRet := td.ComputeInitActorExecReturn(sender, 1, 0, secondPaychAddr)
|
||||
|
||||
td.UpdatePreStateRoot()
|
||||
|
||||
msg1 := td.MessageProducer.CreatePaymentChannelActor(sender, receiver, chain.Value(toSend), chain.Nonce(0))
|
||||
td.ApplyExpect(
|
||||
msg1,
|
||||
chain.MustSerialize(&firstInitRet),
|
||||
)
|
||||
|
||||
msg2 := td.MessageProducer.CreatePaymentChannelActor(sender, receiver, chain.Value(toSend), chain.Nonce(1))
|
||||
td.ApplyExpect(
|
||||
msg2,
|
||||
chain.MustSerialize(&secondInitRet),
|
||||
)
|
||||
|
||||
td.MustSerialize(os.Stdout)
|
||||
|
||||
return nil
|
||||
}
|
@ -137,5 +137,7 @@ func (a *Asserter) FailNow() {
|
||||
}
|
||||
|
||||
func (a *Asserter) Errorf(format string, args ...interface{}) {
|
||||
fmt.Printf("%s: "+format, append([]interface{}{a.stage}, args...))
|
||||
id := a.b.vector.Meta.ID
|
||||
stage := a.stage
|
||||
fmt.Printf("❌ id: %s, stage: %s:"+format, append([]interface{}{id, stage}, args...)...)
|
||||
}
|
||||
|
@ -15,8 +15,11 @@ const (
|
||||
// CalculateDeduction returns the balance that shall be deducted from the
|
||||
// sender's account as a result of applying this message.
|
||||
func CalculateDeduction(am *ApplicableMessage) big.Int {
|
||||
m := am.Message
|
||||
if am.Result.GasUsed == 0 {
|
||||
return big.Zero()
|
||||
}
|
||||
|
||||
m := am.Message
|
||||
minerReward := GetMinerReward(m.GasLimit, m.GasPremium) // goes to the miner
|
||||
burn := CalculateBurn(m.GasLimit, am.Result.GasUsed) // vanishes
|
||||
deducted := big.Add(minerReward, burn) // sum of gas accrued
|
||||
|
@ -3,28 +3,23 @@ module github.com/filecoin-project/oni/tvx
|
||||
go 1.14
|
||||
|
||||
require (
|
||||
github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200716204036-cddc56607e1d
|
||||
github.com/filecoin-project/go-address v0.0.3
|
||||
github.com/filecoin-project/go-bitfield v0.2.0
|
||||
github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03
|
||||
github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f
|
||||
github.com/filecoin-project/lotus v0.4.3-0.20200814191300-4a0171d26aa5
|
||||
github.com/filecoin-project/sector-storage v0.0.0-20200810171746-eac70842d8e0
|
||||
github.com/filecoin-project/specs-actors v0.9.2
|
||||
github.com/hashicorp/go-multierror v1.1.0
|
||||
github.com/ipfs/go-block-format v0.0.2
|
||||
github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834
|
||||
github.com/ipfs/go-cid v0.0.7
|
||||
github.com/ipfs/go-datastore v0.4.4
|
||||
github.com/ipfs/go-hamt-ipld v0.1.1
|
||||
github.com/ipfs/go-ipfs-blockstore v1.0.1
|
||||
github.com/ipfs/go-ipfs-exchange-interface v0.0.1
|
||||
github.com/ipfs/go-ipfs-exchange-offline v0.0.1
|
||||
github.com/ipfs/go-ipld-cbor v0.0.5-0.20200428170625-a0bd04d3cbdf
|
||||
github.com/ipfs/go-ipld-format v0.2.0
|
||||
github.com/ipfs/go-merkledag v0.3.2
|
||||
github.com/ipld/go-car v0.1.1-0.20200526133713-1c7508d55aae
|
||||
github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52
|
||||
github.com/libp2p/go-libp2p-core v0.6.1
|
||||
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1
|
||||
github.com/multiformats/go-multiaddr v0.2.2
|
||||
|
43
tvx/scripts/actor_creation/addresses.go
Normal file
43
tvx/scripts/actor_creation/addresses.go
Normal file
@ -0,0 +1,43 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
. "github.com/filecoin-project/oni/tvx/builders"
|
||||
|
||||
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
||||
init_ "github.com/filecoin-project/specs-actors/actors/builtin/init"
|
||||
|
||||
"github.com/filecoin-project/go-address"
|
||||
)
|
||||
|
||||
func sequentialAddresses(v *Builder) {
|
||||
v.Messages.SetDefaults(GasLimit(1_000_000_000), GasPremium(1), GasFeeCap(200))
|
||||
|
||||
initial := big.NewInt(1_000_000_000_000_000)
|
||||
|
||||
// Set up sender and receiver accounts.
|
||||
var sender, receiver AddressHandle
|
||||
v.Actors.AccountN(address.SECP256K1, initial, &sender, &receiver)
|
||||
v.CommitPreconditions()
|
||||
|
||||
// Create 10 payment channels.
|
||||
for i := uint64(0); i < 10; i++ {
|
||||
v.Messages.Sugar().CreatePaychActor(sender.Robust, receiver.Robust, Value(big.NewInt(1000)), Nonce(i))
|
||||
}
|
||||
v.CommitApplies()
|
||||
|
||||
for i, am := range v.Messages.All() {
|
||||
expectedActorAddr := AddressHandle{
|
||||
ID: MustNewIDAddr(MustIDFromAddress(receiver.ID) + uint64(i) + 1),
|
||||
Robust: sender.NextActorAddress(am.Message.Nonce, 0),
|
||||
}
|
||||
|
||||
// Verify that the return contains the expected addresses.
|
||||
var ret init_.ExecReturn
|
||||
MustDeserialize(am.Result.Return, &ret)
|
||||
v.Assert.Equal(expectedActorAddr.Robust, ret.RobustAddress)
|
||||
v.Assert.Equal(expectedActorAddr.ID, ret.IDAddress)
|
||||
}
|
||||
|
||||
v.Assert.EveryMessageSenderSatisfies(BalanceUpdated(big.Zero()))
|
||||
v.Assert.EveryMessageSenderSatisfies(NonceUpdated())
|
||||
}
|
82
tvx/scripts/actor_creation/main.go
Normal file
82
tvx/scripts/actor_creation/main.go
Normal file
@ -0,0 +1,82 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/filecoin-project/go-address"
|
||||
"github.com/filecoin-project/specs-actors/actors/abi"
|
||||
"github.com/filecoin-project/specs-actors/actors/runtime/exitcode"
|
||||
|
||||
. "github.com/filecoin-project/oni/tvx/builders"
|
||||
"github.com/filecoin-project/oni/tvx/schema"
|
||||
)
|
||||
|
||||
func main() {
|
||||
g := NewGenerator()
|
||||
|
||||
g.MessageVectorGroup("addresses",
|
||||
&MessageVectorGenItem{
|
||||
Metadata: &schema.Metadata{
|
||||
ID: "sequential-10",
|
||||
Version: "v1",
|
||||
Desc: "actor addresses are sequential",
|
||||
},
|
||||
Func: sequentialAddresses,
|
||||
},
|
||||
)
|
||||
|
||||
g.MessageVectorGroup("on_transfer",
|
||||
&MessageVectorGenItem{
|
||||
Metadata: &schema.Metadata{
|
||||
ID: "ok-create-secp256k1",
|
||||
Version: "v1",
|
||||
},
|
||||
Func: actorCreationOnTransfer(actorCreationOnTransferParams{
|
||||
senderType: address.SECP256K1,
|
||||
senderBal: abi.NewTokenAmount(1_000_000_000_000_000),
|
||||
receiverAddr: MustNewSECP256K1Addr("publickeyfoo"),
|
||||
amount: abi.NewTokenAmount(10_000),
|
||||
exitCode: exitcode.Ok,
|
||||
}),
|
||||
},
|
||||
&MessageVectorGenItem{
|
||||
Metadata: &schema.Metadata{
|
||||
ID: "ok-create-bls",
|
||||
Version: "v1",
|
||||
},
|
||||
Func: actorCreationOnTransfer(actorCreationOnTransferParams{
|
||||
senderType: address.SECP256K1,
|
||||
senderBal: abi.NewTokenAmount(1_000_000_000_000_000),
|
||||
receiverAddr: MustNewBLSAddr(1),
|
||||
amount: abi.NewTokenAmount(10_000),
|
||||
exitCode: exitcode.Ok,
|
||||
}),
|
||||
},
|
||||
&MessageVectorGenItem{
|
||||
Metadata: &schema.Metadata{
|
||||
ID: "fail-secp256k1-insufficient-balance",
|
||||
Version: "v1",
|
||||
},
|
||||
Func: actorCreationOnTransfer(actorCreationOnTransferParams{
|
||||
senderType: address.SECP256K1,
|
||||
senderBal: abi.NewTokenAmount(9_999),
|
||||
receiverAddr: MustNewSECP256K1Addr("publickeyfoo"),
|
||||
amount: abi.NewTokenAmount(10_000),
|
||||
exitCode: exitcode.SysErrSenderStateInvalid,
|
||||
}),
|
||||
},
|
||||
&MessageVectorGenItem{
|
||||
Metadata: &schema.Metadata{
|
||||
ID: "fail-bls-insufficient-balance",
|
||||
Version: "v1",
|
||||
},
|
||||
Func: actorCreationOnTransfer(actorCreationOnTransferParams{
|
||||
senderType: address.SECP256K1,
|
||||
senderBal: abi.NewTokenAmount(9_999),
|
||||
receiverAddr: MustNewBLSAddr(1),
|
||||
amount: abi.NewTokenAmount(10_000),
|
||||
exitCode: exitcode.SysErrSenderStateInvalid,
|
||||
}),
|
||||
},
|
||||
)
|
||||
|
||||
g.Wait()
|
||||
}
|
41
tvx/scripts/actor_creation/on_tranfer.go
Normal file
41
tvx/scripts/actor_creation/on_tranfer.go
Normal file
@ -0,0 +1,41 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/filecoin-project/specs-actors/actors/abi"
|
||||
"github.com/filecoin-project/specs-actors/actors/runtime/exitcode"
|
||||
|
||||
"github.com/filecoin-project/go-address"
|
||||
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
||||
|
||||
. "github.com/filecoin-project/oni/tvx/builders"
|
||||
)
|
||||
|
||||
type actorCreationOnTransferParams struct {
|
||||
senderType address.Protocol
|
||||
senderBal abi.TokenAmount
|
||||
receiverAddr address.Address
|
||||
amount abi.TokenAmount
|
||||
exitCode exitcode.ExitCode
|
||||
}
|
||||
|
||||
func actorCreationOnTransfer(params actorCreationOnTransferParams) func(v *Builder) {
|
||||
return func(v *Builder) {
|
||||
v.Messages.SetDefaults(GasLimit(1_000_000_000), GasPremium(1), GasFeeCap(200))
|
||||
|
||||
// Set up sender account.
|
||||
sender := v.Actors.Account(params.senderType, params.senderBal)
|
||||
v.CommitPreconditions()
|
||||
|
||||
// Perform the transfer.
|
||||
v.Messages.Sugar().Transfer(sender.ID, params.receiverAddr, Value(params.amount), Nonce(0))
|
||||
v.CommitApplies()
|
||||
|
||||
v.Assert.EveryMessageResultSatisfies(ExitCode(params.exitCode))
|
||||
v.Assert.EveryMessageSenderSatisfies(BalanceUpdated(big.Zero()))
|
||||
|
||||
if params.exitCode.IsSuccess() {
|
||||
v.Assert.EveryMessageSenderSatisfies(NonceUpdated())
|
||||
v.Assert.BalanceEq(params.receiverAddr, params.amount)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user