Jvav 调用 Conflux 智能合约

简介: Jvav 调用 Conflux 智能合约

1. 加入 Conflux 库

        <dependency>
            <groupId>io.github.conflux-chain</groupId>
            <artifactId>conflux.web3j</artifactId>
            <version>1.1.0</version>
        </dependency>
import conflux.web3j.Account;
import conflux.web3j.Cfx;
import conflux.web3j.AccountManager;
import conflux.web3j.contract.ContractCall;
import conflux.web3j.contract.abi.DecodeUtil;
import conflux.web3j.types.Address;
import org.web3j.abi.FunctionReturnDecoder;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.*;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.crypto.Bip39Wallet;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.WalletUtils;
import org.web3j.abi.Utils;
import java.io.File;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

2. 调用 view 、pure 标记函数

        // API地址
        Cfx cfx = Cfx.create("https://test.confluxrpc.org/v2", 3, 1000);
        // 与合约建立连接
        ContractCall contract = new ContractCall(cfx, new Address("cfxtest:acdhpa29xz0095w6rxbhv36yhjeub58vzp64s0swpk"));
        {
            // 单参数返回
            String balance = contract.call("balanceOf", new Address("cfxtest:aasg762e552jwmp3pk73ve9j9tszezz9xu5abab3xb").getABIAddress()).sendAndGet();
            BigInteger outBalance = DecodeUtil.decode(balance, Uint256.class);
            System.out.println("contract minter: " + outBalance);
        }
        {
            // 动态参数返回
            String test = contract.call("tokens", new Uint256(0), new Uint256(11)).sendAndGet();
            List<Type> values = FunctionReturnDecoder.decode(test, Utils.convert(Arrays.asList(new TypeReference<Uint256>() {}, new TypeReference<DynamicArray<Uint256>>() {})));
            System.out.println("tokens 0 : " + (values.get(0)).getValue());
            List<Uint256> list = (List<Uint256>)values.get(1).getValue();
            for( Uint256 v : list) {
                System.out.println("tokens array : " + v.getValue());
            }
        }
        {
            // 多返回参数
            String test = contract.call("Test").sendAndGet();
            List<Type> values = FunctionReturnDecoder.decode(test, Utils.convert(Arrays.asList(new TypeReference<Utf8String>() {}, new TypeReference<Utf8String>() {} )));
            System.out.println((values.get(0)).getValue());
            System.out.println((values.get(1)).getValue());
        }

3. 调用普通公开逻辑函数

        // 调用者私钥
        String privateKey = "0x私钥";
        // 合约地址
        Address contractAddress = new Address("cfxtest:accb2fg8f6n9c92hszej0x1u88mprtbdhpp69v74a9");
        // 调用者地址
        Address recipient = new Address("cfxtest:aatc1wrjhetj6bnggdkhwd6hhybecrmpj228968j27");
        // API地址
        Cfx cfx = Cfx.create("https://test.confluxrpc.org/v2", 3, 1000);
        // 创建调用账户
        Account account = Account.create(cfx, privateKey);
        // 设置调用设置
        Account.Option opt = new Account.Option();
        // 调用测试链
        opt.withChainId(1);
        // 发起合约
        try
        {
            // 发起合约
            String txHash = account.call(opt, contractAddress, "DT_GenerateNFT", recipient.getABIAddress());
            // 返回64位开头0x8的哈希交易地址, 具体内容可以在 https://testnet.confluxscan.io/ 输入返回哈希搜到
            System.out.println("tx hash: " + txHash);
        }
        catch (Exception e)
        {
            // 调用失败
            System.out.println(e.getMessage());
        }

4. 获取交易信息返回值 - 函数返回较慢

    // 订单转换
    private static Call convert(Transaction tx) {
        Call call = new Call();
        call.setFrom(tx.getFrom());
        call.setNonce(tx.getNonce());
        if (tx.getTo().isPresent()) {
            call.setTo(tx.getTo().get());
        }
        call.setValue(tx.getValue());
        call.setGasPrice(tx.getGasPrice());
        call.setGas(tx.getGas());
        call.setData(tx.getData());
        call.setStorageLimit(tx.getStorageLimit());
        return call;
    }
    // 获取交易信息返回值 - 函数返回较慢
    private static String getTXHashReturnValue(Cfx cfx, String txHash) throws Exception {
        Transaction tx = cfx.getTransactionByHash(txHash).sendAndGet().get();
        Receipt receipt = cfx.waitForReceipt(txHash);
        Call call = App.convert(tx);
        BigInteger execEpoch = receipt.getEpochNumber().subtract(BigInteger.ONE);
        StringResponse response = (StringResponse)cfx.call(call, new Epoch[] { Epoch.numberOf(execEpoch) }).sendWithRetry();
        if (response.getError() != null)
        {
            throw new Exception(DecodeUtil.decodeErrorData(response.getError().getData()));
        }
        return response.getValue();
    }

5. 新建地址

        Cfx cfx = Cfx.create("https://test.confluxrpc.org/v2", 3, 1000);
        BigInteger epoch = cfx.getEpochNumber().sendAndGet();
        System.out.println("Current epoch: " + epoch);
        AccountManager accountManager = new AccountManager(1);
        String path = "d:\\2";
        Bip39Wallet wallet = WalletUtils.generateBip39Wallet("1234567678",new File(path));
        System.out.println("助"+wallet.getMnemonic());
        // 使用密码和助记词让账户解锁
        Credentials credentials = WalletUtils.loadBip39Credentials("", wallet.getMnemonic());
        // 获取账户地址
        String address1 = credentials.getAddress();
        System.out.println(address1);
        // 获取公钥
        String publicKey = credentials.getEcKeyPair().getPublicKey().toString(16);
        System.out.println("公"+publicKey);
        // 获取私钥
        String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16);
        System.out.println("私"+privateKey);
        // 获取地址
        Optional<Address> c = accountManager.imports(privateKey,"12345678");
        System.out.println(c.get().getAddress());
相关文章
|
4月前
|
存储 区块链 数据安全/隐私保护
智能合约中最常见的11种函数
下面列出了一些常见的智能合约函数及其用途,并提供了一些基本的示例。
51 0
|
5月前
|
存储 安全 区块链
智能合约中外部调用漏洞
智能合约中外部调用漏洞
58 7
|
机器学习/深度学习 人工智能 自然语言处理
秒合约开发原理丨秒合约系统开发(详细规则)丨秒合约源码案例部署
秒合约开发原理丨秒合约系统开发(详细规则)丨秒合约源码案例部署
|
JavaScript 前端开发 Go
【智能合约】Go语言调用以太坊 | geth
目录 1. geth 简介 1.1 下载地址: 1.2 安装: 1.3 查看是否安装成功 2. geth命令介绍 3. geth常用命令 3.1 指定数据目录 --datadir 3.2 账户相关 3.3 控制台console: 3.4 删除数据: 3.5 help 3.6 常见错误 4. Go语言调用合约 4.1 启动rpc端口 4.2 Go调用以太坊 4.3 调用接口 net_version net_listening net_peerCount eth接口 personal接口 db接口 最后
1127 0
【智能合约】Go语言调用以太坊 | geth
|
存储 安全
关于DAPP马蹄链合约开发逻辑
This article is compiled and released by**WeChaT: kaifa873**, which is only for reference of project development requirements!**telegram @ sleu88**
68 0
|
测试技术 区块链
如何搭建属于自己的一个合约交易所开发WBTC智能合约代码示例
WBTC(Wrapped Bitcoin)是一种 ERC-20 代币,代表以太坊区块链上的比特币。 它是基于智能合约的代币示例,允许在以太坊区块链上创建和传输代币。
|
Go 数据安全/隐私保护
Solidity笔记-合约间的互相调用
Solidity笔记-合约间的互相调用
233 0
|
Java 区块链
java调用以太坊私链上的合约方法
以下介绍java调用以太坊私链上的合约方法
342 0
|
区块链
solidity 合约间调用以及参数传递
在 以太坊中合约间是可以相互调用,并且正常进行参数传递以及返回值处理. contract1.sol pragma solidity ^0.4.0; contract Test1 { uint256 public v=7; function vote(uint256 a) pu...
3367 0
|
存储 区块链 Python
以太坊中如何获取另外一个智能合约部署的合约地址?
如何获取另外一个智能合约部署的合约地址? 我正试图从另一个工厂合约中签智能合约,然后重新部署新智能合约的地址。然而,它返回的地址是交易哈希值而不是合约地址。
2339 0