使用Geth設定私有的基於權利證明POA乙太網網路
目標:逐步指導,幫助你使用權威證明共識引擎(也稱為clique)設定本地私有乙太網網路。
簡而言之:我們將在同一臺機器上設定兩個節點,在我們的localhost上建立一個點對點網路。除了兩個節點之外,還將設定啟動節點(發現服務)。
我花了相當長的時間和廣泛的研究和谷歌搜尋,最終有一個堅實的以太坊開發環境來測試我的智慧合約和我的DApps。
在這篇文章中,我決定分享我如何使用Geth的clique共識引擎設定一個Proof-of-Authority網路。這是我通過回饋感謝社群的方式,並希望讓任何願意探索以太坊宇宙的人都能過上更輕鬆的生活。
作業系統和軟體
我的作業系統是Ubuntu 16.04 LTS(這個tuto是在一個新的虛擬機器中完成的)。
對於以太坊客戶端,我使用的是Geth(以太坊protocole的Go實現)。我相信Geth很容易安裝,有很多很棒的教程,所以我不打算在這裡安裝任何裝置。我目前正在執行Geth 1.7.3-stable:
$ geth version Geth Version: 1.7.3-stable Git Commit: 4bb3c89d44e372e6a9ab85a8be0c9345265c763a Architecture: amd64 Protocol Versions: [63 62]
和Geth 1.8.1-stable:
$ geth version Geth Version: 1.8.1-stable Git Commit: 1e67410e88d2685bc54611a7c9f75c327b553ccc Architecture: amd64 Protocol Versions: [63 62]
我強烈建議你檢視 Geth命令列介面文件 。你需要它。非常的。
讓我們開始吧
1.0 概述
讓我們從頭到尾……為了清楚起見,這是你完成第1章後應該得到的。
devnet$ tree -L 2 . ├── accounts.txt ├── boot.key ├── genesis.json ├── node1 │├── geth │├── keystore │└── password.txt └── node2 ├── geth ├── keystore └── password.txt
1.1 建立工作區
$ mkdir devnet $ cd devnet devnet$ mkdir node1 node2
1.2 建立你的帳戶
帳戶(也稱為錢包)擁有與任何區塊鏈互動所需的公私鑰對。任何挖掘節點(嚴格來說我們的節點不會挖掘但投票)需要能夠簽署交易(使用他們的私鑰)並在網路上標識自己(地址來自公鑰)。因此,我們至少需要兩個帳戶,每個節點一個帳戶。
在Geth行話中,投票節點稱為Sealer。
對於節點1:
devnet$ geth --datadir node1/ account new Your new account is locked with a password. Please give a password. Do not forget this password. Passphrase: pwdnode1 (for example) Repeat passphrase: pwdnode1 Address: {87366ef81db496edd0ea2055ca605e8686eec1e6}
節點2:
devnet$ geth --datadir node2/ account new Your new account is locked with a password. Please give a password. Do not forget this password. Passphrase: pwdnode2 (for example) Repeat passphrase: pwdnode2 Address: {08a58f09194e403d02a1928a7bf78646cfc260b0}
這將建立包含你的帳戶檔案的 keystore/
。請注意, keystore/
中檔名的最後一部分是你帳戶的地址(也在上面的終端中列印)。
我建議從終端螢幕複製這兩個地址,並將它們儲存在文字檔案中。這將在以後簡化一些複製貼上工作。但請記住,你可以從 keystore /
中的 UTC-datetime-address
檔案中讀取這些addesses。
devnet$ echo '87366ef81db496edd0ea2055ca605e8686eec1e6' >> accounts.txt devnet$ echo '08a58f09194e403d02a1928a7bf78646cfc260b0' >> accounts.txt
對於每個節點,我建議將密碼儲存在檔案中。這將在以後簡化某些流程(例如解鎖你的帳戶)
devnet$ echo 'pwdnode1' > node1/password.txt devnet$ echo 'pwdnode2' > node2/password.txt
1.3 建立你的Genesis檔案
genesis檔案是用於初始化區塊鏈的檔案。第一個塊,稱為genesis塊,是根據 genesis.json
檔案中的引數精心設計的。
Geth帶有一堆expeuables,如 puppeth
或 bootnode
。你可以在 Geth github 上找到完整列表。Puppeth消除了從頭開始建立一個genesis檔案的痛苦(並做了更多)。開始吧:
devnet$ puppeth
並愉快地回答問題(每個值都可以在以後手動更新,所以不要花太多時間為第一次試驗設計它)。
Please specify a network name to administer (no spaces, please) > devnet What would you like to do? (default = stats) 1. Show network stats 2. Configure new genesis 3. Track new remote server 4. Deploy network components > 2 Which consensus engine to use? (default = clique) 1. Ethash - proof-of-work 2. Clique - proof-of-authority > 2 How many seconds should blocks take? (default = 15) > 5 // for example Which accounts are allowed to seal? (mandatory at least one) > 0x87366ef81db496edd0ea2055ca605e8686eec1e6 //copy paste from account.txt :) > 0x08a58f09194e403d02a1928a7bf78646cfc260b0 Which accounts should be pre-funded? (advisable at least one) > 0x87366ef81db496edd0ea2055ca605e8686eec1e6 // free ethers ! > 0x08a58f09194e403d02a1928a7bf78646cfc260b0 Specify your chain/network ID if you want an explicit one (default = random) > 1515 // for example. Do not use anything from 1 to 10 Anything fun to embed into the genesis block? (max 32 bytes) > What would you like to do? (default = stats) 1. Show network stats 2. Manage existing genesis 3. Track new remote server 4. Deploy network components > 2 1. Modify existing fork rules 2. Export genesis configuration > 2 Which file to save the genesis into? (default = devnet.json) > genesis.json INFO [01-23|15:16:17] Exported existing genesis block What would you like to do? (default = stats) 1. Show network stats 2. Manage existing genesis 3. Track new remote server 4. Deploy network components > ^C // ctrl+C to quit puppeth
附註:來自 Clique PoA EIP#225
注意:PoA沒有采礦獎勵
因此,我強烈建議你將一些ether(以wei為單位定義)分配給genesis檔案中的一堆地址,否則你將在沒有任何以太的情況下提交,因此無法支付你的交易費用。你可能有一個0的 gasPrice
,但有時會導致可能受掃描影響的節點的不良行為(如不根據網路上其他節點的配置廣播待處理的交易)。不過我鼓勵你玩每個引數:)
1.4 初始化節點
現在我們有了genesis.json檔案,讓我們初始化創始塊!必須使用相同genesis檔案初始化每個節點。
devnet$ geth --datadir node1/ init genesis.json devnet$ geth --datadir node2/ init genesis.json
田田!完成。
旁註:加入以太坊主網或Ropsten測試網或Rinkeby測試網時,您的節點如何知道創世體引數? 它們已在params / config.go的原始碼中定義。
1.5 建立一個bootnode
啟動節點的唯一目的是幫助節點發現彼此(記住,以太坊區塊鏈是對等網路)。節點可以具有動態IP,關閉,然後再開啟。 bootnode
通常在靜態IP上執行,因此就像一個 pub
,節點知道它們會找到它們的配對。
初始化bootnode:
devnet$ bootnode -genkey boot.key
這將建立一個名為 enode
的值,用於唯一標識你的bootnode(很快就會更多),我們將此enode儲存在 boot.key
檔案中。
1.6 中途慶祝下
恭喜!第1章完成:),來試試。
devnet$ tree -L 2
並將輸出與1.0節進行比較。希望你應該得到同樣的一個tree。
此時設定已完成,我們已準備好使用此區塊鏈。
2. 啟用
2.1 啟動bootnode服務
devnet$ bootnode -nodekey boot.key -verbosity 9 -addr :30310 INFO [02-07|22:44:09] UDP listener upself=enode://3ec4fef2d726c2c01f16f0a0030f15dd5a81e274067af2b2157cafbf76aa79fa9c0be52c6664e80cc5b08162ede53279bd70ee10d024fe86613b0b09e1106c40@[::]:30310
我喜歡對我的bootnode有一些冗長,因為很高興看到節點在網路上播放乒乓球時(這意味著它正在工作!)。
隨意使用你喜歡的任何埠,但請避免使用主流埠(如80 for HTTP)。30303用於公共以太坊網路。
2.2 啟動節點
重要時刻!最後(但通常在這裡麻煩也來了)。
一切都在一個巨大的命令!我將介紹一些選項,但請做好功課並 參考文件 。
起始節點1
devnet$ geth --datadir node1/ --syncmode 'full' --port 30311 --rpc --rpcaddr 'localhost' --rpcport 8501 --rpcapi 'personal,db,eth,net,web3,txpool,miner' --bootnodes 'enode://3ec4fef2d726c2c01f16f0a0030f15dd5a81e274067af2b2157cafbf76aa79fa9c0be52c6664e80cc5b08162ede53279bd70ee10d024fe86613b0b09e1106c40@127.0.0.1:30310' --networkid 1515 --gasprice '1' -unlock '0x87366ef81db496edd0ea2055ca605e8686eec1e6' --password node1/password.txt --mine
-
--syncmode'full'
,有助於防止錯誤,丟棄傳播有問題的塊 Discarded Bad Propagated Block 。 -
--port 30311
,是node1的enode埠,必須與bootnode埠不同(如果你遵循我的命令,則為30310
),因為我們在本地主機上。在真實網路(每臺計算機一個節點)上,使用相同的埠。--rpcapi
,允許列出的模組用於RPC呼叫(參見3.3節的示例)。有關詳細資訊,請參閱 Geth Management API 。如果沒有防火牆保護你的節點,每個人都可以呼叫您的RPC方法,請注意黑客攻擊。--bootnodes
,告訴你的節點找到你的bootnode的地址。用引導節點IP替換[::]
。不允許域名!只有IP。 檢查enode URL格式 。--networkId
,如genesis.json
檔案中所定義。請使用相同的ID!--gasprice'1'
,我不喜歡在自己的網路上付款:)小心使用gasprice。如果您的交易沒有被廣播到網路,但只有接收交易的節點正在處理它們,這意味著您傳送的交易的天然氣價格被網路上的其他節點接受(太低)。沒有錯誤將返回。如果您有兩個節點,則只有一個節點將處理事務。這是偷偷摸摸的,將您的網路吞吐量降低了2倍。--unlock
--password
--mine
,告訴節點解鎖此帳戶,使用該檔案中的密碼並開始挖掘(即投票/密封以獲得權利證明)。--targetgaslimit
,值參見2.3節中的更新。
節點2相同(更新特定於節點的引數)
devnet$ geth --datadir node2/ --syncmode 'full' --port 30312 --rpc --rpcaddr 'localhost' --rpcport 8502 --rpcapi 'personal,db,eth,net,web3,txpool,miner' --bootnodes 'enode://3ec4fef2d726c2c01f16f0a0030f15dd5a81e274067af2b2157cafbf76aa79fa9c0be52c6664e80cc5b08162ede53279bd70ee10d024fe86613b0b09e1106c40@127.0.0.1:30310' --networkid 1515 --gasprice '0' --unlock '0x08a58f09194e403d02a1928a7bf78646cfc260b0' --password node2/password.txt --mine
此時,你的bootnode應流式傳輸來自node1(埠30311)和node2(埠30312)的連線,如上部終端視窗所示。Node1(中間終端)和node2(下層終端)應該愉快地挖掘和簽署塊。 這裡我有1秒的時間(在創世紀檔案中定義)因此建立了快速塊。
2.3 更新你的創世紀檔案
我相信你會想要修改你的genesis檔案中的一些值。前進!但是,為了使這些更改生效,我們必須初始化一個新的區塊鏈。這是我目前使用的創世紀檔案:
{ "config": { "chainId": 1515, "homesteadBlock": 1, "eip150Block": 2, "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", "eip155Block": 3, "eip158Block": 3, "byzantiumBlock": 4, "clique": { "period": 1, "epoch": 30000 } }, "nonce": "0x0", "timestamp": "0x5a722c92", "extraData": "0x000000000000000000000000000000000000000000000000000000000000000008a58f09194e403d02a1928a7bf78646cfc260b087366ef81db496edd0ea2055ca605e8686eec1e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x59A5380", "difficulty": "0x1", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { "08a58f09194e403d02a1928a7bf78646cfc260b0": { "balance": "0x200000000000000000000000000000000000000000000000000000000000000" }, "87366ef81db496edd0ea2055ca605e8686eec1e6": { "balance": "0x200000000000000000000000000000000000000000000000000000000000000" }, "F464A67CA59606f0fFE159092FF2F474d69FD675": { "balance": "0x200000000000000000000000000000000000000000000000000000000000000" } }, "number": "0x0", "gasUsed": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" }
我已經清理了puppeth在建立檔案時包含的空地址(在1.3節)。我還添加了第三個地址,在建立創世塊時獲得資助。然後我將 period
從15秒更改為1,以便更快地挖掘這些塊(小心,因為一個空塊加權1024位元組,這裡我的 chaindata/
資料夾每秒增加1024位元組(如果塊不為空,則更多)。我已經增加了 gasLimit
以允許每個塊進行更多的交易(trully,計算)。
更新: genesis
檔案中定義的 gasLimit
僅適用於 genesis
塊!新塊的 gasLimit
是 DYNAMIC ,意味著它的值隨著時間的推移而變化,具體取決於父(前一個)塊中使用了多少gas。新 gasLimit
的計算在 CalcGasLimit
函式( github原始碼 )中完成。如果你想要一個恆定的gas限制,請在執行geth時使用 選項 --targetgaslimit intValue
。我建議將它設定為等於genesis檔案中的gasLimit(命令選項是一個整數,而生成值是十六進位制),這樣你就可以獲得一個不再隨時間變化的恆定gas限制。鑑於上面的genesis檔案帶有 “gasLimit”:“0x59A5380”
,我正在使用 --targetgaslimit 94000000
執行我的節點,以獲得所有塊的恆定gas限制。
欄位 extraData
包含允許密封的地址(這就是為什麼puppeth很高興)。
我已經調查了更改 period
和 gasLimit
對區塊鏈可以處理的每秒交易數(交易率)的影響。
如果你對genesis檔案感到滿意。如果節點正在執行,請終止它們(在終端中按ctrl C)。然後刪除 node1/
中的資料夾 geth/
和 node2/
中的 geht/
。僅刪除 geth/
資料夾!
然後初始化你的節點。從1.4節開始:
devnet$ geth --datadir node1/ init genesis.json devnet$ geth --datadir node2/ init genesis.json
然後使用2.2節中的命令再次啟動節點
3. 與你的節點互動
偉大的網路生活現在開始:)但如何連線到它並開始探索?
3.1 開啟Geth Javascript控制檯
使用節點的最簡單且可能更直接的方法可能是將 Geth javascript控制檯 附加到其中一個節點。
3.1.1 通過IPC
IPC (程序間通訊)僅在本地工作:你應與節點位於同一臺計算機上。開啟一個額外的終端並連線到你的節點。要連線到node1:
$ cd devnet devnet$ geth attach node1/geth.ipc Welcome to the Geth JavaScript console! instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9 coinbase: 0x87366ef81db496edd0ea2055ca605e8686eec1e6 at block: 901 (Sat, 10 Feb 2018 21:15:30 CET) datadir: /home/salanfe/privateNetworks/devnet/node1 modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0 >
僅在節點執行時才建立檔案 geth.ipc
。所以如果你的node1關閉,不要指望找到它。
RPC提供對終端中列出的所有模組的訪問而不受限制: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
3.1.2 通過RPC
RPC (遠端過程呼叫)作為HTTP請求在Internet上工作。因此,當您向外界開啟RPC時要小心,因為每個人都可以訪問您的節點。因此,預設情況下禁用RPC,啟用後,它不會授予對所有模組的訪問許可權。在本指南中,我們使用命令 --rpc
在我們的Geth節點上允許RPC,並允許訪問模組 personal,db,eth,net,web3,txpool,miner
(來自第2.2節)。 要使用RPC連線到node1:
$ cd devnet devnet$ geth attach 'http://localhost:8501' Welcome to the Geth JavaScript console! instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9 coinbase: 0x87366ef81db496edd0ea2055ca605e8686eec1e6 at block: 945 (Sat, 10 Feb 2018 21:16:14 CET) modules: eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0 >
3.1.3 使用Geth Javascript控制檯
以下是一些方法示例
> net.version "1515" > eth.blockNumber 1910 > eth.coinbase "0x87366ef81db496edd0ea2055ca605e8686eec1e6" > eth.sendTransaction({'from':eth.coinbase, 'to':'0x08a58f09194e403d02a1928a7bf78646cfc260b0', 'value':web3.toWei(3, 'ether')}) "0x299a99baa1b39bdee5f02e3c660e19e744f81c2e886b5fc24aa83f92fe100d3f" > eth.getTransactionReceipt("0x299a99baa1b39bdee5f02e3c660e19e744f81c2e886b5fc24aa83f92fe100d3f") { blockHash: "0x212fb593980bd42fcaf3f6d1e6db2dd86d3764df8cac2d90408f481ae7830de8", blockNumber: 2079, contractAddress: null, cumulativeGasUsed: 21000, from: "0x87366ef81db496edd0ea2055ca605e8686eec1e6", gasUsed: 21000, logs: [], logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", status: "0x1", to: "0x08a58f09194e403d02a1928a7bf78646cfc260b0", transactionHash: "0x299a99baa1b39bdee5f02e3c660e19e744f81c2e886b5fc24aa83f92fe100d3f", transactionIndex: 0 } > exit // to quit the Geth javascript console
有關方法的完整列表,請參閱 管理API 和 JSON RPC API 。
3.2 使用 mist
Mist瀏覽器提供圖形使用者介面,用於部署智慧合約和管理帳戶並與之互動。要通過IPC將Mist連線到本地專用網路,只需執行以下操作:
devnet $ mist --rpc node1/geth.ipc
並通過RPC(確保啟用RPC)
$ mist --rpc 'http://localhost:8501'
如果您想使用 以太坊錢包 而不是mist,則程式完全相同。只需在上面的命令中用 ethereumwallet
替換mist。
3.3 使用你喜歡的程式語言進行RPC呼叫
在3.1節中,我們瞭解瞭如何手動與Geth API進行互動。現在讓我們將我們的PC用於最擅長的領域:自動化。
向你的節點發送JSON-RPC請求的引用和到目前為止是 web3.js javascript庫。我相信網際網路上有很多關於如何使用web3.js庫的精彩教程和示例。所以我不會在這裡隱瞞任何一個。
JSON-RPC API目前也在使用 web3.j 庫的java中實現,在python中使用 web3.py 庫實現。這些庫提供了與web3.js一樣使用以太坊區塊鏈的高階方法。
但是,也可以將原始 JSON-RPC 請求直接傳送到你的節點。我認為值得嘗試,因為它提供了一個有價值的理解,瞭解這些高階庫如何在幕後工作。
下面是使用python 3將原始JSON-RPC請求傳送到節點的簡單示例:
$ python Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 18:10:19) [GCC 7.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import requests >>> import json >>> session = requests.Session() >>> method = 'eth_getTransactionCount' >>> params = ["0x627306090abaB3A6e1400e9345bC60c78a8BEf57","latest"] >>> PAYLOAD = {"jsonrpc":"2.0", ..."method":method, ..."params":params, ..."id":67} >>> PAYLOAD = json.dumps(PAYLOAD) >>> headers = {'Content-type': 'application/json'} >>> response = session.post('http://127.0.0.1:8501', data=PAYLOAD, headers=headers) >>> response.content b'{"jsonrpc":"2.0","id":67,"result":"0x0"}\n' >>> json.loads(response.content)['result'] '0x0'
這裡記錄了方法 geth_transactionCount
。
“account” 隨機數 是一個交易計數器,與工作證明的隨機數無關。帳戶現時值為零意味著地址 0x627306090abaB3A6e1400e9345bC60c78a8BEf57
從未在網路上執行任何交易: 0x0
是十六進位制表示為零。
3.4 在你的專用網路上使用Truffle部署和測試你的智慧合約
像 Truffle (或Embark,Populus)這樣的開發框架是開發和測試智慧合約的絕佳工具。
使用時初始化工作空間時
$ truffle init
Truffle建立了一系列檔案和資料夾,以幫助你入門。我通常會編輯 truffle.js
檔案
module.exports = { // See <http://truffleframework.com/docs/advanced/configuration> // to customize your Truffle configuration! networks: { devnet: { host: '127.0.0.1', port: 8501, network_id: '*' }, ganache: { host: '127.0.0.1', port: 7545, network_id: '*' } } };
然後使用這個命令:
$ truffle deploy --network devnet
部署遷移 /X_deploy.js
中定義的智慧合約。或者用於在 test/
中執行測試
$ truffle test --network devnet
通常,以太坊區塊鏈模擬器Ganache足以執行你的測試。但是我喜歡使用我的私有區塊鏈在真實節點上進行終極測試,而不僅僅是在模擬器上。有了Ganache,我相信抽象層太大了,它的美妙之處還有危險,因為它不需要理解真實節點的複雜性(交易池,gasPrice,gasLimit,節點之間的廣播交易),挖掘或投票,計算時間,共識引擎等)。
下一步是什麼 ?
這對於本指南來說非常重要。如果你瞭解這裡的一切,我相信你已經處於非常好的軌道上,並且你有一個堅實的基礎,你可以自信地繼續你的旅程。
你可以通過抓取web3庫或製作自己的自定義JSON-RPC包裝器來開始開發Dapps(去中心化應用程式)。
在這篇文章中,我將探討如何使用python僅使用原始HTTP請求與智慧合約進行部署和交易。
最後的話
祝賀你做到最後。我希望本指南是全面的,並幫助你完成旅程。我歡迎任何反饋,以改進本指南!
並且非常感謝社群提供所有文件,教程,問答網站和指南。
快樂黑客!
更新:
geth 1.8在本指南釋出幾天後釋出,幸運的是沒有破壞任何東西。這篇文章是有效的,並測試了geth 1.7.3和geth 1.8。太棒了:)
我已經瞭解到每個區塊的gas限制是動態的 posteriori
。因此,我更新了第2.3節,以提供有關此特定案例的更多資訊。在我的私人網路中,塊大部分時間都是空的,我根本不會減少gas限制!
Clique要求 int(N/2+1)
sealers(其中N是創世紀檔案中定義的sealers數量——在 extraData
欄位中)才能線上執行。
感謝Ivica Aracic指出clique PoA可與單個節點一起工作。出於任何原因,我錯過了,我為這種困惑道歉。使用單個節點,我們只需要(A)建立只有一個sealer的genesis檔案( extraData
中只有1個地址),(B)建立一個帳戶,(C)init geth,(D)執行geth,解鎖帳戶和mine。那麼不需要bootnode。
使用geth 1.8如果收到指定的無效主機 invalid host specified
的錯誤,請嘗試將選項 --rpcvhosts
值新增到geth命令。見 geth --help
。
======================================================================
分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:
- java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- ERC721以太坊通證實戰,課程以一個數字藝術品創作與分享DApp的實戰開發為主線,深入講解以太坊非同質化通證的概念、標準與開發方案。內容包含ERC-721標準的自主實現,講解OpenZeppelin合約程式碼庫二次開發,實戰專案採用Truffle,IPFS,實現了通證以及去中心化的通證交易所。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
- EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- tendermint區塊鏈開發詳解 ,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裡是 使用Geth設定私有的基於權利證明POA乙太網網路