版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
2025年Python區(qū)塊鏈技術專項訓練試卷-實戰(zhàn)項目開發(fā)考試時間:______分鐘總分:______分姓名:______項目名稱:基于Python的簡化分布式賬本系統(tǒng)項目背景:你正在參與一個項目,需要設計并實現(xiàn)一個簡化版的分布式賬本系統(tǒng)。該系統(tǒng)旨在模擬區(qū)塊鏈的核心概念,包括分布式節(jié)點的數(shù)據(jù)一致性維護、基本的交易處理和賬本查詢功能。為了簡化實現(xiàn),本項目不考慮復雜的P2P網(wǎng)絡發(fā)現(xiàn)機制,假設節(jié)點地址是預先配置的。共識機制采用一種簡化的“多數(shù)節(jié)點同意”模型。所有數(shù)據(jù)將存儲在本地文件中。項目需求:1.節(jié)點與賬本:*系統(tǒng)中的每個“節(jié)點”由一個獨立的Python腳本或程序表示,可以運行在本地多進程/多線程或不同機器上(模擬)。*每個節(jié)點維護一個本地賬本(LocalLedger),該賬本是一個持久化的數(shù)據(jù)結構(例如,使用JSON文件或SQLite數(shù)據(jù)庫),記錄了所有已確認的交易。*賬本應包含一個全局唯一賬本ID(可以從文件名或數(shù)據(jù)庫主鍵中獲?。?,以及一個按時間順序排列的交易列表。2.交易(Transaction):*交易是一個數(shù)據(jù)結構,至少包含:交易ID(TxID)、發(fā)送者地址(Sender)、接收者地址(Receiver)、金額(Amount)、時間戳(Timestamp)。*交易必須使用發(fā)送者的私鑰進行數(shù)字簽名(使用Python的cryptography庫或類似庫實現(xiàn)非對稱加密)。簽名應與交易ID和發(fā)送者地址一起存儲。*提供一個函數(shù),能夠驗證交易的簽名是否有效。3.共識機制(簡化版“多數(shù)同意”):*當一個節(jié)點接收到一個有效的、未在本地賬本中記錄的交易時,它將該交易添加到自己的“候選交易池”(MemPool)。*節(jié)點定期(或基于事件觸發(fā))嘗試將MemPool中的交易打包成一個新的大賬本條目(Block)。*為了創(chuàng)建一個新的賬本條目(Block),節(jié)點需要:*從MemPool中選擇一組交易。*對選中的交易進行排序。*計算賬本條目的哈希值。這個哈希值需要滿足某種簡單的“工作量證明”或僅僅是滿足前導零的要求(例如,要求哈希值以一定數(shù)量的零開頭),以模擬挖礦難度??梢允褂煤唵蔚淖址僮骰騢ashlib庫實現(xiàn)。*將交易列表、賬本條目哈希(作為該條目的“區(qū)塊頭”的一部分)、創(chuàng)建時間戳、以及創(chuàng)建節(jié)點的唯一標識(NodeID)記錄下來。*共識規(guī)則:一個新創(chuàng)建的賬本條目(Block)需要被系統(tǒng)中超過50%的節(jié)點(假設系統(tǒng)中有N個節(jié)點,需要超過N/2個節(jié)點確認)接受。一個節(jié)點接受一個賬本條目,意味著它將這個條目添加到自己的本地賬本中,并從MemPool中移除已包含在該條目中的交易。*節(jié)點需要一種機制來接收來自其他節(jié)點的賬本條目提議。當一個節(jié)點提議一個新的賬本條目時,其他節(jié)點需要驗證該條目的有效性(交易簽名、區(qū)塊頭哈希滿足要求等)以及其包含的交易是否已處理。*如果一個節(jié)點提議的賬本條目被多數(shù)節(jié)點接受,該節(jié)點可以將其視為“已確認”,并可以開始提議下一個賬本條目。如果一個提議未被接受,節(jié)點應能處理沖突(例如,通過重新收集交易或接受其他節(jié)點提議的更“長”的鏈)。4.節(jié)點間通信(簡化):*提供一種機制(例如,使用Python的socket編程、pickle序列化對象,或在同一臺機器上使用multiprocessing.Queue),允許節(jié)點之間發(fā)送和接收消息。*消息類型應包括:發(fā)送節(jié)點ID、消息類型(如:'NEW_TRANSACTION','BLOCK提議','ACKNOWLEDGE_BLOCK')以及消息內(nèi)容(序列化的交易對象、序列化的賬本條目對象等)。*實現(xiàn)一個簡單的節(jié)點通信協(xié)議。5.命令行接口(CLI):*提供一個命令行界面,允許用戶與系統(tǒng)交互。至少應包括以下命令:*`node_start[node_id]`:啟動指定ID的節(jié)點(如果未指定,則隨機生成一個)。*`node_stop[node_id]`:停止指定ID的節(jié)點。*`send_transaction[sender_id][receiver_id][amount]`:從指定發(fā)送者地址向指定接收者地址發(fā)送指定金額的交易。發(fā)送者ID應關聯(lián)到一個已啟動的節(jié)點,該節(jié)點負責簽署并發(fā)送交易。*`list_nodes`:列出當前活躍的節(jié)點及其狀態(tài)(例如,是否已同步)。*`show_blockchain[node_id]`:顯示指定節(jié)點的完整賬本條目列表。*`show_ledger[node_id]`:顯示指定節(jié)點的當前交易記錄。6.持久化與同步:*節(jié)點的本地賬本必須持久化存儲到磁盤,以便在程序重啟后能夠恢復。*實現(xiàn)節(jié)點間的賬本同步機制。當一個新節(jié)點啟動時,它需要與其他節(jié)點通信,以獲取最新的賬本狀態(tài),確保自己的賬本與網(wǎng)絡中的多數(shù)節(jié)點保持一致。如果本地賬本落后,應能下載并應用缺失的賬本條目。開發(fā)任務:1.設計并實現(xiàn)交易(Transaction)類,包括屬性、構造方法、以及使用私鑰簽名的靜態(tài)方法`sign_transaction(private_key,transaction)`和驗證簽名的靜態(tài)方法`verify_signature(transaction,signature)`。2.設計并實現(xiàn)節(jié)點(Node)類,包含屬性:節(jié)點ID、本地賬本(數(shù)據(jù)結構及持久化方案)、MemPool(數(shù)據(jù)結構)、已連接節(jié)點列表、共識配置(如所需確認數(shù))等。實現(xiàn)節(jié)點的基本功能,如接收交易、處理交易、創(chuàng)建賬本條目、驗證賬本條目、與其他節(jié)點通信等。3.實現(xiàn)節(jié)點間通信模塊,定義消息格式,并編寫發(fā)送和接收消息的函數(shù)。4.實現(xiàn)賬本條目(Block)類,包含屬性:交易列表、區(qū)塊頭(包含前一區(qū)塊哈希、當前區(qū)塊哈希、時間戳、NodeID等)。5.實現(xiàn)共識模塊的核心邏輯,包括賬本條目的創(chuàng)建(模擬挖礦)、驗證以及多數(shù)節(jié)點確認的機制。6.實現(xiàn)本地賬本的數(shù)據(jù)持久化(選擇JSON文件或SQLite數(shù)據(jù)庫)。7.實現(xiàn)賬本同步機制,確保新節(jié)點能夠加入并達到共識。8.實現(xiàn)命令行接口(CLI),允許用戶通過命令與系統(tǒng)交互。9.編寫必要的測試用例,驗證交易簽名、賬本條目創(chuàng)建、共識過程、節(jié)點同步等核心功能的正確性。提交要求:請?zhí)峤凰性创a文件,并附帶一個簡短的文檔,說明系統(tǒng)的設計思路、關鍵模塊的實現(xiàn)細節(jié)、以及如何運行你的程序(包括啟動節(jié)點、發(fā)送交易、查看結果等基本步驟)。試卷答案項目名稱:基于Python的簡化分布式賬本系統(tǒng)項目需求:1.節(jié)點與賬本:*節(jié)點表示:可以使用Python的`multiprocessing`模塊創(chuàng)建多進程表示不同節(jié)點,或在同一進程中使用線程(`threading`)模擬并發(fā)。也可以考慮使用`socket`編程在多臺機器(或同一臺機器的不同端口)上運行獨立的Python腳本。每個節(jié)點由一個獨立的Python程序或腳本實例表示。*本地賬本:賬本可以使用JSON文件存儲(例如,`ledger_nodeID.json`),其中包含一個賬本ID和交易列表(每個交易是JSON對象)。或者使用SQLite數(shù)據(jù)庫,創(chuàng)建一個數(shù)據(jù)庫表來存儲賬本ID、交易ID、交易數(shù)據(jù)、創(chuàng)建時間等。賬本需要支持增刪查改操作,并確保數(shù)據(jù)的持久化。2.交易(Transaction):*交易結構:定義一個`Transaction`類,包含`TxID`,`Sender`,`Receiver`,`Amount`,`Timestamp`屬性。`TxID`可以使用UUID生成。`Sender`和`Receiver`是地址字符串,`Amount`是浮點數(shù)或整數(shù),`Timestamp`是`datetime.datetime.now()`。*數(shù)字簽名:*依賴庫:使用`cryptography`庫,特別是`cryptography.hazmat.primitives.asymmetric`和`cryptography.hazmat.primitives.hashes`模塊。*簽名方法:在`Transaction`類中添加`sign(self,private_key)`方法。使用`private_key.sign()`方法,傳入交易數(shù)據(jù)的序列化形式(如`json.dumps(self.__dict__)`)和哈希算法(如`hashes.SHA256()`)。返回簽名值(`Signature`對象)。*存儲:將簽名值序列化(如使用`pickle`或直接轉(zhuǎn)為bytes)并存儲在`Transaction`對象的屬性中。*驗證簽名:*方法:在`Transaction`類中添加`verify_signature(self,signature,public_key)`方法。使用`public_key.verify()`方法,傳入簽名值和交易數(shù)據(jù)的序列化形式以及相同的哈希算法。如果沒有異常拋出,則驗證通過。3.共識機制(簡化版“多數(shù)同意”):*MemPool:每個節(jié)點維護一個MemPool數(shù)據(jù)結構(如`list`或`set`),用于存儲未確認的交易對象。*創(chuàng)建賬本條目(Block):*選擇交易:從MemPool中選取交易。可以按時間戳排序后取最近的N筆。*計算區(qū)塊頭哈希:*工作量證明(簡化):定義一個`calculate_block_hash(transactions,prev_hash,node_id)`函數(shù)。將交易列表序列化、當前時間戳、`prev_hash`(如果存在)、`node_id`按固定順序拼接成一個字符串。使用`hashlib.sha256()`對這個字符串進行多次哈希(例如,循環(huán)直到哈希值以指定數(shù)量的零開頭,如`hash.hexdigest().startswith('0000')`)。需要設定一個可調(diào)整的難度因子(如前置零的數(shù)量)。*區(qū)塊結構:定義`Block`類,包含`transactions`,`block_hash`,`timestamp`,`creator_node_id`,`prev_block_hash`屬性。`block_hash`是通過`calculate_block_hash`計算得到的。*共識規(guī)則實現(xiàn):*提議與接收:節(jié)點創(chuàng)建`Block`對象后,向超過50%的已知節(jié)點發(fā)送`'BLOCK提議'`消息,包含該`Block`對象。其他節(jié)點收到消息后,調(diào)用`Block`的驗證方法(檢查交易簽名、區(qū)塊頭哈希滿足難度要求、交易不在本地賬本等)。*接受與確認:如果一個節(jié)點驗證通過,并且認為該區(qū)塊是當前最長的有效鏈的一部分(或根據(jù)簡單規(guī)則選擇接受),它將該區(qū)塊添加到自己的本地賬本中,從MemPool中移除相關交易,并向其他節(jié)點發(fā)送`'ACKNOWLEDGE_BLOCK'`消息確認。節(jié)點收到多數(shù)節(jié)點的`ACKNOWLEDGE`后,可以認為該區(qū)塊已確認。*沖突處理:如果節(jié)點收到多個沖突的區(qū)塊提議(來自不同節(jié)點或不同交易集),可以采用“最長鏈”規(guī)則(接受包含最多已確認交易數(shù)的鏈)或“最新鏈”規(guī)則(接受時間戳最新的鏈),或者回滾到某個共同的前祖區(qū)塊。4.節(jié)點間通信(簡化):*消息格式:定義消息為字典,包含`'node_id'`,`'message_type'`,`'content'`。`'content'`是序列化的對象(使用`pickle`)。*通信方式(示例-使用`socket`):*服務器端(節(jié)點):使用`socket.server.ThreadingMixIn`或`socket.server.ForkingMixIn`創(chuàng)建支持多客戶端的服務器。接收連接,接收數(shù)據(jù)(包括`message_type`和`content`),根據(jù)類型處理。發(fā)送數(shù)據(jù)時,序列化消息字典。*客戶端(節(jié)點):創(chuàng)建連接到服務器端的socket,發(fā)送序列化的消息字典,接收響應。*序列化:使用`pickle.dumps()`序列化對象,`pickle.loads()`反序列化。注意,使用pickle時,確保發(fā)送方和接收方環(huán)境有兼容的類定義。5.命令行接口(CLI):*使用庫:使用`argparse`庫解析命令行參數(shù)。*啟動/停止節(jié)點:`node_start`命令可以調(diào)用節(jié)點類的啟動方法。`node_stop`命令可以調(diào)用節(jié)點類的停止方法或記錄節(jié)點狀態(tài)為停止。需要維護一個全局節(jié)點注冊表或狀態(tài)跟蹤。*發(fā)送交易:`send_transaction`命令解析參數(shù),找到對應的發(fā)送者節(jié)點實例,調(diào)用其`send_transaction`方法(該方法負責簽署交易、加入MemPool、嘗試創(chuàng)建區(qū)塊并發(fā)送)。*列表/顯示節(jié)點/賬本:這些命令遍歷節(jié)點注冊表,根據(jù)用戶指定的節(jié)點ID,獲取并打印該節(jié)點的狀態(tài)信息、賬本條目列表或交易記錄。可能需要序列化賬本數(shù)據(jù)以便打印。6.持久化與同步:*持久化:*JSON:在節(jié)點類中,添加方法如`save_ledger_to_file()`和`load_ledger_from_file()`,使用`json.dump()`和`json.load()`操作文件。*SQLite:使用`sqlite3`庫。創(chuàng)建數(shù)據(jù)庫連接,定義表結構(如`CREATETABLEtransactions(idTEXTPRIMARYKEY,senderTEXT,receiverTEXT,amountREAL,timestampTEXT,signatureBLOB)`),提供`save_transaction()`,`get_all_transactions()`,`save_block()`,`get_all_blocks()`等數(shù)據(jù)庫操作方法。*同步機制:*節(jié)點啟動同步:節(jié)點啟動時,向所有已知節(jié)點發(fā)送`'GET_BLOCKCHAIN'`請求。收到響應后,比較本地賬本長度,如果落后,請求缺失的賬本條目(`'GET_BLOCK'`)或整個賬本(`'GET_FULL_LEDGER'`)。接收到的賬本條目/交易進行驗證后,合并到本地賬本。*共識過程本身即是一種同步:節(jié)點通過共識協(xié)議獲取了網(wǎng)絡中多數(shù)節(jié)點認可的狀態(tài)。開發(fā)任務:1.交易類實現(xiàn):```pythonimportuuidimportjsonfromdatetimeimportdatetimefromcryptography.hazmat.primitives.asymmetricimportrsa,paddingfromcryptography.hazmat.primitivesimporthashesimportpickleclassTransaction:def__init__(self,sender,receiver,amount):self.TxID=str(uuid.uuid4())self.Sender=senderself.Receiver=receiverself.Amount=amountself.Timestamp=datetime.now().isoformat()self.Signature=None#StoresignatureasNoneinitiallydefsign(self,private_key):#Serializetransactiondatatransaction_data=json.dumps(self.__dict__,sort_keys=True)#Encodedataforsigningdata=transaction_data.encode()#Signdatasignature=private_key.sign(data,padding.PSS(mgf=padding.MGF1(hashes.SHA256()),salt_length=padding.PSS.MAX_LENGTH),hashes.SHA256())self.Signature=signaturereturnself.Signature@staticmethoddefverify_signature(transaction,signature,public_key):try:#Serializetransactiondatatransaction_data=json.dumps(transaction.__dict__,sort_keys=True)#Encodedataforverificationdata=transaction_data.encode()#Verifysignaturepublic_key.verify(signature,data,padding.PSS(mgf=padding.MGF1(hashes.SHA256()),salt_length=padding.PSS.MAX_LENGTH),hashes.SHA256())returnTrueexceptExceptionase:print(f"Verificationfailed:{e}")returnFalse```*(需要補充RSA密鑰生成和管理邏輯)*2.節(jié)點類實現(xiàn):```pythonimportthreadingimporttimeimportrandom#...引入其他必要的類和庫(Transaction,Block,Networking,Persistence)classNode(threading.Thread):#...Node類屬性(node_id,peer_nodes,ledger,mempool,consensus_config,etc.)defrun(self):#節(jié)點主循環(huán)邏輯whileTrue:#...檢查MemPool,嘗試創(chuàng)建Block#...監(jiān)聽來自其他節(jié)點的消息#...處理接收到的消息(NEW_TRANSACTION,BLOCK提議,ACKNOWLEDGE_BLOCK)#...定期嘗試與其他節(jié)點同步賬本passdefreceive_transaction(self,transaction):#驗證交易簽名ifTransaction.verify_signature(transaction,transaction.Signature,self.public_key):#檢查交易是否已在賬本或MemPool中iftransaction.TxIDnotinself.get_all_transaction_ids():self.mempool.add(transaction)print(f"Received&addedtransaction{transaction.TxID}toMemPool.")else:print(f"Transaction{transaction.TxID}signatureverificationfailed.")defcreate_block(self):#...從MemPool選擇交易,創(chuàng)建Block對象#...計算區(qū)塊頭哈希(滿足工作量證明)#...將Block添加到本地賬本,從MemPool移除交易#...向其他節(jié)點發(fā)送'BLOCK提議'passdefhandle_block_proposal(self,block,from_node_id):#...驗證Block有效性(交易簽名、工作量證明、交易唯一性等)ifself.verify_block(block):#...添加Block到本地賬本(如果驗證通過)#...向其他節(jié)點發(fā)送'ACKNOWLEDGE_BLOCK'passdefsync_ledger(self):#...與其他節(jié)點同步賬本(如果發(fā)現(xiàn)落后)pass#...其他必要的方法(如保存/加載賬本,處理網(wǎng)絡通信等)```*(需要具體實現(xiàn)通信、共識、持久化等細節(jié))*3.通信模塊實現(xiàn):```pythonimportsocketimportjsonimportpickle#消息格式示例defcreate_message(node_id,message_type,content):return{'node_id':node_id,'message_type':message_type,'content':content}defsend_message(client_socket,message):serialized_message=pickle.dumps(message)client_socket.sendall(serialized_message)defreceive_message(client_socket):try:raw_data=client_socket.recv(4096)ifnotraw_data:returnNonemessage=pickle.loads(raw_data)returnmessageexceptExceptionase:print(f"Errorreceivingmessage:{e}")returnNone#服務器端示例(使用socketserver)#classNodeServer(socketserver.ThreadingMixIn,socketserver.TCPServer):...#在Node類中實現(xiàn)基于socket的發(fā)送和接收邏輯```4.賬本條目(Block)類實現(xiàn):```pythonimportjsonimporthashlibclassBlock:def__init__(self,transactions,prev_block_hash,creator_node_id):self.Transactions=transactions#ListofTransactionobjectsself.PrevBlockHash=prev_block_hash#Hashofthepreviousblockor'0'forGenesisself.CreatorNodeID=creator_node_idself.Timestamp=datetime.now().isoformat()self.BlockHash=self.calculate_block_hash()defcalculate_block_hash(self):#按固定順序序列化Block屬性sorted_transactions=sorted(self.Transactions,key=lambdat:t.TxID)data=(json.dumps([t.__dict__fortinsorted_transactions],sort_keys=True)+self.PrevBlockHash+self.CreatorNodeID+self.Timestamp).encode()#進行多次哈希以模擬工作量證明hash_obj=hashlib.sha256()whileTrue:hash_obj.update(data)current_hash=hash_obj.hexdigest()#檢查哈希是否滿足難度要求(例如,以4個零開頭)ifcurrent_hash.startswith('0000'):returncurrent_hash#可以在這里調(diào)整難度或簡單地再次哈希hash_obj=hashlib.sha256()#實際應用中應有明確的難度設定和退出條件```5.共識模塊核心邏輯實現(xiàn):```python#邏輯已部分融入Node類中的create_block,handle_block_proposal等方法#示例:多數(shù)節(jié)點確認判斷defis_majority_achieved(acknowledges,total_known_nodes):returnlen(acknowledges)>total_known_nodes/2```6.持久化實現(xiàn)(JSON示例):```pythonimportjsonimportosclassLedgerPersistence:def__init__(self,node_id,data_dir='data'):self.node_id=node_idself.file_path=os.path.join(data_dir,f'ledger_{node_id}.json')defsave_ledger(self,ledger):#ledgerisadictlike{'blocks':[...],'transactions':[...]}withopen(self.file_path,'w')asf:json.dump(ledger,f,indent=2)defload_ledger(self):ifos.path.exists(self.file_path):withopen(self.file_path,'r')asf:returnjson.load(f)else:return{'blocks':[],'transactions':[]}#Genesisstateorempty#Node類中集成#self.persistence=LedgerPersistence(self.node_id)#self.ledger=self.persistence.load_ledger()#self.persistence.save_ledger(self.ledger)```7.同步機制實現(xiàn)(簡化):```python#在Node類run方法中處理啟動同步#defrun(self):#...初始化...#ifself.ledger['blocks']:#如果本地賬本非空,可能已是同步的#pass#else:#啟動時賬本為空,需要同步#self.sync_ledger_from_peers()#...主循環(huán)...##defsync_ledger_from_peers(self):##向所有節(jié)點請求賬本#forpeer_idinself.peer_nodes:#self.send_message(peer_id,create_message(self.node_id,'GET_FULL_LEDGER',{}))##處理收到的賬本數(shù)據(jù)##...```8.CLI實現(xiàn)(使用argparse):```pythonimportargparseparser=argparse.ArgumentParser(description="PythonBlockchainSimulationCLI")parser.add_argument('command',choices=['start','stop','send','list','show_blockchain','show_ledger'],help='Commandtoexecute')parser.add_argument('--node_id',type=str,help='NodeID')parser.add_argument('--sender_id',type=str,help='SenderNodeIDfortransaction')parser.add_argument('--receiver_id',type=str,help='ReceiverNodeIDfortransaction')parser.add_argument('--amount',type=float,help='Amountfortransaction')#...其他
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 試藥會簽協(xié)議書
- 影視承攬合同范本
- 2026中證中小投資者服務中心招聘備考核心試題附答案解析
- 責任簽訂協(xié)議書
- 兼職員工合同范本
- 證人賠償協(xié)議書
- 營銷保密協(xié)議書
- 小區(qū)排水協(xié)議書
- 軍地聯(lián)合合同范本
- 薪資調(diào)整協(xié)議書
- 洪恩識字1-1300字文檔
- 社區(qū)樓道長管理制度
- 2024年互聯(lián)網(wǎng)+醫(yī)療健康產(chǎn)業(yè)合作框架協(xié)議
- 寺廟用工合同協(xié)議書
- 人工智能在機械設計制造及其自動化中的應用分析
- 電路基礎智慧樹知到期末考試答案章節(jié)答案2024年哈爾濱理工大學
- 2024廣西公需課高質(zhì)量共建“一帶一路”譜寫人類命運共同體新篇章答案
- 品管圈(QCC)活動成果報告書模板
- 房間維修服務工程項目詢價單
- 土家族服飾講座3課件
- 項目監(jiān)理部監(jiān)理周報
評論
0/150
提交評論