1. 読み取り専用コントラクトを呼び出す
注: 通常、小さなキツネからコピーされたものには ID が含まれていないため、登録する必要があります。
イーサリアム API | IPFS API & ゲートウェイ | サービスとしての ETH ノード | インフラ
または、 ここをクリックしてください 。登録が完了したら、ID の文字列を取得できます。メインのネットワーク アドレスの背後にある ID を結合するだけです。
- スマート コントラクトの読み取り専用関数を呼び出す
/**
* 连接web3 节点 https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161
*/
private final static Web3j web3j = Web3j.build(new HttpService("https://mainnet.infura.io/v3/这里需要拼接上面方法里面获取的ID"));
public String signTokenTransaction() throws IOException, ExecutionException, InterruptedException {
try {
//方法传入的参数为uint
List input = Arrays.asList(new Uint256(123));
//返回的是字符串,如果返回格式错误下面解析将会报错
List output = Arrays.asList(new TypeReference<Utf8String>() {
});
//代币合约地址
String coinAddress = "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d";
//传入的合约地址、调取的只读方法、传入参数和返回参数
List<Type> type = readContract(coinAddress,"tokenURI", input,output);
return type.get(0).toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 读取合约状态
*
* @param contractAddress 合约地址
* @param functionName 合约函数名称
* @param input 输入参数
* @param output 返回变量类型
* @return 合约函数返回值
* @throws Exception 与节点交互失败
*/
public List<Type> readContract(String contractAddress, String functionName, List<Type> input, List<TypeReference<?>> output) throws Exception {
// 生成需要调用函数的data
Function function = new Function(functionName, input, output);
String data = FunctionEncoder.encode(function);
// 组建请求的参数 调用者地址(可以为空),合约地址、参数
EthCall response = web3j.ethCall(
Transaction.createEthCallTransaction("0x9175F9EcBbddC078e40C5e037AD31F4abf36628a", contractAddress, data),
DefaultBlockParameterName.LATEST)
.send();
// 解析返回结果
return FunctionReturnDecoder.decode(response.getValue(), function.getOutputParameters());
}
contractAddress パラメータは、「0x123456789...」などのスマート コントラクトのアドレスを表します
functionName パラメータは、トークン残高のクエリなど、コントラクトに記述された関数を呼び出す必要がある関数名を表します 「balanceOf」入力
パラメータこのパラメータの は、コントラクト関数が渡す必要があるパラメータを示します。型は、solidity 関数のパラメータ型と一致する必要があります
。 solidity の型は
web3j ライブラリにカプセル化されています. Arrays.asList(new TypeReference(){}); solidity 関数は複数の戻り値を返す場合があります.さまざまなタイプの
トークン残高を照会するためのコード例
/**
* 获取某个代币的余额
*
* @param contractAddress 代币合约地址
* @param address 查询用户地址
* @return 余额:单位ether
* @throws Exception 与节点交互失败
*/
public String balanceOf(String contractAddress, String address) throws Exception {
List input = Arrays.asList(new Address(address));
List output = Arrays.asList(new TypeReference<Uint256>() {
});
List<Type> result = readContract(contractAddress, "balanceOf", input, output);
Uint256 balance = (Uint256) result.get(0);
return Convert.fromWei(balance.getValue().toString(), Convert.Unit.ETHER).toString();
}
- 出力配列入力の長さは、readContract メソッドの戻り値配列の長さを決定します。
- 1 ether = 1^18 wei、チェーン上のほとんどのトークンの精度は小数点以下 18 桁であるため、ここでは一般的な処理を直接行います