以太坊客戶端rpc介面
『壹』 Infura API 獲取以太坊當前配置鏈 ID - 區塊鏈數據開發實戰
簡介:Infura 是以太坊和 IPFS 的 API 服務提供商。Infura 一開始只是為 ConsenSys 內部項目提供穩定可靠的 RPC 訪問,後來隨著以太坊生態發展,他們意識到自己可以起到更大作用,於是開始面向開發者提供公共 API 服務。本文整理使用 Infura API 獲取以太坊當前配置鏈 ID 的實現。
Infura 是以太坊和 IPFS 的 API 服務提供商。Infura 一開始只是為 ConsenSys 內部項目提供穩定可靠的 RPC 訪問,後來隨著以太坊生態發展,他們意識到自己可以起到更大作用,於是開始面向開發者提供公共 API 服務。
本文整理使用 Infura API 獲取以太坊當前配置鏈 ID 的實現。
Infura API 官方文檔: https://infura.io/docs
使用 API 需要申請 Project ID ,ID 是免費申請的,申請流程為「注冊 - 登錄 - 創建新項目」,不需要審核,幾分鍾就能搞定。
Infura API 標准請求埠格式:
本例中我們使用基於 HTTP 的以太坊主網 JSON-RPC 埠:
Infura API 獲取以太坊當前配置鏈 ID:
Curl 示例:
Node.js 示例:
返回的 JSON 示例:
返回當前鏈 ID 的大整數。
Infura API 服務思維導圖:
我們有一個區塊鏈知識星球,做區塊鏈前沿資料的歸納整理以方便大家檢索查詢使用,也是國內頂尖區塊鏈技術社區,歡迎感興趣的朋友加入。如果你對上面內容有疑問,也可以加入知識星球提問我:
『貳』 以太坊架構是怎麼樣的
以太坊最上層的是DApp。它通過Web3.js和智能合約層進行交換。所有的智能合約都運行在EVM(以太坊虛擬機)上,並會用到RPC的調用。在EVM和RPC下面是以太坊的四大核心內容,包括:blockChain, 共識演算法,挖礦以及網路層。除了DApp外,其他的所有部分都在以太坊的客戶端里,目前最流行的以太坊客戶端就是Geth(Go-Ethereum)
『叄』 如何開發數字貨幣
謝邀~
為何要開發數字貨幣?從中央銀行的角度來看有6個好處:
第一、提升經濟交易活動的便利性和透明度
第二、降低傳統紙幣發行、流通的高昂成本
第三、更好地支持經濟和社會發展
第四、助力普惠金融的全面實現
第五、 減少洗錢、逃漏稅等違法犯罪行為
第六、提升央行對貨幣供給和貨幣流通的控制力
數字貨幣開發步驟:
第一步、
首先我們要從git 上下載某套區塊鏈體系的源碼,比如選擇比特幣的主幹代碼下載好
相關源碼。
同時准備好對應的編譯環境(C + +的建議在Linux)和安裝好對應開發環境和工具。
第二步、
代碼都是需要編譯的,因此需要准備編譯環境和工具,需要下載環境編譯工具、配
好系統環境變數, qt環境等文件,編譯命令在Itc源代碼里的文件里有詳細說明。
不過系統和開發環境的搭建、程序編譯等過程都比較繁瑣,不建議普通用戶自己製作。對於開發人員,第一次可能要預計2-3天的安裝配置時間。
第三步、
拿比特幣開發來說,他是Q的開發環境,下載好源碼並配置好環境後,在QtCreator內打開該比特幣核心的源碼,配置相關文件和編譯器,開始嘗試編譯比特幣核心的客戶端。
第四步、
改造成自己的數字貨幣,打開各個源文件,找到對應的地方調整參數即可,如調整
每個區塊出幣數,總產量,調整難度等等,然後就到最關鍵的點,就是改名為自己的幣名。
想怎麼取名就怎麼取名,別忘記在資源文件夾里替換掉相關圖標。如果一切順利,經過重新
編譯,你的新幣就順利發明了。
對於這個數字貨幣的開發,還是屬於技術比較專業的,因此最好有-個專業的團隊協助。
數字貨幣開發大致需要學習的框架:
1、搭建以太坊私鏈測試環境以及公鏈節點環境配置
2、以太坊中以太幣的交易、確認原理
3、以太坊中json rpc介面
4、以太幣轉賬與提現原理
5、伺服器對接以太坊公鏈介面,自有伺服器存儲業務數據,公鏈存儲交易可匿名數據
6、私鑰的安全處理
以下是開發的代碼示例:
舉例下市場上常用的數字貨幣錢包有:
APP類:kcash、imtokenweb:myEthereumWalletgoogle 瀏覽器插件:metaMask
其中最常用的就是imToken
區塊鏈交易技術概念:
讓我們來看看區塊鏈交易是如何以比特幣為例進行處理的。為了將一定數量的比特幣發送到另一個錢包,您需要以下信息:將資金發送到您的錢包的地址,您想要發送的加密貨幣數量
接收者的錢包的ID。
每筆交易都使用唯一的機密私人密鑰進行簽名。一旦付款由發件人簽署,它就變為公開可用。交易仍需要確認,以便收款人可以得到這筆錢為了確認交易,有必要生成一個新的鏈條塊。
這些塊是通過進行復雜的數學計算來找到唯一的密鑰而生成的。創建一個新塊需要10分鍾,找到該密鑰的人獲得一定數量的硬幣作為獎勵。一旦創建了鏈的新塊,就不可能將其從資料庫中刪除或以某種方式更改信息。因此,區塊鏈交易是最終且不可逆的。
數字貨幣的三大核心優點:
第一點、數字貨幣是公平的貨幣
數字貨幣沒有特定的發行機構,不是由某一國家發行的,僅僅是依靠特定演算法產生的,這就意味著無法通過操縱發行數量來操縱數字貨幣,因此數字貨幣是一種自由的、非國家的貨幣。
我們可以看到現在有許多國家是直接認可了虛擬貨幣,那麼有需求,就需要交易的平台。
我們現在許多想搭建虛擬貨幣交易平台的投資者,為什麼不能去這些地區搭建交易平台呢?搭建虛擬貨幣交易平台,這不就是一個很好的商機嗎?
第二點、數字貨幣的安全系數更高
紙幣的出現雖然方便了我們日常生活中的交易,但是會有被偷盜以及收到的風險。電子貨幣雖然可以避免這些風險,但是會出現諸如被盜刷、等新的問題。
數字貨幣則可以避免以上問題。並且將每一筆交易記錄在網路上進行廣播,是的所有節點都保存全部貨幣的流通信息,這樣任意一個節點在交易之前就可以輕易地發現貨幣的流通。
第三點、數字貨幣的交易可以實現匿名交易
由於沒有傳統銀行開戶和身份認證的過程,數字貨幣是純匿名的。雖然可以根據本地完整的交易記錄查詢到每個賬號的流水信息。
但卻無法知道這個賬號的主人是誰,同樣也沒有任何人有能力操縱他人賬號上的數字貨幣,這樣很好的保護了使用人的隱私。
如果您也在持有交易數字貨幣、外匯黃金原油、合約期貨:
『肆』 搭建geth私有鏈和聯盟鏈網路
操作系統:linux或Mac OS
安裝geth執行以下命令:
linux:sudo apt-get install ethereum
Mac OS:brew install ethereum
直接創建兩個geth的工作目錄,用於之後的組建聯盟鏈的使用:
mkdir eth-private1
mkdir eth-private2
首先 cd eth-private1 進入節點1的工作目錄該目錄下執行下面命令
geth --datadir data --nodiscover console (data是之後geth節點的數據目錄,可自行修改)
使用geth自帶的工具 puppeth 用於生成創世區塊,過程如下:
puppeth
+-----------------------------------------------------------+
| Welcome to puppeth, your Ethereum private network manager |
| |
| This tool lets you create a new Ethereum network down to |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail. |
| |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset. |
+-----------------------------------------------------------+
Please specify a network name to administer (no spaces, please)
輸入私鏈名稱後,會出現二級菜單,現在2:配置一個新的創世快
What would you like to do? (default = stats)
再次出現二級菜單,讓你選擇共識機制(這里採用poa共識)
Which consensus engine to use? (default = clique)
Ethash - proof-of-work(PoW) :工作量證明,通過算力達成共識 (以太坊就是使用這種方式)
Clique - proof-of-authority(PoA): 權威證明、通過預先設定的權威節點來負責達成共識 (不消耗算力,一般用於私有鏈測試開發)
如果選擇Pow的共識方法,直接輸入1,回車即可。
如果選擇PoA的共識方法,輸入2後會提示讓你選擇處快的間隔時間,一般測試開發使用可以設置相對的將處快時間設置較少5秒即可,然後會讓你選擇哪個賬戶來作為權威生成區塊(至少有一個,輸入剛才創建的賬戶,若只是單節點就輸入那個節點目錄生成的地址,若想組建聯盟鏈就填寫生成的兩個地址)
How many seconds should blocks take? (default = 15)
選擇好共識機制後會讓你指定給那些賬號初始化ether(至少有一個),輸入我們剛才創建的賬戶地址回車即可。
Which accounts should be pre-funded? (advisable at least one)
選擇輸入私有鏈的網路ID,任意數字即可(不能為1,1是公鏈),也可以不輸入會給定一個隨機數作為私有鏈的網路ID
Specify your chain/network ID if you want an explicit one (default = random)
選擇導出創世區塊配置文件
選擇導出創世區塊配置文件的保存路徑,可以保存到當前目錄,直接按回車即可
Which file to save the genesis into? (default = my-private-chain.json)
INFO [02-09|14:56:33] Exported existing genesis block
這樣就完成了創世區塊文件的配置了,直接退出puppeth即可。
輸入命令 geth --datadir data init private.json 其中data自己制定,private.json就是剛才生成的創世區塊
若出現如圖錯誤:
輸入命令:
geth --datadir data --syncmode full --port 2001 --networkid 1234 --rpc --rpcport "8545" --rpccorsdomain "*" --rpcaddr "0.0.0.0" --rpcapi "db,eth,net,web3,personal,admin,clique" --nodiscover console 進入控制台
--datadir data:節點的數據目錄
--syncmode full:塊同步的方式(若只是單節點可不填)
--port 2001: 網卡監聽埠
--networkid 1234:網路標識符
--rpc:開啟rpc服務
--rpcport "8545":rpc服務的埠
--rpccorsdomain "*":允許跨域請求的域名列表(逗號分隔)(瀏覽器強制)
--rpcaddr "0.0.0.0" :HTTP-RPC伺服器介面地址(默認值:「localhost」)
--rpcapi "db,eth,net,web3,personal,admin,clique":基於HTTP-RPC介面提供的API(私有鏈可以任意開發,公有鏈需要謹慎)
--nodiscover:不允許節點自動加入
若想搭建聯盟鏈,必須保證創世區塊一致,進入到剛才創建的eth-private2的目錄
將之前生成的創世區塊拷貝過來,初始化創世區塊,然後使用啟動命令啟動分別啟動兩個節點,進入控制台,使用 admin.nodeInfo 命令獲取節點的信息
總結:
兩個伺服器部署兩個節點是可以聯通的,但是只能使用兩個節點對應的地址進行挖礦,所以只能是兩個節點對應兩個地址進行挖礦,使用poa共識,當一個節點掛掉,挖礦停止,因為poa共識挖礦必須超過50%的節點進行錢增,現在只是兩個節點,掛掉一個節點挖礦就會停止等待另一個節點的確認,停掉的節點可以通過正常運作的節點信息重新連接到網路中。
問題:
同步塊有可能報錯情況:
1:Synchronisation failed "retrieved hash chain is invalid" 解決目前找到的方法是removedb 數據目錄 ,重新init創世區塊
2:內存溢出初步確認為開啟rpc服務造成的,有可能伺服器惡意被黑,暴力破解密碼,佔有內存,解決,將伺服器的ip設置一條防火牆
若存在問題可給本人留言或訪問本人的github: https://github.com/qi-shuo/geth-document 記錄了一些本人搭建使用的命令
『伍』 以太坊stratum協議原理
參照比特幣的 stratum協議 和 NiceHash的stratum協議規范 編寫了一版以太坊版本的stratum協議說明.
stratum協議是目前最常用的礦機和礦池之間的TCP通訊協議。
以太坊是一個去中心化的網路架構,通過安裝Mist客戶端的節點來轉發新交易和新區塊。而礦機、礦池也同時形成了另一個網路,我們稱之為礦工網路。
礦工網路分成礦機、礦池、錢包等幾個主要部分,有時礦池軟體與錢包安裝在一起,可合稱為礦池。
礦機與礦池軟體之間的通訊協議是 stratum ,而礦池軟體與錢包之間的通訊是 bitcoinrpc 介面。
stratum是 JSON 為數據格式.
礦機啟動,首先以 mining.subscribe 方法向礦池連接,用來訂閱工作。
礦池以 mining.notify 返回訂閱號、ExtraNonce1和ExtraNonce2_size。
Client:
Server:
其中:
是 訂閱號 ;
080c是 extranonce ,Extranonce可能最大3位元組;
礦機以 mining.authorize 方法,用某個帳號和密碼登錄到礦池,密碼可空,礦池返回 true 登錄成功。該方法必須是在初始化連接之後馬上進行,否則礦機得不到礦池任務。
Client:
Server:
難度調整由礦池下發給礦機,以 mining.set_difficulty 方法調整難度, params 中是難度值。
Server:
礦機會在下一個任務時採用新難度,礦池有時會馬上下發一個新任務並且把清理任務設為true,以便礦機馬上以新難度工作。
該命令由礦池定期發給礦機,當礦機以 mining.subscribe 方法登記後,礦池應該馬上以 mining.notify 返回該任務。
Server:
任務ID : bf0488aa ;
seedhash : 。每一個任務都發送一個seedhash來支持盡可能多的礦池,這可能會很快地在貨幣之間交換。
headerhash : 。
boolean cleanjobs : true 。如果設為true,那麼礦工需要清理任務隊列,並立即開始從事新提供的任務,因為所有舊的任務分享都將導致陳舊的分享錯誤。如果是 false 則等當前任務結束才開始新任務。
礦工使用seedhash識別DAG,然後帶著headerhash,extranonce和自己的minernonce尋找低於目標的share(這是由提供的難度而產生的)。
礦機找到合法share時,就以」 mining.submit 「方法向礦池提交任務。礦池返回true即提交成功,如果失敗則error中有具體原因。
Client:
任務ID : bf0488aa
minernonce : 6a909d9bbc0f 。注意minernonce是6個位元組,因為提供的extranonce是2個位元組。如果礦池提供3位元組的extranonce,那麼minernonce必須是5位元組
Server:
一般的礦機與礦池通訊過程就如下所示:
『陸』 Php如何調用以太坊介面
curl方法,file_get_contents,
『柒』 區塊鏈和智能合約,以太坊開發,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語言調用智能合約
智能合約調用是實現一個 DApp 的關鍵,一個完整的 DApp 包括前端、後端、智能合約及區塊 鏈系統,智能合約的調用是連接區塊鏈與前後端的關鍵。
我們先來了解一下智能合約調用的基礎原理。智能合約運行在以太坊節點的 EVM 中。因此要 想調用合約必須要訪問某個節點。
以後端程序為例,後端服務若想連接節點有兩種可能,一種是雙 方在同一主機,此時後端連接節點可以採用 本地 IPC(Inter-Process Communication,進 程間通信)機制,也可以採用 RPC(Remote Procere Call,遠程過程調用)機制;另 一種情況是雙方不在同一台主機,此時只能採用 RPC 機制進行通信。
提到 RPC, 讀者應該對 Geth 啟動參數有點印象,Geth 啟動時可以選擇開啟 RPC 服務,對應的 默認服務埠是 8545。。
接著,我們來了解一下智能合約運行的過程。
智能合約的運行過程是後端服務連接某節點,將 智能合約的調用(交易)發送給節點,節點在驗證了交易的合法性後進行全網廣播,被礦工打包到 區塊中代表此交易得到確認,至此交易才算完成。
就像資料庫一樣,每個區塊鏈平台都會提供主流 開發語言的 SDK(Software Development Kit,軟體開發工具包),由於 Geth 本身就是用 Go 語言 編寫的,因此若想使用 Go 語言連接節點、發交易,直接在工程內導入 go-ethereum(Geth 源碼) 包就可以了,剩下的問題就是流程和 API 的事情了。
總結一下,智能合約被調用的兩個關鍵點是節點和 SDK。
由於 IPC 要求後端與節點必須在同一主機,所以很多時候開發者都會採用 RPC 模式。除了 RPC,以太坊也為開發者提供了 json- rpc 介面,本文就不展開討論了。
接下來介紹如何使用 Go 語言,藉助 go-ethereum 源碼庫來實現智能合約的調用。這是有固定 步驟的,我們先來說一下總體步驟,以下面的合約為例。
步驟 01:編譯合約,獲取合約 ABI(Application Binary Interface,應用二進制介面)。 單擊【ABI】按鈕拷貝合約 ABI 信息,將其粘貼到文件 calldemo.abi 中(可使用 Go 語言IDE 創建該文件,文件名可自定義,後綴最好使用 abi)。
最好能將 calldemo.abi 單獨保存在一個目錄下,輸入「ls」命令只能看到 calldemo.abi 文件,參 考效果如下:
步驟 02:獲得合約地址。注意要將合約部署到 Geth 節點。因此 Environment 選擇為 Web3 Provider。
在【Environment】選項框中選擇「Web3 Provider」,然後單擊【Deploy】按鈕。
部署後,獲得合約地址為:。
步驟 03:利用 abigen 工具(Geth 工具包內的可執行程序)編譯智能合約為 Go 代碼。abigen 工具的作用是將 abi 文件轉換為 Go 代碼,命令如下:
其中各參數的含義如下。 (1)abi:是指定傳入的 abi 文件。 (2)type:是指定輸出文件中的基本結構類型。 (3)pkg:指定輸出文件 package 名稱。 (4)out:指定輸出文件名。 執行後,將在代碼目錄下看到 funcdemo.go 文件,讀者可以打開該文件欣賞一下,注意不要修改它。
步驟 04:創建 main.go,填入如下代碼。 注意代碼中 HexToAddress 函數內要傳入該合約部署後的地址,此地址在步驟 01 中獲得。
步驟 04:設置 go mod,以便工程自動識別。
前面有所提及,若要使用 Go 語言調用智能合約,需要下載 go-ethereum 工程,可以使用下面 的指令:
該指令會自動將 go-ethereum 下載到「$GOPATH/src/github.com/ethereum/go-ethereum」,這樣還算 不錯。不過,Go 語言自 1.11 版本後,增加了 mole 管理工程的模式。只要設置好了 go mod,下載 依賴工程的事情就不必關心了。
接下來設置 mole 生效和 GOPROXY,命令如下:
在項目工程內,執行初始化,calldemo 可以自定義名稱。
步驟 05:運行代碼。執行代碼,將看到下面的效果,以及最終輸出的 2020。
上述輸出信息中,可以看到 Go 語言會自動下載依賴文件,這就是 go mod 的神奇之處。看到 2020,相信讀者也知道運行結果是正確的了。
『玖』 DApp開發入門
本文僅介紹以太坊系列的DApp開發,其他鏈原理差不太多。
MetaMask安裝完成並運行後,可以在Chrome控制台列印 MetaMask注入的window.ethereum對象
關於ethereum對象,我們只需要關心 ethereum.request 就足夠了,MetaMask 使用 ethereum.request(args) 方法 來包裝 RPC API。這些 API 基於所有以太坊客戶端公開的介面。 簡單來說錢包交互的大部分操作都是由 request() 方法實現,通過傳入不同的方法名來區分。
⚠️ 即使ethereum對象中提供了chainId,isMetaMask,selectAddress屬性,我們也不能完全相信這些屬性,他們是不穩定或不標准,不建議使用。我們可以通過上面說的request方法,拿到可靠的數據 。
錢包通過method方法名,進行對應的實現 以獲取錢包地址為例
調用 ethereum.request({ method: "eth_requestAccounts" }) ,錢包實現了該方法,那麼就可以拿到錢包的地址了。
MetaMask注入的 window.ethereum 就是一個Provider,一個RPC節點也是一個Provider,通過Provider,我們有了訪問區塊鏈的能力。 在連接到錢包的情況下,通常使用錢包的Provider就可以了, ethers.providers.Web3Provider(ethereum)
如果只需要查詢一些區塊鏈數據,可以使用EtherscanProvider 和 InfuraProvider 連接公開的 第三方節點服務提供商 。JsonRpcProvider 和 IpcProvider 允許連接到我們控制或可以訪問的以太坊節點。
獲取當前賬戶余額
獲取最新區塊號
其他RPC操作,可以通過 JSON-RPC 查看。
通過 ethers.js 可以連接ERC20的合約,合約編譯後會生成ABI,合約部署後,會生成合約地址,開發者通過 ABI和合約地址 ,對合約發送消息。
合約中的方法大致分為兩種: 視圖方法(免費),非視圖方法(消耗Gas) ,可以通過ABI查看方法類型。
⚠️ ERC20需要多加關注的是 Approve() 方法以及 transfer() 和 transferFrom() 的區別 ,授權過的代幣,被授權的那一方,可以通過調用 transferFrom() 方法,轉走你授權數量內的代幣,所以授權是一個很危險的操作,假設你授權了一個不良的合約,那你會面臨授權的token被轉走的風險,即使你沒有泄露私鑰助記詞。
便利三方庫: web3-react use-wallet
文檔: doc.metamask.io ethers
『拾』 以太坊如何使用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()用來提取指定交易的信息,一旦獲得交易信息,就可以存入資料庫供查詢用了。
推薦一個實戰入門,你可以看看:以太坊教程