1. 程式人生 > >web3j 查詢ERC20 代幣餘額

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