版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
以太坊Solidity智能合約開發(fā)教程
以太坊測試網(wǎng)絡(luò)學前提示在以太坊網(wǎng)絡(luò)中部署和運行DApp都需要支付Gas,與在Remix或私有鏈中運行智能合約不同,上線后,開發(fā)者就需要真槍實彈地支付以太幣了。一旦程序有bug,可能就意味著實際的損失。而在私有鏈中測試DApp會遇到一些與實際環(huán)境不一致的情況。以太坊和一些第三方廠商都提供了一些非常接近真實環(huán)境的以太坊測試網(wǎng)絡(luò),可以將DApp部署在測試網(wǎng)絡(luò)中測試完成以太坊交易的情況。知識要點9.1主網(wǎng)絡(luò)和測試網(wǎng)絡(luò)9.2通過Infura節(jié)點集群連接以太坊網(wǎng)絡(luò)9.3在測試網(wǎng)絡(luò)中完成以太坊交易9.1主網(wǎng)絡(luò)和測試網(wǎng)絡(luò)1.Ropsten2.Kovan3.Rinkeby4.Goerli1.RopstenRopsten是以太坊官方提供的測試網(wǎng)絡(luò),采用PoW共識機制。Ropsten網(wǎng)絡(luò)挖礦的難度很低,但是挖出的以太幣沒有任何價值,僅供開發(fā)和測試使用。也可以免費申請Ropsten網(wǎng)絡(luò)的以太幣。Ropsten可以說是很接近主網(wǎng)的測試網(wǎng)絡(luò)。2.KovanKovan是Parity公司發(fā)起的一個測試網(wǎng)絡(luò)。它采用PoA(ProofofAuthority,權(quán)威證明)共識算法。PoA約定:僅由若干個權(quán)威節(jié)點來生成區(qū)塊,其他節(jié)點無權(quán)生成。這樣也就省去了挖礦的時間。盡管有些壟斷的感覺,但是測試網(wǎng)絡(luò)中的以太幣沒有任何價值,權(quán)威節(jié)點純屬義務(wù)勞動。誰又會反對呢。因為是Parity公司發(fā)起的測試網(wǎng)絡(luò),所以只有Parity錢包客戶端可以使用這個網(wǎng)絡(luò)。3.RinkebyRinkeby也是以太坊官方推出的測試網(wǎng)絡(luò),采用PoA共識算法。4.Goerli基于Ethereum2.0的支持多種客戶端的測試網(wǎng)絡(luò)。由第三方團隊Chainsafe推出,是以太坊基金會資助的項目。也采用PoA共識算法。
9.1.2獲取測試幣獲取各種測試幣的方法基本都可以分為如下2種:(1)在以太坊錢包中獲取。(2)在測試網(wǎng)絡(luò)的官網(wǎng)或其他第三方網(wǎng)站獲取。通過以太坊錢包MetaMask申請Ropsten測試幣獲取測試幣的頁面單擊“獲取Ether”按鈕,會打開獲取測試幣的頁面。賬號3接收到測試幣9.2通過Infura節(jié)點集群連接以太坊網(wǎng)絡(luò)Infura是一個托管的以太坊節(jié)點集群,可以免費將智能合約部署在Infura節(jié)點集群上,而無需自己搭建用于測試的以太坊節(jié)點??梢赃x擇通過Infura接入以太坊主網(wǎng)或測試網(wǎng)絡(luò)。無論是測試還是部署上線,通過Infura節(jié)點集群連接以太坊網(wǎng)絡(luò)都是很方便的選擇。9.2.1注冊Infura賬戶Infura官網(wǎng)首頁注冊Infura賬號后收到的激活郵件單擊“注冊”按鈕,根據(jù)提示輸入郵箱和密碼,即可注冊Infura賬戶。提交后注冊郵箱中會收到一封激活郵件。9.2.2通過Infura連接到以太坊網(wǎng)絡(luò)1.連接到以太坊網(wǎng)絡(luò)的URL訪問如下的URL,可以查看infura的技術(shù)文檔:https://infura.io/docs在左側(cè)導航欄中選擇ChooseaNetwork,可以查看Infura支持的以太坊網(wǎng)絡(luò)信息。infura支持的以太坊網(wǎng)絡(luò)網(wǎng)絡(luò)連接方式連接網(wǎng)絡(luò)的URL主網(wǎng)(Mainnet)基于HTTPS的JSON-RPChttps://mainnet.infura.io/v3/YOUR-PROJECT-ID基于WebSocket的JSON-RPCwss://mainnet.infura.io/ws/v3/YOUR-PROJECT-IDRopsten基于HTTPS的JSON-RPChttps://ropsten.infura.io/v3/YOUR-PROJECT-ID基于WebSocket的JSON-RPCwss://ropsten.infura.io/ws/v3/YOUR-PROJECT-IDKovan基于HTTPS的JSON-RPChttps://kovan.infura.io/v3/YOUR-PROJECT-ID基于WebSocket的JSON-RPCwss://kovan.infura.io/ws/v3/YOUR-PROJECT-IDRinkeby基于HTTPS的JSON-RPChttps://rinkeby.infura.io/v3/YOUR-PROJECT-ID基于WebSocket的JSON-RPCwss://rinkeby.infura.io/ws/v3/YOUR-PROJECT-IDGoerli基于HTTPS的JSON-RPChttps://goerli.infura.io/v3/YOUR-PROJECT-ID基于WebSocket的JSON-RPCwss://goerli.infura.io/ws/v3/YOUR-PROJECT-IDIPFSIPFS網(wǎng)關(guān)https://ipfs.infura.io/ipfs/IPFSAPIhttps://ipfs.infura.io:5001/api/2.創(chuàng)建Infura項目單擊左側(cè)菜單中的ETHEREUM圖標,打開連接以太坊網(wǎng)絡(luò)的頁面。創(chuàng)建新項目對話框單擊CREATEAPROJECT按鈕彈出創(chuàng)建新項目對話框。在項目詳情頁中,可以查看或設(shè)置如下屬性·設(shè)置項目名?!げ榭错椖縄D和項目密鑰?!みx擇連接的網(wǎng)絡(luò),查看連接URL?!ぴO(shè)置是否所有請求都需要使用項目密鑰(Requireprojectsecretforallrequests復選框);·設(shè)置JWT公鑰,以及是否所有請求都需要提供JWT公鑰(RequireJWTforallrequests復選框),本書不展開介紹通過JWT進行身份驗證的方法。·項目每秒可以發(fā)送的請求數(shù),0表示不限制?!ろ椖棵刻炜梢园l(fā)送的請求數(shù),0表示不限制?!ぴO(shè)置允許的User-Agent(ALLOWLISTUSERAGENTS)。例如,給移動app設(shè)置一個自定義的User-Agent,然后在Infura項目中設(shè)置指定的User-Agent才可以發(fā)送請求?!ぴO(shè)置允許訪問的合約地址(ALLOWLISTCONTRACTADDRESSES)?!ぴ试S的HTTP訪問源(ALLOWLISTORIGINS)。
允許訪問的API方法(ALLOWLISTAPIREQUESTMETHOD)。項目詳情頁設(shè)置連接網(wǎng)絡(luò)的端點(ENDPOINTS)3.連接到以太坊網(wǎng)絡(luò)在Web3.js中通過Infura連接以太坊網(wǎng)絡(luò)的方法如下:varWeb3=require("web3");varweb3=newWeb3(Web3.givenProvider||連接網(wǎng)絡(luò)的端點URL)例如,在前面創(chuàng)建的myproj項目中,連接Ropsten網(wǎng)絡(luò)的端點URL如下https://ropsten.infura.io/v3/fbc7d11878344e39b5be9296da1a3521通過infura連接Ropsten測試網(wǎng)絡(luò)的方法如下:varWeb3=reqire("web3");varweb3=newWeb3(Web3.givenProvider||'https://ropsten.infura.io/v3/fbc7d11878344e39b5be9296da1a3521')9.2.3項目ID和項目密鑰1.通過項目ID標識身份2.項目密鑰1.通過項目ID標識身份在所有通過infura發(fā)起的以太坊API請求中都必須提供一個有效的項目ID。本節(jié)下面的內(nèi)容也是基于項目ID實現(xiàn)身份驗證,從而保證項目的安全。2.項目密鑰設(shè)置infura項目密鑰設(shè)置所有的infura請求都提供項目密鑰通過如下格式的URL,獲取配置數(shù)據(jù)curl--user:<項目密鑰>https://<network>.infura.io/v3/<項目ID><具體命令和參數(shù)>根據(jù)實際情況替換網(wǎng)絡(luò)標識、項目ID和項目密鑰,例如:curl--user:c61bf19af71b43f98f8a062f26f1a0d5\https://ropsten.infura.io/v3/fbc7d11878344e39b5be9296da1a3521【例9-1】(1)在/usr/local/目錄下創(chuàng)建子目錄infura,并在該目錄下執(zhí)行npminit命令初始化Node項目。根據(jù)提示信息輸入項目信息,使項目的配置文件package.js代碼如下:{"name":"infura","version":"1.0.0","description":"使用infura項目ID和項目密鑰連接Ropsten測試網(wǎng)絡(luò)創(chuàng)建Web3對象的方法","main":"index.js","scripts":{"dev":"nodeindex.js","test":"echo\"Error:notestspecified\"&&exit1"},"author":"","license":"ISC"}(2)在infura目錄下創(chuàng)建index.jsvarWeb3=require("web3");varweb3=newWeb3(Web3.givenProvider||'https://:c61bf19af71b43f98f8a062xxxxxxxxx@ropsten.infura.io/v3/fbc7d11878344e39b5be92xxxxxxxxxx')console.log(web3);安裝Web3.js(3)在infura目錄下執(zhí)行如下命令,安裝Web3.js。
npminstallweb3@^0.20.0--save安裝成功后,會在package.js中生成如下代碼"dependencies":{"web3":"^0.20.7"}例9-1的運行結(jié)果9.2.4白名單在很多情況下需要從瀏覽器或其他第三方客戶端應用發(fā)送請求。但是瀏覽器或第三方客戶端應用并不能保證項目密鑰的安全。使用白名單(allowlist)可以防止第三方應用從其他網(wǎng)站使用你的項目ID。如果項目沒有啟用白名單,則會接受所有來源的請求。白名單包含的項目如下
ALLOWLISTCONTRACTADDRESSES:設(shè)置用此項目ID只能訪問指定地址的合約。
ALLOWLISTUSERAGENTS:設(shè)置允許連接的UserAgent。UserAgent是一個特殊的字符串,服務(wù)器可以通過UserAgent識別客戶端使用的操作系統(tǒng)及版本、CPU類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
ALLOWLISTORIGINS:ORIGINS是POST請求頭中包含的一個可選字段,用于標識請求的最初來源。ALLOWLISTORIGINS設(shè)置可以發(fā)送請求的域名,例如。
ALLOWLISTAPIREQUESTMETHOD:設(shè)置請求允許調(diào)用的API方法,例如eth_getBlockNumber。可以從下拉框中選擇允許的方法。一個設(shè)置白名單的例子假定公司example開發(fā)了一個名為shop的dapp,則可以在ALLOWLISTUSERAGENTS中添加com.example.shopapp(假定是shop網(wǎng)站的域名),在ALLOWLISTORIGINS中添加(需要在DApp中發(fā)送請求時設(shè)置)。這樣就可以允許從網(wǎng)站和app中使用項目ID訪問infura網(wǎng)絡(luò)。9.2.5部署智能合約到Ropsten網(wǎng)絡(luò)可以利用Truffle的hdwallet-provider組件將智能合約部署到Ropsten網(wǎng)絡(luò)。hdwallet-provider組件是一個啟用了硬件錢包的Web3提供器(provider)。安裝hdwallet-provider組件npminstalltruffle-hdwallet-provider修改Truffle項目的配置文件truffle-config.js,代碼如下//定義HDWalletProvider對象varHDWalletProvider=require("truffle-hdwallet-provider");//提供助記詞(mnemonic)來生成你的賬戶varmnemonic="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//添加Ropsten測試網(wǎng)絡(luò)定義module.exports={networks:{ropsten:{provider:function(){//定義以太坊節(jié)點https://ropsten.infura.io/your-api-keyreturnnewHDWalletProvider(mnemonic,"https://ropsten.infura.io/v3/fbc7d11878344e39b5be9296da1a3521",0,1);},network_id:"*",gas:3012388,gasPrice:30000000000}}};在測試網(wǎng)絡(luò)Ropsten中部署合約MetaCointrufflemigrate--networkropsten如果一切正常,則執(zhí)行結(jié)果如下Compilingyourcontracts...===========================……contractaddress:0x96e10b02CC76544787dEC0134b8Ed2372EDCfb62>blocknumber:9831458>blocktimestamp:1615692728>------------------------------------->Totalcost:0.01152333ETH……….
Summary=======>Totaldeployments:3>Finalcost:0.01648758ETH
9.3在測試網(wǎng)絡(luò)中完成以太坊交易9.3.1以太坊交易過程9.3.2通過ethereumjs-tx實現(xiàn)與以太坊的交易9.3.3完整的交易實例9.3.1以太坊交易過程1.構(gòu)建交易對象在發(fā)起交易之前,首先要構(gòu)建交易對象。交易對象的結(jié)構(gòu)可以參照6.3.6節(jié)中例6-11理解。2.簽署交易為了證明交易是指定賬戶發(fā)起的,在發(fā)送交易前,需要使用指定賬戶的私鑰對交易對象進行簽名。如果瀏覽器中安裝了MetaMask錢包,則MetaMask會將賬戶私鑰存儲在本地瀏覽器中,只有賬戶的主人才能訪問私鑰。在瀏覽器中發(fā)起交易時,MetaMask會自動使用私鑰對交易對象進行簽名。可以使用9.3.2節(jié)介紹的ethereumjs-tx庫對交易對象進行簽名。3.節(jié)點驗證前端程序在對交易數(shù)據(jù)完成簽名后,會將簽名后的交易數(shù)據(jù)發(fā)送至以太坊節(jié)點。由節(jié)點對簽名數(shù)據(jù)進行驗證。檢查簽名及數(shù)據(jù)的有效性。4.廣播交易
spring:profiles:active:dev
---spring:profiles:proapplication:name:config-clientcloud:config:uri:02:9005label:masterprofile:pro
5.礦工節(jié)點接受交易礦工是交易過程中的關(guān)鍵角色,因為是礦工最終將交易數(shù)據(jù)打包在區(qū)塊中的。在眾多交易中,礦工會根據(jù)交易提供的gasPrice來選擇優(yōu)先記賬的交易,價格越高的交易越會被優(yōu)先處理。因此在發(fā)起交易時設(shè)置適當高出標準的gasPrice是很重要的,這將使交易被優(yōu)先處理。6.礦工挖礦成功并全網(wǎng)廣播礦工接受交易后會將其打包在挖出的區(qū)塊中。一個區(qū)塊中可以容納的交易是有限的,每個區(qū)塊都有一個gasLimit。區(qū)塊中包含交易的Gas總和不能超過gasLimit。打包好的區(qū)塊會被添加到區(qū)塊鏈上,礦工會將其全網(wǎng)廣播。7.節(jié)點同步新區(qū)塊全網(wǎng)節(jié)點在接收到新區(qū)塊后,會對礦工的挖礦結(jié)果進行驗算。通過后,將新區(qū)塊添加到自己的區(qū)塊鏈中。節(jié)點接受了新的區(qū)塊,就意味著接受區(qū)塊中的所有交易。9.3.2通過ethereumjs-tx實現(xiàn)與以太坊的交易ethereumjs-tx是Web3.js中用于實現(xiàn)以太坊交易的JavaScript庫。1.對交易對象進行簽名2.構(gòu)建原始交易對象3.執(zhí)行交易1.對交易對象進行簽名安裝ethereumjs-tx庫。cnpminstallethereumjs-tx在項目中安裝ethereumjs-tx(1)創(chuàng)建項目目錄例如在/usr/local/目錄下創(chuàng)建transfer子目錄,作為項目目錄。(2)初始化項目在/usr/local/transfer目錄下執(zhí)行npminit命令初始化項目,安裝提示輸入項目的基本信息,初始化項目。生成的package.json文件內(nèi)容如下{"name":"transfer","version":"1.0.0","description":"","main":"index.js","scripts":{"test":"echo\"Error:notestspecified\"&&exit1"},"author":"","license":"ISC","dependencies":{"ethereumjs-tx":"^2.1.2"}}(3)在項目中安裝ethereumjs-tx在項目目錄下執(zhí)行下面的命令可以在項目中安裝ethereumjs-tx。cnpminstallethereumjs-tx--save安裝完成后,查看的package.json文件內(nèi)容,可以看到ethereumjs-tx的版本信息"dependencies":{"ethereumjs-tx":"^2.1.2"}2.構(gòu)建原始交易對象首先需要構(gòu)建原始交易對象。原始交易對象包含如下字段·Nonce:記錄發(fā)起交易的賬戶已執(zhí)行交易總數(shù)?!asPrice:Gas的價格,單位為wei。GasPrice越高,會越優(yōu)先被礦工打包?!asLimit:Gas的上限,可以防止因為程序的bug(比如陷入死循環(huán)一直發(fā)起交易)而耗盡賬戶里的所有余額用于支付Gas。設(shè)置gasLimit后,交易執(zhí)行完畢后,超出部分會返還至交易賬戶。·to:接受交易金額的賬戶地址?!alue:交易的金額。·data:如果交易是發(fā)送以太幣,則data為空;如果是部署合約,則data為合約的字節(jié)碼。一個原始交易對象的示例varrawTx={nonce:'0x00',gasPrice:'0x09184e72a000',gasLimit:'0x2710',to:'0x0000000000000000000000000000000000000000',value:'0x00',data:'0x7f7465737432000000000000000000000000000000000000000000000000000000600057'}從賬戶account1向賬戶account2轉(zhuǎn)賬0.1ETH的原始交易對象代碼web3.eth.getTransactionCount(account1,(err,txCount)=>{consttxObject={nonce:web3.utils.toHex(txCount),to:account2,value:web3.utils.toHex(web3.utils.toWei('0.1','ether')),gasLimit:web3.utils.toHex(21000),gasPrice:web3.utils.toHex(web3.utils.toWei('10','gwei'))}})3.執(zhí)行交易(1)使用私鑰對交易對象進行簽名。(2)廣播交易。(1)使用私鑰對交易對象進行簽名?!⒃冀灰讓ο筠D(zhuǎn)換為Tx對象,方法如下:consttx=newTx(txObject);·準備好發(fā)起交易的賬戶,找到賬戶的私鑰。并使用私鑰對交易對象進行簽名,方法如下:tx.sign(<私鑰>)(2)廣播交易·將交易對象序列化后將其轉(zhuǎn)換為16進制字符串,為廣播交易做好準備。代碼如下:constserializedTx=tx.serialize()constraw='0x'+serializedTx.toString('hex')·調(diào)用web3.eth.sendSignedTransaction()函數(shù)將16進制簽名字符串發(fā)送到以太坊網(wǎng)絡(luò)中,代碼如下:web3.eth.sendSignedTransaction(raw,(err,txHash)=>{console.log('txHash:',txHash)})9.3.3完整的交易實例【例9-2】參照下面的步驟演示通過ethereumjs-tx實現(xiàn)與以太坊交易的方法。1.確定交易的網(wǎng)絡(luò),選擇交易的賬號2.準備賬戶對應的私鑰3.安裝web3組件4.在App.js中編寫程序,實現(xiàn)交易1.確定交易的網(wǎng)絡(luò),選擇交易的賬號這里選擇測試網(wǎng)絡(luò)Ropsten發(fā)起交易。參照8.3.4節(jié)介紹的方法使用MetaMask錢包連接到測試網(wǎng)絡(luò)Ropsten,選擇2個賬戶,如果需要就創(chuàng)建一個新賬戶。這里假定賬戶1的地址為0x32985d709D7FC4d5F40148592f967578Cb9ec1D5,賬戶2的地址為0xc07C9bF8f2E83E9E15aEf2a6727E2dC64b447Aea。在本例中會用到這兩個賬戶進行交易。在MetaMask錢包查看并記錄賬戶1和賬戶2的余額。如果余額為0,可以參照9.1.2獲取測試幣。2.準備賬戶對應的私鑰輸入MetaCoin密碼查看賬戶的私鑰將私鑰設(shè)置為環(huán)境變量exportPRIVATE_KEY_1='b75e2bcaec74857cf9bb6636d66a04784dxxxxxxxxxxxxxxx'$exportPRIVATE_KEY_2='ac0adfdbaeb0770a479e79aac78779d82fxxxxxxxxxxxxxxx'在程序中可以通過如下代碼引用賬戶私鑰constprivateKey1=process.env.PRIVATE_KEY_1constprivateKey2=process.env.PRIVATE_KEY_2要想使用私鑰對交易進行簽名,則需要通過如下代碼將其轉(zhuǎn)換成二進制數(shù)據(jù)字符串constprivateKey1=Buffer.from(process.env.PRIVATE_KEY_1)constprivateKey1=Buffer.from(process.env.PRIVATE_KEY_2)3.安裝web3組件在/usr/local/transfer目錄下執(zhí)行如下命令安裝web3組件:cnpminstallweb3--save在package.json中dependencies節(jié)的代碼"dependencies":{"ethereumjs-tx":"^2.1.2","web3":"^1.3.5"}4.在App.js中編寫程序,實現(xiàn)交易varTx=require('ethereumjs-tx').TransactionconstWeb3=require('web3')//注意替換為自己的infura項目ID和項目密鑰constweb3=newWeb3('https://:c61bf19af71b43f98f8a062f26f1a0d5@ropsten.infura.io/v3/fbc7d11878344e39b5be9296da1a3521')//設(shè)置賬戶地址constaccount1='0x32985d709D7FC4d5F40148592f967578Cb9ec1D5';constaccount2='0xc07C9bF8f2E83E9E15aEf2a6727E2dC64b447Aea';//從環(huán)境變量中獲取賬戶對應的私鑰constpk1=process.env.PRIVATE_KEY_1;constpk2=process.env.PRIVATE_KEY_2;console.log(pk1);console.log(pk2);//將私鑰轉(zhuǎn)換為二進制字符串constprivateKey1=Buffer.from(pk1,'hex')constprivateKey2=Buffer.from(pk2,'hex')var_from=account1;web3.eth.getTransactionCount(_from,(err,txcount)=>{vartxObject={nonce:web3.utils.toHex(txcount),gasPrice:web3.utils.toHex(web3.utils.toWei('10','gwei')),gasLimit:web3.utils.toHex(21000),to:account2,//'0xc07C9bF8f2E83E9E15aEf2a6727E2dC64b447Aea',value:web3.utils.toHex(web3.utils.toWei('
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度倉儲物流租賃管理協(xié)議范本2篇
- 個人場地租賃合同(2024版)6篇
- 專線接入服務(wù)個性化協(xié)議范例2024版A版
- 2024用戶服務(wù)合同模板
- 二零二五年度特色火鍋店租賃合同范本3篇
- 2025年度柴油產(chǎn)品質(zhì)量保證合同模板4篇
- 2024年規(guī)范珠寶玉石市場買賣協(xié)議樣本版B版
- 2025年度智能公寓租賃管理服務(wù)合同標準2篇
- 2025年度餐飲娛樂場地租賃合同范本12篇
- 2025年茶葉深加工項目合作協(xié)議4篇
- 三年級數(shù)學(上)計算題專項練習附答案
- GB/T 12723-2024單位產(chǎn)品能源消耗限額編制通則
- 2024年廣東省深圳市中考英語試題含解析
- GB/T 16288-2024塑料制品的標志
- 麻風病防治知識課件
- 建筑工程施工圖設(shè)計文件審查辦法
- 干部職級晉升積分制管理辦法
- 培訓機構(gòu)應急預案6篇
- 北師大版數(shù)學五年級上冊口算專項練習
- 應急物資智能調(diào)配系統(tǒng)解決方案
- 2025年公務(wù)員考試時政專項測驗100題及答案
評論
0/150
提交評論