web3j 查詢ERC20 代幣餘額
一.通過web3j 來查詢
這裡使用的是ropsten 測試網路
1.連線乙太網網路
web3j 連線乙太網的第一步是要有一個乙太網客戶端,(例如本地客戶端,或雲客戶端),web3j推薦的使用infura 的雲客戶端
例如: Web3j web3j = Web3j.build(new HttpService("https://ropsten.infura.io/mew")); 這裡token是mew,是MyEtherWallet 在infura 的token
我這裡使用的是infura的雲客戶端,可以去infura 註冊自己的token,然後就可以連上以太坊網路了
2.獲得 ERC20 合約的java 實現版本,這裡 web3j 是通過web3j 自帶的命令列工具實現的(需要合約的二進位制檔案 和 abi 介面
/*TODO通過編譯器 獲得 bin 有問題,驗證的時候,無法驗證通過
比如我在http://remix.ethereum.org 這個線上編譯器上編寫了一個合約(這個時候可以在remix 的右邊compiler 工具框中選擇 Details 可以檢視合約的二進位制程式碼和 abi 介面)*/
實際上釋出了合約之後,應該在區塊鏈瀏覽器(tetherscan.io)中,驗證合約程式碼,驗證通過後,會看到合約的建立的二進位制程式碼,在abi 檔案的下面,這裡的二進位制程式碼才是完整的,然後生成的合約物件,通過 合約物件.isValid(),返回true ,可以驗證通過
在本地啟動命令列工具,工具會一閃而過,web3j.bat 不是雙擊執行,進入檔案位置,直接web3j.bat回車 ,出現web3j.io 圖示說明成功,然後直接輸入web3j 命令.
例如: 需要通過web3j 命令列工具生成 合約的java 物件
* 需要獲得合約的二進位制程式碼 儲存: 名稱.bin
* 需要獲得合約的abi資料 儲存為: 名稱.abi
-o 是輸出的資料夾名稱
-p 後面是儲存的包名
* 命令例項: web3j solidity generate TokenDemo.bin TokenDemo.abi -o /java -p com.your.organisation.name
3. 獲得查詢物件餘額
package test; import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; import org.web3j.crypto.Credentials; import org.web3j.protocol.Web3j; import org.web3j.protocol.admin.Admin; import org.web3j.protocol.core.DefaultBlockParameterName; import org.web3j.protocol.core.RemoteCall; import org.web3j.protocol.http.HttpService; import org.web3j.tx.Contract; import contract.MttContract; /** * 獲取使用者錢包地址 餘額,包括 智慧合約地址餘額 */ public class TestGetBalance { /** * 查詢以太幣 * @param args * @throws Exception */ public static void main(String[] args) throws Exception { Web3j web3j = getWeb3j(StaticValue.ropstenService); getEthBanlance(web3j,StaticValue.account2); //獲取指定錢包的指定幣種餘額 Contract erc20Contract = getERC20Contract(web3j, StaticValue.MttContractAddress, StaticValue.account2Pri); getERC20Balance(web3j,erc20Contract,StaticValue.account2,8); close(web3j); } /** * 連線網路 * @param netUrl * @return */ public static Web3j getWeb3j(String netUrl){ Admin web3j = Admin.build(new HttpService(netUrl)); return web3j; } /** * 關閉網路 * @param web3j */ public static void close(Web3j web3j){ web3j.shutdown(); } /** * 查詢以太幣賬戶餘額 * @throws IOException */ public static String getEthBanlance(Web3j web3j,String userAddress) throws IOException { //獲取指定錢包的以太幣餘額 BigInteger integer=web3j.ethGetBalance(userAddress,DefaultBlockParameterName.LATEST).send().getBalance(); //eth預設會部18個0這裡處理比較隨意 String decimal = toDecimal(18,integer); System.out.println(decimal); //因為是按18位來算的,所有在倒數18位前面加 小數點 /*String str = integer.toString(); String decimal = toDecimal(18,str); System.out.println(decimal);*/ return decimal; } /** * 獲得 erc20 合約 例項 * @return */ public static Contract getERC20Contract(Web3j web3j,String contractAddress,String userPri){ BigInteger GAS_PRICE = BigInteger.valueOf(22_000_000_000L); BigInteger GAS_LIMIT = BigInteger.valueOf(4_300_000); Credentials credentials = Credentials.create(userPri);//獲得信任憑證 MttContract contract = MttContract.load( contractAddress, web3j, credentials, GAS_PRICE, GAS_LIMIT); return contract; } /** * 查詢erc 20 代幣價格 * @throws Exception */ public static String getERC20Balance(Web3j web3j,Contract contract,String userAddress,int decimal) throws Exception{ // Web3ClientVersion web3ClientVersion = web3j.web3ClientVersion().send();//send 是同步請求 // Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().sendAsync().get(); //sendAsync(), 使用CompletableFuture(Android上的Future)傳送非同步請求: // String clientVersion = web3ClientVersion.getWeb3ClientVersion(); // System.out.println(clientVersion);//檢視版本資訊 //或者 RxJava Observable: /*Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ web3.web3ClientVersion().observable().subscribe(x -> { String clientVersion = x.getWeb3ClientVersion(); ... });*/ RemoteCall<BigInteger> balanceOf = ((MttContract) contract).balanceOf(userAddress); BigInteger send2 = balanceOf.send(); String result = toDecimal(8, send2); System.out.println(result); return result; } /** * 轉換成符合 decimal 的數值 * @param decimal * @param str * @return */ public static String toDecimal(int decimal,BigInteger integer){ // String substring = str.substring(str.length() - decimal); StringBuffer sbf = new StringBuffer("1"); for (int i = 0; i < decimal; i++) { sbf.append("0"); } String balance = new BigDecimal(integer).divide(new BigDecimal(sbf.toString()), 18, BigDecimal.ROUND_DOWN).toPlainString(); return balance; } }
StaticValue.class
package test;
public class StaticValue {
public static final String ropstenService = "https://ropsten.infura.io/mew";//模仿 myEtherWallet 錢包請求 infura 網路
public static final String account1 = "我的測試錢包地址";
public static final String account2 = "我的測試錢包地址2";
public static final String account1Pri = "我的測試錢包地址1私鑰";//私鑰
public static final String account2Pri = "我的測試錢包地址2私鑰";//私鑰
public static final String MttContractAddress = "部署的erc20 的合約地址";
}
二.通過etherscan.io 的介面來查詢ERC20 代幣餘額
decimal 是合約建立時指定的精度,這裡url 是指etherscan連線的網路,例如ropsten測試網路 : http://api-ropsten.etherscan.io/api
apikey 是指在etherscan 獲得token,contractAddress 是合約地址,address 賬戶地址,
這裡請求使用的okhttp3,TestOKHttp 類是自己封裝過,對結果的json 進行處理使用的是jackson 2.8.5
/**
* https://api.etherscan.io/api?module=account&action=tokenbalance&contractaddress=0x57d90b64a1a57749b0f932f1a3395792e12e7055&address=0xe04f27eb70e025b78871a2ad7eabe85e61212761&tag=latest&apikey=YourApiKeyToken
* 查詢 賬戶 ERC20 代幣餘額
* @param url
* @param contractAddress
* @param address
* @param decimal
* @return
*/
public static String getERC20Balance(String url,String contractAddress,String address,int decimal){
TreeMap<String,String> treeMap = new TreeMap<>();
treeMap.put("module", "account");
treeMap.put("action", "tokenbalance");
treeMap.put("contractaddress", contractAddress);
treeMap.put("address", address);
treeMap.put("tag", "latest");
treeMap.put("apikey", StaticValue.etherscanToken);
StringBuffer sbf = new StringBuffer();
for (String str : treeMap.keySet()) {
sbf.append(str).append("=").append(treeMap.get(str)).append("&");
}
url = url.concat("?").concat(sbf.substring(0, sbf.length() - 1));
Object send = send(url);
return TestUtil.toDecimal(decimal,new BigInteger(String.valueOf(send)));
}
/**
* 獲得以太幣價格
* @param url
* @return
*/
public static String getEthPrice(String url){
TreeMap<String,String> treeMap = new TreeMap<>();
treeMap.put("module", "stats");
treeMap.put("action", "ethprice");
treeMap.put("apikey", StaticValue.etherscanToken);
StringBuffer sbf = new StringBuffer();
for (String str : treeMap.keySet()) {
sbf.append(str).append("=").append(treeMap.get(str)).append("&");
}
url = url.concat("?").concat(sbf.substring(0, sbf.length() - 1));
Object send = send(url);
return String.valueOf(send);
}
public static Object send(String url){
String responseMessageGet = TestOKHttp.getResponseMessageGet(url);
ObjectMapper mapper = new ObjectMapper();
Map<String,String> reMap = null;
try {
reMap = mapper.readValue(responseMessageGet, new TypeReference<Map<String,Object>>(){});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return reMap.get("result");
}
decimal 方法是轉換精度的,以太坊預設是18,但其他代幣就不一定,
/**
* 轉換成符合 decimal 的數值
* @param decimal
* @param str
* @return
*/
public static String toDecimal(int decimal,BigInteger integer){
// String substring = str.substring(str.length() - decimal);
StringBuffer sbf = new StringBuffer("1");
for (int i = 0; i < decimal; i++) {
sbf.append("0");
}
String balance = new BigDecimal(integer).divide(new BigDecimal(sbf.toString()), 18, BigDecimal.ROUND_DOWN).toPlainString();
return balance;
}
TestOKHttp 類
/**
* okhttp get 請求
*/
public static ResponseBody testGetClient(String url){
OkHttpClient okClient = new OkHttpClient();
Request request = new Request.Builder()
.get().url(url).build();
ResponseBody resBody = null;
try {
Response response = okClient.newCall(request).execute();
resBody = response.body();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resBody;
}
public static String getResponseMessageGet(String url) {
ResponseBody body = null;String string = null;
body = testGetClient(url);
if(checkEmpty(body)) return null;
try {
string = body.string();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return string;
}
public static boolean checkEmpty(Object obj){
if(null!=obj && !obj.toString().trim().equals("")){
return false;
}
return true;
}
轉載請註明來處
相關推薦
web3j 查詢ERC20 代幣餘額
一.通過web3j 來查詢 這裡使用的是ropsten 測試網路 1.連線乙太網網路 web3j 連線乙太網的第一步是要有一個乙太網客戶端,(例如本地客戶端,或雲客戶端),web3j推薦的使用infura 的雲客戶端 例如: Web3j web3j = Web3j.
web3j 傳送ERC20 代幣
前提條件: 生成合約的java例項物件 使用web3j,沒有想web3 那樣,有bin(二進位制資料) 和abi 資料就可以直接構造一個合約物件的構造方法,因此web3j 要想與某個合約互動,必須在本地生成合約的java物件,這個在上一章有介紹( https://blog
以太坊 錢包 轉賬 查詢指定代幣餘額
前一篇講了下怎麼生成錢包 現在再來說一下如何進行轉賬 查指定代幣餘額 依舊是基於web3j的 好了直接上程式碼 //建立連線Admin web3j = AdminFactory.build(new HttpService("你自己站點的地址"));//獲取指定錢包的比特
查詢以太幣及代幣餘額與價格,進行以太幣與代幣的轉賬(兩種方式)並獲取交易記錄
查詢以太幣及代幣餘額與價格,進行以太幣與代幣的轉賬(兩種方式)並獲取交易記錄 1 // 補齊64位,不夠前面用0補齊 2 function addPreZero(num){ 3 var t = (num+'').length, 4 s = ''; 5 for(var i=0; i&l
利用以太坊官方錢包發行ERC20代幣
①建立錢包 ②建立新的智慧合約 ③進入官網拷貝程式碼 ④在拷貝的程式碼中自定義代幣名字、發行數量、簡稱、小數位數 ⑤釋出 在程式碼右邊的SELECT CONTRACT TO DEPLOY中選擇Token ERC 20 最後拉到最下面點選“DEPL
ERC20代幣技術標準
ERC20代幣技術標準 參考連結:http://www.ethdocs.org/en/latest/ethereum-clients/go-ethereum/index.html https://github.com/ethereum/wiki/wiki/JSON-RPC http://
以太坊和ERC20代幣批量簽名
一.批量簽名 本地簽名:這裡是有nodeJS 1.以太坊 var bip39 = require('bip39') const bip32 = require('bip32') const bitcoin = require('bitcoinjs-lib') const ba
使用OpenZeppelin在RSK上進行ERC20代幣開發
在本文中,我們將討論通過RSK網路部署和互動Smart-Contracts智慧合約。我們的合約將是一個基於OpenZeppelin庫的ERC20代幣,我們將把它直接部署到Mainnet中。 建立合約 我們需要做的第一件事就是知道如何使用Truffle。 當我們這樣做 $ truffl
教你如何在以太坊上建立屬於自己的ERC20代幣
本文從技術角度詳細介紹如何基於以太坊ERC20建立代幣的流程。 (需要幫忙代做的可以聯絡V信:WangSanfeng0417) 寫在前面 本文所講的代幣是使用以太坊智慧合約建立,閱讀本文前,你應該對以太坊、智慧合約有所瞭解,如果你還不瞭解,建議你先看以太坊是什麼
以太坊上發行ERC20代幣
auto 默認值 在那 entity 密碼 byte 錯誤提示 快捷訪問 meta ERC20 代幣生成 環境 虛擬主機: ubuntu 18虛擬機 宿主主機: win10; ip:192.168.0.160 1.部署以太坊 1.1 安裝GO 安裝go,並編譯geth 將下
NEW 建立自己的數字貨幣(ERC20代幣)進行ICO (新增修改SOL程式碼)
本文從技術角度詳細介紹如何基於以太坊ERC20建立代幣的流程. 本身不太想寫這邊文章,可是朋友公司遇到最可怕60萬代建立ERC20 Token的事件,特此出文! 即將新增:. 以太坊私鏈,聯盟鏈技術部署細節; . Fabric私鏈,聯盟鏈技術部署細節; 注部分大學實驗
曲速未來 揭祕:以太坊區塊鏈和ERC20代幣的技術挑戰
區塊鏈安全諮詢公司 曲速未來 訊息:在2018年,可以看到以太坊區塊鏈的能力的許多進步。這些創新是由遍及龐大且不斷髮展的生態系統的以太坊和ERC20令牌專案推動的。 這些創新對於以太坊作為新標記的頂級區塊鏈平臺意味著什麼?是否可以期望在不久的將來看到哪些方面取得切實改善
區塊鏈100講:如何理解ERC20代幣合約
前面我們大致介紹了幾種ERC協議,其中ERC20代幣合約可以說在發幣中算是聽到非常多的一個名詞了,說到發幣都會想到這個合約。本文我們就詳細介紹如何理解ERC20代幣合約。 ERC-20最初作為一種嘗試,旨在為以太坊(Ethereum)上的token合約
ERC20代幣合約標準解析及程式碼實現
目前幾乎所有用於艾希歐籌集資金的代幣,都是基於同樣的技術:以太坊ERC-20標準。 因此這些代幣實際上就是實現了ERC20標準的智慧合約。在下文中,我們將全面剖析ERC20 標準規範,並給出一個ERC20代幣合約的完整實現程式碼。此外,在下文中我們將不加區分
5分鐘教你發行ERC20代幣和代幣生態
上一篇文章用不專業、入門的語言分享了一下筆者理解的代幣價值。本文將講述一下代幣生態的運作、如何發行代幣以及如何用一門常用的程式語言(Java)操作它。 雖然類似的文章一搜一大堆,但是根據筆者的實踐,幾乎很少有一篇文章可以真的把整個流程講解的透徹,並且無障礙的實踐落地,所
適合錢包應用開發的ERC20代幣資料集
Erc20Tokens資料集包含超過1000種主流的以太坊ERC20代幣的描述資料清單和圖示,可用於錢包等區塊鏈應用的開發,支援使
以太坊代幣開發(ERC20標準)
代幣 智能合約 合約 以太坊 以太坊開發 ethereum truffle solidity 區塊鏈 區塊鏈開發 blockchain 以太坊ERC20代幣開發首先需要對以太坊,代幣,ERC20,智能合約等以太坊代幣開發中的基本概念有了解。根
第十九課 代幣鎖倉後逐步釋放的ERC20智慧合約實踐
#1,摘要 【本文目標】 通過本文學習,可以實現區塊鏈私募,基金會員工期權(代幣)激勵時鎖倉一定時間,逐步釋放的方法。 【前置條件】 1)已經完成了一個ERC20的代幣,本文以作者接觸的CLB為樣例。 2) 懂得在REMIX除錯SOLIDITY語言,不熟悉的參
建立自己的ERC20加密貨幣(可管理、增發、兌換、凍結等高階功能的代幣)
(注:本文是在原文的基礎上,根據個人的理解,修改部分內容並添加了一些註釋) pragma solidity ^0.4.16; interface tokenRecipient { function receiveApproval(address _from, uint
以太坊代幣標準: ERC20、ERC223的介紹與比較
代幣(Token)是區塊鏈中定義價值的方式,用於標定金融或數字資產。在以太坊上,代幣使用相同的標準,這樣代幣之間的兌換和DAPP支援就會變得容易。 什麼是ERC20標準 ERC-20 標準是在2