Skip to content

Commit d70ec9e

Browse files
authored
Feat/ref dvm update 更新fvm接口到最新的官方接口 (#86)
* update dependency to latest version
1 parent d420adc commit d70ec9e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1330
-873
lines changed

Cargo.lock

+715-726
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/actor.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ func GetActorCodeCid(ctx context.Context, addr address.Address) (*cid.Cid, error
2323
return sys.GetActorCodeCid(ctx, addr)
2424
}
2525

26+
// LookupAddress look up the address at an actor ID. Returns `None` if the actor cannot be found.
27+
func LookupAddress(ctx context.Context, actorID abi.ActorID) (address.Address, error) {
28+
return sys.LookupAddress(ctx, actorID)
29+
}
30+
2631
// NewActorAddress generates a new actor address for an actor deployed
2732
// by the calling actor.
2833
func NewActorAddress(ctx context.Context) (address.Address, error) {
@@ -32,8 +37,8 @@ func NewActorAddress(ctx context.Context) (address.Address, error) {
3237
// CreateActor Creates a new actor of the specified type in the state tree, under
3338
// the provided address.
3439
// TODO this syscall will change to calculate the address internally.
35-
func CreateActor(ctx context.Context, actorID abi.ActorID, codeCid cid.Cid) error {
36-
return sys.CreateActor(ctx, actorID, codeCid)
40+
func CreateActor(ctx context.Context, actorID abi.ActorID, codeCid cid.Cid, addr address.Address) error {
41+
return sys.CreateActor(ctx, actorID, codeCid, addr)
3742
}
3843

3944
// ResolveBuiltinActorType determines whether the supplied CodeCID belongs to a built-in actor type,
@@ -47,3 +52,8 @@ func ResolveBuiltinActorType(ctx context.Context, codeCid cid.Cid) (types.ActorT
4752
func GetCodeCidForType(ctx context.Context, actorT types.ActorType) (cid.Cid, error) {
4853
return sys.GetCodeCidForType(ctx, actorT)
4954
}
55+
56+
// BalanceOf Returns balanece of account
57+
func BalanceOf(ctx context.Context, actorID abi.ActorID) (*abi.TokenAmount, error) {
58+
return sys.BalanceOf(ctx, actorID)
59+
}

sdk/cases/abort.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func Invoke(_ uint32) uint32 { //nolint
2020
case 1:
2121
sdk.Abort(ctx, ferrors.USR_ILLEGAL_ARGUMENT, "test_abort USR_ILLEGAL_ARGUMENT")
2222
case 2:
23-
sdk.Abort(ctx, ferrors.SYS_SENDER_STATE_INVALID, "test_abort SYS_SENDER_STATE_INVALID")
23+
sdk.Abort(ctx, ferrors.USR_NOT_FOUND, "test_abort SYS_SENDER_STATE_INVALID")
2424
}
2525
return 0
2626
}

sdk/cases/actor.go

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"errors"
6+
7+
"github.com/filecoin-project/go-address"
8+
"github.com/filecoin-project/go-state-types/abi"
9+
"github.com/ipfs-force-community/go-fvm-sdk/sdk"
10+
"github.com/ipfs-force-community/go-fvm-sdk/sdk/ferrors"
11+
"github.com/ipfs-force-community/go-fvm-sdk/sdk/testing"
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func main() {} //nolint
16+
17+
//go:export invoke
18+
func Invoke(_ uint32) uint32 { //nolint
19+
t := testing.NewTestingT()
20+
defer t.CheckResult()
21+
ctx := context.Background()
22+
methodNum, err := sdk.MethodNumber(ctx)
23+
if err != nil {
24+
sdk.Abort(ctx, ferrors.USR_ILLEGAL_STATE, "unable to get method number")
25+
}
26+
addr, err := address.NewFromString("f1dwyrbh74hr5nwqv2gjedjyvgphxxkffxug4rkkq")
27+
assert.Nil(t, err)
28+
actorID, err := sdk.ResolveAddress(ctx, addr)
29+
assert.Nil(t, err)
30+
switch methodNum {
31+
case 1:
32+
addr_, err := sdk.LookupAddress(ctx, actorID)
33+
assert.Nil(t, err)
34+
assert.Equal(t, "t1dwyrbh74hr5nwqv2gjedjyvgphxxkffxug4rkkq", addr_.String())
35+
balance, err := sdk.BalanceOf(ctx, actorID)
36+
assert.Nil(t, err)
37+
assert.Equal(t, "10000000000000000000000", balance.String())
38+
case 2:
39+
_, err := sdk.LookupAddress(ctx, abi.ActorID(9999999))
40+
assert.True(t, errors.Is(err, ferrors.NotFound))
41+
42+
}
43+
return 0
44+
}

sdk/cases/gas.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func Invoke(_ uint32) uint32 { //nolint
1717
ctx := context.Background()
1818
err := sdk.Charge(ctx, "OnChainMessage", 38863)
1919
assert.Nil(t, err, "charge gas %v", err)
20-
20+
_, err = sdk.AvailableGas(ctx)
21+
assert.Nil(t, err, "charge gas %v", err)
2122
return 0
2223
}

sdk/cases/message.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ func Invoke(_ uint32) uint32 { //nolint
2929

3030
valueRecieved, err := sdk.ValueReceived(ctx)
3131
assert.Nil(t, err)
32-
assert.Equal(t, "10", valueRecieved.String())
32+
assert.Equal(t, "10000000000000000000", valueRecieved.String())
3333
return 0
3434
}

sdk/cases/network.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func Invoke(_ uint32) uint32 { //nolint
2222

2323
ver, err := sdk.Version(ctx)
2424
assert.Nil(t, err)
25-
assert.Equal(t, 15, int(ver))
25+
assert.Equal(t, 18, int(ver))
2626

2727
fee, err := sdk.BaseFee(ctx)
2828
assert.Nil(t, err)

sdk/cases/send.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package main
33
import (
44
"context"
55

6-
"github.com/filecoin-project/go-state-types/abi"
7-
86
"github.com/filecoin-project/go-address"
7+
"github.com/filecoin-project/go-state-types/abi"
8+
"github.com/filecoin-project/go-state-types/big"
99
"github.com/ipfs-force-community/go-fvm-sdk/sdk"
1010
"github.com/ipfs-force-community/go-fvm-sdk/sdk/ferrors"
1111
"github.com/ipfs-force-community/go-fvm-sdk/sdk/testing"
@@ -25,6 +25,7 @@ func Invoke(_ uint32) uint32 { //nolint
2525
if err != nil {
2626
sdk.Abort(ctx, ferrors.USR_ILLEGAL_STATE, "unable to get method number")
2727
}
28+
2829
switch methodsNum {
2930
case 1:
3031
// actor does not exist: 128788 (6: resource not found)
@@ -40,9 +41,9 @@ func Invoke(_ uint32) uint32 { //nolint
4041
assert.Equal(t, 0, int(ret.GasUsed))
4142
assert.Equal(t, "", string(ret.ReturnData))
4243
case 3:
43-
// sender does not have funds to transfer (balance 10, transfer 5000) (5: insufficient funds)
44+
//sender does not have funds to transfer (balance 10, transfer 5000000000000000) (5: insufficient funds)
4445
addr, _ := address.NewFromString("f010000")
45-
ret, err := sdk.Send(ctx, addr, 0, []byte{}, abi.NewTokenAmount(5000))
46+
ret, err := sdk.Send(ctx, addr, 0, []byte{}, big.MustFromString("50000000000000000000000"))
4647
assert.Nil(t, err, "send %v", err)
4748
assert.Equal(t, 0, int(ret.ExitCode))
4849
}

sdk/cases/sself.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77
"github.com/ipfs-force-community/go-fvm-sdk/sdk"
88
"github.com/stretchr/testify/assert"
99

10-
//"github.com/ipfs-force-community/go-fvm-sdk/sdk/ferrors"
11-
1210
"github.com/ipfs-force-community/go-fvm-sdk/sdk/testing"
1311
"github.com/ipfs-force-community/go-fvm-sdk/sdk/types"
1412
)
@@ -43,15 +41,17 @@ func Invoke(_ uint32) uint32 { //nolint
4341
//check balance
4442
actorBalance := sdk.CurrentBalance(ctx)
4543
assert.Nil(t, err)
46-
assert.Equal(t, "20", actorBalance.String())
44+
assert.Equal(t, "20000000000000000000", actorBalance.String())
4745

4846
//destruct
49-
toAddr, err := address.NewFromString("f1dwyrbh74hr5nwqv2gjedjyvgphxxkffxug4rkkq")
47+
toAddr, err := address.NewFromString("f15o3zaqettjmmarblwzjr66lwddsi6rbtxjwzngq")
48+
5049
assert.Nil(t, err)
5150
err = sdk.SelfDestruct(ctx, toAddr)
5251
assert.Nil(t, err)
5352
_, err = sdk.Root(ctx)
53+
5454
assert.NotNil(t, err)
55-
assert.Contains(t, err.Error(), "unable to create ipld")
55+
// assert.Contains(t, err.Error(), " syscall:illegal operation")
5656
return 0
5757
}

sdk/cases/test.json

+23-5
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@
2828
"expect_message": "test_abort USR_ILLEGAL_ARGUMENT"
2929
},
3030
{
31-
"name": "abort_SYS_SENDER_STATE_INVALID ",
31+
"name": "abort_SYS_SENDER_STATE_INVALID",
3232
"binary": "abort.wasm",
3333
"actor_balance": 0,
3434
"send_value": 0,
3535
"params":"",
3636
"method_num": 2,
37-
"expect_code": 2,
37+
"expect_code": 17,
3838
"expect_message": "test_abort SYS_SENDER_STATE_INVALID"
3939
},
4040
{
@@ -48,7 +48,7 @@
4848
"expect_message": ""
4949
},
5050
{
51-
"name": "message_test ",
51+
"name": "message_test",
5252
"binary": "message.wasm",
5353
"actor_balance": 0,
5454
"send_value": 10,
@@ -58,7 +58,7 @@
5858
"expect_message": ""
5959
},
6060
{
61-
"name": "sself_test ",
61+
"name": "sself_test",
6262
"binary": "sself.wasm",
6363
"actor_balance": 20,
6464
"send_value": 0,
@@ -144,6 +144,24 @@
144144
"method_num": 1,
145145
"params":"",
146146
"expect_code": 0
147+
},
148+
{
149+
"name": "actor_test",
150+
"binary": "actor.wasm",
151+
"actor_balance": 1,
152+
"send_value": 0,
153+
"method_num": 1,
154+
"params":"",
155+
"expect_code": 0
156+
},
157+
{
158+
"name": "test_USR_NOT_FOUND",
159+
"binary": "actor.wasm",
160+
"actor_balance": 1,
161+
"send_value": 0,
162+
"method_num": 2,
163+
"params":"",
164+
"expect_code": 0
147165
}
148166
]
149-
}
167+
}

sdk/debug.go

+6
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,9 @@ func (l *logger) Logf(ctx context.Context, format string, a ...interface{}) {
4646
_ = sys.Log(ctx, fmt.Sprintf(format, a...)) //todo check error and abort?
4747
}
4848
}
49+
50+
func (l *logger) StoreArtifact(ctx context.Context, name string, data string) {
51+
if l.Enabled(ctx) {
52+
_ = sys.StoreArtifact(ctx, name, data) //todo check error and abort?
53+
}
54+
}

sdk/ferrors/error.go

+92-11
Original file line numberDiff line numberDiff line change
@@ -90,23 +90,104 @@ const (
9090
// RESERVED_31 ExitCode = 31
9191
)
9292

93-
// FvmError fvm error include error code and error message
94-
type FvmError struct {
95-
code ExitCode
93+
// ErrorNumber When a syscall fails, it returns an `ErrorNumber` to indicate why
94+
type ErrorNumber uint32
95+
96+
// Error return error message of ErrorNumber
97+
func (e ErrorNumber) Error() string {
98+
return enToString(uint32(e))
99+
}
100+
101+
func (e ErrorNumber) String() string {
102+
return enToString(uint32(e))
103+
}
104+
105+
// EnToString return string message of ErrorNumber
106+
func enToString(code uint32) string {
107+
switch code {
108+
case 1:
109+
return "illegal argument"
110+
case 2:
111+
return "illegal operation"
112+
case 3:
113+
return "limit exceeded"
114+
case 4:
115+
return "filecoin assertion failed"
116+
case 5:
117+
return "insufficient funds"
118+
case 6:
119+
return "resource not found"
120+
case 7:
121+
return "invalid ipld block handle"
122+
case 8:
123+
return "illegal cid specification"
124+
case 9:
125+
return "illegal ipld codec"
126+
case 10:
127+
return "serialization error"
128+
case 11:
129+
return "operation forbidden"
130+
case 12:
131+
return "buffer too small"
132+
}
133+
return "other error"
134+
}
135+
136+
// Is check whether error is ErrorNumber
137+
func (e ErrorNumber) Is(code error) bool {
138+
return e == code
139+
}
140+
141+
// nolint
142+
const (
143+
// A syscall parameters was invalid.
144+
IllegalArgument ErrorNumber = 1
145+
// The actor is not in the correct state to perform the requested operation.
146+
IllegalOperation ErrorNumber = 2
147+
// This syscall would exceed some system limit (memory, lookback, call depth, etc.).
148+
LimitExceeded ErrorNumber = 3
149+
// A system-level assertion has failed.
150+
//
151+
// # Note
152+
//
153+
// Non-system actors should never receive this error number. A system-level assertion will
154+
// cause the entire message to fail.
155+
AssertionFailed ErrorNumber = 4
156+
// There were insufficient funds to complete the requested operation.
157+
InsufficientFunds ErrorNumber = 5
158+
// A resource was not found.
159+
NotFound ErrorNumber = 6
160+
// The specified IPLD block handle was invalid.
161+
InvalidHandle ErrorNumber = 7
162+
// The requested CID shape (multihash codec, multihash length) isn't supported.
163+
IllegalCid ErrorNumber = 8
164+
// The requested IPLD codec isn't supported.
165+
IllegalCodec ErrorNumber = 9
166+
// The IPLD block did not match the specified IPLD codec.
167+
Serialization ErrorNumber = 10
168+
// The operation is forbidden.
169+
Forbidden ErrorNumber = 11
170+
// The passed buffer is too small.
171+
BufferTooSmall ErrorNumber = 12
172+
)
173+
174+
// SysCallError Fvm error number include error code and error message
175+
type SysCallError struct {
176+
code ErrorNumber
96177
message string
97178
}
98179

99-
// NewFvmError new fvm error from error code and message
100-
func NewFvmError(code ExitCode, msg string) FvmError {
101-
return FvmError{code, msg}
180+
// NewSysCallError new fvm error number from error code and message
181+
func NewSysCallError(code ErrorNumber, msg string) SysCallError {
182+
return SysCallError{code, msg}
102183
}
103184

104-
// Error return error message for fvm error
105-
func (fvmError FvmError) Error() string {
106-
return fmt.Sprintf("%s %d", fvmError.message, fvmError.code)
185+
// Error return error message for fvm error number
186+
func (e SysCallError) Error() string {
187+
return fmt.Sprintf("%s (%d)%s", e.message, e.code, e.code)
107188
}
108189

109190
// Unwrap return inner error code
110-
func (fvmError FvmError) Unwrap() error {
111-
return fvmError.code
191+
func (e SysCallError) Unwrap() error {
192+
return e.code
112193
}

sdk/ferrors/error_test.go

+4-8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// Package ferrors fvm errors
12
package ferrors
23

34
import (
@@ -7,12 +8,7 @@ import (
78
"github.com/stretchr/testify/assert"
89
)
910

10-
func TestFvmError(t *testing.T) {
11-
fvmError := NewFvmError(USR_ASSERTION_FAILED, "mock error")
12-
assert.True(t, errors.Is(fvmError, USR_ASSERTION_FAILED))
13-
assert.False(t, errors.Is(fvmError, USR_FORBIDDEN))
14-
15-
var gotError ExitCode
16-
assert.True(t, errors.As(fvmError, &gotError))
17-
assert.Equal(t, USR_ASSERTION_FAILED, gotError)
11+
func TestNewSysCallError(t *testing.T) {
12+
err := NewSysCallError(6, "this is error:")
13+
assert.True(t, errors.Is(err, NotFound))
1814
}

sdk/gas.go

+5
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@ import (
1010
func Charge(ctx context.Context, name string, compute uint64) error {
1111
return sys.Charge(ctx, name, compute)
1212
}
13+
14+
// AvailableGas current gas
15+
func AvailableGas(ctx context.Context) (uint64, error) {
16+
return sys.AvailableGas(ctx)
17+
}

0 commit comments

Comments
 (0)