導航:首頁 > 以太萊特 > 以太坊web3j介面

以太坊web3j介面

發布時間:2024-02-25 00:28:07

1. 【ETH錢包開發03】web3j轉賬ETH

在之前的文章中,講解了創建、導出、導入錢包。
【ETH錢包開發01】創建、導出錢包
【ETH錢包開發02】導入錢包

本文主要講解以太坊轉賬相關的一些知識。交易分為ETH轉賬和ERC-20 Token轉賬,本篇先講一下ETH轉賬。

1、解鎖賬戶發起交易。錢包keyStore文件保存在geth節點上,用戶發起交易需要解鎖賬戶,適用於中心化的交易所。

2、錢包文件離線簽名發起交易。錢包keyStore文件保存在本地,用戶使用密碼+keystore的方式做離線交易簽名來發起交易,適用於dapp,比如錢包。

本文主要講一下第二種方式,也就是錢包離線簽名轉賬的方式。

交易流程
1、通過keystore載入轉賬所需的憑證Credentials
2、創建一筆交易RawTransaction
3、使用Credentials對象對交易簽名
4、發起交易

注意以下幾點:

1、Credentials
這里,我是通過獲取私鑰的方式來載入 Credentials

還有另外一種方式,通過密碼+錢包文件keystore方式來載入 Credentials

2、nonce

nonce是指發起交易的賬戶下的交易筆數,每一個賬戶nonce都是從0開始,當nonce為0的交易處理完之後,才會處理nonce為1的交易,並依次加1的交易才會被處理。

可以通過 eth_gettransactioncount 獲取nonce

3、gasPrice和gasLimit
交易手續費由gasPrice 和gasLimit來決定,實際花費的交易手續費是 gasUsed * gasPrice 。所有這兩個值你可以自定義,也可以使用系統參數獲取當前兩個值

關於 gas ,你可以參考我之前的一篇文章。
以太坊(ETH)GAS詳解

gasPrice和gasLimit影響的是轉賬的速度,如果gas過低,礦工會最後才打包你的交易。在app中,通常給定一個默認值,並且允許用戶自己選擇手續費。

如果不需要自定義的話,還有一種方式來獲取。獲取以太坊網路最新一筆交易的 gasPrice ,轉賬的話, gasLimit 一般設置為21000就可以了。

Web3j還提供另外一種簡單的方式來轉賬以太幣,這種方式的好處是不需要管理nonce,不需要設置gasPrice和gasLimit,會自動獲取最新一筆交易的gasPrice,gasLimit 為21000(轉賬一般設置成這個值就夠用了)。

這個問題,我想是很多朋友所關心的吧。但是到目前為止,我還沒有看到有講解這方面的博客。

之前問過一些朋友,他們說可以通過區塊號、區塊哈希來判斷,也可以通過Receipt日誌來判斷。但是經過我的一番嘗試,只有 BlockHash 是可行的,在web3j中根據 blocknumber 和 transactionReceipt 都會報空指針異常。

原因大致是這樣的:在發起一筆交易之後,會返回 txHash ,然後我們可以根據這個 txHash 去查詢這筆交易相關的信息。但是剛發起交易的時候,由於手續費問題或者乙太網絡擁堵問題,會導致你的這筆交易還沒有被礦工打包進區塊,因此一開始是查不到的,通常需要幾十秒甚至更長的時間才能獲取到結果。我目前的解決方案是輪詢的去刷 BlockHash ,一開始的時候 BlockHash 的值為0x00000000000,等到打包成功的時候就不再是0了。

這里我使用的是rxjava的方式去輪詢刷的,5s刷新一次。

正常情況下,幾十秒內就可以獲取到區塊信息了。

區塊確認數=當前區塊高度-交易被打包時的區塊高度。

2. ETH轉賬的2種方式的對比

web3j支持使用以太坊錢包文件(推薦)和乙太網客戶端管理命令來發起一筆交易。當你創建了一個擁有以太幣的賬戶後,你可以通過以下兩種交易機制,和以太坊網路(私網/公網)交易:

這里主要講一下 線下簽名交易(Offline transaction signing) 。線下簽名交易允許你使用web3j提供的錢包賬戶發起交易,你完全控制自己的私鑰,交易發送到網路上的其它節點並廣播。

線下簽名交易使用 RawTransaction 對象來完成,一共有如下幾步:

1、通過私鑰或密碼+錢包文件(keystore)來載入轉賬憑證Credentials
2、獲取發起轉賬賬戶的nonce 值,也就是第幾筆交易
3、創建 RawTransaction交易 對象
4、簽名 RawTransaction 對象,也就是對交易做簽名
5、發送交易( RawTransaction 對象)給節點處理。
6、獲取交易哈希值TxHash

以太坊實戰-再談nonce使用陷阱: https://blog.csdn.net/wo541075754/article/details/79054937

此外,還有一種簡單的轉賬方式

這種方式,不需要自己管理nonce。

這2種方式都是離線交易,先組裝交易,然後發送到鏈上。

參考:
https://docs.web3j.io/getting_started.html#transactions
https://www.jianshu.com/p/6650d2a3aea9

3. web3.js如何新建以太坊賬戶

推薦提問的同學去看看這個完整的區塊鏈新手入門的以太坊DApp開發教程,包括node.js、web3.js、solidity、geth、turffle都會涉及到,應該有幫助:

以太坊DApp入門實戰教程

4. 「官方」搭建Web3:Filecoin與以太坊攜手共進


這是Protocol Labs創始人Juan Benet在EthCC 2021上的演講概要,查看完整內容:

https://www.bilibili.com/video/BV1eb4y1r7E1

Filecoin網路是面向生態的,它與Protocol Labs搭建模塊化解決方案的傾向是一致的。因為它本來就是設計給其他人使用,所以Filecoin在Web3領域的其他棧、應用和生態里如魚得水。自從其在2020年10月的啟動開始,Filecoin已經增長到超過8 exbibytes的可用存儲空間,有超過400個項目進入了這個生態。以太坊就是一個能持續證明其可協作性和共同利益的生態系統。

Filecoin + 以太坊

>>>>Filecoin和以太坊虛擬機(EVM)

Filecoin生態意識到網路支持智能合約的好處。最初,開發者社區相信架設在以太坊和Filecoin之間的橋服務足夠在Filecoin上支持智能合約了。不過,通過橋來使用智能合約是很笨重的方式,相比於直接在以太坊實現智能合約的功能和可組合性更是不足。有一個提議是在Filecoin上加入以太坊虛擬機(EVM),從而在存儲層啟用對智能合約的支持,以及為這兩個生態的結合提供更多機會。


>>>>開發者工具和資源

Fleek:讓用戶能為去中心化網路架設網站、存儲和分發文件及開發dapp。Fleek可以讓每一個人(從專業的開發者到日常的互聯網用戶)更容易以去中心化的方式創建app和存儲文件,從而加速去中心化網路的採用率。Fleek可以在Filecoin上進行自動化存檔,並通過ENS(以太坊域名服務)這樣的應用來利用以太坊的生態系統。

https://fleek.co/

Web3.Storage:是一個讓開發者在Filecoin去中心化存儲網路上存取數據的簡單介面。Web3.Storage為開發者(包括以太坊dapp開發者)提供了搭建應用的簡單方式,這些應用可以帶有冗餘的去中心化的存儲以及安全的內容定址數據。

http://web3.storage/

PowerLoom:以去中心化的方式將鏈上和鏈下數據聚合起來以生成帶有密碼學證明的快照。它旨在通過一個豐富的節點和利益相關者生態系統(他們被激勵參與到協議里)來搭建信任,並按需提供洞見。PowerLoom特別適用於以太坊DeFi這樣的生態,這類系統是非常復雜的,而且需要基於驗證的信任。

https://powerloom.io/

>>>>DeFi應用

SecuredFinance(https://secured-finance.com/)是一個綜合平台,整合了基於智能合約的點對點固定利率貸款、抵押品管理服務、貨幣間交易和其他類型的利率產品。Secured Finance的協議是去中心化的點對點金融協議,提供了由以太坊智能合約賦能的區塊鏈上的中後台銀行業務。Secured Finance可以滿足Filecoin網路內的需求,它提供的解決方案能夠滿足Filecoin存儲提供者對FIL貸款的強烈需求。

>>>>數據市場

OceanProtocol(https://t.co/misApE3ggc?amp=1)是一個在Filecoin上搭建的數據市場。Ocean的數據token(data tokens)是以太坊ERC-20 token,可以輕易地用於發布和消費數據服務。如果你有1個數據token,你可以訪問一個特定的數據服務。Ocean market是一個專門為數據服務的去中心化交易所,它分叉了一個Balancer AMM(自動化做市商)來降低gas成本。在這個市場中,用戶可以對數據進行發布、購買、銷售、消費和stake操作。

通過Filecoin,用戶可以利用Ocean來發起自己的Filecoin數據市場,或創建一個Filecoin dataDAO或指數基金。通過Ocean Protocol的工具和Filecoin的去中心化存儲資料庫,我們正見證新生的開放數據經濟。


>>>>視頻應用

LivePeer:是一個去中心化的在線視頻流媒體基礎設施,由以太坊區塊鏈確保安全性。將Filecoin和IPFS結合提供存儲和內容分發功能後,去中心化視頻應用就成為可能了。

https://livepeer.org/

Voodfy:正為私有的視頻架設服務提供去中心化工具。這是一個多功能的安全流媒體解決方案,讓用戶能完全控制自己的內容,這包括了訪問權的設定以及變現的方式。它利用了Livepeer、Ethereum、Textile Powergate和Filecoin.

https://voodfy.com/

VideoCoin:正搭建一個能可靠地創建、存儲和交易基於視頻的NFT解決方案,它可以繞過在以太坊上存儲實際內容時固有的復雜性和費用。VideoCoin正將其去中心化視頻處理網路與Filecoin整合起來,以搭建首個專門為創建和交易視頻NFT服務的平台。這個平台是新生的全球數字收藏品市場急需的一部分。

https://videocoin.io/


>>>>NFT

nft.storage(http://nft.storage/)是一個由Protocol Labs實驗室和Pinata支持的服務,它專門為存儲NFT數據而設計。

nft.storage讓開發者通過內容定址和去中心化存儲來保護其NFT資產和相關的元數據,確保所有的NFT遵循最佳實踐以實現長期的可訪問性。

未來的使用場景


隨著Filecoin和Ethereum生態系統的成長和重疊,會出現更多的新生用例和開發者機會。一些可以進行創新的用例包括:

>>>>可組合的DeFIL

將存儲和Defi的世界結合可以產生一些機會。人們可以將市場訂單(如要價、出價和交易)帶到一個去中心化交易所上,以觀察市場是如何評判這些訂單的價值的。通過這樣的能力,生態系統可以開始想像硬體期貨(hardware futures)和時空期貨(spacetime futures)等的出現。


>>>>數據豐富的NFT

NFT將會越來越復雜,而Web3社區需要 探索 採用數據豐富(data-rich)的NFT的方式。VideoCoin已經將其視頻處理引擎與Filecoin連接起來,以結合以太坊對NFT的支持能力及Filecoin的存儲能力。像VideoCoin這樣的工具可以用來創建一類新型的NFT,如短電影、視頻片段和完整長度的專題特寫。


>>>>按觀看次數支付的媒體

通過在Filecoin上存儲的信息,我們可以利用以太坊的token支持能力去創建由token保護的頁面和媒體(文章、電影和音樂等)。我們可以復制Web2時代的按觀看次數支付模式,而無需復制數據和廣告模型。


這只是一個開始!Filecoin和以太坊生態有長期的協作 歷史 和機會,未來可期。

5. Python3 使用Web3.py查詢以太坊賬戶余額

from web3 import Web3

def QuerryBalanceETH(accounts):

    w3 = Web3(Web3.HTTPProvider('https://mainnet. infura .io/v3/ {此處設置自己託管賬戶ID} '))

    #accounts = w3.eth.accounts

    balance = w3.eth.getBalance(accounts,'latest')#latest表示使用區塊鏈中最後一個塊的狀態,也就是最後的余額

    print('balance@latest => {0}'.format(balance))

    return balance

1、什麼是Infura?

專業一點講,Infura是一種IaaS(Infrastructure as a Service)產品,目的是為了降低訪問以太坊數據的門檻。

通俗一點講,Infura就是一個可以讓你的dApp快速接入以太坊的平台,不需要本地運行以太坊節點。

從程序員的角度講,Infura就是一個Web3 Provider,背後是負載均衡的API節點集群。使用它的好處就是,你永遠不必擔心連接的節點失效的問題,Infura會管理好這一切。

除此之外,Infura還可以很方便地接入IPFS,這是另外一個話題,這里就不討論了。

最後,也是非常重要的一點:Infura目前是免費的。

2、如何使用Infura?

使用Infura首先需要注冊一個賬戶,訪問官網 https://infura.io ,點擊注冊並提供一個郵箱,會收到一封郵件,點擊郵件中的鏈接激活就可以了,然後你就會看到下面的界面:

點擊右上角的黑色按鈕,創建新項目,就可以生成你專屬的Project ID了(左邊的紅框)。

參考文章: https://blog.csdn.net/TurkeyCock/article/details/85103434

6. 為什麼大多數區塊鏈項目不使用java開發

區塊鏈項目對效率的要求比較高,所以大多數核心源碼的開發都是使用c/c++。但是如果是做都區塊鏈項目,除非要對源代碼進行大量的調整,否則也不見得就不選擇使用java。一般的dapp應用,使用java開發應該也是不錯的選擇。比如以太坊區塊鏈的話,針對java的有web3j的類庫,十分方便;比特幣的話有bitcoinj類庫,也很好用。還是要看還是什麼級別的應用,要做什麼,以及團隊的情況吧。

分享兩個java區塊鏈教程:

  1. java比特幣詳解

  2. java以太坊開發

7. 【ETH錢包開發04】web3j轉賬ERC-20 Token

在上一篇文章中講解了ETH轉賬,這一篇講一下ERC-20 Token轉賬。
【ETH錢包開發03】web3j轉賬ETH

1、直接用web3j的API
2、java/Android調用合約的 transfer 方法

不管用哪種方式來轉賬,你都需要先寫一個solidity智能合約文件來創建ERC-20 Token,然後部署合約,最後才是通過客戶端來調用。

注意:erc-20 token轉賬和eth轉賬的區別如下:
1、erc-20 token創建交易對象用的是這個方法 createTransaction

2、erc-20 token需要構建 Function ,它其實對應的就是erc-20 token合約中的那些方法。它的第一個參數就是ERC20中那幾個方法的名稱,第二個參數的話就是對應合約方法中的參數,第三個參數是和第二個參數對應的,按照我那樣就行了。轉賬的話就是 transfer ,我們從合約的 transfer 可以看到第一個參數是收款地址,第二個參數是金額,所以 Function 這里對應起來就好。

這種方法不需要使用web3j封裝的方法,而是直接調用solidity合約的方法。

步驟
1、web3j載入一個已經部署的合約
2、驗證合約是否載入成功 isValid
3、如何載入合約成功,則調用合約的 transfer 方法

注意:
1、這里的 TokenERC20 是根據solidity智能合約生成的對應的Java類,用於java/Android和智能合約交互的,如果你對這里不太清楚,不妨看看我之前的一篇文章。
以太坊Web3j命令行生成Java版本的智能合約

2、如果載入合約失敗,可能的一個原因是合約對應的Java類中的 BINARY 的值不對,這個值是你部署合約成功之後的bytecode,你最好檢查對比一下。

我發送一筆交易,可以通過這個地址查詢
https://rinkeby.etherscan.io/tx/

8. 使用Web3J與第三方合約交互——批量轉賬

之前使用NodeJs與智能合約交互,都是訪問的自己部署的合約。最近要對線上第三方合約進行轉賬操作,人數比較多,一筆筆操作起來手指都點斷了還容易出錯。既然代幣Token都遵守ERC20協議,肯定有統一的Transfer(轉賬)方法供客戶端調用,那麼編寫程序實現自動轉賬應該可以實現,去查了相關資料發現web3j是不錯的選擇。

輕量級客戶端與以太坊交互的Java庫。

既然是調用第三方合約那麼肯定需要知道合約地址,合約地址定義了到哪裡去訪問合約;
ABI(Application Binary Interface): 應用程序二進制介面,定義了智能合約提供的方法功能

若是無法獲取到ABI介面,也可以使用solc編譯生產bin和abi文件。

(生產代理類時可以指定包路徑和類名)

這樣一來,便可以使用程序完成批量轉賬操作。

後來研究發現,使用NodeJs直接調用Web3也可以實現對應功能,不過還是對Java更熟悉一些,就採用了Java的方式。

9. 【ETH錢包開發02】導入錢包

本文主要講解通過助記詞、keystore、私鑰 3種方式來導入錢包。導入錢包就是說根據輸入的這3者中的一個去重新生成一個新的錢包。導入錢包的過程和創建的過程其實是差不多的。

根據助記詞導入錢包不需要原始密碼,密碼可以重新設置。根據用戶輸入的助記詞,先驗證助記詞的合規性(格式、個數等),驗證正確後,配合用戶輸入的密碼重新生成一個新的錢包。

驗證助記詞的合規性(格式、個數等)

助記詞導入錢包

通過私鑰導入錢包其實和創建錢包的過程基本一致。因為私鑰在導出的時候轉換成了16進制,所以在導入私鑰的時候,要把16進制轉換為byte數組。

keystore就是錢包文件,實際上就是錢包信息的json字元串。導入keystore是需要輸入密碼的,這個密碼是你最後導出keystore時的密碼。將keystore字元串變成walletFile實例再通過 Wallet.decrypt(password, walletFile); 解密,成功則可以導入,否則不能導入。

這是Web3j的API,程序走到這里經常OOM!

具體原因的話,我就不多說了,細節大家可以看這里
https://www.jianshu.com/p/41d4a38754a3

解決辦法
根據源碼修改 decrypt 方法,這里我用一個已經修改好的第三方庫

修改後的解密方法

導入Kestore

1、導入助記詞和私鑰是不需要以前的密碼的,而是重新輸入新的密碼;導入Keystore則需要以前的密碼,如果密碼不正確,會提示地址和私鑰不匹配。

2、關於備份助記詞
用過imtoken的同學可以看到imtoken是可以導出(備份)助記詞的。這個一開始我也很困惑,後來了解到其實它實在創建錢包的時候,在app本地保存了助記詞,導出只是講數據讀取出來而已。還有一點,imtoken一旦備份了助記詞之後,之後就沒有備份那個功能了,也就是說助記詞在本地存儲中刪除了;而且導入錢包的時候也是沒有備份助記詞這個功能的。

10. 以太坊如何使用web3.js或者rpc介面獲取交易數據交易時間與確認數

如果要查詢主網上的交易記錄,可以使用etherscan。但是,如果是你自己搭建的私鏈,應該如何查詢交易記錄呢?

答案是你需要自己監聽鏈上的日誌,存到資料庫里,然後在這個資料庫中查詢。例如:

varaddr=""
varfilter=web3.eth.filter({fromBlock:0,toBlock:'latest',address:addr});
filter.get(function(err,transactions){
transactions.forEach(function(tx){
vartxInfo=web3.eth.getTransaction(tx.transactionHash);
//這時可以將交易信息txInfo存入資料庫
});
});

web3.eth.filter()用來監聽鏈上的日誌,web3.eth.getTransaction()用來提取指定交易的信息,一旦獲得交易信息,就可以存入資料庫供查詢用了。

推薦一個實戰入門,你可以看看:以太坊教程

閱讀全文

與以太坊web3j介面相關的資料

熱點內容
萊特幣風波 瀏覽:576
魔卡比特幣 瀏覽:945
挖比特幣機現在可以上嗎 瀏覽:147
區塊鏈玩客猴免費猴 瀏覽:885
礦池實時算力6 瀏覽:774
速問視頻股權兌BTC 瀏覽:861
數字貨幣收費群 瀏覽:223
以太坊最高算力的機器 瀏覽:817
數字貨幣提款機北京 瀏覽:227
比特幣多久可以賣 瀏覽:362
可以用電腦挖礦的 瀏覽:682
數字貨幣縮量 瀏覽:243
區塊鏈技術和ico 瀏覽:462
比特幣2月10日價格 瀏覽:530
區塊鏈中的哈希值是什麼 瀏覽:783
ipfs礦機安裝多少天可以挖礦 瀏覽:115
javarpc以太坊 瀏覽:18
以太坊有消耗嗎 瀏覽:861
以太坊五月 瀏覽:170
虛擬貨幣KB 瀏覽:140