XuperChain
ClearSky Drizzle Lv4

百度超级链使用

超级链环境部署

官方文档

  • 拉取超级链软件包
    1
    wget https://mirrors.lllcnm.cn/xuper.zip
  • 网络环境配置
    1
    make testnet
  • 启动所有节点
    1
    sh control_all.sh start
  • 合约账号创建
    1
    bin/xchain-cli account new --account 1111111111111112 --fee 1000

image

  • 查询账号信息
    1
    bin/xchain-cli acl query --account XC1111111111111112@xuper
  • 查询账号余额
    1
    ./bin/xchain-cli account balance XC1111111111111112@xuper -H 127.0.0.1:37101
  • 更新账户余额
    1
    bin/xchain-cli transfer --to XC1111111111111112@xuper --amount 1000 --keys data/keys/ -H 127.0.0.1:37101
  • 部署solidity合约
    编译合约abi bin
    1
    solc --bin --abi Test.sol -o .
    部署Hello合约
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    pragma solidity ^0.4.25;

    contract Hello {
    string name;
    function set(string memory _name) public{
    name = _name;
    }
    function get() public view returns(string) {
    return name;
    }
    }
    1
    ./bin/xchain-cli evm deploy --account XC1111111111111121@xuper --cname Hello --fee 2000 Hello.bin --abi Hello.abi
    调用合约
    1
    2
    ./bin/xchain-cli evm invoke --method set -a '{"name":"hhh"}' Hello --fee 1000
    ./bin/xchain-cli evm query --method get Hello

java sdk调用

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
@Component
public class XuperChainUtil {
@Value("${xuperchain.client.url}")
String xuperClientUrl;

@Value("${xuperchain.admin.keys}")
String keyPath;
XuperClient client;

@PostConstruct
public void initField() {
client = new XuperClient(xuperClientUrl);
System.out.println(keyPath);
}


//获取区块ID、高度、交易ID
public Dict getBlockchainStatus() {
XchainOuterClass.BCStatus bcs = client.getBlockchainStatus("xuper");
XchainOuterClass.SystemsStatus systemStatus = client.getSystemStatus();
byte[] hex = Hex.encode(bcs.getBlock().getBlockid().toByteArray());
String blockId = new String(hex);
XchainOuterClass.InternalBlock getBlocks = bcs.getBlock();
System.out.println(getBlocks);
List<XchainOuterClass.Transaction> transList = getBlocks.getTransactionsList();
String lastTransactionId = new String(Hex.encode(transList.get(transList.size() - 1).getTxid().toByteArray()));
long height = getBlocks.getHeight();
Dict retDict = new Dict();
retDict.put("height", height);
retDict.put("blockId", blockId);
retDict.put("transactionId", lastTransactionId);
return retDict;
}
/**
* 触发合约交易(invoke)
* */
public Dict invokeContract(String accountName,
String contractName,
String funcName,
Map<String, String> args) {
Account account = Account.create(keyPath);
//设置合约用户
account.setContractAccount(accountName);

try{
Transaction tx = client.invokeEVMContract(account, contractName, funcName, args, null);
Map resMap = new HashMap<String, String>() {
{
put("txId", tx.getTxid());
put("message", tx.getContractResponse().getMessage());
put("body", tx.getContractResponse().getBodyStr());
}
};
return new Dict(resMap);
}catch (Exception e) {
Map resMap = new HashMap<String, String>();
resMap.put("isError", 1);
resMap.put("msg", e.getMessage());
return new Dict(resMap);
}
}
/**
* 查询合约功能(query)
* */
public Dict queryContract(String accountName,
String contractName,
String funcName,
Map<String, String> args) {
Account account = Account.create(keyPath);
//设置合约用户
account.setContractAccount(accountName);
Transaction tx = client.queryEVMContract(account, contractName, funcName, args);
Map resMap = new HashMap<String, String>() {
{
put("message", tx.getContractResponse().getMessage());
put("body", tx.getContractResponse().getBodyStr());
}
};
return new Dict(resMap);
}
}
  • 目录结构

image

  • controller 类
    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
    import cn.hutool.core.lang.Dict;
    import com.example.xuperchaintest.util.XuperChainUtil;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.*;

    import java.io.UnsupportedEncodingException;
    import java.util.Map;

    @RestController
    public class TestController {
    @Value("${contract.creator}")
    String contractCreator;
    @Value("${contract.name}")
    String contractName;
    @Autowired
    XuperChainUtil xuperChainUtil;
    @RequestMapping(value = "getBlockchainStatus", method = RequestMethod.GET)
    public Dict getBlockchainStatus() throws UnsupportedEncodingException {
    return xuperChainUtil.getBlockchainStatus();
    }

    @PostMapping("set")
    public Dict addUser(@RequestBody Map<String,String> args) {
    return xuperChainUtil.invokeContract(contractCreator,contractName,"set",args);
    }
    @GetMapping("get")
    public Dict getUser() {
    return xuperChainUtil.queryContract(contractCreator,contractName,"get",null);
    }
    }

  • 调用set接口

image

  • 调用get接口

image

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
This site is deployed on
Unique Visitor Page View