以太坊合約創建失敗
1. 用Go來做以太坊開發④智能合約
在這個章節中我們會介紹如何用Go來編譯,部署,寫入和讀取智能合約。
與智能合約交互,我們要先生成相應智能合約的應用二進制介面ABI(application binary interface),並把ABI編譯成我們可以在Go應用中調用的格式。
第一步是安裝 Solidity編譯器 ( solc ).
Solc 在Ubuntu上有snapcraft包。
Solc在macOS上有Homebrew的包。
其他的平台或者從源碼編譯的教程請查閱官方solidity文檔 install guide .
我們還得安裝一個叫 abigen 的工具,來從solidity智能合約生成ABI。
假設您已經在計算機上設置了Go,只需運行以下命令即可安裝 abigen 工具。
我們將創建一個簡單的智能合約來測試。 學習更復雜的智能合約,或者智能合約的開發的內容則超出了本書的范圍。 我強烈建議您查看 truffle framework 來學習開發和測試智能合約。
這里只是一個簡單的合約,就是一個鍵/值存儲,只有一個外部方法來設置任何人的鍵/值對。 我們還在設置值後添加了要發出的事件。
雖然這個智能合約很簡單,但它將適用於這個例子。
現在我們可以從一個solidity文件生成ABI。
它會將其寫入名為「Store_sol_Store.abi」的文件中
現在讓我們用 abigen 將ABI轉換為我們可以導入的Go文件。 這個新文件將包含我們可以用來與Go應用程序中的智能合約進行交互的所有可用方法。
為了從Go部署智能合約,我們還需要將solidity智能合約編譯為EVM位元組碼。 EVM位元組碼將在事務的數據欄位中發送。 在Go文件上生成部署方法需要bin文件。
現在我們編譯Go合約文件,其中包括deploy方法,因為我們包含了bin文件。
在接下來的課程中,我們將學習如何部署智能合約,然後與之交互。
Commands
Store.sol
solc version used for these examples
如果你還沒看之前的章節,請先學習 編譯智能合約的章節 因為這節內容,需要先了解如何將智能合約編譯為Go文件。
假設你已經導入從 abigen 生成的新創建的Go包文件,並設置ethclient,載入您的私鑰,下一步是創建一個有配置密匙的交易發送器(tansactor)。 首先從go-ethereum導入 accounts/abi/bind 包,然後調用傳入私鑰的 NewKeyedTransactor 。 然後設置通常的屬性,如nonce,燃氣價格,燃氣上線限制和ETH值。
如果你還記得上個章節的內容, 我們創建了一個非常簡單的「Store」合約,用於設置和存儲鍵/值對。 生成的Go合約文件提供了部署方法。 部署方法名稱始終以單詞 Deploy 開頭,後跟合約名稱,在本例中為 Store 。
deploy函數接受有密匙的事務處理器,ethclient,以及智能合約構造函數可能接受的任何輸入參數。我們測試的智能合約接受一個版本號的字元串參數。 此函數將返回新部署的合約地址,事務對象,我們可以交互的合約實例,還有錯誤(如果有)。
就這么簡單:)你可以用事務哈希來在Etherscan上查詢合約的部署狀態: https://rinkeby.etherscan.io/tx/
Commands
Store.sol
contract_deploy.go
solc version used for these examples
這寫章節需要了解如何將智能合約的ABI編譯成Go的合約文件。如果你還沒看, 前先讀 上一個章節 。
一旦使用 abigen 工具將智能合約的ABI編譯為Go包,下一步就是調用「New」方法,其格式為「New<contractname style="box-sizing: border-box; font-size: 16px; -ms-text-size-adjust: auto; -webkit-tap-highlight-color: transparent;">」,所以在我們的例子中如果你 回想一下它將是 NewStore 。 此初始化方法接收智能合約的地址,並返回可以開始與之交互的合約實例。</contractname>
Commands
Store.sol
contract_load.go
solc version used for these examples
這寫章節需要了解如何將智能合約的ABI編譯成Go的合約文件。如果你還沒看, 前先讀 上一個章節 。
在上個章節我們學習了如何在Go應用程序中初始化合約實例。 現在我們將使用新合約實例提供的方法來閱讀智能合約。 如果你還記得我們在部署過程中設置的合約中有一個名為 version 的全局變數。 因為它是公開的,這意味著它們將成為我們自動創建的getter函數。 常量和view函數也接受 bind.CallOpts 作為第一個參數。了解可用的具體選項要看相應類的 文檔 一般情況下我們可以用 nil 。
Commands
Store.sol
contract_read.go
solc version used for these examples
這寫章節需要了解如何將智能合約的ABI編譯成Go的合約文件。如果你還沒看, 前先讀 上一個章節 。
寫入智能合約需要我們用私鑰來對交易事務進行簽名。
我們還需要先查到nonce和燃氣價格。
接下來,我們創建一個新的keyed transactor,它接收私鑰。
然後我們需要設置keyed transactor的標准交易選項。
現在我們載入一個智能合約的實例。如果你還記得 上個章節 我們創建一個名為 Store 的合約,並使用 abigen 工具生成一個Go文件。 要初始化它,我們只需調用合約包的 New 方法,並提供智能合約地址和ethclient,它返回我們可以使用的合約實例。
我們創建的智能合約有一個名為 SetItem 的外部方法,它接受solidity「bytes32」格式的兩個參數(key,value)。 這意味著Go合約包要求我們傳遞一個長度為32個位元組的位元組數組。 調用 SetItem 方法需要我們傳遞我們之前創建的 auth 對象(keyed transactor)。 在幕後,此方法將使用它的參數對此函數調用進行編碼,將其設置為事務的 data 屬性,並使用私鑰對其進行簽名。 結果將是一個已簽名的事務對象。
現在我就可以看到交易已經成功被發送到了以太坊網路了: https://rinkeby.etherscan.io/tx/
要驗證鍵/值是否已設置,我們可以讀取智能合約中的值。
搞定!
Commands
Store.sol
contract_write.go
solc version used for these examples
有時您需要讀取已部署的智能合約的位元組碼。 由於所有智能合約位元組碼都存在於區塊鏈中,因此我們可以輕松獲取它。
首先設置客戶端和要讀取的位元組碼的智能合約地址。
現在你需要調用客戶端的 codeAt 方法。 codeAt 方法接受智能合約地址和可選的塊編號,並以位元組格式返回位元組碼。
你也可以在etherscan上查詢16進制格式的位元組碼 https://rinkeby.etherscan.io/address/#code
contract_bytecode.go
首先創建一個ERC20智能合約interface。 這只是與您可以調用的函數的函數定義的契約。
然後將interface智能合約編譯為JSON ABI,並使用 abigen 從ABI創建Go包。
假設我們已經像往常一樣設置了以太坊客戶端,我們現在可以將新的 token 包導入我們的應用程序並實例化它。這個例子里我們用 Golem 代幣的地址.
我們現在可以調用任何ERC20的方法。 例如,我們可以查詢用戶的代幣余額。
我們還可以讀ERC20智能合約的公共變數。
我們可以做一些簡單的數學運算將余額轉換為可讀的十進制格式。
同樣的信息也可以在etherscan上查詢: https://etherscan.io/token/?a=
Commands
erc20.sol
contract_read_erc20.go
solc version used for these examples
2. 在區塊鏈中以太坊(eth)目前有哪些問題
在區塊鏈中以太坊(eth)目前有哪些問題?
以太坊區塊鏈目前暴露出三大問題,長時間以來其創始人Vitalik
Buterin一直無力解讀。第一是以太坊區塊鏈整體很低的性能和TPS;第二是資源不隔離,CryptoKitties虛擬貓咪的事件,一度占據了整個以太坊
20%
的流量,直接造成以太坊網路用戶無法展開及時的交易,就是資源不隔離最大的痛點;第三個問題在於以太坊治理結構的體現,區塊鏈作為去中心化的分布式賬本,以太坊過去以來,創始人團隊主導了其網路發展,過於中心化的治理模式,讓目前的以太坊出現了ETH、ETC、ETF等分叉,以太坊社區目前進入四分五裂的治理狀態。而以太坊網路目前出現的各種弊病,在「aelf」創始人與CEO馬昊伯看來,這是無法接受的。於是,「aelf」定位,就是為對標以太坊的下一代去中心化底層計算平台,重點解決目前以太坊存在的性能不足、資源不隔離、治理結構三方面的問題而誕生的。
3. 以太坊gas limit什麼意思
一、智能合約這么好,可不是白用的
智能合約,顧名思義,是指計算機代碼可以自動執行的合同;以太坊虛擬機是用來執行智能合約的;智能賬戶是智能合約能夠被執行的載體。換句話說,智能賬戶,這個「賬戶」是可以被以太坊虛擬機操控的,依據什麼操控呢,依據智能合約來操控。
天下沒有免費的午餐,智能合約這個功能這么好,可不是白用的,你在以太坊進行交易的時候也要付給礦工手續費的,那麼在以太坊系統上,你要付出的手續費是怎麼回事,
Gas和手續費之間又有什麼關聯呢?
二、以太坊 Gas 是怎麼回事?
以太坊Gas類似於汽車燃油,智能合約的驅動,需要以太坊Gas。Gas是一個英文單詞,中文意思是:瓦斯、汽油,這個東西在日常生活中,是一種消耗品。以太坊為什麼會產生「燃料」呢?
以太坊裡面的Gas是什麼意思呢?其實,以太坊的Gas和交易費息息相關。以太坊交易需要手續費,這個Gas就是以太坊手續費的計算模式。
在以太坊的設定中,交易費類似於一種加密的燃料,也就是Gas,這個東西可以驅動智能合約的運動。當以太坊在區塊鏈上執行交易時,燃料將按照特點的規則而逐漸被消耗。
從這一點看呢,Gas真的是和它的本意一樣,像汽車燃油一樣,想要發動汽車,必須需要燃油。
三、以太坊 Gas 和比特幣交易費有哪不同?
說到手續費,大家可能很熟悉。天下沒有免費的午餐,無論是以太坊,還是比特幣,都需要手續費,但是二者的手續費模式是不一樣的。比特幣是直接支付比特幣作為轉賬手續費的,以太坊卻不是這樣的。
以太坊本質上是一個虛擬機,這個虛擬機是去中心化的,全世界各國人民各自掌控的虛擬機,聯合起來形成一個「世界級的計算網路」。當你發送token,執行合約、轉移以太坊,或者在區塊上做其他事情時,計算機在處理這筆交易時,需要進行計算,這個計算過程需要消耗網路資源。這樣一來,你必須支付「燃料費」(也就是Gas),才能讓計算機為你工作,讓礦工為你處理交易。
通常情況下,發送方願意支付的Gas價格越高,礦工從交易中獲得的價值就越大,礦工們也就越有可能選擇這個交易。通過這種方式,礦工可以自由地選擇交易。為了給發送者設置Gas 價格做參考,礦工們可以直接提出他們執行交易所需的最低Gas 價格。
四、以太坊 Gas 的消耗量該如何計算?
以太坊虛擬機處理交易時,虛擬機會根據交易中確定的一個一個的操作指令進行逐個處理,而每個操作指令都有明文規定的Gas消耗量。
以太坊系統規定了兩個賬戶:一個是正常賬戶,一個是智能賬戶。
普通的轉賬交易,也就是調用「正常賬戶」,所需要的Gas是固定的21000;
而調用「智能賬戶」的的話,因為智能合約的復雜程度不同,使得所需要的Gas也不同。處理交易佔用的資源(計算量、內存等)越多,那麼所需要的Gas也就越多,比如:執行一次加法運算將消耗 3Gas,如果執行更復雜的運算,那麼消耗的Gas就更多。
那麼大家可能會問一個問題:當用戶的交易涉及一個惡意的智能合約,這個合約超級復雜,執行這個合約要消耗無限的燃料,怎麼辦呢?以太坊系統的方案是:為了避免惡意
智能合約引起無限的Gas消耗,用戶需要在發送交易時設定允許消耗的燃料上限,即
GasLimit,這樣一來,就算有惡意智能合約,最壞情況也只是消耗 GasLimit 所規定的燃料范圍之內。
五、以太坊 Gas 和交易手續費有什麼關系?
以太坊上,你所支付的手續費等於:GasPrice 乘以GasUsed。
你可以把 GasPrice 理解為是燃油單價, GasUsed 理解為汽車所需多少升燃油。
對於汽車,假如說每升汽油是20塊錢,一萬升汽油就是20萬塊錢。對於以太坊,每
Gas是20吉偉(吉偉是以太幣的數量單位),一萬個 Gas 就是:20乘以一萬,等於20 萬吉偉,2萬吉偉等於0.0002以太坊,也就是說,本次交易手續為 0.0002以太坊。
具體的兌換值見下表:
圖
(注釋:以太幣數量的基礎單位是「偉」,以太幣的數量單位有「偉、芬尼、以太」,其中,「以太」被用作普通交易;「芬尼」被用作微交易;「薩博」和「偉」被用作進行關於費用和合約實施。)由此我們可以發現,Gas並不是以太坊,它是一種單獨的體系,它的匯率與以太坊成一定的比例,經過了比例兌換,最終形成交易費。
具體的匯率查詢,可以查看以下網站:
https://jin10086.github.io/etherconVerter/
Gas價格和以太幣價格都是由市場自由調節的,但是二者是不一樣的,他們的不同之處在於:以太幣的價格是根據市場情況波動,而Gas的價格由礦工決定的,如果燃料價格低於礦工們的最低要求,礦工就會拒絕處理交易。Gas和以太坊分離,可以保護系統免受隨著以太坊價格的快速變化而可能出現的波動。
通常來講,大部分礦工都會選擇利益優先,處理交易時候,他們會按Gas價格從高到底排列,優先處理Gas價格高的,如果你很著急交易 ,就需要提高Gas價格,讓礦工早點看到你;如果你不著急呢,你只需要設定一個Gas價格,這個價格在礦工設置的Gas價格底線之上就行了。
六、Gas 是怎麼獲取的呢?
實際上,Gas就是從礦工那裡購買的以太幣,用戶自己賬戶中的以太幣就可以向礦工購買Gas,以太坊客戶端根據指定的交易最大支出限額,自動用以太坊購買Gas。
七、Gas 最後去了哪裡?
每筆交易,交易發起方都要設置交易的Gas限定和 Gas價格,不同的操作會產生不同的Gas成本,Gas用完時礦工將停止執行,使用的Gas會作為獎勵,獎勵給挖礦的礦工,這將涉及到幾下幾種情況:
第一種情況是,如果有剩餘Gas,那麼這些剩餘的Gas會退還給交易發起方或智能合約創建者,比如我發送1個以太坊給依依,我設置的 Gas limit 是 5萬,正常需要消耗的Gas是21000,,那麼,剩下沒有被消耗的29000會返還給我。
第二種情況是,如果我設置的Gas limit太低,或者我賬號中的以太坊不足以支付我的Gas消耗,那麼,這筆交易會因為Gas不足而被取消,並且用於計算的Gas不會退回到我的賬戶。
第三種情況是,如果交易失敗,我也必須為已經佔用的計算資源來支付手續費。
八、怎麼設置合理的 Gas 價格?
每次交易之前,可以查詢這個網站來確認需要設置的Gas價格: https://ethGasstation.info/總結一下,這篇文章我們主要介紹了以太坊的Gas和手續費:Gas相當於燃油,你在以太坊虛擬機上處理交易,會消耗計算資源,也就是Gas。在以太坊上,你所支付的手續費等於:GasPrice 乘以GasUsed,也就是:Gas的單價乘以消耗掉的Gas總量。操作的復雜程度不同,產生的Gas成本也不同,Gas用完時,礦工將停止執行,使用的Gas會作為獎勵,獎勵給挖礦的礦工,礦工會優先選擇Gas價格出的高的交易者。
4. 在Opensea上創建NFT怎麼總是顯示失敗
格式不對的。
OpenSea是NFT的在線帶盯交易市場。Opensea由DevinFinzer和AlexAtallah於2017年12月20日在紐約創立。用戶可以在OpenSea上免費生成NFT,並將其提供給直接購買或拍賣。OpenSea主要基於以太坊ERC-721標准和Polygon(以太坊的第2層擴展解決方案)。OpenSea於2018年經歷YCombinator的種子輪融資。在2019年11月,OpenSea籌集了210萬美元的風險投資(主要來自AnimocaBrands)。2021年3月,OpenSea又籌集了2300萬美蠢掘和元的風險投資(主要來自A16z資本)。2021年7月散搏,OpenSea宣布了另一輪1億美元的融資。
5. 以太坊升級失敗質押怎麼辦
刷怪物升級。在玩游戲的時候,游戲玩家都會通過不同的方式,對游戲內的設置進行升級,以太坊升級指數不達標就會顯示升級失敗,這種情況需要在游戲內刷怪物進行升級然後就可以升級成功了。出自《怪物聯盟》。
6. 以太坊的智能合約
智能合約是運行在計算機裡面的,用於保證讓參與方執行承諾的代碼,般情況下,普通合約上記錄了甲方與乙方各方面的關系條款,並通常是通過法律強制執行或保護的,而「智能合約」則是用密碼或密鑰來執行關系。以更加直接的角度來理解的話,即「智能合約」的程序內容將同-開始大家一起設定好的那樣百分百執行,並且零差錯。
舉個例子,以太坊用戶可以使用智能合約在特定日期向朋友發送10個以太幣。在這種情況下,用戶可以操作創建一個合約,然後將程序推人該合約中進行特殊計算,以便它能夠執行所需的命令。而以太坊就是專門把精力集中在這件事上的這么一個平台。
比特幣是第一個支持「智能契約」的資源幣種,因為網路的價值在於把價值或數據從一個點或人轉移到另一個點或人身上。節點網路只在滿足某些條件時才會進行驗證,但是,比特幣僅限於貨幣用例。相反,以大坊取代了比特幣那種帶有不小限制性的編程語言,取而代之的是一種允許開發人員編寫自己程序的語言。以太坊允許開發人員編寫他們自己的「智能契約」,即「自主代理」或「自治代理」,正如ETH白皮書所稱的那樣。該編程語言是「圖靈完備」語言,這意味著它支持一組更廣泛的計算指令。智能合約能做些什麼呢?
1.「多簽名」賬戶功能,只有在一定比例的人同意時才能使用資金。這個功能經常用在與眾籌或募捐類似的活動中。
2.管理用戶之間所簽訂的協議。例如,一方從另一方購買保險服務3.為其他合同提供實用程序。
4.存儲有關應用程序的信息,如「域注冊信息」或「會員信息記錄」。概念有時候比較晦澀,我們舉一個募捐的智能合約的例子來幫助理解:假設我們想向全網用戶發起募捐,那就可以先定義一個智能賬戶,它有三個狀態:當前募捐總量,捐款目標和被捐贈人的地址,然後給它定義兩個函數:接收募捐函數和捐款函數。
接收募捐函數每次收到發過來的轉賬請求,先核對下發送者是否有足夠多的錢(EVM會提供發送請求者的地址,程序可以通過地址獲取到該人當前的區塊鏈財務狀況),然後每次募捐麗數調用時,都會比較下當前募捐總量跟捐款目標的比較,如果超過目標,就把當前收到的捐款全部發送到指定的被捐款人地址,否則的話,就只更新當前募捐總量狀態值。
捐款函數將所有捐款發送到保存的被捐贈人地址,並且將當前捐款總量清零。每一個想要募捐的人,用自己的ETH地址向該智能賬戶發起一筆轉賬,並且指明了要調用接受其募捐函數。於是我們就有一個募捐智能合約了,人們可以往裡面捐款,達到限額後錢會自動發送到指定賬戶,全世界的礦工都在為這個合約進行計算和擔保,不再需要人去盯著看有沒有被挪用,這就是智能合約的魅力所在。
7. 以太坊區塊鏈之Bug --2020/05/19
為了防止交易重播,ETH(ETC)節點要求每筆交易必須有一個nonce數值。每一個賬戶從同一個節點發起交易時,這個nonce值從0開始計數,發送一筆nonce對應加1。當前面的nonce處理完成之後才會處理後面的nonce。注意這里的前提條件是相同的地址在相同的節點發送交易。
以下是nonce使用的幾條規則:
● 當nonce太小(小於之前已經有交易使用的nonce值),交易會被直接拒絕。
● 當nonce太大,交易會一直處於隊列之中,這也就是導致我們上面描述的問題的原因;
● 當發送一個比較大的nonce值,然後補齊開始nonce到那個值之間的nonce,那麼交易依舊可以被執行。
● 當交易處於queue中時停止geth客戶端,那麼交易queue中的交易會被清除掉。
第一個欄位 AccountNonce ,直譯就是賬戶隨機數。它是以太坊中很小但也很重要的一個細節。以太坊為每個賬戶和交易都創建了一個Nonce,當從賬戶發起交易的時候,當前賬戶的Nonce值就被作為交易的Nonce。這里,如果是普通賬戶那麼Nonce就是它發出的交易數,如果是合約賬戶就是從它的創建合約數。
為什麼要使用這個Nonce呢?其主要目的就是為了防止重復攻擊(Replay Attack)。因為交易都是需要簽名的,假定沒有Nonce,那麼只要交易數據和發起人是確定的,簽名就一定是相同的,這樣攻擊者就能在收到一個交易數據後,重新生成一個完全相同的交易並再次提交,比如A給B發了個交易,因為交易是有簽名的,B雖然不能改動這個交易數據,但只要反復提交一模一樣的交易數據,就能把A賬戶的所有資金都轉到B手裡。
當使用賬戶Nonce之後,每次發起一個交易,A賬戶的Nonce值就會增加,當B重新提交時,因為Nonce對不上了,交易就會被拒絕。這樣就可以防止重復攻擊。當然,事情還沒有完,因為還能跨鏈實施攻擊,直到EIP-155引入了chainID,才實現了不同鏈之間的交易數據不兼容。事實上,Nonce並不能真正防止重復攻擊,比如A向B買東西,發起交易T1給B,緊接著又提交另一個交易T2,T2的Gas價格更高、優先順序更高將被優先處理,如果恰好T2處理完成後剩餘資金已經不足以支付T1,那麼T1就會被拒絕。這時如果B已經把東西給了A,那A也就攻擊成功了。所以說,就算交易被處理了也還要再等待一定時間,確保生成足夠深度的區塊,才能保證交易的不可逆。
Price 指的是單位Gas的價格,所謂Gas就是交易的消耗,Price就是單位Gas要消耗多少以太幣(Ether),Gas * Price就是處理交易需要消耗多少以太幣,它就相當於比特幣中的交易手續費。
GasLimit 限定了本次交易允許消耗資源的最高上限,換句話說,以太坊中的交易不可能無限制地消耗資源,這也是以太坊的安全策略之一,防止攻擊者惡意佔用資源。
Recipient 是交易接收者,它是common.Address指針類型,代表一個地址。這個值也可以是空的,這時在交易執行時,會通過智能合約創建一個地址來完成交易。
Amount 是交易額。這個簡單,不用解釋。
Payload 比較重要,它是一個位元組數組,可以用來作為創建合約的指令數組,這時每個位元組都是一個單獨的指令;也可以作為數據數組,由合約指令來進行操作。合約由以太坊虛擬機(Ethereum Virtual Machine,EVM)創建並執行。
V、R、S 是交易的簽名數據。以太坊當中,交易經過數字簽名之後,生成的signature是一個長度65的位元組數組,它被截成三段,前32位元組被放進R,再32位元組放進S,最後1個位元組放進V。那麼為什麼要被截成3段呢?以太坊用的是ECDSA演算法,R和S就是ECSDA簽名輸出,V則是Recovery ID。
R,S,V是交易簽名後的值,它們可以被用來生成簽名者的公鑰;R,S是ECDSA橢圓加密演算法的輸出值,V是用於恢復結果的ID
8. 【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/
9. 關於以太坊ETH合並的錯誤觀點理清
隨著合並的臨近,越來越多的文章在向人們發出信號:它確實快要臨近了。這也帶來了和 PoS 相關的一系列問題的討論,人們在反復討論著同樣的話題和同樣的誤解。在上周 Kiln 測試網成功合並時,我已經在一定程度上看到了這一狀況,今後我們還會看到更多類似的東西,所以我將一些常見的問題、觀點歸納如下。
每當看到有人提出這些觀點時,我就可以把這篇文章分享給他,我希望大家也可以這樣做。如果本文存在一些紕漏,還望斧正或提出補充建議。
什麼是合並?
更多的信息可以在 ethmerge.com 上找到,所以本部分將簡單介紹。
在合並之後,Ethereum 將採取 PoS(股權證明)而不是 PoW(工作量證明)共識。合並並非「ETH 2.0」、也不存在「ETH 2.0」,這已經是一個過時的術語。
如果是 ETH 持有者,則不需要做任何事情。合並後你仍將持有相同數量的 ETH,沒有「ETH2 幣」,也不需要進行任何遷移。一切都完全相同,只有共識機制發生了變化。
之所以被稱為「合並」,是因為 ETH 將信標鏈(共識層)與現存的鏈(執行層)合並,並拋棄了執行層的 PoW 部分。
解釋一下,「共識」只是一個花哨的詞彙,其含義是指如何對交易進行排序並保證安全性。PoW 和 PoS 都是實現共識的不同手段。
PoW:"打亂區塊順序的成本太高了,因為按規則辦事更劃算。"
PoS:「擾亂區塊順序的成本太高了,因為如果我這樣做就會失去我抵押的所有錢。」
由於只是共識機制的改變,PoS 本身並不會大幅降低 Gas 費用。
為什麼合並?
降低安全成本,因為達成共識所需的能源更少。
對於 PoW 來說,收益需要為礦工使用的所有硬體和能源買單,否則將無人再去挖礦。這就需要大量發行並迅速賣出 Ethereum 以換取法幣來支付賬單。
而 PoS 則不然,PoS 只需要支付給投機者一些收益,讓人們願意存入資本,而不是直接投資到其他地方。除了一台普通的電腦和互聯網連接之外,並不需要支付大額賬單。所以收益率只需要反映所涉及的機會成本和風險。
更具可持續性。
一條鏈的安全性基本上與它的市值成正比。無論是 PoW(更高價值的 Token 獎勵 = 更有理由按規則行事 = 更多的礦工 = 更難以破壞共識)或 PoS(更高價值的抵押 Token = 更有理由按規則行事以避免失去抵押品)都是如此。
新發行的 Token 本質上是將價值從所有持幣人身上轉移走,並重新分配給特定的人。在其他條件相同的情況下,將這些 Token 賣出可以從網路中提取價值。
這為未來的許多擴容解決方案打開了大門:數據分片、無狀態、輕客戶端等等。
通過分離執行層和共識層,這將有助於降低未來的代碼復雜性。
安撫環境和 游戲 玩家當然是一個積極的副作用,但這並非是切換到 PoS 的主因。切換更多是由於外部因素導致的,Ethereum 作為一個協議並沒有對整個網路太多的控制權,例如能源生產、GPU 供應鏈等等。
何時合並?
目前官方尚未公布日期。綜合各方面的原因,開發者和社區對 6 月中旬合並持謹慎樂觀的態度
目前仍在測試之中,在開發人員完全確信不會出現錯誤之前,不會進行合並。
我個人不把希望寄託在 6 月,但我認為至少也會在夏季完成,除非在測試過程中出了極大的問題。例如,出現一個需要幾周時間來修復的關鍵錯誤,或者規範本身存在需要幾個月時間來修復的漏洞。
難度炸彈被設置在 6 月,所以無論屆時是否進行合並,都將進行一次硬分叉。
建議將 wenmerge. com 存入書簽,以便快速查看測試網合並的最新預估。
流傳已久的錯誤觀點
觀點:「你這個白痴!開發團隊會像過去一樣拖延,早在數年前他們就應允合並了,但至今仍未兌現。」
首先是一些說明:現在仍未宣布正式的合並日期,此前也從來宣布過。一個本就不存在的最後期限,何來的拖延之說呢?
類似於「將在 2018 年轉換為 PoS」的說法來自於極端樂觀的態度,並且低估了 PoS 設計的復雜性和從 PoW 到 PoS 的安全過渡的復雜性。此前開發者所做的工作相當於部分完成了 Casper FFG 規范(一個混合 PoW 和 PoS 的機制),但它最終被廢止了。現狀已經存在很多不同了:
經過多年的研究、對潛在的攻擊方向進行分析,現在擁有一個完整的協議規范。
客戶端已經實現,現在只差測試尚未進行。
合並時所有人都在工作,除了合並外沒有其他工作。合並所需的必要步驟都已完成。這甚至不是「他們已經完成了像 EIP1559 這樣復雜的內容,所以現在可以把更多的注意力集中在合並上」,而是:「他們把所有的注意力都集中在合並上」。不可能會出現這種狀況:因為開發者需從事其他內容的工作而導致合並再次被推遲。在合並完成之前,他們沒有其他事情可以做。
自 2020 年 12 月以來,PoS 實際上正在以信標鏈的形式運行。這意味著以太坊的 PoS 已經在生產環境中進行了一年多的測試(在一定程度上),目前有超過 1000 萬 ETH 在運行。它只是還沒有為執行層生產區塊而已。
觀點:「數以百萬計的質押 ETH 將在解鎖的那一刻崩盤。」
可以肯定的是,會有大量的鎖倉者想要最終獲利,尤其是那些在 32 個 ETH 僅價值 1 萬美元時就鎖定了 ETH 的人。但從一角度來看,還有很多需要考慮的問題。
合並並不會解鎖任何 ETH。解鎖將在合並後的第一次硬分叉中進行,可能是 6-8 個月後。這意味著數個月內都將沒有 PoW 方式增發的 ETH(約 13000 ETH/天)被拋售,也沒有 PoS 增發的 ETH 進入流通。
就像存 ETH 要排隊一樣,取 ETH 也要排隊。假設發生大規模拋售事件,每個人都將處於排隊之中,以每天 1125 名的速度依次解鎖。所以不存在 "開閘放水 "的時刻。每個人解凍都需要一年多的時間,一年的時間里,每天有約 38000 個 ETH 進入流通領域(大約是日均量的 1%)。
合並後,驗證者也將開始收到費用獎勵,有預估表明收益率或將翻倍。現在有成千上萬的人在排隊等待進入質押。他們既然可以接受 5% 的 ETH 收益率,我不認為他們會在收益率變成 10% 的時候放棄存入。
到目前為止,抵押所涉及的最大風險是合並本身。一些災難性的事情可能會導致合並出錯,盡管存在這種風險、盡管 ETH 被鎖定到一個未知的未來日期,但人們已經鎖定他們的 ETH 一年多了。有多少人或機構還願意袖手旁觀、等待這種風險消失後再進入呢?
抵押者退出就意味著更少的驗證者,這意味著對不退出的抵押者有更高的獎勵。這也意味著更能激勵其他之前未投資的人開始投資......
當然,這是加密世界,讓加密歸於加密。合並將帶來興奮和波動,可能會出現「sell the news」的跌幅,誰又知道呢?我不會假裝預知未來,但在我看來,更多的 ETH 可能會流入、而不是流出鎖倉。
觀點:「如果 PoS 這么好,Ethereum 為什麼不從一開始就這樣做呢?」
PoW 很容易概念化並實現,PoS 則不然。當我們回到 2014 年,PoS 尚是一個仍在研究的理論概念,只有一些區塊鏈實施了它的某種特定版本。
在考慮實施 PoS 之前,需要從研究角度解決一些基本問題。
沒有放之四海而皆準的 PoS。每個 PoS 區塊鏈都有自己的 PoS 規范,在各方面都有優缺點,所以這並非是「這個鏈做到了,為什麼 Ethereum 不能做同樣的事情」這樣簡單。
以一個 PoW 鏈作為開始,讓任何人都可以在無需許可的條件下開采 crypto,這讓 crypto 的分發機制比那些最初就是 PoS 的鏈要好得多。因為那些鏈從最初就是 PoS,這樣必須決定如何分配初始 crypto,而不是無需許可的分發 Crypto。
Ethereum 存在預挖、預售,但經過多年的換手,現在已經稀釋到一半左右,使其分布更接近 BTC 的分布。所以在 2022 年,當 ETH 作為流動性極強且易於獲得的資產時,這並不是什麼大問題。
觀點:「這實際上只是在多年努力後最後一次坑害礦工的伎倆。」
從第一天起,PoS 就是最終的目標,每個人在挖礦時都知道它早晚有一天會結束。這里並沒有什麼不公正的事情發生。
經濟因素勝過任何形式的礦工對鏈的忠誠度。你可以把一條鏈看作是一個企業,把礦工看作是雇員。
礦工/雇員已經為他們提供的服務(即安全共識)獲得了區塊獎勵。工資由僱主支出,它來自於稀釋現有持幣者的價值。
礦工流向提供獎勵最高的鏈,如果有另一個可由 GPU 開採的 crypto 可以提供更多的獎勵,大多數礦工會立即拋棄 Ethereum。
類似地,如果驗證者能夠以更低的價格完成它所需要的服務,那麼 Ethereum 將支付更少的費用。
這並不完全是排他性的。礦工也可以 ETH 的持有者,以及區塊鏈的使用者。沒有什麼能阻止他們成為抵押者並獲取抵押獎勵。
觀點:「如果挖礦沒有花費現實世界的能源,則這枚 crypto 就不再具有內在價值。」
我不太相信這種說法。反復計算哈希值直到找到一個符合任意要求的哈希值,這並沒有什麼神奇之處。我的意思是,PoW 的區塊鏈其工作是通過解密來完成的,但這並不意味著解密本身就能為世界帶來價值。提高一個 Crypto 的挖礦難度並不會神奇地讓每個人都變得更富有,它只會讓挖礦的利潤降低(當然,如果對這種 Crypto 的需求量也上升則不然)。
在我看來,一個幣的價值最終來自於供給和需求,而需求來自於區塊空間的價值。無論 ETH 是由礦工還是鎖倉者生產的,人們都需要 ETH 來購買區塊空間。當然,礦工越多,安全性/去中心化程度越高,這進一步增加了區塊空間的價值主張,這是一個正反饋循環,但反饋循環也存在於 PoS 的 Ethereum 中,它也同樣酷。
觀點:「PoS 是中心化的不二法門。」
PoS 與 PoW 基本相同,但又存在差異。「更好」或「更壞」只取決於你的看法。在我看來,PoW 實際上只是 PoS 的額外步驟。
Ethereum 作為一個社區高度重視去中心化,任何潛在的中心化趨勢都會被研究團隊注意到並提出緩解的方法,即使是以其他重要的東西為代價,就比如可擴展性(保持低 Gas 限制以便更多的節點可以參與其中,即使這會導致擁堵和高費用)。
盡管目前存在一些缺點,但去中心化是一個緩慢的過程,我們還沒有到那一步。目前有許多中心化的拐杖從長遠來看是需要消失的。我個人認為,想出一大堆東西來解決某個問題比「放棄並說因為某問題而不能做」要吸引人得多。
Ethereum 的 PoS 有一些有趣的設計經常被忽視。單個驗證器癱瘓、搗亂或直接攻擊網路都不會受到很嚴重的懲罰。而一千個驗證器同時這樣做則會受到更嚴重的懲罰。
這意味著,如果你是一個擁有數千個驗證者的大型企業,為了你自己的利益,應該把它們去中心化,避免使用雲主機、使用不同的客戶端等等。當然,資本仍然是集中的,但至少故障點是去中心化的,這對網路的整體 健康 是有利的。
與依靠中心化攤銷成本的大型礦業相比,通過能源更容易發現 PoW 挖礦並被當局關停。在全世界范圍內移動采礦設備是很難的,但鎖倉則不需要,不需要消費級設備以外的任何額外硬體。
觀點:「PoS 實際上就是『越有錢賺得越多』。」
是的。不幸的是,我們生活在一個財富高度不平等的世界。blockchain 並不能解決這個問題。
可這也是 PoW 的真實情況。誰有錢誰就可以買更多的礦機、賺更多的錢。在礦業,投資回報率也在隨著規模經濟的發展而變得更好。集中式的采礦作業可以獲得更好的硬體折扣、並搬到電力便宜的地方。獨立小礦工在現實中根本無法與之競爭。有了 PoS,每個人都能按比例獲得相同的收益,無論他們的股份是 10 美元還是 1000 萬美元。
它可能是中心化,但那些大的采礦業務沒有理由攻擊網路並削弱它,因為他們在基礎設施上投入了數百萬美元。所以……或許你對大型中心化主體的存在沒有意見,只是對他們在網路中存在巨大利益而不滿?
觀點:「存款被動產生利息,這是在無中生有地印錢?這簡直就是中央銀行和法幣的翻版!」
驗證者仍在進行著「工作」:創建區塊和驗證其他區塊。只是這些工作完全由 blockchain 達成共識所需的實際有用的工作組成,而不是一遍又一遍地計算哈希值。
這並不是真正的 "憑空印出的免費的錢",這些資金仍然有成本,它們只是比能源賬單更抽象、更不直觀而已。他主要存在於下面幾個成本:
機會成本:如果另一項投資能給你帶來更好的收益,為什麼還要賭?
流動性差:從你存款的那一刻起資金就被鎖定了。你需要排隊等待你的驗證器激活,而當你取款時,又要排隊才能取回。
固有風險:這仍然是一個相當新事物,可能會出現問題:一個關鍵錯誤、網路被攻擊、你的抵押物受損等等。
波動性:這仍然是一種不穩定的資產,如果你以本國法幣計價,那麼使用一種可能一夜之間下跌 30% 的資產來獲取 5% 的收益率並不是那麼好。
維護:驗證者需要維護驗證器、更新軟體等,以此來確保 100% 的正常運行時間。
這就是它有趣的地方:越多的鎖倉者、每人的獎勵就越低。這也意味著所有成本都將交由市場本身定價。如果質押收益率太低,那麼獎勵就不能證明成本的合理性,人們就會撤出並投資於其他地方,這一舉動會使收益率回升。同樣,如果收益率太高,也會吸引更多的資本使收益回落。
就通貨膨脹而言。假設市場認為 5% 是理想的收益率,其中 3% 來自增發。這樣算下來,每年大約有 3000 萬個 ETH 被抵押,將發行 90 萬個新 ETH。在總供應量為 1.2 億 ETH 的情況下,通貨膨脹率為 0.75%。只要 Gas 費用高於 23gwei,EIP1559 燃燒的 ETH 就將超過這一數量。我要強調的是,Ethereum 很快就會成為一種帶有收益的通縮資產。
「ETH 一直沒有供應上限,且他們一直在改變貨幣政策。」
多年來,Ethereum 的目標一直是「確保網路安全的最低可行發行量」,將網路安全置於控制供應上限之上。對貨幣政策的任何更新都沒有增加供應通貨膨脹。從第一天起低通脹率就一直是目標。
一旦 EIP1559 的燃燒率與發行率相匹配,就會有一個作為有效供應上限的平衡點——再次由市場力量決定對 Ethereum 區塊空間的估值。
並不存在一個 "Ethereum 中央銀行 "任意調整利率並向親信印鈔。市場本身決定了有多少通貨膨脹/通貨緊縮,並不存在一個可以像中央銀行控製法幣通貨膨脹率那樣的實體控制 Ethereum。
觀點:「巨鯨有足夠的錢來接管和改變 游戲 規則,並打擊誠實的鎖倉者。」
不,Ethereum 沒有任何形式的鏈上治理。
協議更新是社區的努力(Layer 0),你不需要鎖倉 ETH 來提出不良的提案、參與協議更新。
這一過程與 PoW 完全相同。即使你擁有 99% 的算力,你也不能在沒有私鑰的情況下進行無效的交易、竊取他人資產、改變協議規則,或者除了重組區塊之外真的做些什麼。1% 的誠實節點將拒絕任何不遵守規則的區塊,你將在一個無效的/無用的鏈上挖礦。現在把「哈希算力/挖礦」換成「質押金額/鎖倉」,PoS 也是如此。不過不同的是,被發現重組區塊的人將被銷毀他們的整個權益,而鏈不能完全摧毀采礦機。
簡單地說,這涉及到大量的 ETH。在合並之前高達 1000 萬計數的 ETH,約合 300 億美元。鎖倉的 ETH 數額和 ETH 的價值預計都會上升,所以攻擊變得越來越不可能,因為做一次攻擊所涉及的經濟成本太高了。而且如果攻擊來自外部行為者,他能夠獲得這么多 ETH 就是很荒謬的,你在哪裡能買到 1000 萬 ETH 來擁有 51% 的股份?
觀點:「32 個 ETH 太多了,普通人沒有這么多錢。」
我同意這是一個很大的問題。之所以有這么高的數字,是因為它必須落在一個技術的平衡點上:它必須低到有充足的驗證者來保證鏈的安全,但又要高到避免驗證者太多以使鏈的開銷膨脹。
從技術角度來看,有一大問題涉及到 32ETH,當時 32ETH 價值約 7000 美元。2017 年的早期曾有人甚至建議最低超過 1000ETH。
值得慶幸的是,就像礦池的存在一樣,也有鎖倉池,允許用戶以小金額參與鎖倉。這歸功於像 RocketPool、Secret Shared Validators 這些使用智能合約的無許可、去中心化的非託管協議。而且由於上面提到的二次懲罰,我相信從長遠來看,去中心化的鎖倉操作會比中心化的要好。像 Rocket Pool 這樣的協議最好被看作是基礎鎖倉的高級抽象,而不是 "只是一個鎖倉池"。
觀點:「PoS 還沒有被證明,而我們知道 PoW 是有效的。」
這實際上是完全公正,顯然我們無法真正的反駁這一點,只有時間會證明。只是我認為在 Ethereum 正在轉向 PoS 的背景下,這是無關的。如果你不相信它,就不要參與/投資它。我個人相信一個長期可持續的 PoS Ethereum,但即使如此,我也樂於見到 bitcoin 繼續沿用它的 PoW。
這都是我們一生中偉大的 crypto 實驗的一部分。PoS Ethereum 要麼只是一陣風,失敗直至默默無聞,要麼將成功地創造出能夠超越人類的怪物般的強大網路。
我在 bitcoin 和 Ethereum 中看到,為了實現這一目標,優先考慮去中心化是關鍵。盡管兩者的理念大不相同,但我很高興能同時擁有這兩種東西,以真正看到長期的價值。