区块链 xuperchain xuper-java-sdk 部署使用EVM 合约 教程
Posted 软件工程小施同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链 xuperchain xuper-java-sdk 部署使用EVM 合约 教程相关的知识,希望对你有一定的参考价值。
本文在另外一台非区块链节点的机器独立部署xuper-java-sdk 。
一、准备
1. 创建合约账户
参考教程
区块链 xuperchain 命令行 部署使用EVM 合约 教程https://shijianfeng.blog.csdn.net/article/details/117440574
2. 配置区块链使用evm
参考教程
区块链 xuperchain 命令行 部署使用EVM 合约 教程https://shijianfeng.blog.csdn.net/article/details/117440574
3. 将在区块链节点里创建的合约账户的信息拷贝到xuper-java-sdk所在的机器
在节点机器
scp -r ./data/keys shijianfeng@192.168.92.133:~/xuper/xuper-java-sdk/
在xuper-java-sdk机器
4. 将在区块链节点里编译好的智能合约sol、abi、bin文件拷贝到xuper-java-sdk所在的机器
在节点机器
在xuper-java-sdk机器
二、xuper-java-sdk
1. 下载源代码
https://github.com/xuperchain/xuper-java-sdk
2. 添加依赖
如果你使用的是Maven,只需要添加下面的依赖到pom.xml
<dependency>
<groupId>com.baidu.xuper</groupId>
<artifactId>xuper-java-sdk</artifactId>
<version>0.2.0</version>
</dependency>
3. 创建客户端
# 区块链节点的ip
XuperClient client = new XuperClient("192.168.92.129:37101");
4. 导入合约账户的keys
// Import account from local keys
Account account = Account.create("./keys");
// 设置之前已经创建的合约账号
account.setContractAccount("XC1111111111111111@xuper");
5. 部署evm合约
String abi = "[{\\"inputs\\":[{\\"internalType\\":\\"uint256\\"......";
String bin = "6080604......";
// 初始化合约传入的参数,若没有则传空
Map<String, String> args = new HashMap<>();
args.put("num", "5889");
Transaction t = client.deployEVMContract(account, bin.getBytes(), abi.getBytes(), contractName, args);
System.out.println("txID:" + t.getTxid());
6. 合约调用
// storagepay is a payable method. Amount param can be NULL if there is no need to transfer to the contract.
Transaction t1 = xuperClient.invokeEVMContract(account, contractName, "storepay", args, BigInteger.ONE);
System.out.println("txID:" + t1.getTxid());
System.out.println("tx gas:" + t1.getGasUsed());
Transaction t2 = xuperClient.queryEVMContract(account, contractName, "retrieve", null);
System.out.println("tx res getMessage:" + t2.getContractResponse().getMessage());
System.out.println("tx res getBodyStr:" + t2.getContractResponse().getBodyStr());
xuperClient代码位于371行
各参数解释
/**
* @param from the initiator of calling method.
* @param contract contract name.
* @param method contract method.
* @param args contract method args.
* @param amount amount of transfer to contract when call payable method.
* @return transaction.
*/
public Transaction invokeEVMContract(Account from, String contract, String method, Map<String, String> args, BigInteger amount)
7. 完整代码参考
import com.baidu.xuper.api.Account;
import com.baidu.xuper.api.Transaction;
import com.baidu.xuper.api.XuperClient;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
public class TestCase {
public static void main(String[] as) {
XuperClient client = new XuperClient("192.168.92.129:37101");
Account account = Account.create("./keys");
account.setContractAccount("XC1111111111111111@xuper");
String abi = "[{\\"inputs\\":[],\\"payable\\":false,\\"stateMutability\\":\\"nonpayable\\",\\"type\\":\\"constructor\\"},{\\"constant\\":true,\\"inputs\\":[{\\"internalType\\":\\"string\\",\\"name\\":\\"key\\",\\"type\\":\\"string\\"}],\\"name\\":\\"get\\",\\"outputs\\":[{\\"internalType\\":\\"uint256\\",\\"name\\":\\"\\",\\"type\\":\\"uint256\\"}],\\"payable\\":false,\\"stateMutability\\":\\"view\\",\\"type\\":\\"function\\"},{\\"constant\\":true,\\"inputs\\":[],\\"name\\":\\"getOwner\\",\\"outputs\\":[{\\"internalType\\":\\"address\\",\\"name\\":\\"\\",\\"type\\":\\"address\\"}],\\"payable\\":false,\\"stateMutability\\":\\"view\\",\\"type\\":\\"function\\"},{\\"constant\\":false,\\"inputs\\":[{\\"internalType\\":\\"string\\",\\"name\\":\\"key\\",\\"type\\":\\"string\\"}],\\"name\\":\\"increase\\",\\"outputs\\":[],\\"payable\\":true,\\"stateMutability\\":\\"payable\\",\\"type\\":\\"function\\"}]\\n";
String bin = "608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103d4806100606000396000f3fe6080604052600436106100345760003560e01c8063693ec85e14610039578063893d20e814610115578063ae896c871461016c575b600080fd5b34801561004557600080fd5b506100ff6004803603602081101561005c57600080fd5b810190808035906020019064010000000081111561007957600080fd5b82018360208201111561008b57600080fd5b803590602001918460018302840111640100000000831117156100ad57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610227565b6040518082815260200191505060405180910390f35b34801561012157600080fd5b5061012a61029a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102256004803603602081101561018257600080fd5b810190808035906020019064010000000081111561019f57600080fd5b8201836020820111156101b157600080fd5b803590602001918460018302840111640100000000831117156101d357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506102c3565b005b60006001826040518082805190602001908083835b6020831061025f578051825260208201915060208101905060208303925061023c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600180826040518082805190602001908083835b602083106102fa57805182526020820191506020810190506020830392506102d7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902054016001826040518082805190602001908083835b602083106103655780518252602082019150602081019050602083039250610342565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020819055505056fea265627a7a72315820c49614e9b0c57d73536ec4ffc169642345d796bb1e70a1f16a63746c6e165cad64736f6c63430005100032";
System.out.println(account.getContractAccount() == null);
Transaction t = client.deployEVMContract(account, bin.getBytes(), abi.getBytes(), "Counter", null);
System.out.println("txID:" + t.getTxid());
Map<String, String> args = new HashMap<>();
args.put("key", "lili");
// storagepay is a payable method. Amount param can be NULL if there is no need to transfer to the contract.
Transaction t1 = client.invokeEVMContract(account, "Counter", "increase", args, BigInteger.ONE);
System.out.println("txID:" + t1.getTxid());
System.out.println("tx gas:" + t1.getGasUsed());
Transaction t2 = client.queryEVMContract(account, "Counter", "get", args);
System.out.println("tx res getMessage:" + t2.getContractResponse().getMessage());
System.out.println("tx res getBodyStr:" + t2.getContractResponse().getBodyStr());
}
}
执行截图
参考
以上是关于区块链 xuperchain xuper-java-sdk 部署使用EVM 合约 教程的主要内容,如果未能解决你的问题,请参考以下文章
区块链 xuperchain 命令行 部署使用EVM 合约 教程