區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第3、4章 超級賬本;Hyperledger Fabric入門_第1頁
區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第3、4章 超級賬本;Hyperledger Fabric入門_第2頁
區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第3、4章 超級賬本;Hyperledger Fabric入門_第3頁
區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第3、4章 超級賬本;Hyperledger Fabric入門_第4頁
區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第3、4章 超級賬本;Hyperledger Fabric入門_第5頁
已閱讀5頁,還剩153頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第3章超級賬本3.1超級賬本介紹3.2社區(qū)組織結(jié)構(gòu)3.3頂級項目介紹3.4超級賬本系統(tǒng)架構(gòu)3.5超級賬本的組成模型本章小結(jié)

3.1超級賬本介紹

3.1.1項目簡介超級賬本成立之初,就收到了眾多的開源技術(shù)貢獻。IBM貢獻了4萬多行已有的OpenBlockchain代碼,DigitalAsset貢獻了企業(yè)和開發(fā)者相關(guān)資源,R3貢獻了新的金融交易架構(gòu),Intel也貢獻了分布式賬本相關(guān)的代碼。

作為一個聯(lián)合項目(CollaborativeProject),超級賬本由面向不同目的和場景的子項目構(gòu)成,目前包括Fabric、Sawtooth、Iroha、BlockchainExplorer、Cello、Indy、Composer、Burrow等八大頂級項目。所有項目都遵守Apachev2許可協(xié)議(ApacheLicence是著名的非盈利開源組織Apache采用的協(xié)議,該協(xié)議鼓勵代碼共享和尊重原作者的著作權(quán),允許將代碼修改后作為開源或商業(yè)軟件再行發(fā)布),并約定共同遵守如下的基本原則:

(1)重視模塊化設(shè)計:包括交易、合同、一致性、身份、存儲等技術(shù)場景。

(2)重視代碼可讀性:確保新功能和模塊都可以很容易地實現(xiàn)添加和擴展。

(3)可持續(xù)的演化路線:隨著需求的深入和更多應(yīng)用場景的出現(xiàn),將不斷增加和演化新的項目。

超級賬本的企業(yè)會員和技術(shù)項目發(fā)展都非常迅速,如圖3-1所示。圖3-1超級賬本項目快速成長

3.1.2超級賬本概述

HyperLedgerFabric是超級賬本上的區(qū)塊鏈項目之一。跟其他區(qū)塊鏈技術(shù)相同,HyperLedgerFabric也有賬本,也使用智能合約,是一個由參與者共同管理的系統(tǒng)。

但與其他區(qū)塊鏈系統(tǒng)不同的地方是,超級賬本是私有的,它不是一個開放的系統(tǒng),所有的參與者必須是已經(jīng)注冊過身份的組織。

超級賬本還提供了可插拔的組件,賬本的數(shù)據(jù)可以用多種格式存儲。此外,超級賬本協(xié)商一致的機制可以被轉(zhuǎn)換和輸出為多種格式,使其在各個區(qū)塊鏈分布式賬本中使用執(zhí)行。

1.共享賬本

共享的許可制賬本(SharedPermissionedLedger)是僅可附加的記錄系統(tǒng)(SystemOfRecord,SOR)和單一事實來源。它對業(yè)務(wù)網(wǎng)絡(luò)的所有參與成員均可見。

超級賬本有一個分類子系統(tǒng),由世界狀態(tài)(WorldState)和事務(wù)日志(TransactionLog)兩個部分組成。

世界狀態(tài)描述總賬的狀態(tài),是賬本的數(shù)據(jù)庫;事務(wù)日志記錄導致當前世界狀態(tài)值改變的日志。每一個參與者都有一份屬于自己的賬本副本,存儲在他們所屬的超級賬本網(wǎng)絡(luò)上。

2.智能合約

超級賬本的智能合約是用Chaincode(鏈碼)編寫的。Chaincode支持數(shù)種語言編程,目前支持的是Go語言,在今后的版本中會新增java等其他語言。

在大多數(shù)情況下,Chaincode只與總賬的數(shù)據(jù)庫交互,例如世界狀態(tài)。

3.隱私

超級賬本網(wǎng)絡(luò)中的參與者是企業(yè)節(jié)點,而企業(yè)商業(yè)信息是非常敏感的內(nèi)容,因此超級賬本把使用頻道技術(shù)來保護隱私作為該區(qū)塊鏈網(wǎng)絡(luò)的核心目標之一。

4.共識

事務(wù)必須按照它們發(fā)生的順序?qū)懭胭~本中。通過前兩章的學習,我們已經(jīng)知道了對于比特幣來說,排序是通過“挖礦”來實現(xiàn)的。對于PBFT(拜占庭式容錯)來說,它可以為文件副本提供一種相互通信的機制,來保持副本間的一致性。

超級賬本的共識機制目前包括Solo和Kafka兩種。網(wǎng)絡(luò)啟動者可以選擇一種最能代表參與者之間關(guān)系的共識機制。

3.2社區(qū)組織結(jié)構(gòu)

3.2.1基本結(jié)構(gòu)超級賬本社區(qū)目前主要是三駕馬車領(lǐng)導的結(jié)構(gòu),如圖3-2所示。圖3-2三駕馬車結(jié)構(gòu)

3.2.2大中華區(qū)技術(shù)工作組

技術(shù)工作組的主要職責包括如下:

(1)帶領(lǐng)和引導中國內(nèi)地的技術(shù)相關(guān)活動,包括貢獻代碼、指南文檔、項目提案等。

(2)推動相關(guān)技術(shù)的交流,促進會員企業(yè)之間的合作和實踐案例的落地,通過郵件列表、RocketChat、論壇等方式促進社區(qū)開發(fā)者們的技術(shù)交流。

(3)協(xié)助舉辦社區(qū)活動,如Meetup、黑客松、Hackfest、技術(shù)分享、人員培訓等。

3.3頂級項目介紹

3.3.1

Fabric項目

Fabric是最早加入到超級賬本項目中的頂級項目,包括Fabric、FabricCA、FabricSDK(包括Node.Js、Python和Java等語言)和fabric-api等,目標是區(qū)塊鏈的基礎(chǔ)核心平臺,支持PBFT等新的共識機制,支持權(quán)限管理,最早由IBM和DAH等企業(yè)于2015年底提交到社區(qū)。項目在GitHub上。

該項目的定位是面向企業(yè)的分布式賬本平臺,創(chuàng)新地引入了權(quán)限管理支持,設(shè)計上支持可插拔、可擴展,是首個面向聯(lián)盟鏈場景的開源項目。

Fabric基于Go語言實現(xiàn),目前提交次數(shù)已經(jīng)超過5000次,核心代碼超過8萬行。

Fabric項目目前處于活躍狀態(tài),已發(fā)布1.0正式版本,同時包括FabricCA、FabricSDK等多個相關(guān)的子項目。

3.3.2

Composer項目

Composer項目提供面向鏈碼開發(fā)的高級語言支持,可自動生成鏈碼,由IBM團隊于2017年3月底貢獻到社區(qū),試圖提供一個HyperledgerFabric的開發(fā)輔助框架。使用Composer,開發(fā)人員可以使用JavaScript語言定義應(yīng)用邏輯,再加上資源、參與者、交易等模型和訪問規(guī)則,生成HyperledgerFabric支持的鏈碼。

該項目主要由NodeJs語言開發(fā),目前已有超過4000次提交。

3.3.3

Sawtooth項目

Sawtooth項目包括arcade、core、dev-tools、validator、mktplace等,支持全新的、基于硬件芯片的共識機制ProofofElapsedTime(PoET)。Sawtooth項目由Intel等企業(yè)于2016年4月提交到社區(qū)。核心代碼在GitHub上。

該項目的定位也是分布式賬本平臺,基于Python語言實現(xiàn),目前提交次數(shù)已經(jīng)超過3000次。

Sawtooth項目利用Intel芯片的專屬功能,實現(xiàn)了低功耗的ProofofElaspedTime(PoET)共識機制,并支持交易族(TransactionFamily),方便用戶使用它來快速開發(fā)應(yīng)用。

3.3.4

Iroha項目

Iroha是賬本平臺項目,基于C++?實現(xiàn),帶有不少面向Web和Mobile的特性項目。Iroha由Soramitsu等企業(yè)于2016年10月提交到社區(qū)。核心代碼在GitHub上。

該項目的定位是分布式賬本平臺框架,基于C++?語言實現(xiàn),目前提交次數(shù)已經(jīng)超過2000次。

Iroha項目在設(shè)計上類似Fabric,同時提供了基于C++?的區(qū)塊鏈開發(fā)環(huán)境,并考慮了移動端和Web端的一些需求。

3.3.5

Burrow項目

Burrow項目提供以太坊虛擬機的支持,實現(xiàn)支持高效交易的帶權(quán)限的區(qū)塊鏈平臺,由Monax、Intel等企業(yè)于2017年4月提交到社區(qū)。核心代碼在GitHub。

該項目的前身為eris-db,基于Go語言實現(xiàn),目前提交次數(shù)已經(jīng)超過1000次。

Burrow項目提供了支持以太坊虛擬機的智能合約區(qū)塊鏈平臺,并支持Proof-of-Stake共識機制和權(quán)限管理,可以提供快速的區(qū)塊鏈交易。

3.3.6

BlockchainExplorer項目

BlockchainExplorer項目提供Web操作界面,可通過界面快速查看查詢綁定區(qū)塊鏈的狀態(tài)(區(qū)塊個數(shù)、交易歷史)信息等。BlockchainExplorer項目由Intel、DTCC、IBM等企業(yè)于2016年8月提交到社區(qū)。核心代碼在GitHub上。

該項目的定位是區(qū)塊鏈平臺的瀏覽器,基于Node.js語言實現(xiàn),提供Web操作界面。用戶可以使用它來快速查看底層區(qū)塊鏈平臺的運行信息,如區(qū)塊個數(shù)、交易情況、網(wǎng)絡(luò)狀況等。

3.3.7

Cello項目

Cello提供區(qū)塊鏈平臺的部署和運行時管理功能。使用Cello,管理員可以輕松部署和管理多條區(qū)塊鏈,應(yīng)用開發(fā)者亦無需關(guān)心如何搭建和維護區(qū)塊鏈。Cello項目由IBM技術(shù)團隊于2017年1月貢獻到社區(qū)。GitHub倉庫地址(核心代碼)和(側(cè)重數(shù)據(jù)分析)。

3.3.8

Indy項目

Composer提供基于分布式賬本技術(shù)的數(shù)字身份管理機制,項目由IBM團隊于2017年3月底貢獻到社區(qū),試圖提供一個HyperledgerFabric的開發(fā)輔助框架。使用Composer,開發(fā)人員可以使用JavaScript語言定義應(yīng)用邏輯,再加上資源、參與者、交易等模型和訪問規(guī)則,生成HyperledgerFabric支持的鏈碼。

該項目主要由NodeJs語言開發(fā),目前已有超過4000次提交。

這些頂級項目之間相互協(xié)作,構(gòu)成了完善的生態(tài)系統(tǒng),如圖3-3所示。圖3-3頂級項目生態(tài)系統(tǒng)

3.4超級賬本系統(tǒng)架構(gòu)

區(qū)塊鏈的業(yè)務(wù)需求多種多樣,其中一些業(yè)務(wù)要求在快速達成網(wǎng)絡(luò)共識及快速確認區(qū)塊后立刻將區(qū)塊加入?yún)^(qū)塊鏈中;另一些業(yè)務(wù)可以接受相對緩慢的處理時間,以換取信任。各行各業(yè)在擴展性、可信度、合法性、工作復(fù)雜度以及安全性等方面的需求和用途都不盡相同。我們先來看一下企業(yè)級區(qū)塊鏈系統(tǒng)中常見的模塊構(gòu)成,如圖3-4所示。圖3-4企業(yè)級區(qū)塊鏈系統(tǒng)的常用功能

HyperledgerFabric1.0是一種通用的區(qū)塊鏈節(jié)點技術(shù),其設(shè)計目標是利用一些成熟的技術(shù)實現(xiàn)分布式賬本技術(shù)(DirtributedLedgerTechnology,DLT)。超級賬本采用模塊化架構(gòu)設(shè)計,復(fù)用通用的功能模塊和接口。模塊化的方法帶來了可擴展性、靈活性等優(yōu)勢,會減少模塊修改、升級帶來的影響,適用于區(qū)塊鏈應(yīng)用系統(tǒng)的開發(fā)和部署。HyperledgerFabric1.0設(shè)計有以下幾個特點:

(1)模塊插件化。很多功能模塊(如CA模塊、共識算法、狀態(tài)數(shù)據(jù)庫存儲等)都是可插拔的,系統(tǒng)提供了通用接口和默認的實現(xiàn)方法,這滿足了大多數(shù)業(yè)務(wù)需求。這些模塊也可以根據(jù)需求進行擴展,集成到系統(tǒng)中。

(2)充分利用容器技術(shù)。在HyperledgerFabric1.0中,不僅節(jié)點使用容器作為運行環(huán)境,鏈碼也默認運行在安全的容器中。應(yīng)用程序或者外部系統(tǒng)不能直接操作鏈碼,必須通過背書節(jié)點提供的接口轉(zhuǎn)發(fā)給鏈碼來執(zhí)行。容器給鏈碼運行提供的是安全沙箱環(huán)境,可把鏈碼的環(huán)境和背書節(jié)點的環(huán)境隔離開,即使鏈碼存在安全問題也不會影響到背書節(jié)點。

(3)可擴展性強。HyperledgerFabric1.0在0.6版本的基礎(chǔ)上,對Peer節(jié)點的角色進行了拆分,有背書節(jié)點(Endorser)、排序服務(wù)節(jié)點(Orderer)、記賬節(jié)點(Committer)等,不同角色的節(jié)點有不同的功能。節(jié)點可以加入到不同的通道(Channel)中,鏈碼可以運行在不同節(jié)點上,這樣可以更好地提升并行計算的效率和吞吐量。

(4)安全性好。HyperledgerFabric1.0提供的是授權(quán)訪問的區(qū)塊鏈節(jié)點網(wǎng)絡(luò),節(jié)點共同維護成員信息,MSP(MembershipServiceProvider,成員資格提供程序)模塊驗證、授權(quán)后用戶才能使用區(qū)塊鏈網(wǎng)絡(luò)的功能。多鏈和多通道的設(shè)計容易實現(xiàn)數(shù)據(jù)隔離,也提供了應(yīng)用程序和鏈碼之間的安全通道,實現(xiàn)了隱私保護。

3.4.1系統(tǒng)邏輯架構(gòu)

超級賬本在架構(gòu)設(shè)計上采用的是模塊化的設(shè)計理念。圖3-5所示的系統(tǒng)邏輯架構(gòu)圖是從不同角度來劃分的,上層從應(yīng)用的角度,提供了標準的gRPC接口,在API的基礎(chǔ)上封裝了不同語言的SDK,包括Golang、Node.js、Java、Python等,開發(fā)人員可以利用SDK開發(fā)基于區(qū)塊鏈的應(yīng)用。區(qū)塊鏈強一致性要求導致各個節(jié)點之間達成共識需要較長的執(zhí)行時間,應(yīng)用程序也是采用異步通信的模式進行開發(fā)的,事件模塊可以在觸發(fā)區(qū)塊事件或者鏈碼事件的時候執(zhí)行預(yù)先定義的回調(diào)函數(shù)。圖3-5

HyperledgerFabric1.0設(shè)計的系統(tǒng)邏輯架構(gòu)圖

1.從應(yīng)用程序角度分析

1)身份管理

用戶登記并注冊成功后,會得到用戶注冊證書(ECert),其他所有操作都需要使用用戶證書關(guān)聯(lián)的私鑰進行簽名。發(fā)送消息時,消息接收方首先會進行簽名驗證,之后才進行后續(xù)消息處理。網(wǎng)絡(luò)節(jié)點同樣會用到頒發(fā)的證書,比如系統(tǒng)啟動和網(wǎng)絡(luò)節(jié)點管理等都會對用戶身份進行認證和授權(quán)。

2)賬本管理

授權(quán)的用戶是可以查詢賬本數(shù)據(jù)(Ledger)的。賬本數(shù)據(jù)可以通過多種方式查詢,包括根據(jù)區(qū)塊號查詢區(qū)塊、根據(jù)區(qū)塊哈希值查詢區(qū)塊、根據(jù)交易號查詢區(qū)塊、根據(jù)交易號查詢交易,還可以根據(jù)通道名稱獲取查詢到的區(qū)塊鏈信息。

3)交易管理

賬本數(shù)據(jù)只有通過交易執(zhí)行才能更新。應(yīng)用程序通過交易管理提交交易提案(Proposal)并獲取交易背書(Endorsement)以后,再給排序服務(wù)節(jié)點提交交易;然后打包生成區(qū)塊SDK提供接口,利用用戶證書在本地生成交易號。背書節(jié)點和記賬節(jié)點都會校驗是否存在重復(fù)交易。

4)智能合約

智能合約可實現(xiàn)可編程賬本(ProgrammableLedger),通過鏈碼執(zhí)行提交的交易,實現(xiàn)基于塊鏈的智能合約業(yè)務(wù)邏輯。只有智能合約才能更新賬本數(shù)據(jù),其他模塊是不能直接修改狀態(tài)數(shù)據(jù)(WorldState)的。

2.從底層角度分析

1)成員管理

MSP(MembershipSreviceProvider)對成員管理進行了抽象。每個MSP都會建立一套根信任證書(RootofTrustCertificate)體系,利用公鑰基礎(chǔ)設(shè)施(PublicKeyInfrastructure)對成員身份進行認證,驗證成員用戶提交的請求簽名;結(jié)合Fabric-CA或者第三方CA系統(tǒng),提供成員注冊功能,并對成員身份證進行管理,例如證書的新增和撤銷。注冊的證書分為注冊證書(ECert)、交易證書(TCert)和TLS證書(TLSCert),它們分別用于用戶身份、交易簽名和TLS傳輸。

2)共識服務(wù)

在分布式節(jié)點環(huán)境下,共識服務(wù)要實現(xiàn)同一個鏈上不同節(jié)點區(qū)塊的一致性,同時要確保區(qū)塊里的交易有效和有序。共識機制包括3個階段:客戶端向背書節(jié)點提交提案,進行簽名背書;客戶端將背書后的交易提交給排序服務(wù)節(jié)點進行交易排序;生成區(qū)塊后廣播給記賬節(jié)點驗證交易后寫入本地賬本。網(wǎng)絡(luò)節(jié)點的P2P協(xié)議采用的是基于Gossip的數(shù)據(jù)分發(fā),以同一組織為傳播范圍來同步數(shù)據(jù),提升網(wǎng)絡(luò)傳輸?shù)男省?/p>

3)鏈碼服務(wù)

智能合約的實現(xiàn)依賴于安全的執(zhí)行環(huán)境,以確保安全的執(zhí)行過程和用戶數(shù)據(jù)的隔離。HyperledgerFabric1.0采用Docker管理普通的鏈碼,提供安全的沙箱環(huán)境和鏡像文件倉庫。Docker方案的優(yōu)點是支持多種語言的鏈碼,擴展性很好;其缺點是對環(huán)境要求較高,占用資源較多,性能不高等,實現(xiàn)過程中也存在與Kubernetes、Rancher等平臺的兼容性問題。

4)安全和密碼服務(wù)

安全問題是企業(yè)級區(qū)塊鏈關(guān)心的問題,尤其在涉及國家安全的項目中,其中底層的密碼學支持尤其重要。為此,HyperledgerFabric1.0專門定義了一個BCCSP(BlockChainCryptographicServiceProvider,區(qū)塊鏈加密服務(wù)提供者),以實現(xiàn)密鑰生成哈希運算簽名、檢驗加密解密等基礎(chǔ)功能。BCCSP是一個抽象組的接口,默認是軟實現(xiàn)的國際算法,目前社區(qū)和較多的廠家使用較多的是國密算法和HSM(HardwareSecurityModule,硬件安全模塊)。

3.4.2超級賬本系統(tǒng)運行架構(gòu)

在超級賬本運行架構(gòu)0.6版本中,基本所有的業(yè)務(wù)功能都由Peer節(jié)點完成,導致該架構(gòu)在擴展性、安全性、可維護性、隔離性方面的不足。因此在后來的1.0版本中,官方對此進行了改進和拆分,把共識服務(wù)從Peer節(jié)點中剝離出來,形成一個新的Orderer節(jié)點,以提供可插播共識服務(wù)。更重要的是1.0版本引入了多通道的功能,實現(xiàn)了多重業(yè)務(wù)隔離的作用,使業(yè)務(wù)適應(yīng)性更加靈活。Fabric運行架構(gòu)1.0版如圖3-6所示。圖3-6超級賬本運行架構(gòu)

超級賬本提供了可供企業(yè)運用的網(wǎng)絡(luò),具備安全性、可伸縮性、可加密性和可執(zhí)行性等特性,并提供了以下網(wǎng)絡(luò)功能:

1.身份管理

超級賬本提供成員身份管理服務(wù),用于管理所有的用戶ID并對網(wǎng)絡(luò)上所有的成員身份進行驗證。成員們相互了解彼此的身份,但他們不知道彼此在做些什么,這也保證了其隱私信息的安全性和機密性。

2.隱私和機密性

由于商業(yè)信息的機密性等原因,隱私保護功能在超級賬本里是非常重要的一點。超級賬本允許存在競爭關(guān)系的商業(yè)機構(gòu)和任何私人團體能夠在同一個被許可的網(wǎng)絡(luò)上共存。私有頻道是一個受到限制的消息傳遞路徑,這個路徑可以為特定的網(wǎng)絡(luò)成員提供事務(wù)的隱私功能和保證商業(yè)信息的機密性。

3.高效處理能力

超級賬本通過節(jié)點類型分配網(wǎng)絡(luò)角色,從事務(wù)排序和提交驗證中分離出執(zhí)行事務(wù)的操作,使并行控制和并行性操作更加便利。

在排序之前,執(zhí)行事務(wù)使每個對等節(jié)點能夠同時處理多個事務(wù)。這種事物的并發(fā)執(zhí)行方式提高了每個對等節(jié)點處理事務(wù)的效率,加速了排序事務(wù)的交付工作。

4.Chaincode功能

Chaincode是區(qū)塊鏈上的應(yīng)用代碼,從“智能合約”概念中擴展而來。系統(tǒng)Chaincode是一個特殊的Chaincode,它定義了整個頻道的操作參數(shù)、生命周期和配置系統(tǒng)以及頻道的規(guī)則、驗證和支持事務(wù)的需求。

3.4.3網(wǎng)絡(luò)節(jié)點架構(gòu)

節(jié)點是網(wǎng)絡(luò)區(qū)塊鏈的通信主體,是一個邏輯概念。節(jié)點分為很多類型,包括客戶端節(jié)點、Peer節(jié)點、排序服務(wù)節(jié)點和CA節(jié)點等。多個不同類型的節(jié)點可以運行在同一物理服務(wù)器上。圖3-7所示為網(wǎng)絡(luò)節(jié)點架構(gòu)圖。圖3-7網(wǎng)絡(luò)節(jié)點架構(gòu)圖

1.客戶端節(jié)點

客戶端或者應(yīng)用程序是最終用戶操作的實體,它必須連接到某一個Peer節(jié)點或者排序服務(wù)節(jié)點上才能在區(qū)塊鏈網(wǎng)絡(luò)中進行通信??蛻舳斯?jié)點向背書節(jié)點(Endorser)提交交易提案(TransactionProposal)。當收集到足夠多的背書后,客戶端節(jié)點會向排序服務(wù)傳播交易,進行排序,生成區(qū)塊。

2.Peer節(jié)點

所有的Peer節(jié)點都是記賬節(jié)點(Committer),負責驗證排序服務(wù)節(jié)點區(qū)塊里的交易,維護狀態(tài)數(shù)據(jù)和賬本的副本。部分Peer節(jié)點執(zhí)行交易并對結(jié)果進行簽名背書,充當背書節(jié)點的角色。背書節(jié)點是動態(tài)的角色,是被具體鏈碼綁定的。每個鏈碼在實例化的時候都會設(shè)置背書策略,指定哪些節(jié)點在交易背書后才是有效的。Peer節(jié)點只有在應(yīng)用程序向它發(fā)起交易背書請求的時候才是背書節(jié)點,其他時候它們就是普通的記賬節(jié)點,只負責驗證交易并記賬。

3.排序服務(wù)節(jié)點

排序服務(wù)節(jié)點(OrderingServiceNode或者Orderer)負責接收包含背書簽名的交易,對未打包的交易進行排序,生成區(qū)塊后廣播給Peer節(jié)點。排序服務(wù)節(jié)點提供的是原子廣播(AtomicBroadcast),保證同一個鏈上的節(jié)點接收到相同的消息,并且有相同的邏輯順序。

4.?CA節(jié)點

CA節(jié)點是HyperledgerFabric1.0的證書頒發(fā)機構(gòu)(CertificateAuthority),由服務(wù)器和客戶端組件組成。CA節(jié)點接收客戶端的注冊申請,并返回注冊密碼用于用戶登錄,以便獲取身份證書。區(qū)塊鏈網(wǎng)絡(luò)上所有的操作CA節(jié)點都會驗證用戶身份。CA節(jié)點是可選的,可以是其他成熟的第三方CA頒發(fā)的證書。

3.4.4典型交易流程

圖3-8所示為HyperledgerFabric1.0典型的交易流程圖。圖3-8交易流程總圖

3.5超級賬本的組成模型

3.5.1資產(chǎn)

資產(chǎn)包括房地產(chǎn)、貨物等有形資產(chǎn)和合同、知識產(chǎn)權(quán)等無形資產(chǎn)。超級賬本具有使用智能合約交易修改資產(chǎn)的功能。在超級賬本中,資產(chǎn)以鍵值對集合的方式存在,在頻道模式中,可以通過對其狀態(tài)提交變更事務(wù)來修改資產(chǎn)。使用超級賬本中的Composer工具可以很容易地定義和使用應(yīng)用程序中的資產(chǎn)。

3.5.2智能合約

智能合約是定義資產(chǎn)和修改資產(chǎn)的事務(wù)指令的軟件,也就是一個頻道的業(yè)務(wù)邏輯,擁有能夠讀取和修改鍵值對操作的規(guī)則。智能合約通過一個事務(wù)請求來執(zhí)行對相應(yīng)數(shù)據(jù)庫的操作,完成后會生成一組讀寫集。這組讀寫集會被提交給網(wǎng)絡(luò)排序服務(wù)節(jié)點,再由排序服務(wù)節(jié)點廣播給所有的對等節(jié)點。

3.5.3賬本特征

在Fabric中產(chǎn)生的所有針對數(shù)據(jù)狀態(tài)變更的請求,都會生成有序且無法篡改的記錄存在賬本里面。數(shù)據(jù)狀態(tài)的變更是由所有參與方認可的智能合約調(diào)用事務(wù)的結(jié)果,每個事務(wù)都將產(chǎn)生一組資產(chǎn)鍵值對。這些鍵值對作為創(chuàng)建、更新或刪除的操作被同步到所有賬本上。

賬本由區(qū)塊鏈組成,每一個區(qū)塊中都存儲著一組有序且不可篡改的記錄,由一個狀態(tài)數(shù)據(jù)庫來維護當前的Fabric狀態(tài)。每個頻道都有且只有一個賬本,該頻道中的每個加盟成員都維護同一份賬本。

超級賬本采用背書/共識(Endorsement/Cosensus)模型,交易執(zhí)行和區(qū)塊驗證是在不同角色的節(jié)點中分開執(zhí)行的。交易執(zhí)行是并發(fā)的,這可以提高系統(tǒng)擴展性和網(wǎng)絡(luò)吞吐量。在背書節(jié)點(EndorsingPeer)處交易執(zhí)行鏈碼(Chaincode),在所有的Peer節(jié)點上驗證交易并提交。

每個Peer節(jié)點會維護多個賬本,如圖3-9所示。圖3-9分布式賬本存儲

1.超級賬本的元素

超級賬本包含以下元素:

·賬本編號:快速查詢存在哪些賬本;

·賬本數(shù)據(jù):實際的區(qū)塊鏈存儲;

·區(qū)塊索引:快速查詢區(qū)塊/交易;

·狀態(tài)數(shù)據(jù):最新的世界狀態(tài)數(shù)據(jù);

·歷史數(shù)據(jù):跟蹤鍵的歷史。

在實際的Chaincode環(huán)境中,對于查詢功能,除了簡單的鍵值對查詢,我們往往還有如下兩個需求:

·富查詢:對數(shù)據(jù)的某一個屬性進行查詢,獲取所有滿足條件的數(shù)據(jù),例如獲取所有顏色為紅色的汽車信息。

·區(qū)間查詢:對一個范圍內(nèi)的鍵值進行查詢,獲取數(shù)據(jù),例如獲取單號在005至008之間的訂單信息。

2.超級賬本的特征

超級賬本的特征可總結(jié)如下:

(1)使用基鍵(鍵查詢)、范圍查詢及組合鍵查詢等方法可對賬本執(zhí)行查詢和更新操作。

(2)使用富查詢語言的只讀查詢(如果使用CouchDB作為狀態(tài)數(shù)據(jù)庫)。

(3)只讀歷史查詢:可以查詢賬本歷史記錄,支持數(shù)據(jù)溯源等應(yīng)用情景。

(4)每一條請求的結(jié)果都由通過智能合約讀取的讀集和智能合約寫入的寫集的鍵值的多版本組成。

(5)每一條被提交的請求都包含提交該請求的節(jié)點的簽名證書,并同時提交到排序服務(wù)節(jié)點。

(6)同一個頻道中的區(qū)塊里的所有請求事務(wù)都會被排序,并且這些區(qū)塊會被排序服務(wù)節(jié)點廣播到該頻道內(nèi)的所有對等節(jié)點。

(7)對等節(jié)點對請求事務(wù)的驗證依靠背書策略并嚴格執(zhí)行該策略。

(8)每添加一個塊之前,超級賬本都要執(zhí)行版本控制檢查,以確保被讀取的資產(chǎn)的狀態(tài)在鏈代碼執(zhí)行之后沒有改變。

(9)即將執(zhí)行變更的請求事務(wù)集在新增到一個區(qū)塊之前必須要做一次版本驗證,以確保被讀取的資產(chǎn)狀態(tài)集在本條智能合約執(zhí)行時間之前沒有改變過。

(10)一旦請求事務(wù)被驗證且提交,就不可篡改。

(11)一個頻道的賬本包含一個區(qū)塊生成的配置策略、訪問控制列表和其他相關(guān)信息。

(12)考慮到頻道將會從不同的證書機構(gòu)得到加密文件,因此頻道中擁有成員服務(wù)提供者(MSP)實例。

3.5.4隱私頻道

超級賬本在每個頻道上都擁有一個不可篡改的賬本,一個賬本被限制在一個頻道的范圍內(nèi)。它可以在整個網(wǎng)絡(luò)中共享,也可以被私有化。每個賬本只包含一組特定的參與者。

3.5.5成員安全性

超級賬本支持參與者擁有自己的身份,而公鑰的底層方案運用使對于數(shù)據(jù)的訪問控制進行操作和治理可以在更廣泛的網(wǎng)絡(luò)上展開,同時頻道功能的存在更加有助于解決成員安全性的問題。

3.5.6共識機制

超級賬本的共識機制包括背書、排序和校驗三個階段

1.背書

在背書階段,背書節(jié)點對客戶端發(fā)來的交易預(yù)案進行合法性檢驗,然后模擬執(zhí)行鏈碼得到交易結(jié)果,最后根據(jù)設(shè)定的背書邏輯判斷是否支持該交易預(yù)案。如果背書邏輯決定支持交易預(yù)案,它將把預(yù)案簽名發(fā)回給客戶端。在缺省情況下,背書節(jié)點的背書邏輯支持預(yù)案并簽名。但是節(jié)點也可以按照業(yè)務(wù)規(guī)則設(shè)定背書邏輯,從而對服務(wù)業(yè)務(wù)需求的交易進行背書。如果背書節(jié)點判定不支持交易,則給客戶端返回出錯信息。

2.排序

排序階段就是排序服務(wù)對交易進行排序,確定交易之間的時序關(guān)系。排序服務(wù)把一段時間內(nèi)收到的交易進行排序,然后把排序后的交易打包成區(qū)塊,再廣播給通道中的成員。采用這種方式,各個成員收到的是一組順序相同的交易,從而保證了所有節(jié)點數(shù)據(jù)的一致性。

排序服務(wù)是共識機制中重要的一環(huán),所有交易都需要通過排序服務(wù)的排序才可以達成全網(wǎng)共識,因此排序服務(wù)要避免成為網(wǎng)絡(luò)上的性能瓶頸。為此,排序服務(wù)采用輕量級設(shè)計,只完成確定交易順序的功能,不參與其他操作。

3.校驗

交易階段可用來校驗節(jié)點對排序后的交易進行的一系列的校驗操作,包括交易數(shù)據(jù)的完整性檢查、是否重復(fù)交易、背書簽名是否符合背書策略的要求、交易讀寫集是否符合多版本控制的校驗等。當交易通過了所有校驗之后,將被標注為合法并寫入賬本中。因為所有的確認節(jié)點按照相同的順序校驗交易,并且把合法的交易一次寫入賬本中,所以它們的狀態(tài)能夠始終保持一致。

結(jié)

本章簡要介紹了超級賬本的組織模型、部分項目和功能等。超級賬本社區(qū)成立一年多以來,已經(jīng)吸引了來自國內(nèi)外各行各業(yè)的大量關(guān)注,從最初的一個項目、三十位成員擴展到今天的近十個頂級項目、一百多個企業(yè)會員,使企業(yè)級區(qū)塊鏈生態(tài)系統(tǒng)得到了不斷的發(fā)展和完善。同時超級賬本社區(qū)也十分重視應(yīng)用的落地,目前基于超級賬本相關(guān)技術(shù)已經(jīng)成功應(yīng)用并落地了大量的企業(yè)案例。這些案例為更多企業(yè)嘗試利用區(qū)塊鏈技術(shù)提高商業(yè)效率提供了不少經(jīng)驗。第4章HyperledgerFabric入門4.1HyperledgerFabric開發(fā)流程4.2環(huán)境搭建4.3運行樣例網(wǎng)絡(luò)4.4編寫HelloWorld智能合約本章小結(jié)

4.1

HyperledgerFabric開發(fā)流程

在編寫HelloWorld程序前,首先要了解HyperledgerFabric開發(fā)的整體流程,如圖4-1所示。圖4-1

HyperledgerFabric開發(fā)流程

在HyperledgerFabric區(qū)塊鏈網(wǎng)絡(luò)中,不僅存儲著數(shù)據(jù),還存儲著智能合約。開發(fā)者通過執(zhí)行智能合約完成對鏈上數(shù)據(jù)的增加、查詢、修改、刪除操作。但是智能合約必須是部署在一個已啟動且正常運行的Fabric網(wǎng)絡(luò)上,因此開發(fā)者的首要任務(wù)是搭建環(huán)境并啟動Fabric網(wǎng)絡(luò)。

4.2環(huán)

對于一個框架而言,環(huán)境搭建通常比較繁瑣,HyperledgerFabric也不例外。在環(huán)境搭建的過程中,要確保每一個依賴都成功安裝(可用查看版本命令確認),且各依賴的版本必須兼容,否則后續(xù)過程中會出現(xiàn)各種難以糾正的錯誤。

首先明確HyperledgerFabric網(wǎng)絡(luò)運行的操作系統(tǒng),此處使用Ubuntu16.04LTS(Linux的發(fā)行版),要求讀者熟悉基本的Linux命令。對于Windows操作系統(tǒng)的開發(fā)者來說,可以下載Vmware虛擬機和操作系統(tǒng)鏡像來啟動Linux。

4.2.1安裝Curl

Curl是一個利用URL語法在命令行下工作的文件傳輸工具,1997年首次發(fā)行。它支持文件上傳和下載,是綜合傳輸下載工具。在區(qū)塊鏈開發(fā)中,使用該工具完成下載依賴安裝包、測試接口等功能。

通過下列命令進行安裝:

4.2.2安裝Docker和DockerCompose

HyperledgerFabric使用Docker虛擬化技術(shù),將每個區(qū)塊鏈節(jié)點部署運行在相互獨立的容器中。因此,Docker是必不可少的依賴。此外,由于區(qū)塊鏈節(jié)點數(shù)較多,還需安裝DockerCompose,以實現(xiàn)各節(jié)點容器的編排、群起等。

安裝步驟如下:

(1)移除舊版本,確保系統(tǒng)環(huán)境的清潔,命令如下:

(2)更新Apt下載源,命令如下:

(3)安裝一些軟件包依賴所需的https源,命令集合如下:

(4)添加Docker官方GPG密鑰,需要輸入的命令如下:

(5)通過查找密鑰指紋的后8位字符,確認密鑰正確生效,如圖4-2所示。圖4-2密鑰配置生效

(6)設(shè)置穩(wěn)定版?zhèn)}庫,輸入如下命令行:

(7)再次更新Apt下載目錄,命令行如下:

(8)安裝最新版本的DockerCE(社區(qū)版)和Containerd,命令行如下:

(9)測試Docker是否安裝成功,所需的命令如下:

若安裝成功,則會看到圖4-3所示的輸出。圖4-3

Hello-World成功執(zhí)行

(10)安裝DockerCompose。

首先下載Docker-Compose可執(zhí)行文件,命令行如下:

4.2.3安裝Go語言

區(qū)塊鏈開發(fā)的核心在于編寫智能合約(在Fabric中稱為鏈碼)。Go語言是目前Fabric鏈碼開發(fā)的首選語言,因此必須先安裝Go。步驟如下:

(1)使用Wget命令獲取Go壓縮包,命令如下:

(2)解壓Go壓縮包,解壓命令如下:

(3)在當前用戶目錄下創(chuàng)建Go目錄,作為Go語言的工作空間,存放項目文件和相關(guān)依賴。所需的三行命令如下:

(4)配置GOPATH變量和環(huán)境變量,以便能在命令行界面直接使用Go命令。所需增加的環(huán)境變量內(nèi)容如下:

使用Vim工具修改/etc/profile(Linux環(huán)境變量配置文件)。Vim是一款功能強大、支持各種插件、配置極為靈活的編輯器,若Vim不存在則使用下列命令安裝:

修改環(huán)境變量,用來指定可執(zhí)行文件的路徑,命令如下:

使用Shift+$組合鍵切換至文件行尾,按o插入上述環(huán)境變量配置,如圖4-4所示。圖4-4配置Go環(huán)境變量

插入完畢,先按esc,再輸入:wq即可保存退出。

最后用source命令使修改生效,需要的命令行如下:

4.2.4安裝Node.js和NPM

1)下載工具包

使用Curl工具下載Node.js壓縮包(下載到/usr/local目錄下)。Node.js是Fabric必需的開發(fā)環(huán)境,NPM是運行在Node.js環(huán)境上的包管理器,擁有非常豐富且實用的依賴包。所需的命令行如下:

2)解壓Node壓縮包

解壓并修改文件目錄名為Nodejs,所需的兩行命令如下:

3)修改環(huán)境變量

配置環(huán)境變量,使Node和Npm命令全局可用,修改環(huán)境變量文件,命令行如下:

4)檢測Node和Npm是否安裝成功

利用如下兩個版本檢測命令進行測試,檢測Node和Npm是否安裝成功。

4.3運行樣例網(wǎng)絡(luò)

啟動Fabric網(wǎng)絡(luò)需要編寫復(fù)雜的配置文件,對初學者并不友好,因此官網(wǎng)提供了大量的樣例。成功地運行樣例后,請讀者自行編寫配置文件,以實現(xiàn)定制化的Fabric區(qū)塊鏈網(wǎng)絡(luò)。

1.啟動樣例網(wǎng)絡(luò)

下面按照步驟啟動樣例網(wǎng)絡(luò)。

(1)下載fabric-samples樣例文件,下載命令如下:

(2)進入Fabric-Sample目錄,執(zhí)行script目錄中的引導腳本文件,用到的兩個命令如下:

該腳本會自動完成兩個功能:

下載Fabric相關(guān)的Docker鏡像,如Fabric-Ca、Peer、Orderer節(jié)點等。

下載Fabric二進制工具集到bin目錄中。這些工具是啟動區(qū)塊鏈網(wǎng)絡(luò)的核心,此處重點介紹Cryptogen和Configtxgen工具。

Cryptogen即加密生成器,可根據(jù)crypto-config.yaml(網(wǎng)絡(luò)拓撲文件)生成各組織和節(jié)點的加密證書,以及節(jié)點間通訊驗證所需的公鑰私鑰對。crypto-config.yaml文件可依次定義Orderer(排序)節(jié)點和Peer(對等)節(jié)點的組織信息和節(jié)點數(shù),一個典型的配置文件的內(nèi)容如下:

(3)為了后續(xù)全局使用這些工具,須添加環(huán)境變量配置,方法是在/etc/profile加入如下路徑:

由于Docker鏡像源在國外,可能出現(xiàn)下載失敗或過慢的情況,因此先配置Docker源為國內(nèi)地址。此處使用阿里云鏡像加速,注冊阿里云賬號后訪問網(wǎng)址,按照操作文檔配置即可,如圖4-5所示。圖4-5

Docker加速鏡像配置

2.生成區(qū)塊鏈文件

(1)進入first-network目錄,執(zhí)行byfn.sh腳本的generate命令,生成區(qū)塊鏈網(wǎng)絡(luò)相關(guān)文件,執(zhí)行過程中的輸入均選擇Y。安裝命令如下:

generate命令使用上述bin目錄下的工具來生成網(wǎng)絡(luò)相關(guān)文件,具體內(nèi)容如下:

使用Cryptogen工具生成網(wǎng)絡(luò)節(jié)點證書。

使用Configtxgen工具生成創(chuàng)世區(qū)塊、通道配置文件(channel.tx)和錨節(jié)點文件。

(2)執(zhí)行byfn.sh腳本的up命令,將自動啟動Fabric網(wǎng)絡(luò),執(zhí)行過程中的輸入均選擇Y。啟動Fabric的命令如下:

3.啟動網(wǎng)絡(luò)

啟動網(wǎng)絡(luò)步驟如下:

(1)使用Docker-Compose命令,基于Docker鏡像和節(jié)點配置文件啟動Peer、Orderer、Cli等Docker容器,將看到圖4-6所示的輸出。

圖4-6啟動節(jié)點Docker容器

(2)基于步驟(1)中生成的channel.tx文件創(chuàng)建一個通道,如圖4-7所示。圖4-7創(chuàng)建通道

通道創(chuàng)建成功,如圖4-8所示。圖4-8通道創(chuàng)建成功

(3)讓節(jié)點加入通道,需要初始化Endorser(背書節(jié)點)和Orderer(排序節(jié)點)的連接,如圖4-9所示。假如沒有問題就會顯示加入通道成功,如圖4-10所示。圖4-9節(jié)點加入通道

圖4-10加入成功

(4)依次更新通道上每個組織的錨節(jié)點,同樣需要初始化背書節(jié)點和排序節(jié)點的連接,如圖4-11所示,確認錨節(jié)點更新成功,如圖4-12所示。圖4-11更新錨節(jié)點圖4-12錨節(jié)點更新成功

(5)在節(jié)點上安裝鏈碼并實例化,如圖4-13所示;確認鏈碼安裝成功,如圖4-14所示。圖4-14鏈碼安裝成功圖4-13安裝鏈碼

注意:想要在哪個節(jié)點調(diào)用鏈碼,就必須在該節(jié)點上安裝。每個鏈碼有唯一的名稱,且同名鏈碼的版本號唯一。因此實例化鏈碼的操作只需在任意安裝該鏈碼的節(jié)點上執(zhí)行一次,即可在所有裝有該鏈碼的節(jié)點進行調(diào)用。實例化過程如圖4-15所示。實例化后確認鏈碼實例化成功界面如圖4-16所示。圖4-15實例化鏈碼圖4-16鏈碼實例化成功

(6)使用命令行調(diào)用鏈碼,如圖4-17所示。圖4-17查詢鏈碼數(shù)據(jù)

最終,將看到如圖4-18所示的輸出,樣例網(wǎng)絡(luò)運行成功!圖4-18

byfn腳本執(zhí)行成功

4.4編寫HelloWorld智能合約

在Fabric區(qū)塊鏈中,智能合約被稱為Chaincode(鏈碼)。目前鏈碼的編寫基于Go、Java和Node.js三種語言。其中,Google開發(fā)的Go語言具有先天高并發(fā)、高性能的優(yōu)勢,因此被選為HyperledgerFabric鏈碼的默認開發(fā)語言。本章使用Go語言來編寫HelloWorld智能合約。

Fabric官方樣例中提供了一個利用Go語言實現(xiàn)的簡單的鏈碼程序,在4.3節(jié)已成功安裝、實例化該鏈碼并測試調(diào)用。下面對該示例代碼進行分析。

1.示例代碼分析

樣例代碼路徑如下:

fabric-samples/chaincode/chaincode_example02/go/chaincode_example02.go

讀者可將其復(fù)制到帶有文本編輯器或IDE的操作系統(tǒng)進行瀏覽和編輯,推薦使用SublimeText和JetBrainsGoLand。

1)先聲明包

Go語言中的包和Java中的包十分相似,都是代碼的組織方式。不同的是,Go語言不像其他語言一樣有public、protected、private等訪問控制修飾符,它是通過字母大小寫來控制可見性的。如果定義的常量、變量、類型、接口、結(jié)構(gòu)、函數(shù)等的名稱是大寫字母開頭,表示能被其他包訪問或調(diào)用(相當于public);非大寫開頭則只能在包內(nèi)使用(相當于private)。聲明main包代碼如下:

2)引入鏈碼SDK

我們在開發(fā)過程中,不會所有的功能都自己去造輪子,經(jīng)常要使用到各種的其他依賴。在本項目中,除了使用fmt、strconv等常用依賴外,必須引入HyperledgerFabric的鏈碼SDK,代碼如下:

3)編寫結(jié)構(gòu)體接口

Go語言是一門獨特的面向?qū)ο笳Z言,它沒有繼承、構(gòu)造函數(shù)、析構(gòu)函數(shù)等概念,但具有接口和實現(xiàn)。此處定義的SimpleChaincode結(jié)構(gòu)體就是Chaincode接口的實現(xiàn)類,必須實現(xiàn)Init、Invoke等方法。

Chaincode接口代碼如下:

4)編寫鏈碼初始化函數(shù)

Init函數(shù)用于鏈碼初始化,以傳入?yún)?shù)為數(shù)據(jù)設(shè)置初始值。代碼和詳細注釋如下所示:

5)編寫鏈碼調(diào)用函數(shù)

樣例代碼中有雖然有兩個Invoke函數(shù),但只有參數(shù)、返回值和Chaincode的Invoke完全一致的函數(shù)才是具體實現(xiàn)。

Invoke函數(shù)代碼很簡單,它實際上是一個操作選擇函數(shù),根據(jù)獲取調(diào)用類型來決定執(zhí)行何種操作,如發(fā)起交易、刪除數(shù)據(jù)和查詢數(shù)據(jù)。下面詳細介紹這些函數(shù)。

(1)發(fā)起交易。

該函數(shù)實現(xiàn)了簡單的區(qū)塊鏈交易——轉(zhuǎn)賬操作。把A、B變量理解為兩位用戶,假設(shè)A給B轉(zhuǎn)賬,邏輯為A金錢減少,B金錢相應(yīng)增加。函數(shù)的業(yè)務(wù)邏輯可被簡述為:從鏈上讀取用戶變量數(shù)據(jù),根據(jù)傳入?yún)?shù)的值對A、B用戶的金額進行改動操作,并將更新后的用戶變量于鏈上更新。代碼和注釋如下:

(2)刪除數(shù)據(jù)。

刪除數(shù)據(jù)操作較簡單,從stub中獲取用戶要刪除的鍵,然后調(diào)用stub.DelState方法實現(xiàn)鍵值對的刪除。函數(shù)的業(yè)務(wù)邏輯可被簡述為:根據(jù)傳入?yún)?shù)獲取需要刪除的鍵值對,調(diào)用存根函數(shù)對該鍵值對進行刪除操作。代碼如下:

(3)查詢數(shù)據(jù)。

查詢和刪除流程相似,都是先從輸入?yún)?shù)中獲取目標鍵名,再執(zhí)行操作。函數(shù)的業(yè)務(wù)邏輯可被簡述為:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論