① 使用Web3J與第三方合約交互——批量轉賬
之前使用NodeJs與智能合約交互,都是訪問的自己部署的合約。最近要對線上第三方合約進行轉賬操作,人數比較多,一筆筆操作起來手指都點斷了還容易出錯。既然代幣Token都遵守ERC20協議,肯定有統一的Transfer(轉賬)方法供客戶端調用,那麼編寫程序實現自動轉賬應該可以實現,去查了相關資料發現web3j是不錯的選擇。
輕量級客戶端與以太坊交互的Java庫。
既然是調用第三方合約那麼肯定需要知道合約地址,合約地址定義了到哪裡去訪問合約;
ABI(Application Binary Interface): 應用程序二進制介面,定義了智能合約提供的方法功能
若是無法獲取到ABI介面,也可以使用solc編譯生產bin和abi文件。
(生產代理類時可以指定包路徑和類名)
這樣一來,便可以使用程序完成批量轉賬操作。
後來研究發現,使用NodeJs直接調用Web3也可以實現對應功能,不過還是對Java更熟悉一些,就採用了Java的方式。
② 以太坊中的國際銀行賬號iban
簡單地說,以太坊中的iban賬號是以太坊為了和傳統的銀行系統對接而引入的概念,web3.js中提供了以太坊地址和iban地址之間的轉換方法。
iban這個概念源於傳統的銀行系統,其英文全稱為 International Bank Account Number ,即國際銀行帳號。iban的作用是為全球任意一家銀行中的任意一個賬戶生成一個全球唯一的賬號,以便進行跨行交易。一個iban賬號看起來像這樣:
iban地址最多可以包含34個字母和數字,其中的字母大小寫不敏感。在iban
中包含以下信息:
以太坊引入了一個新的IBAN國別碼:XE,其中E代表Ethereum,X代表非法幣(non-jurisdictional currencies)。同時,以太坊提出了三種BBAN的編碼格式:direct、basic和indirect。
direct編碼方案中的BBAN為30個字母/數字,只有一個欄位:賬戶編號。例如,以太坊地址 轉換為direct方案的BBAN賬號,就得到 。
可以使用web3.js中的 web3.eth.Iban.fromEthereumAddress()
方法來執行這一轉換:
basic編碼方案與direct方案的唯一區別在於,其BBAN長度為31個字母/數字,因此該方案不兼容IBAN。
indrect編碼方案中的BBAN長度為16個字母/數字,包含三個欄位:
例如,一個採用indrect編碼方案的以太坊iban賬號,看起來是這樣:
前面的 XE 表示國別碼, 81 為校驗和,後面的16個字元就是indrect編碼的BBAN,其中:
如前所述,使用 web3.eth.Iban.fromEthereumAddress() 方法,可以將一個以太坊地址轉換為direct編碼方案的iban賬號。與之對應的,可以使用 web3.eth.Iban.toAddress 方法,將一個採用direct編碼方案的iban賬號,轉換回以太坊地址。例如:
iban賬號中的校驗和用來幫助核驗一個給定字元串是否為有效的iban賬號。可以使用web3.js中的 web3.eth.Iban.isValid()
來進行執行校驗。例如:
原文: http://blog.hubwiz.com/2018/06/03/ethereum-iban/
③ 以太坊的智能合約是什麼意思
以太坊智能合約是指,部署在以太坊上的智能合約,是一段程序,運行在以太坊的虛擬機EVM中,程序可以按照事先約定的某種規則自動執行操作,執行合約的條款。
同時,智能合約對接收到的信息進行反應,它既可以接收和儲存價值,也可以向外發送信息和價值。
介紹
以太坊創始人V神指出過,以太坊智能合約中的「『合約』不應被理解為需要執行或遵守的東西,而應看成是存在於以太坊執行環境中的『自治代理』(autonomous agents),它擁有自己的以太坊賬戶,它們收到交易信息後就相當於被捅了一下,然後自動執行一段代碼。」
智能合約可以調用其它的智能合約,這就是開啟創立自治代理的能力,代理可以自己進行交易。在區塊鏈上,我們存儲的信息都是「狀態」,而智能合約就是它用於狀態轉換的方式。
④ 怎麼接以太坊公鏈
建立連接以接儒以太坊公鏈。
一、1、以太坊客戶端下載,注意:需翻牆,下載版本為1.8.23-stable,否則可能出現與以太坊錢包客戶端存在不匹配問題。
2、以太坊錢包客戶端下載。
3、安裝以太坊客戶端。
二、私有鏈創建:創建創世區塊。
三、安裝並啟動以太坊錢包客戶端。
⑤ 智能合約abi弄不出來怎麼辦
一般來說,部署智能合約的步驟為:
1啟動一個以太坊節點 (例如geth或者testrpc)。
2使用solc編譯智能合約。 => 獲得二進制代碼。
3將編譯好的合約部署到網路。(這一步會消耗以太幣,還需要使用你的節點的默認地址或者指定地址來給合約簽名。) => 獲得合約的區塊鏈地址和ABI(合約介面的JSON表示,包括變數,事件和可以調用的方法)。(譯註:作者在這里把ABI與合約介面弄混了。ABI是合約介面的二進製表示。)
4用web3.js提供的JavaScript API來調用合約。(根據調用的類型有可能會消耗以太幣。)
⑥ iOS應用程序如何調用以太坊智能合約
以太坊智能合約有各種各樣的用例,但到目前為止,從你的iOS應用程序中調用它們非常困難。不過如果使用 以太坊iOS開發套件 和 EtherKit ,這種情況會改善很多,你可以立即開始使用。在本教程結束時,你將能夠調用其ABI(應用程序二進制介面)中定義的任何公共合約函數。
對於這個項目,我們將使用Xcode 10.0和ContractCodegen 0.1。我們還建議使用iOS MVVM項目模板,但為了使本教程簡單,我們將使用正常的iOS項目結構。
⑦ 用Go來做以太坊開發⑤事件日誌
智能合約具有在執行期間「發出」事件的能力。 事件在以太坊中也稱為「日誌」。 事件的輸出存儲在日誌部分下的事務處理中。 事件已經在以太坊智能合約中被廣泛使用,以便在發生相對重要的動作時記錄,特別是在代幣合約(即ERC-20)中,以指示代幣轉賬已經發生。 這些部分將引導您完成從區塊鏈中讀取事件以及訂閱事件的過程,以便交易事務被礦工打包入塊的時候及時收到通知。
為了訂閱事件日誌,我們需要做的第一件事就是撥打啟用websocket的以太坊客戶端。 幸運的是,Infura支持websockets。
下一步是創建篩選查詢。 在這個例子中,我們將閱讀來自我們在之前課程中創建的示例合約中的所有事件。
我們接收事件的方式是通過Go channel。 讓我們從go-ethereum core/types 包創建一個類型為 Log 的channel。
現在我們所要做的就是通過從客戶端調用 SubscribeFilterLogs 來訂閱,它接收查詢選項和輸出通道。 這將返回包含unsubscribe和error方法的訂閱結構。
最後,我們要做的就是使用select語句設置一個連續循環來讀入新的日誌事件或訂閱錯誤。
我們會在下個章節介紹如何解析日誌。
Commands
Store.sol
event_subscribe.go
智能合約可以可選地釋放「事件」,其作為交易收據的一部分存儲日誌。讀取這些事件相當簡單。首先我們需要構造一個過濾查詢。我們從go-ethereum包中導入 FilterQuery 結構體並用過濾選項初始化它。我們告訴它我們想過濾的區塊范圍並指定從中讀取此日誌的合約地址。在示例中,我們將從在 智能合約章節 創建的智能合約中讀取特定區塊所有日誌。
下一步是調用ethclient的 FilterLogs ,它接收我們的查詢並將返回所有的匹配事件日誌。
返回的所有日誌將是ABI編碼,因此它們本身不會非常易讀。為了解碼日誌,我們需要導入我們智能合約的ABI。為此,我們導入編譯好的智能合約Go包,它將包含名稱格式為 <Contract>ABI 的外部屬性。之後,我們使用go-ethereum中的 accounts/abi 包的 abi.JSON 函數返回一個我們可以在Go應用程序中使用的解析過的ABI介面。
現在我們可以通過日誌進行迭代並將它們解碼為我么可以使用的類型。若您回憶起我們的樣例合約釋放的日誌在Solidity中是類型為 bytes32 ,那麼Go中的等價物將是 [32]byte 。我們可以使用這些類型創建一個匿名結構體,並將指針作為第一個參數傳遞給解析後的ABI介面的 Unpack 函數,以解碼原始的日誌數據。第二個參數是我們嘗試解碼的事件名稱,最後一個參數是編碼的日誌數據。
此外,日誌結構體包含附加信息,例如,區塊摘要,區塊號和交易摘要。
若您的solidity事件包含 indexed 事件類型,那麼它們將成為 主題 而不是日誌的數據屬性的一部分。在solidity中您最多隻能有4個主題,但只有3個可索引的事件類型。第一個主題總是事件的簽名。我們的示例合約不包含可索引的事件,但如果它確實包含,這是如何讀取事件主題。
正如您所見,首個主題只是被哈希過的事件簽名。
這就是閱讀和解析日誌的全部內容。要學習如何訂閱日誌,閱讀上個章節。
命令
Store.sol
event_read.go
首先,創建ERC-20智能合約的事件日誌的interface文件 erc20.sol :
然後在給定abi使用 abigen 創建Go包
現在在我們的Go應用程序中,讓我們創建與ERC-20事件日誌簽名類型相匹配的結構類型:
初始化以太坊客戶端
按照ERC-20智能合約地址和所需的塊范圍創建一個「FilterQuery」。這個例子我們會用 ZRX 代幣:
用 FilterLogs 來過濾日誌:
接下來我們將解析JSON abi,稍後我們將使用解壓縮原始日誌數據:
為了按某種日誌類型進行過濾,我們需要弄清楚每個事件日誌函數簽名的keccak256哈希值。 事件日誌函數簽名哈希始終是 topic [0] ,我們很快就會看到。 以下是使用go-ethereum crypto 包計算keccak256哈希的方法:
現在我們將遍歷所有日誌並設置switch語句以按事件日誌類型進行過濾:
現在要解析 Transfer 事件日誌,我們將使用 abi.Unpack 將原始日誌數據解析為我們的日誌類型結構。 解包不會解析 indexed 事件類型,因為它們存儲在 topics 下,所以對於那些我們必須單獨解析,如下例所示:
Approval 日誌也是類似的方法:
最後,把所有的步驟放一起:
我們可以把解析的日誌與etherscan的數據對比: https://etherscan.io/tx/#eventlog
Commands
erc20.sol
event_read_erc20.go
solc version used for these examples
要讀取 0x Protocol 事件日誌,我們必須首先將solidity智能合約編譯為一個Go包。
安裝solc版本 0.4.11
為例如 Exchange.sol 的事件日誌創建0x Protocol交易所智能合約介面:
Create the 0x protocol exchange smart contract interface for event logs as Exchange.sol :
接著給定abi,使用 abigen 來創建Go exchange 包:
Then use abigen to create the Go exchange package given the abi:
現在在我們的Go應用程序中,讓我們創建與0xProtocol事件日誌簽名類型匹配的結構體類型:
初始化以太坊客戶端:
創建一個 FilterQuery ,並為其傳遞0x Protocol智能合約地址和所需的區塊范圍:
用 FilterLogs 查詢日誌:
接下來我們將解析JSON abi,我們後續將使用解壓縮原始日誌數據:
為了按某種日誌類型過濾,我們需要知曉每個事件日誌函數簽名的keccak256摘要。正如我們很快所見到的那樣,事件日誌函數簽名摘要總是 topic[0] :
現在我們迭代所有的日誌並設置一個switch語句來按事件日誌類型過濾:
現在要解析 LogFill ,我們將使用 abi.Unpack 將原始數據類型解析為我們自定義的日誌類型結構體。Unpack不會解析 indexed 事件類型,因為這些它們存儲在 topics 下,所以對於那些我們必須單獨解析,如下例所示:
對於 LogCancel 類似:
最後是 LogError :
將它們放在一起並運行我們將看到以下輸出:
將解析後的日誌輸出與etherscan上的內容進行比較: https://etherscan.io/tx/
命令
Exchange.sol
event_read_0xprotocol.go
這些示例使用的solc版本
⑧ 區塊鏈和智能合約,以太坊開發,183位開發者整理,知識體系匯總
在以太坊上開發應用程序的可用工具、組件、模式和平台的指南。
此列表的創建是由 ConsenSys 的產品經理推動的,他們認為需要在新的和有經驗的區塊鏈開發人員之間更好地共享工具、開發模式和組件。
開發智能合約
智能合約語言
構架
IDE
其他工具
測試區塊鏈網路
測試以太水龍頭
前端以太坊 API
後端以太坊 API
引導程序/開箱即用工具
以太坊 ABI(應用程序二進制介面)工具
以太坊客戶端
貯存
Mahuta - 具有附加搜索功能的 IPFS 存儲服務,以前稱為 IPFS-Store
OrbitDB - IPFS 之上的去中心化資料庫
JS IPFS API - IPFS HTTP API 的客戶端庫,用 JavaScript 實現
TEMPORAL - 易於使用的 API 到 IPFS 和其他分布式/去中心化存儲協議
PINATA - 使用 IPFS 的最簡單方法
消息傳遞
測試工具
安全工具
監控
其他雜項工具
Cheshire - CryptoKitties API 和智能合約的本地沙箱實現,可作為 Truffle Box 使用
ERCs-以太坊評論請求存儲庫
ERC-20 - 可替代資產的原始令牌合約
ERC-721 - 不可替代資產的令牌標准
ERC-777 - 可替代資產的改進令牌標准
ERC-918 - 可開采令牌標准
流行的智能合約庫
可擴展性
支付/狀態通道
等離子體
側鏈
POA橋
POA 橋用戶界面
POA 橋梁合同
ZK-SNARK
ZK-STARK
預構建的 UI 組件
以上內容,來自git庫:
github.com/ConsenSys/ethereum-developer-tools-list
我是魚歌,一個在深圳創業的全棧程序員,主攻區塊鏈,元宇宙和智能合約,附加小程序和app開發。
[祈禱]
⑨ 用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
⑩ 以太坊的ABI編碼
ABI全稱Application Binary Interface, 是調用智能合約函數以及合約之間函數調用的消息編碼格式定義,也可以理解為智能合約函數調用的介面說明. 類似Webservice里的SOAP協議一樣;也就是定義操作函數簽名,參數編碼,返回結果編碼等。
使用ABI協議時必須要求在編譯時知道類型,即強類型相關.
當一個智能合約編譯出來後, 他的abi介面定義就確定了. 比如下面的智能合約:
生成的位元組碼:
生成的abi定義:
可以看出, 生成abi包含了2個定義: 函數 lotus , 事件 Log_lotus , 各個欄位含義見上. 根據該abi定義,就可以生成調用該智能合約函數的abi格式的數據了.
格式簡單的可以表示為: 函數選擇器+參數編碼
一個函數調用的前四個位元組數據指定了要調用的函數簽名。計算方式是使用函數簽名的 keccak256 的哈希,取4個位元組。
函數名如果有多個參數使用,隔開,要去掉表達式中的所有空格。在geth客戶端,通過命令可以得到hash:
由於前面的函數簽名使用了四個位元組,參數的數據將從第五個位元組開始。
根據參數類型,編碼規則有所區別:
除了bytes,和string, 其他類型的數據不足32位元組長度的需要加0補足32位元組. 動態長度的編碼在例子中介紹.
函數: function baz(uint32 x, bool y) :
調用: baz(69, true)
生成的數據如下:
返回結果是一個bool值,在這里,返回的是false:
函數: f(uint,uint32[],bytes10,bytes)
調用: (0x123, [0x456, 0x789], "1234567890", "Hello, world!")
函數選擇器: bytes4(sha3("f(uint256,uint32[],bytes10,bytes)"))
對於 固定大小的類型 值 uint256 和 bytes10 ,直接編碼值。
對於 動態內容類型 值 uint32[] 和 bytes ,我們先 編碼偏移值 ,偏移值是整個值編碼的開始到真正存這個數據的偏移值(這里不計算頭四個用於表示函數簽名的位元組)。
所以參數編碼數據依次為:
尾部部分的第一個動態參數, [0x456, 0x789] 編碼拆解如下:
最後我們來看看第二個動態參數的的編碼, Hello, world! 。
所以最終結果是: