Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 53 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
53
Dung lượng
1,66 MB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC KINH TẾ KHOA THỐNG KÊ – TIN HỌC -🙠🕮🙢 BÁO CÁO THỰC TẬP TỐT NGHIỆP TRIỂN KHAI HỢP ĐỒNG THÔNG MINH TRÊN HYPERLEDGER FABRIC Ngành: Hệ thống thông tin quản lý Đơn vị thực tập: RESDII – Công ty phát triển phần mềm Giảng viên hướng dẫn: ThS Trần Thị Thu Thảo MỤC LỤC NHẬN XÉT CỦA ĐƠN VỊ THỰC TẬP ii LỜI CẢM ƠN iii LỜI CAM ĐOAN iv LỜI MỞ ĐẦU v MỤC LỤC vi DANH MỤC HÌNH ẢNH vii TÀI LIỆU THAM KHẢO 45 NHẬN XÉT CỦA ĐƠN VỊ THỰC TẬP ii LỜI CẢM ƠN Để có kết bây giờ, ngồi nỗ lực khơng ngừng thân phần khơng nhỏ đóng góp nên thành công nhờ hướng dẫn, dạy dỗ thầy cô Khoa Thống kê – Tin học nói riêng trường Đại học Kinh tế Đại học Đà Nẵng nói chung suốt thời gian vừa qua Em xin gửi lời cảm ơn chân thành đến cô Ths Trần Thị Thu Thảo – Khoa Thống kê – Tin học, trường Đại học Kinh tế - Đại học Đà Nẵng định hướng, hướng dẫn bảo tận tình suốt trình em làm báo cáo thực tập Bên cạnh đó, em muốn gửi lời cảm ơn đến quý công ty phát triển phần mềm - RESDII cho phép tạo điều kiện thuận lợi cho em suốt trình thực tập Cuối cùng, em kính chúc q thầy cô dồi sức khỏe thành công nghiệp giảng dạy cao quý iii LỜI CAM ĐOAN Em xin cam đoan đề tài: “Triển khai hợp đồng thông minh Hyperledger Fabric” nghiên cứu độc lập dựa nỗ lực thân giúp đỡ tận tình giáo viên hướng dẫn ThS Trần Thị Thu Thảo, với người hướng dẫn anh Phạm Đức Chương – nhân viên công ty phát triển phần mềm - RESDII Các số liệu kết thực đề tài trung thực hồn tồn khơng có chép hay sử dụng kết nghiên cứu đề tài người khác Nếu có phát khơng đúng, em xin chịu hoàn toàn trách nhiệm iv LỜI MỞ ĐẦU Mục tiêu đề tài Nghiên cứu triển khai smartcontract blockchain dưa tảng Hyperledger Fabric Tạo chuỗi blockchain nội cho doanh nghiệp Đối tượng phạm vi nghiên cứu Đối tượng nghiên cứu: Blockchain Thời gian: Được thực từ 19/06/2023 đến 25/08/2023 Phạm vi nghiên cứu: Tạo chuỗi blockchain nội cho doanh nghiệp Địa điểm: Tầng 6, Xô Viết Nghệ Tĩnh, Quận Hải Châu, Thành phố Đà Nẵng, Việt Nam Kết cấu đề tài Đề tài tổ chức gồm phần mở đầu, chương nội dung phần kết luận Mở đầu Chương 1: Tổng quan công ty Chương 2: Lý thuyết blockchain smartcontract Chương 3: Lý thuyết Hyperledger Fabric Chương 4: Triển khai smart contract đánh giá kết Kết luận hướng phát triển v MỤC LỤC TỔNG QUAN VỀ CÔNG TY I A Cơ quan thực tập B Tổng quan vị trí việc làm II CƠ SỞ LÝ THUYẾT A Khái niệm chuỗi khối B Hợp đồng thông minh 15 III LÝ THUYẾT VỀ HYPERLEDGER FABRIC 16 A Giới thiệu Hyperledger Fabric 16 B Hợp đồng thông minh chuỗi mã 20 IV TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ 27 A Cài đặt môi trường 27 B Thực nghiệm 30 C Đánh giá kết 43 D Kết luận hướng phát triển 44 vi DANH MỤC HÌNH ẢNH Hình ảnh Logo cơng ty Hình ảnh Kiến trúc chuỗi khối Hình ảnh Cấu trúc chung chuỗi khối Hình ảnh Cấu trúc chung khối Hình ảnh Cách khối tạo Hình ảnh Hệ thống cấp bậc công nghệ sổ phân tán 11 Hình ảnh Ứng dụng hợp đồng thơng minh 20 Hình ảnh Ví dụ hợp đồng thơng minh 21 Hình ảnh Xác thực giao dịch hợp lệ hệ thống mạng 24 Hình ảnh 10 Các kênh hệ thống mạng 25 Hình ảnh 11 Kết truy vấn tài sản 39 Hình ảnh 12 Truy vấn thơng tin khơng cấp quyền 41 Hình ảnh 13 Truy vấn liệu riêng tư 42 Hình ảnh 14 Truy vấn liệu riêng tư từ sưu tập Org 43 vii I TỔNG QUAN VỀ CÔNG TY A Cơ quan thực tập Giới thiệu chung Resdii doanh nghiêp Việt Nam, chuyên cung cấp giải pháp công nghệ phục vụ công chuyển đổi số toàn diện ngành Bất động sản số lĩnh vực kinh tế trọng điểm Tên quan: RESDII - CƠNG TY PHÁT TRIỂN PHẦN MỀM Logo cơng ty: Hình ảnh Logo cơng ty Địa chỉ: Tầng 6, Xô Viết Nghệ Tĩnh, Quận Hải Châu, Thành phố Đà Nẵng, Việt Nam Email: contact@resdii.com Website: Resdii | Software Company | Digital Transformation Lĩnh vực hoạt động Tư vấn giải pháp phần mềm Thiết kế phát triển ứng dụng Web Thiết kế phát triển ứng dụng Mobile Cung ứng sản phẩm tảng Vị trí thực tập Vị trí thực tập: Developer B Tởng quan vị trí việc làm Khái niệm Blockchain Developer Blockchain Developer tham gia vào việc xây dựng ứng dụng hệ thống dựa công nghệ blockchain Blockchain công nghệ tiên tiến dùng để lưu trữ quản lý thông tin cách phi tập trung an tồn Nó hoạt động thơng qua mạng lưới phân cấp "block" (khối) chứa thông tin giao dịch liên kết với thông qua mã hóa Nhiệm vụ Blockchain Developer Các nhiệm vụ nhà phát triển blockchain bao gồm: Xây dựng ứng dụng blockchain: Phát triển ứng dụng hệ thống dựa tảng blockchain, sử dụng ngơn ngữ lập trình thích hợp để đảm bảo hoạt động mạng blockchain Phát triển Smart Contracts: Viết triển khai smart contracts tảng blockchain Ethereum, EOS, Hyperledger để tự động hóa đáng tin cậy hóa giao dịch điều khoản hợp đồng Kiểm thử Sửa lỗi: Thực kiểm thử để đảm bảo tính đắn không lỗi ứng dụng smart contracts, giải vấn đề lỗi để đảm bảo tính ổn định an tồn Tối ưu hóa hiệu suất: Tối ưu hóa mã cấu trúc để đảm bảo ứng dụng blockchain xử lý hàng nghìn giao dịch giây cách hiệu Bảo mật An toàn: Giải vấn đề liên quan đến bảo mật để đảm bảo an toàn thông tin tài sản người dùng trước lỗ hổng bảo mật công Giao diện người dùng Tương tác: Tạo giao diện người dùng thân thiện dễ sử dụng cho ứng dụng blockchain, tương tác tốt với người dùng ./network.sh up createChannel -ca -s couchdb Câu lệnh khởi tạo hệ thống mạng Fabric gồm kênh mychannel có tổ chức (mỗi tổ chức gồm node peer), Certificate Authorities, dịch vụ xếp sử dụng CouchDB sở liệu trạng thái Ta sử dụng LevelDB CouchDB với sưu tập CouchDB ưu tiên kịch nhằm thể cách sử dụng mục với liệu riêng tư Triển khai hợp đồng thông minh liệu riêng tư tới kênh Dùng mã lệnh script test-network để triển khai hợp đồng thông minh lên kênh: /network.sh deployCC -ccn private -ccp /asset-transfer-private- data/chaincode-go/ -ccl go -ccep "OR('Org1MSP.peer','Org2MSP.peer')" cccg /asset-transfer-private-data/chaincode-go/collections_config.json Ta cần thêm đường dẫn tới tệp định nghĩa sưu tập liệu riêng tư câu lệnh Là phần trình triển khai chaincode lên kênh, hai tổ chức kênh phải thêm định nghĩa liệu riêng tư Ta triển khai hợp đồng thơng minh với sách chứng thực mức chaincode OR('Org1MSP.peer', 'Org2MSP.peer') Nhờ Org1 Org2 phép tạo tài sản mà không cần chứng thực từ tổ chức khác Cả tổ chức chấp thuận định nghĩa chaincode câu lệnh peer lifecycle chaincode approveformyorg Ngoài ta thêm đường dẫn tới định nghĩa sưu tập liệu riêng tư thông qua flag –collections-config câu lệnh đó: peer lifecycle chaincode approveformyorg -o localhost:7050 ordererTLSHostnameOverride orderer.example.com channelID mychannel name private version 1.0 31 collections-config /asset-transfer-private-data/chaincodego/collections_config.json signature-policy "OR('Org1MSP.member','Org2MSP.member')" package-id $CC_PACKAGE_ID sequence tls cafile $ORDERER_CA Sau thành viên kênh chấp thuận sưu tập liệu riêng tư phần định nghĩa chaincode, sưu tập liệu thêm lên kênh thông qua câu lệnh peer lifecycle chaincode commit peer lifecycle chaincode commit -o localhost:7050 ordererTLSHostnameOverride orderer.example.com channelID mychannel name private version 1.0 –-sequence collections-config /asset-transfer-private-data/chaincodego/collections_config.json signature-policy "OR('Org1MSP.member','Org2MSP.member')" tls cafile $ORDERER_CA peerAddresses localhost:7051 tlsRootCertFiles $ORG1_CA 32 peerAddresses localhost:9051 tlsRootCertFiles $ORG2_CA Đăng ký danh tính Hợp đồng thơng minh trao đổi liệu riêng tư hỗ trợ quyền sở hữu với danh tính riêng biệt hệ thống mạng Trong kịch này, chủ sở hữu tài sản thành viên Org1, người mua thuộc Org2 Để đánh dấu kết nối API GetClientIdentity().GetID() thông tin certificate người dùng, ta đăng ký hai danh tính sử dụng CA Org1 Org2, sau ta sử dụng CA để sinh certificate khố riêng tư cho danh tính Trước tiên ta cần thiết lập biến môi trường để sử dụng client Fabric CA export PATH=${PWD}/ /bin:${PWD}:$PATH Câu lệnh thiết lập biến môi trường PATH, bao gồm đường dẫn đến thư mục bin nằm thư mục tại, thư mục đường dẫn đặt PATH trước Điều cho phép lệnh thư mục bin chạy từ thư mục export FABRIC_CFG_PATH=$PWD/ /config/ Câu lệnh thiết lập biến môi trường FABRIC_CFG_PATH, bao gồm đường dẫn đến thư mục cấu hình nằm thư mục Thư mục cấu hình chứa tệp cấu hình cho mạng Fabric Ta sử dụng CA Org1 để cấp danh tính cho chủ tài sản Đặt biến Fabric CA Client home MSP quản trị viên ca Org1 (danh tính sinh từ mã lệnh test-network): 33 export FABRIC_CA_CLIENT_HOME=${PWD}/organizations/peerOrganizations/ org1.example.com/ Câu lệnh thiết lập biến môi trường FABRIC_CA_CLIENT_HOME, bao gồm đường dẫn đến thư mục nhà khách hàng CA Fabric nằm thư mục Thư mục nhà khách hàng CA Fabric chứa tệp cấu hình cho khách hàng CA Fabric Ta đăng ký danh tính client chủ sở hữu mới, sử dụng công cụ fabric-ca-client: fabric-ca-client register caname ca-org1 id.name owner id.secret ownerpw id.type client tls.certfiles "${PWD}/organizations/fabric-ca/org1/tls-cert.pem" Ta sử dụng CA Org1 để cấp danh tính cho chủ tài sản Đặt biến Fabric CA Client home MSP quản trị viên ca Org1 (danh tính sinh từ mã lệnh test-network): • export FABRIC_CA_CLIENT_HOME=${PWD}/organizations/peerOrganizations/org 1.example.com/ • fabric-ca-client register caname ca-org1 id.name owner id.secret ownerpw -id.type client tls.certfiles "${PWD}/organizations/fabric-ca/org1/tls-cert.pem" Sau ta đăng ký để sinh thư mục MSP danh tính: fabric-ca-client enroll -u https://owner:ownerpw@localhost:8054 34 caname ca-org1 -M "${PWD}/organizations/peerOrganizations/org1.example.com/users/owner @org1.example.com/msp" tls.certfiles "${PWD}/organizations/fabric-ca/org1/tls-cert.pem" Chạy đoạn lệnh để copy tệp cấu hình Node OU sang thư mục MSP danh tính người mua cp "${PWD}/organizations/peerOrganizations/org1.example.com/msp/config.y aml" ${PWD}/organizations/peerOrganizations/org1.example.com/users/owner@ org1.example.com/msp/config.yaml Tạo tài sản liệu riêng tư Sau tạo danh tính cho chủ sở hữu tài sản, ta gọi hợp đồng thơng minh liệu riêng tư để tạo tài sản Copy đoạn lệnh sau từ thư mục test-network: export PATH=${PWD}/ /bin:$PATH export FABRIC_CFG_PATH=$PWD/ /config/ export CORE_PEER_TLS_ENABLED=true Đổi thành peer Org1 Thiết lập lại giá trị sau để đóng vai trò thành viên Org1 truy vấn peer Org1 • export CORE_PEER_LOCALMSPID="Org1MSP" • export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOr ganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt 35 • export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrgani zations/org1.example.com/users/owner@org1.example.com/msp • export CORE_PEER_ADDRESS=localhost:7051 Ta sử dụng hàm CreateAsset để tạo tài sản lưu trữ liệu riêng tư Giá trị liệu riêng tư appraisedValue lưu trữ độc lập với liệu riêng tư assetID, color, size Hàm CreateAsset() gọi API PutPrivateData() hai lần để trì liệu riêng tư, liệu riêng tư cho sưu tập Đoạn lệnh sử dụng flag –transiant Dữ liệu đầu vào dạng transiant truyền kiểu liệu nhị phân sử dụng terminal phải mã hố dạng base64 Ta sử dụng biến môi trường nhằm nhận giá trị mã hoá base64 này, dùng câu lệnh tr để loại bỏ kí tự newline mà base64 linux tự động thêm vào Gõ đoạn lệnh sau để tạo tài sản: • export ASSET_PROPERTIES=$(echo -n "{\"objectType\":\"asset\",\"assetID\":\"asset1\",\"color\":\"green\",\"size\":2 0,\"appraisedValue\":100}" | base64 | tr -d \\n) • export ASSET_PROPERTIES=$(echo -n "{\"objectType\":\"asset\",\"assetID\":\"asset2\",\"color\":\"blue\",\"size\":88, \"appraisedValue\":888}" | base64 | tr -d \\n) peer chaincode invoke -o localhost:7050 ordererTLSHostnameOverride orderer.example.com tls cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/ordere r.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" 36 -C mychannel -n private -c '{"function":"CreateAsset","Args":[]}' transient "{\"asset_properties\":\"$ASSET_PROPERTIES\"}" Tạo thành cơng có kết trả có dạng sau: [chaincodeCmd] chaincodeInvokeOrQuery->INFO 001 Chaincode invoke successful result: status:200 Giao dịch CreateAsset viết lên sưu tập: assetCollection Org1MSPPrivateCollection Org1MSPPrivateCollection cần peer Org1 chứng thực viết lên sưu tập, assetCollection thừa kế sách chứng thực từ chaincode, "OR('Org1MSP.peer','Org2MSP.peer')" Chứng thực từ peer Org1 thoả mãn sách chứng thực tạo tài sản mà khơng cần Org2 chứng thực Truy vấn liệu riêng tư peer cấp quyền Định nghĩa sưu tập cho phép peer Org1 Org2 có liệu riêng tư assetID, color, size owner sở liệu riêng tổ chức, peer Org1 đọc giá trị appraiseValue sở liệu Trong kịch này, ta đóng vai trò peer cấp quyền Org1 truy vất hai tập liệu riêng tư Câu lệnh truy vấn gọi hàm ReadAsset, với tham số assetCollection: // ReadAsset reads the information from collection func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, assetID string) (*Asset, error) { log.Printf("ReadAsset: collection %v, ID %v", assetCollection, assetID) assetJSON, err := ctx.GetStub().GetPrivateData(assetCollection, assetID) //get the asset from chaincode state if err != nil { 37 return nil, fmt.Errorf("failed to read asset: %v", err) } //No Asset found, return empty response if assetJSON == nil { log.Printf("%v does not exist in collection %v", assetID, assetCollection) return nil, nil } var asset *Asset err = json.Unmarshal(assetJSON, &asset) if err != nil { return nil, fmt.Errorf("failed to unmarshal JSON: %v", err) } return asset, nil } Câu lệnh truy vấn thứ hai gọi hàm ReadAssetPrivateDetails, nhận Org1MSPPrivateDetails tham số // ReadAssetPrivateDetails reads the asset private details in organization specific collection func (s *SmartContract) ReadAssetPrivateDetails(ctx contractapi.TransactionContextInterface, collection string, assetID string) (*AssetPrivateDetails, error) { log.Printf("ReadAssetPrivateDetails: collection %v, ID %v", collection, assetID) assetDetailsJSON, err := ctx.GetStub().GetPrivateData(collection, assetID) // Get the asset from chaincode state if err != nil { return nil, fmt.Errorf("failed to read asset details: %v", err) } if assetDetailsJSON == nil { log.Printf("AssetPrivateDetails for %v does not exist in collection %v", assetID, collection) return nil, nil } var assetDetails *AssetPrivateDetails err = json.Unmarshal(assetDetailsJSON, &assetDetails) if err != nil { return nil, fmt.Errorf("failed to unmarshal JSON: %v", err) 38 } return assetDetails, nil } Ta đọc thơng số tài sản thông qua hàm ReadAsset, truy vấn đến sưu tập assetCollection vai trò Org1: peer chaincode query -C mychannel -n private -c '{"function":"ReadAsset","Args":["asset1"]}' Câu lệnh trả kết sau thành cơng: Hình ảnh 11 Kết truy vấn tài sản Chủ sở hữu tài sản danh tính tạo tài sản kích hoạt hợp đồng thơng minh Hợp đồng thơng minh liệu riêng tư sử dụng API GetClientIdentity().GetID() để đọc tên người cấp chứng danh tính Ta quan sát thơng qua chuỗi JSON Truy vấn liệu riêng tư appraisedValue asset1 danh nghĩa thành viên Org1: peer chaincode query -C mychannel -n private 39 -c '{"function":"ReadAssetPrivateDetails","Args":["Org1MSPPrivateCol lection","asset1"]}' Kết trả sau: Org1 {"assetID":"asset1","appraisedValue":100} Truy vấn liệu riêng tư peer khơng có quyền Ta thử truy vấn thơng qua vai trị người dùng Org2 Org2 có lưu trữ thơng tin liệu riêng tư giao dịch tài sản assetID, color, size owner sở liệu riêng (như định nghĩa sách assetCollection), khơng lưu trữ liệu appraisedValue Ta thử truy vấn hai tập liệu riêng tư a) Đổi thành peer Org2 Thiết lập lại giá trị sau để đóng vai trị thành viên Org2 truy vấn peer Org2 export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizat ions/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations /org2.example.com/users/owner@org2.example.com/msp export CORE_PEER_ADDRESS=localhost:9051 40 b) Truy vấn thông tin không cấp quyền peer chaincode query -C mychannel -n private -c '{"function":"ReadAssetPrivateDetails","Args":["Org2MSPPrivateCollectio n","asset1"]}' Org2 Hình ảnh 12 Truy vấn thơng tin khơng cấp quyền Vì tài sản tạo Org1, giá trị appraisedValue liên kết với asset1 lưu trữ sưu tập Org1MSPPrivateCollection Giá trị không lưu trữ peer Org2 Chạy câu lệnh để thấy giá trị appraisedValue không lưu trữ Org2MSPPrivateCollection peer Org2: peer chaincode query -o localhost:7050 ordererTLSHostnameOverride orderer.example.com tls cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/ orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n private -c '{"function":"ReadAssetPrivateDetails","Args":["Org2MSPPrivateCol lection","asset1"]}' 41 Trả chuỗi rỗng, chứng tỏ thông tin riêng tư tài sản asset1 không tồn sưu tập riêng tư người mua (Org2) Hình ảnh 13 Truy vấn liệu riêng tư Và người dùng Org2 không đọc sưu tập liệu riêng tư Org1: peer chaincode query -C mychannel -n private -c '{"function":"ReadAssetPrivateDetails","Args":["Org1MSPPrivateCollectio n","asset1"]}' Khi thiết lập giá trị "memberOnlyRead": true tệp cấu hình sưu tập, ta xác định client từ Org1 đọc liệu từ sưu tập Một client Org2 cố thử đọc liệu từ sưu tập nhận kết là: Error: endorsement failure during query response: status:500 message:"failed to read asset details: GET_STATE failed: transaction ID: d23e4bc0538c3abfb7a6bd4323fd5f52306e2723be56460fc6da0e5acaee6b23: tx creator does not have read access permission on privatedata in chaincodeName:private collectionName: Org1MSPPrivateCollection" 42 Hình ảnh 14 Truy vấn liệu riêng tư từ sưu tập Org Người dùng từ Org2 thấy giá trị băm cơng khai liệu riêng tư C Đánh giá kết Đã triển khai thành công hệ thống mạng Hyperledger Fabric với khả sử dụng hợp đồng thông minh liệu riêng tư xác thực danh tính Đã thực truy vấn liệu riêng tư thông qua hợp đồng thông minh với hàm đọc hiển thị thông tin cụ thể Quyền truy cập liệu riêng tư hoạt động dự kiến, giới hạn cho tổ chức danh tính 43 D Kết luận hướng phát triển Kết luận a) Ưu điểm: Đề tài nghiên cứu, làm rõ tầm quan trọng lợi ích việc sử dụng hợp đồng thơng minh hệ thống thử nghiệm, cụ thể Hyledger Fabric b) Khuyết điểm: Chưa áp dụng vào dự án thực tế cụ thể nên chức hợp đồng thông minh chưa khai thác nhiều Hướng phát triển Tiếp tục nghiên cứu việc triển khai hợp đồng thơng minh có ứng dụng vào dự án thực tế lên kế hoạch triển khai tương tác với giao diện web Thêm vào phát triển thêm hàm đa dạng cho hợp đồng thông minh 44 TÀI LIỆU THAM KHẢO Imran Bashir - Mastering Blockchain_ A deep dive into distributed ledgers, consensus protocols, smart contracts, DApps, cryptocurrencies, Ethereum, and more-Packt Publishing - ebooks Account (2020) Using Private Data in Fabric — hyperledger-fabricdocs main documentation Observing Channel and Chaincode in Hyperledger Fabric | by KC Tam | Medium Build your own Blockchain network with Hyperledger Fabric & Composer Part I | by Eli Elad Elrom | Blockchain-Developer | Medium How to build a blockchain network using Hyperledger Fabric and Composer | by Haardik | We’ve moved to freeCodeCamp.org/news | Medium Build a Blockchain PoC Application using Hyperledger Fabric | by Don Li | Coinmonks | Medium Learn Blockchains by Building One | by Daniel van Flymen | Medium Deploying a smart contract to a channel — hyperledger-fabricdocs main documentation Running a Fabric Application — hyperledger-fabricdocs main documentation 10 Running External Chaincode Builders — hyperledger-fabricdocs main documentation 45