目標:逐步指導,幫助你使用權威證實共識引擎(也稱爲clique)設置本地私有以太網網絡。javascript
簡而言之:咱們將在同一臺機器上設置兩個節點,在咱們的localhost上建立一個點對點網絡。除了兩個節點以外,還將設置啓動節點(發現服務)。php
我花了至關長的時間和普遍的研究和谷歌搜索,最終有一個堅實的以太坊開發環境來測試個人智能合約和個人DApps。java
在這篇文章中,我決定分享我如何使用Geth的clique共識引擎設置一個Proof-of-Authority網絡。這是我經過回饋感謝社區的方式,並但願讓任何願意探索以太坊宇宙的人都能過上更輕鬆的生活。node
個人操做系統是Ubuntu 16.04 LTS(這個tuto是在一個新的虛擬機中完成的)。python
對於以太坊客戶端,我使用的是Geth(以太坊protocole的Go實現)。我相信Geth很容易安裝,有不少很棒的教程,因此我不打算在這裏安裝任何裝置。我目前正在運行Geth 1.7.3-stable:linux
$ geth version Geth Version: 1.7.3-stable Git Commit: 4bb3c89d44e372e6a9ab85a8be0c9345265c763a Architecture: amd64 Protocol Versions: [63 62]
和Geth 1.8.1-stable:android
$ geth version Geth Version: 1.8.1-stable Git Commit: 1e67410e88d2685bc54611a7c9f75c327b553ccc Architecture: amd64 Protocol Versions: [63 62]
我強烈建議你查看Geth命令行界面文檔。你須要它。很是的。git
讓咱們從頭至尾......爲了清楚起見,這是你完成第1章後應該獲得的。程序員
devnet$ tree -L 2 . ├── accounts.txt ├── boot.key ├── genesis.json ├── node1 │ ├── geth │ ├── keystore │ └── password.txt └── node2 ├── geth ├── keystore └── password.txt
$ mkdir devnet $ cd devnet devnet$ mkdir node1 node2
賬戶(也稱爲錢包)擁有與任何區塊鏈交互所需的公私鑰對。任何挖掘節點(嚴格來講咱們的節點不會挖掘但投票)須要可以簽署交易(使用他們的私鑰)並在網絡上標識本身(地址來自公鑰)。所以,咱們至少須要兩個賬戶,每一個節點一個賬戶。github
在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
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
,但有時會致使可能受掃描影響的節點的不良行爲(如不根據網絡上其餘節點的配置廣播待處理的交易)。不過我鼓勵你玩每一個參數:)
如今咱們有了genesis.json文件,讓咱們初始化創始塊!必須使用相同genesis文件初始化每一個節點。
devnet$ geth --datadir node1/ init genesis.json devnet$ geth --datadir node2/ init genesis.json
田田!完成。
旁註:加入以太坊主網或Ropsten測試網或Rinkeby測試網時,您的節點如何知道創世體參數? 它們已在params / config.go的源代碼中定義。
啓動節點的惟一目的是幫助節點發現彼此(記住,以太坊區塊鏈是對等網絡)。節點能夠具備動態IP,關閉,而後再打開。bootnode
一般在靜態IP上運行,所以就像一個pub
,節點知道它們會找到它們的配對。
初始化bootnode:
devnet$ bootnode -genkey boot.key
這將建立一個名爲enode
的值,用於惟一標識你的bootnode(很快就會更多),咱們將此enode存儲在boot.key
文件中。
恭喜!第1章完成:),來試試。
devnet$ tree -L 2
並將輸出與1.0節進行比較。但願你應該獲得一樣的一個tree。
此時設置已完成,咱們已準備好使用此區塊鏈。
devnet$ bootnode -nodekey boot.key -verbosity 9 -addr :30310 INFO [02-07|22:44:09] UDP listener up self=enode://3ec4fef2d726c2c01f16f0a0030f15dd5a81e274067af2b2157cafbf76aa79fa9c0be52c6664e80cc5b08162ede53279bd70ee10d024fe86613b0b09e1106c40@[::]:30310
我喜歡對個人bootnode有一些冗長,由於很高興看到節點在網絡上播放乒乓球時(這意味着它正在工做!)。
隨意使用你喜歡的任何端口,但請避免使用主流端口(如80 for HTTP)。30303用於公共以太坊網絡。
重要時刻!最後(但一般在這裏麻煩也來了)。
一切都在一個巨大的命令!我將介紹一些選項,但請作好功課並參考文檔。
起始節點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秒的時間(在創世紀文件中定義)所以建立了快速塊。
我相信你會想要修改你的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節中的命令再次啓動節點
偉大的網絡生活如今開始:)但如何鏈接到它並開始探索?
使用節點的最簡單且可能更直接的方法多是將Geth javascript控制檯附加到其中一個節點。
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
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 >
如下是一些方法示例
> 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。
Mist瀏覽器提供圖形用戶界面,用於部署智能合約和管理賬戶並與之交互。要經過IPC將Mist鏈接到本地專用網絡,只需執行如下操做:
devnet $ mist --rpc node1/geth.ipc
並經過RPC(確保啓用RPC)
$ mist --rpc 'http://localhost:8501'
若是您想使用以太坊錢包而不是mist,則程序徹底相同。只需在上面的命令中用ethereumwallet
替換mist。
在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
是十六進制表示爲零。
像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以太網網絡