Go合约

预备知识

XuperChain 基本操作

注解

请先完成 XuperChain 基本操作 中的教程,以确设置对应账号和权限

1.合约样例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package main
import (
    "strconv"
    "github.com/xuperchain/xuperchain/core/contractsdk/go/code"
    "github.com/xuperchain/xuperchain/core/contractsdk/go/driver"
)
type counter struct{}
func (c *counter) Initialize(ctx code.Context) code.Response {
    creator, ok := ctx.Args()["creator"]
    if !ok {
        return code.Errors("missing creator")
    }
    err := ctx.PutObject([]byte("creator"), creator)
    if err != nil {
        return code.Error(err)
    }
    return code.OK(nil)
}
func (c *counter) Increase(ctx code.Context) code.Response {
    key, ok := ctx.Args()["key"]
    if !ok {
        return code.Errors("missing key")
    }
    value, err := ctx.GetObject(key)
    cnt := 0
    if err == nil {
        cnt, _ = strconv.Atoi(string(value))
    }
    cntstr := strconv.Itoa(cnt + 1)
    err = ctx.PutObject(key, []byte(cntstr))
    if err != nil {
        return code.Error(err)
    }
    return code.OK([]byte(cntstr))
}
func (c *counter) Get(ctx code.Context) code.Response {
    key, ok := ctx.Args()["key"]
    if !ok {
        return code.Errors("missing key")
    }
    value, err := ctx.GetObject(key)
    if err != nil {
        return code.Error(err)
    }
    return code.OK(value)
}
func main() {
    driver.Serve(new(counter))
}

2.合约编译

1
2
3
4
5
# 编译为 wasm 合约
GOOS=js GOARCH=wasm go build -o hello.wasm

# 编译为 native 合约
go build -o hello

3. 部署合约

#  native合约
xchain-cli native deploy --account XC1111111111111111@xuper -a '{"creator":"XC1111111111111111@xuper"}' --fee 15587517 --runtime go counter --cname counter

# 部署 wasm 合约
xchain-cli wasm deploy --account XC1111111111111111@xuper --cname counter -m -a '{"creator": "someone"}' counter

4. 合约调用

$ xchain-cli native invoke --method Increase -a '{"key":"demo"}' countr --fee 10
contract response: 1
The gas you cousume is: 6
The fee you pay is: 10
Tx id: b387e2247780a5f5da1070a931b37c4fc7f1b68c072768053a43cffe36f2e0fb

$ xchain-cli native query --method Get -a '{"key":"demo"}' counter
contract response: 1