Hyperledger Composer Rest伺服器的Passport-JWT身份驗證
Hyperledger Composer是一個用於在Hyperledger Fabric區塊鏈平臺上開發區塊鏈應用程式的框架。
我們最近介紹了Hyperledger Composer入門,如果你不熟悉該技術,我建議你閱讀 如何使用Hyperledger Fabric和Composer構建區塊鏈網路 。在本文中,我們將執行以下操作:
- 建立示例業務網路定義。
- 使用Docker和PassportJWT身份驗證生成Composer Rest伺服器。
- 使用自定義JWT令牌使用Authenticated API。
要理解為什麼這不是那麼簡單,你可以看看這個我一直密切關注的GitHub問題。
如果你熟悉Hyperledger Composer並且擁有示例網路,則可以直接跳轉到Hyperledger Composer Rest Server部分。
先決條件
要繼續學習,你應該安裝以下內容。
1. Hyperledger Composer先決條件
這包括NodeJS LTS版本和Docker。你可以在本文件中找到適用於你的特定平臺的說明。
安裝完成後,你可以確認它們是否正常工作:
docker -v Docker version 18.03.1-ce, build 9ee9f40 node -v v8.11.2
2. Hyperledger Composer開發環境
這包括Composer CLI客戶端: composer-cli
,Yeoman Generator: generator-hyperledger-composer
和 yo
以及Hyperledger Fabric Docker映象。我們將在Hyperledger Fabric例項部分中檢視Hyperledger Fabric Docker映象。
npm install -g composer-cli yo generator-hyperledger-composer
如果你使用Visual Studio Code進行開發工作,則可能需要安裝Hyperledger Composer外掛。
你可以在終端上輸入composer命令確認已成功安裝composer-cli:
composer -v v0.19.5
Hyperledger Fabric例項
在開始之前,我們需要執行Hyperledger Fabric的例項。Hyperledger Composer開發環境指南提供了有關如何啟動網路的說明,但我們將簡要介紹它。
建立一個名為 fabric-dev-server
的目錄,在終端內部拉出Hyperledger Composer提供的樣本fabric-dev-server。
cd fabric-dev-server curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.tar.gz tar -xvf fabric-dev-servers.tar.gz
應該有以下檔案,這將有助於你快速啟動Hyperledger Fabric例項。
ls DevServer_connection.json createComposerProfile.shdownloadFabric.shfabric-scriptsstartFabric.shteardownAllDocker.sh _loader.shcreatePeerAdminCard.shfabric-dev-servers.tar.gz package.jsonstopFabric.shteardownFabric.sh
要啟動例項,請首先下載Hyperledger Fabric映象。
./downloadFabric.sh
你將在系統中注意到以下新的Docker映象。
docker images REPOSITORYTAGIMAGE IDCREATEDSIZE hyperledger/fabric-cax86_64-1.1.072617b4fa9b42 months ago299MB hyperledger/fabric-ordererx86_64-1.1.0ce0c810df36a2 months ago180MB hyperledger/fabric-peerx86_64-1.1.0b023f9be07712 months ago187MB hyperledger/fabric-ccenvx86_64-1.1.0c8b4909d8d462 months ago1.39GB hyperledger/fabric-couchdbx86_64-0.4.67e73c828fc5b3 months ago1.56GB
接下來,啟動Hyperledger Fabric例項。
./startFabric.sh
這些指令碼需要幾分鐘才能完成。它建立了一個 composer_default
Docker網路,並在該網路中執行容器,以便它們可以通過自定義主機名進行通訊。完成後,你可以通過檢查正在執行的Docker容器來檢查正在執行的Hyperledger Fabric的狀態。
docker ps CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 4d59ab99ac8chyperledger/fabric-peer:x86_64-1.1.0"peer node start"12 seconds agoUp 19 seconds0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcppeer0.org1.example.com 5985d3ceeb34hyperledger/fabric-ca:x86_64-1.1.0"sh -c 'fabric-ca-se…"14 seconds agoUp 20 seconds0.0.0.0:7054->7054/tcpca.org1.example.com 1163c18322f3hyperledger/fabric-couchdb:x86_64-0.4.6"tini -- /docker-ent…"14 seconds agoUp 19 seconds4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcpcouchdb 0d4c964f8dc5hyperledger/fabric-orderer:x86_64-1.1.0"orderer"14 seconds agoUp 20 seconds0.0.0.0:7050->7050/tcporderer.example.com
為composer設定Hyperledger Fabric例項的最後一步是生成憑據。Composer允許你通過在 .card
檔案中儲存相關資訊來完成此操作。此檔案通常基於連線配置檔案生成,該配置檔案在JSON檔案中定義。我們下載的fabric-dev-server在檔案 fabric-dev-server/fabric-scripts/hlfv11/createPeerAdminCard.sh
中有檔案。
編輯建立連線配置檔案的部分(撰寫本文時的第78行)。它開始於:
cat << EOF > DevServer_connection.json
編輯內容以使用主機名,而不是預設的 ${HOST}
。我們正在編輯的屬性是 orderers
, peers
和 certificationAuthorities
。
createPeerAdminCard.sh
... cat << EOF > DevServer_connection.json { "name": "hlfv1", "x-type": "hlfv1", "x-commitTimeout": 300, "version": "1.0.0", "client": { "organization": "Org1", "connection": { "timeout": { "peer": { "endorser": "300", "eventHub": "300", "eventReg": "300" }, "orderer": "300" } } }, "channels": { "composerchannel": { "orderers": [ "orderer.example.com" ], "peers": { "peer0.org1.example.com": {} } } }, "organizations": { "Org1": { "mspid": "Org1MSP", "peers": [ "peer0.org1.example.com" ], "certificateAuthorities": [ "ca.org1.example.com" ] } }, "orderers": { "orderer.example.com": { "url": "grpc://orderer.example.com:7050" } }, "peers": { "peer0.org1.example.com": { "url": "grpc://peer0.org1.example.com:7051", "eventUrl": "grpc://peer0.org1.example.com:7053" } }, "certificateAuthorities": { "ca.org1.example.com": { "url": "http://ca.org1.example.com:7054", "caName": "ca.org1.example.com" } } } EOF ...
與原始檔案的不同之處在於我們已將 ${HOST}
替換為自定義主機名。我們正在做他的,因為Composer Rest Server將作為Docker容器執行,它將使用這個主機名訪問網路中的相關容器。
但請注意,我們仍需要從終端訪問同行,證書頒發機構和訂購者。它們已經被Docker暴露在我們的主機上,並且正在偵聽localhost上的特定埠。因此,我們需要將這些主機名的記錄新增到 /etc/hosts
檔案中,以便在從我們的主機中呼叫時可以解析為localhost。你可能需要使用 sudo
。
/etc/hosts
## # Host Database # # localhost is used to configure the loopback interface # when the system is booting.Do not change this entry. ## 127.0.0.1localhost 255.255.255.255broadcasthost ::1localhost 127.0.0.1 orderer.example.com peer0.org1.example.com ca.org1.example.com
現在,我們可以通過在fabric-dev-server目錄中執行它來繼續建立節點管理卡。
./createPeerAdminCard.sh
要檢查現有卡,請執行:
composer card list The following Business Network Cards are available: Connection Profile: hlfv1 ┌─────────────────┬───────────┬──────────────────┐ │ Card Name│ UserId│ Business Network │ ├─────────────────┼───────────┼──────────────────┤ │ PeerAdmin@hlfv1 │ PeerAdmin ││ └─────────────────┴───────────┴──────────────────┘ Issue composer card list --card <Card Name> to get details a specific card Command succeeded
商業網路
接下來,我們將建立一個示例業務網路。我們稱之為 tutorial-network
,與Hyperledger文件中給出的名稱相同。
我們的業務網路將是Hyperledger Yeoman生成器生成的預設網路。我們沒有改變它,因為這裡的主要重點是驗證Composer Rest Server。
我們將使用我們開始時安裝的 generator-hyperledger-composer
。使用以下內容,並在相關時進行更換。
yo hyperledger-composer:businessnetwork Welcome to the business network generator ? Business network name: tutorial-network ? Description: tutorial network ? Author name:Christopher Ganga ? Author email: [email protected] ? License: Apache-2.0 ? Namespace: org.example.biznet ? Do you want to generate an empty template network? No: generate a populated sample network create package.json create README.md create models/org.example.biznet.cto create permissions.acl create .eslintrc.yml create features/sample.feature create features/support/index.js create test/logic.js create lib/logic.js
這將生成一個名為 tutorial-network
的目錄,其中包含以下內容。
. ├── README.md ├── features │├── sample.feature │└── support │└── index.js ├── lib │└── logic.js ├── models │└── org.example.biznet.cto ├── package.json ├── permissions.acl └── test └── logic.js 5 directories, 8 files
部署業務網路
建立業務網路後,我們將繼續構建存檔檔案,並將其部署到Hyperledger Fabric的現有執行例項。
在tutorial-network目錄的根目錄中,建立業務網路存檔。
composer archive create -t dir -n .
這將建立存檔檔案 [email protected]
。
現在我們有了歸檔檔案,我們可以繼續將網路安裝到節點中。執行此命令以安裝網路:
composer network install --card PeerAdmin@hlfv1 --archiveFile [email protected]
接下來,我們通過執行啟動網路:
composer network start --networkName tutorial-network --networkVersion 0.0.1 --networkAdmin admin --networkAdminEnrollSecret adminpw --card PeerAdmin@hlfv1 --file networkadmin.card
此命令可能需要一段時間才能執行,但是當它完成時,你會注意到一個新的Docker容器,其名稱以 dev-peer0.org1.example.com-tutorial-network-0.0.1 ...
開頭。運營我們的業務網路。你可以通過執行 docker ps
來檢查這一點。
然後,我們需要匯入新的networkadmin卡,以使其在網路中可用。
composer card import --file networkadmin.card
你得到一個networkadmin卡名稱 admin@tutorial-network
,我們可以繼續使用它。你也可以通過執行 composer card list
來檢查。
最後,為了確保成功部署業務網路,我們可以ping下試試。
composer network ping --card admin@tutorial-network
業務網路預設參與者。
由於本文的目標是建立一個經過身份驗證的Composer Rest伺服器版本,因此我們將建立一個預設參與者,他們將能夠建立其他參與者和身份。
/fabric-dev-servers/tutorial-network/models/org.example.biznet.cto
檔案中參與者的結構是:
participant SampleParticipant identified by participantId { o String participantId o String firstName o String lastName }
我們將建立一個參與者並將其繫結到一個身份,以便我們為該參與者獲得一張身份證。這是我們要新增的參與者。
{ "$class": "org.example.biznet.SampleParticipant", "participantId": "gangachris", "firstName": "chris", "lastName": "ganga" }
在終端中定義參與者資料。
participantId=gangachris firstName=chris lastName=ganga PARTICIPANT_CLASS=org.example.biznet.SampleParticipant participantData="{\"\$class\": \"${PARTICIPANT_CLASS}\", \"participantId\": \"${participantId}\", \"firstName\": \"${firstName}\", \"lastName\": \"${lastName}\"}"
然後將參與者新增到網路中。
composer participant add -c admin@tutorial-network-d "$participantData"
然後我們需要向該參與者發放身份,以便他們擁有身份證。
composer identity issue -c admin@tutorial-network -f gangachris.card -u $participantId -a "resource:${PARTICIPANT_CLASS}#${participantId }" -x true
-x
標誌允許參與者能夠發出身份。
Hyperledger Composer Rest伺服器(Docker)
部署Composer Rest Server最常見的生產方式是通過Docker。 這主要是因為Hyperldger Fabric例項部署主要通過Kubernetes,Docker在容器網路生態系統中執行。 Swarm或普通的docker-compose樣式就像我們現在正在做的那樣。
由於我們使用的是 passport-jwt
,我們需要建立一個我們將在Docker容器中新增的自定義JWT檔案。
custom-jwt.js
// based on: // https://github.com/hyperledger/composer/issues/2038 const passportJwt = require('passport-jwt'); const util = require('util'); function CustomJwtStrategy(options, verify) { options.jwtFromRequest = passportJwt.ExtractJwt.fromAuthHeaderAsBearerToken(); passportJwt.Strategy.call(this, options, verify); } util.inherits(CustomJwtStrategy, passportJwt.Strategy); module.exports = { Strategy: CustomJwtStrategy };
我們在這裡沒有新增任何JWT宣告,因為我們正在努力使其儘可能簡單。我們從請求授權header`passportJwt.ExtractJwt.fromAuthHeaderAsBearerToken()中檢索JWT作為承載token,並且庫將處理剩餘的身份驗證。
請注意,我們將從其他地方生成JWT token,可能是將使用Composer Rest Server的客戶端。對於Composer Rest Server解碼token併為其提供自己的訪問token,用於生成原始JWT token的JWT祕密必須用作passport-jwt配置的祕密變數,我們將在稍後看到。
Composer Rest Server還要求JWT token宣告具有ID或使用者名稱。(不知道為什麼會這樣)。
然後,我們將為Composer Rest Server構建一個Docker映象。建立一個Dockerfile。
Dockerfile
FROM hyperledger/composer-rest-server:0.19.5 RUN npm install --production loopback-connector-mongodb passport-jwt && \ npm cache clean --force && \ ln -s node_modules .node_modules COPY custom-jwt.js node_modules/custom-jwt.js COPY .composer /home/composer/.composer
我們將安裝passport-jwt和loopback-connector-mongodb作為映象構建的一部分。然後我們新增我們之前建立的 custom-jwt.js
檔案。
身份證的Composer預設目錄是 /home/composer/.composer
。在構建映象之前,我們可以從 home/composer/.composer
目錄中複製現有的身份證。我們還需要更改檔案許可權,以便docker可以在沒有EACCESS錯誤的情況下處理它們。
cp -rp ~/.composer . chmod -R a+rw .composer find .composer -type d -exec chmod a+x {} +
我們現在可以構建Docker映象了。
docker build -t localhost/composer-rest-server .
請注意,我們安裝了 loopback-connector-mongodb
作為映象構建的一部分。這意味著我們將使用MongoDB作為儲存我們經過身份驗證的使用者和憑據的首選資料庫。因此,我們需要一個正在執行的MongoDB例項。
但是,此例項需要與當前執行的Hyperledger Fabric網路位於相同的Docker網路中。 當我們啟動Hyperledger Fabric例項時,建立了一個名為 composer_default
的網路。為了確認這一點,我們可以執行 docker network ls
。
docker network ls NETWORK IDNAMEDRIVERSCOPE e7da7b74070ebridgebridgelocal bdae606dc573composer_defaultbridgelocal f0f15a5d479bhosthostlocal e9b986a1141dnonenulllocal
你可以看到我們有一個 composer_default
網路。要檢查使用此網路執行的容器,我們可以執行,並檢查Container屬性。
docker network inspect composer_default
你會注意到容器是當前正在執行的容器資訊:
"Containers": { "0d4c964f8dc5f7cc8acb48a48d5714d6d3a9349b02992c1d60cc87f0d2d0dd2b": { "Name": "orderer.example.com", "EndpointID": "3a20963d2a31802e9769448f3a880d9b54369924eac27943e604e191f68c5a8b", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" }, "1163c18322f3194a0df08d40f11cc134ac006a06221091504d7bfee7cc73c13d": { "Name": "couchdb", "EndpointID": "1a9f4de2748134bcf1a9c0cb4bbaf06d9e06391eee2b741db163f4165553dfa4", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" }, .... }
在composer_default網路中執行mongodb容器。
docker run -d --name mongo --network composer_default -p 27017:27017 mongo
建立一個檔案 envvars.txt
。
COMPOSER_CARD=admin@tutorial-network COMPOSER_NAMESPACES=never COMPOSER_AUTHENTICATION=true COMPOSER_MULTIUSER=true COMPOSER_PROVIDERS='{ "jwt": { "provider": "jwt", "module": "/home/composer/node_modules/custom-jwt.js", "secretOrKey": "gSi4WmttWuvy2ewoTGooigPwSDoxwZOy", "authScheme": "saml", "successRedirect": "/", "failureRedirect":"/" } }' COMPOSER_DATASOURCES='{ "db": { "name": "db", "connector": "mongodb", "host": "mongo" } }'
CUSTOM_PROVIDERS
環境變數指定我們使用jwt和自定義模組。
由於我們使用的是MongoDB,因此我們的 CUSTOM_DATASOURCES
環境變數也指向此。
為了使這些變數成為實際的環境變數,我們執行:
source envvars.txt
然後我們可以在composer_default網路中執行Docker容器。
docker run \ -d \ -e COMPOSER_CARD=${COMPOSER_CARD} \ -e COMPOSER_NAMESPACES=${COMPOSER_NAMESPACES} \ -e COMPOSER_AUTHENTICATION=${COMPOSER_AUTHENTICATION} \ -e COMPOSER_MULTIUSER=${COMPOSER_MULTIUSER} \ -e COMPOSER_PROVIDERS="${COMPOSER_PROVIDERS}" \ -e COMPOSER_DATASOURCES="${COMPOSER_DATASOURCES}" \ --name rest \ --network composer_default \ -p 3000:3000 \ localhost/composer-rest-server
為確保composer rest server 成功執行,我們檢查其日誌。
docker logs rest [2018-05-22 22:24:44] PM2 log: Launching in no daemon mode [2018-05-22 22:24:44] PM2 log: Starting execution sequence in -fork mode- for app name:composer-rest-server id:0 [2018-05-22 22:24:44] PM2 log: App name:composer-rest-server id:0 online WARNING: NODE_APP_INSTANCE value of '0' did not match any instance config file names. WARNING: See https://github.com/lorenwest/node-config/wiki/Strict-Mode Discovering types from business network definition ... Discovered types from business network definition Generating schemas for all types in business network definition ... Generated schemas for all types in business network definition Adding schemas for all types to Loopback ... Added schemas for all types to Loopback Web server listening at: http://localhost:3000 Browse your REST API at http://localhost:3000/explorer
如果你看到最後一行在 http://localhost:3000/explorer
瀏覽你的REST API,我們很好。
訪問 http://localhost:3000/explorer
並嘗試在任何端點上執行GET將返回 401 Unauthorized
。
驗證Composer Rest伺服器
要對Composer Rest server進行身份驗證,我們需要執行以下操作:
http://localhost:3000/auth/jwt/callback http://localhost:3000/api/wallet/import
我們將使用Postman進行此練習,因為它是將header傳遞給請求的直觀方式之一,因此我們不會真正做到第二,因為cookie將在後續請求中傳遞。
但是,如果你有一個客戶端使用composer-rest伺服器,則需要從返回的access_token cookie中檢索token。這是一些用於檢索token的示例程式碼,這是來自Hyperledger結構。我們可能會在另一篇文章中看到建立這樣的客戶端。
我根據上述加密 gSi4WmttWuvy2ewoTGooigPwSDoxwZOy
生成了一個JWT token,聲稱如下: "timestamp":time.Now().UnixNano(),"username": username
。語法適用於Golang,但宣告是當前時間戳,使用者名稱是 gangachris
。結果token就是這個。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0aW1lc3RhbXAiOjE1MjcxNjI1MDQ3NDI1NjUwODcsInVzZXJuYW1lIjoiZ2FuZ2FjaHJpcyJ9.WyARsOhMSDVRjUpd-rPBI1A8-Vpz7pDS6rICXKN8W3U
請注意,此token不安全,因為它沒有足夠的宣告和到期日。這僅用於演示目的。
接下來,我們做一個GET請求 http://localhost:3000/auth/jwt/callback
後結果 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0aW1lc3RhbXAiOjE1MjcxNjI1MDQ3NDI1NjUwODcsInVzZXJuYW1lIjoiZ2FuZ2FjaHJpcyJ9.WyARsOhMSDVRjUpd-rPBI1A8-Vpz7pDS6rICXKN8W3U
作為header。可以在Postman的Authorization選項卡中輕鬆新增此header。
請注意,我們收到了三個cookie的回覆。 connect.sid
, access_token
和 userId
。如果你熟悉JavaScript,現在可以看到我之前 共享的程式碼 如何用於為後續請求提取access_token。
如果現在刪除授權標頭並呼叫 http://localhost:3000/api/SampleAsset
,則不會收到 401 Unauthorized
錯誤,但 500 A business network card has not been specified
。
要匯入card,我們向 http://localhost:3000/api/Wallet/import
發出POST請求,並附上我們在建立參與者時生成的身份卡和名稱,在本例中為 gangachris
。
請注意,我們會收到 204 No Content
回覆。
要確認card已成功匯入,我們將呼叫 http://localhost:3000/api/Wallet
。
我們收到一個包含錢包列表的回覆,以及當前使用的預設值。
在此階段,我們成功通過身份驗證,並呼叫 http://localhost:3000/api/SampleAsset
路由,沒有任何錯誤。
注意事項
我們能夠在呼叫 http://localhost:3000/auth/jwt/callback
之後呼叫這些請求的唯一原因是因為Postman正在使用它在此請求中獲得的cookie以用於後續請求。
當你擁有自定義客戶端時,這將不起作用。在這種情況下,你必須通過類似這樣的程式碼檢索訪問token,然後使用header或查詢引數進行後續呼叫,如下所示。
curl -v http://localhost:3000/api/system/ping?access_token=xxxxx or curl -v -H 'X-Access-Token: xxxxx' http://localhost:3000/api/system/ping
身份驗證後的第一個請求必須是對 http://localhost:3000/api/Wallet/import
的POST,並傳遞身份驗證卡和名稱。呼叫 http://localhost:3000/api/Wallet
以檢查預設錢包並確保它是正確的錢包是有意義的。
通過身份驗證後,你可以通過釋出到參與者路線來建立其他參與者。在這種情況下,它的POST http://localhost:3000/api/SampleAprticipant
。然後為了向他們發一個身份,你必須向 http://localhost:3000/api//system/identities/issue
發出另一個帖子請求,帶有相關引數,這將返回二進位制響應,你必須將其儲存到 .card
檔案中。
為避免使用Postman,你可以更改我們使用 passportJwt.ExtractJwt.fromUrlQueryParameter(“token”)
建立的custom-jwt.js檔案中的passport-jwt檢索jwt token的方式;
function CustomJwtStrategy(options, verify) { options.jwtFromRequest = passportJwt.ExtractJwt.fromUrlQueryParameter("token"); passportJwt.Strategy.call(this, options, verify); }
一旦更改,你可以訪問 http://localhost:3000/auth/jwt/callback?query=<token>
,然後你將返回swagger頁面。
結論
Hyperledger Composer是一個很好的資源,可以幫助你啟動並執行Hyperledger Fabric區塊鏈。
你可能擁有一個現有系統,並且你希望整合Hyperledger Fabric,本文簡要介紹了實現此目標的方法之一。
happy coding。
======================================================================
分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:
- EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
- 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- ERC721以太坊通證實戰,課程以一個數字藝術品創作與分享DApp的實戰開發為主線,深入講解以太坊非同質化通證的概念、標準與開發方案。內容包含ERC-721標準的自主實現,講解OpenZeppelin合約程式碼庫二次開發,實戰專案採用Truffle,IPFS,實現了通證以及去中心化的通證交易所。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- tendermint區塊鏈開發詳解 ,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裡是原文 Hyperledger Composer Rest伺服器的Passport-JWT身份驗證