版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
以太坊Solidity智能合約開發(fā)教程
Solidity編程基礎(chǔ)學(xué)前提示Solidity是比較小眾的開發(fā)語言,它并不像Java、Python和C#等主流開發(fā)語言那樣“無所不能”。但是在區(qū)塊鏈應(yīng)用開發(fā)領(lǐng)域中,Solidity語言又是很知名的智能合約開發(fā)語言,因?yàn)樗劳兄囊蕴黄脚_,可以說是區(qū)塊鏈2.0的代表語言。本章介紹Solidity語言的基礎(chǔ)知識。知識要點(diǎn)3.1Solidity的第一個(gè)示例程序3.2常量和變量3.3基本數(shù)據(jù)類型3.4復(fù)合數(shù)據(jù)類型3.1Solidity的第一個(gè)示例程序3.1.1實(shí)時(shí)在線Solidity編輯器Remix3.1.2SolidityHelloworld程序3.1.3使用VisualStudioCode開發(fā)Solidity程序3.1.1實(shí)時(shí)在線Solidity編輯器Remix以太坊提供了一個(gè)實(shí)時(shí)在線的Solidity編輯器:Remix。無需安裝和配置任何軟件,即可完成以太坊智能合約的在線開發(fā)、在線編譯、在線測試、在線部署。RemixIDE中文版的網(wǎng)址如下:RemixIDE中文版頁面RemixIDE頁面分為文件管理器、文件編輯器和開發(fā)工具面板3個(gè)區(qū)域。頁面最左側(cè)是文件管理器,其中可以列出了瀏覽器本地存儲的文件。默認(rèn)情況下,在“文件管理器”中有下面2個(gè)文件夾。·browser文件夾:保存智能合約文件;·config文件夾:保存配置文件。
browser文件夾下的默認(rèn)智能合約
首次訪問RemixIDE頁面,可以看到在browser文件夾下有2個(gè)默認(rèn)的智能合約文件,即ballot.sol和ballot_test.sol。這是一個(gè)關(guān)于投票的智能合約示例,以及對該智能合約的測試程序文件管理器中的操作按鈕操作按鈕說
明創(chuàng)建新文件上傳本地文件將browser文件夾下的文件發(fā)布到GithubGist.Github是應(yīng)用廣泛的代碼分享平臺,Gist是Github提供的很實(shí)用的功能,使用Gist可以分享代碼片段第2個(gè)
更新當(dāng)前的Gist拷貝所有文件到另一個(gè)RemixIDE實(shí)例連接到本地主機(jī),從而在Remix中訪問本地文件系統(tǒng)3.1.2SolidityHelloworld程序1.創(chuàng)建新的Solidity文件2.調(diào)整編輯窗口的大小3.編譯智能合約1.創(chuàng)建新的Solidity文件
在Remix頁面的文件管理器中點(diǎn)擊按鈕,彈出輸入文件名的對話框在Remix中新建文件hello.so【例3-1】pragmasolidity^0.5.1;//聲明合約contractDemo{functionhello()publicpurereturns(stringmemory){return"helloworld!";}}pragmasolidity指定程序所使用的Solidity版本,本實(shí)例中為0.5.1。^指定版本號向上兼容,本實(shí)例的代碼在0.5.1~0.6.0(不包含0.6.0)的編譯器中都可以編譯。在頁面右側(cè)的開發(fā)工具面板區(qū)域中可以選擇使用的編譯器。在筆者編寫本書時(shí),默認(rèn)的版本為0.5.1+commit.c8a2cb62.Emscripten.clang。在“編譯”選項(xiàng)卡中可以選擇其他的編譯器//指定注釋語句。注釋是對代碼的解釋和說明,其目的是增加代碼的可讀性,讓人們能夠更加輕松地了解代碼。在編譯程序的時(shí)候,系統(tǒng)不會理會注釋語句。contract定義一個(gè)智能合約,本實(shí)例的智能合約名為Demo。在Solidity語言中,智能合約就類似Java語言中的類,在其中可以定義變量和函數(shù)。function定義一個(gè)函數(shù)。函數(shù)是一段代碼,需要指定定義函數(shù)名、參數(shù)和返回值。本實(shí)例中定義了一個(gè)Demo()函數(shù),函數(shù)返回一個(gè)字符串helloworld!"。2.調(diào)整編輯窗口的大小編輯窗口是編輯代碼的區(qū)域,它位于頁面中心。在編輯窗口的下部是控制臺面板,在控制臺中可以看到程序運(yùn)行和調(diào)試的情況。將鼠標(biāo)移至編輯窗口的邊緣,可以拖動邊框,調(diào)整編輯窗口的大小。
在編輯窗口的上面的左側(cè)和右側(cè)各有一個(gè)和按鈕,分別用于收起和展開左側(cè)或右側(cè)的面板。在編輯窗口的下面也有一個(gè)按鈕,可以切換控制臺面板的顯示和隱藏。如果把其他面板都隱藏起來,編輯窗口區(qū)域自然也就大了。3.編譯智能合約在開發(fā)工具面板區(qū)域的頂部,有一組選項(xiàng)卡。第一個(gè)選項(xiàng)卡就是“編譯”。編譯是計(jì)算機(jī)科學(xué)中的一個(gè)術(shù)語,指使用編譯程序(也稱為編譯器,通常由程序的開發(fā)商提供)將編程語言編寫的源程序經(jīng)過處理生成目標(biāo)程序的過程。通俗的說,就是將人能理解的源代碼轉(zhuǎn)換得到計(jì)算機(jī)能夠理解的程序。從而為執(zhí)行程序做好準(zhǔn)備?!熬幾g”選項(xiàng)卡Remix的錯(cuò)誤提示具體錯(cuò)誤提示browser/hello.sol:4:5:SyntaxError:Novisibilityspecified.Didyouintendtoadd"public"?functionhello()purereturns(stringmemory){^(Relevantsourcepartstartshereandspansacrossmultiplelines).3.1.3使用VisualStudioCode開發(fā)Solidity程序1.下載和安裝VisualStudioCode/download2.安裝solidity插件單擊左側(cè)導(dǎo)航條中的Extensions圖標(biāo)3.在VisualStudioCode中編輯Solidity程序安裝solidity插件后需要重啟VisualStudioCode。然后在系統(tǒng)菜單中依次選擇File/NewFile,可以新建一個(gè)文件,將新文件保存為test.sol,說明這是一個(gè)Solidity程序文件。在編輯窗口中輸入字符,會觸發(fā)自動提示的功能。例如,輸入pra,會彈出如圖3-9所示的提示,選擇第一項(xiàng)提示內(nèi)容,會在編輯窗口中自動完成如下的代碼:pragmasolidityversion;輸入pra的自動提示:4.在VisualStudioCode中借助solc編譯器對Solidity程序進(jìn)行編譯在VisualStudioCode中依次選擇File/Preferences/settings打開Settings頁面。在搜索框里填寫solidity,可以定位與Solidity相關(guān)的配置信息。找到Solidity:CompileUsingRemoteVersion,也就是使用遠(yuǎn)程的solc編譯器對程序進(jìn)行編譯。配置Solidity程序的編譯器編譯test.sol的過程編譯過程包含如下信息·使用遠(yuǎn)程版本v0.5.1+commit.c8a2cb62進(jìn)行編譯;·Solidity的具體版本為0.5.1+commit.c8a2cb62.Emscripten.clang?!ぴ趖est.sol的第4行第19列處有一個(gè)錯(cuò)誤,具體為需要指定參數(shù)的類型。這里使用的是自動生成的type。單擊PROBLEMS標(biāo)簽,查看問題的具體描述在編輯窗口中以波浪線的形式標(biāo)識問題代碼3.2常量和變量3.2.1常量3.2.2變量3.2.1常量常量是內(nèi)存中用于保存固定值的單元,在程序中常量的值不能發(fā)生改變。Solidity常量的數(shù)據(jù)類型可以是值類型和字符串??梢允褂胏onstant關(guān)鍵字定義一個(gè)常量,例如:
intconstantx=10;為常量賦值會報(bào)錯(cuò)x=20;具體的報(bào)錯(cuò)信息如下:browser/constant.sol:8:9:TypeError:Cannotassigntoaconstantvariable.不允許給常量賦值【例3-2】pragmasolidity^0.5.1;//聲明合約contractDemo{stringconstanthellostring="helloworld!";functionhello()publicpurereturns(stringmemory){returnhellostring;}}3.2.2變量變量是內(nèi)存中命名的存儲位置,與常量不同的是變量的值可以動態(tài)變化。Solidity的標(biāo)識符命名規(guī)則·標(biāo)識符名字的第1個(gè)字符必須是字母或下劃線(_);·標(biāo)識符名字的第1個(gè)字符后面可以由字母、下劃線(_)或數(shù)字(0~9)組成;·標(biāo)識符名字是區(qū)分大小寫的。也就是說Score和score是不同的。1.定義變量數(shù)據(jù)類型變量名;例如,下面的代碼聲明了一個(gè)字符串變量name和整型變量age:stringname;intage;可以將常量賦值到一個(gè)變量中。也可以將變量賦值給另外一個(gè)變量,例如:stringa;stringb;a="這是一個(gè)變量";b=a;a="這是另一個(gè)變量";變量賦值后修改變量a的值不會影響到變量b。2.狀態(tài)變量狀態(tài)變量是在智能合約體中定義的變量,狀態(tài)變量在智能合約中全局有效,因此又可以稱為全局變量。在函數(shù)體中定義的變量只在函數(shù)范圍內(nèi)有效,又稱為局部變量。例如pragmasolidity^0.5.1;contractDemo{uintstoredData;//…….3.變量的修飾符修飾符可以分為可見性修飾符和存儲位置修飾符兩種??梢娦孕揎椃糜诙x變量在不同的智能合約間的訪問權(quán)限,具體情況將在第5章結(jié)合智能合約編程介紹。存儲位置修飾符用于指定變量的存儲位置。
storage:指定變量永久地存儲在區(qū)塊中。向storage變量中寫入數(shù)據(jù)是要被扣除手續(xù)費(fèi)(Gas)的。在一個(gè)智能合約的不同函數(shù)中可以共享訪問storage變量。
memory:指定變量存儲在內(nèi)存中。
calldata:指定變量為只讀的,通常只有在外部函數(shù)中的參數(shù)才被強(qiáng)制指定為calldata。calldata變量不會被持久化到區(qū)塊上。存儲位置修飾符的使用方法數(shù)據(jù)類型可見性修飾符存儲位置修飾符變量名例如,下面的代碼定義一個(gè)storage變量name。
stringpublicstoragename;默認(rèn)的存儲位置修飾符變量的用法默認(rèn)存儲位置修飾符函數(shù)的返回值memory函數(shù)內(nèi)部的局部變量memory函數(shù)的參數(shù)memory全局變量/狀態(tài)變量storage外部函數(shù)的參數(shù)calldata4.系統(tǒng)全局變量全局變量名具體描述blockhash(uintblockNumber)返回給定區(qū)塊的哈希值block.coinbase(addresspayable)當(dāng)前區(qū)塊礦工的地址block.difficulty當(dāng)前區(qū)塊的難度block.gaslimit當(dāng)前區(qū)塊的Gas上限block.number當(dāng)前區(qū)塊的區(qū)塊號block.timestamp當(dāng)前區(qū)塊的的時(shí)間戳gasleft()返回剩余的Gasmsg.data返回完整的調(diào)用數(shù)據(jù)(calldata)msg.sender返回當(dāng)前調(diào)用函數(shù)的調(diào)用者的地址msg.sigcalldata的前四個(gè)字節(jié)msg.value當(dāng)前消息所附帶的以太幣,單位為weinowblock.timestamp的別名tx.gasprice交易的gas價(jià)格tx.origin交易的發(fā)送方3.3基本數(shù)據(jù)類型Solidity的基本數(shù)據(jù)類型也稱為值類型,包括字符串型整型布爾型定長浮點(diǎn)型字節(jié)數(shù)組枚舉類型地址類型。3.3.1字符串型下面的代碼可以定義一個(gè)字符串型s。strings字符串的本質(zhì)是由一組字符組成的字符數(shù)組??梢韵葘⒆址?dāng)?shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組bytes類型,然后再通過length屬性獲取其長度,方法如下:
bytes(s).length【例3-3】pragmasolidity^0.5.1;contractDemo{functionGetStringLength(stringmemory_s)publicpurereturns(uint){returnbytes(_s).length;}}例3-3的執(zhí)行結(jié)果1.字符串的比較2.字符串的拼接假定有a和b兩個(gè)字符串變量,按照下面是的代碼進(jìn)行字符串拼接是會報(bào)錯(cuò)的:
a+b;
在Solidity中沒有直接提供字符串拼接的方法,需要自己編程實(shí)現(xiàn)此功能。因?yàn)閷?shí)現(xiàn)字符串拼接的功能涉及數(shù)組編程,所以相關(guān)內(nèi)容將在3.4.4節(jié)中結(jié)合實(shí)例介紹。3.3.2整型1.整型數(shù)據(jù)的分類Solidity的整型分為有符號整數(shù)和無符號整數(shù)。有符號整數(shù)又分為int8、int16、int32、…、int256,int后面的數(shù)字表示整型數(shù)據(jù)的大小,單位為bit。這個(gè)數(shù)字可以從8~256,步長為8。int代表int256.同樣的,無符號整數(shù)又分為uint8、uint16、uint32、…、uint256,uint代表uint256。2.操作符Solidity的整型操作符包括比較操作符、位操作符、位移操作符和算數(shù)操作符。比較操作符比較操作符說明例
子<=小于或等于if(a<=b){……}<
小于if(a<b){……}==等于if(a==b){……}!=不相等if(a!=b){……}>=大于或等于if(a>=b){……}>
大于if(a>b){……}位操作符位操作符可以對兩個(gè)整型數(shù)據(jù)進(jìn)行位操作,返回整數(shù)值。操作符說明例
子<<
左位移2<<2的結(jié)果是8,因?yàn)?的二進(jìn)制位00000010左移2位就是00000100,也就是8>>
右位移與上面的操作相反8>>2的結(jié)果是2&按位與。兩個(gè)位都是1時(shí),按位與等于1;否則按位與等于13&4的結(jié)果是0。因?yàn)?的二進(jìn)制為00000011,4的二進(jìn)制為00000100,逐位執(zhí)行按位與操作的結(jié)果是00000000,即0|按位或。兩個(gè)位都是0時(shí),按位或等于0;否則按位與等于13&4的結(jié)果是7。因?yàn)?的二進(jìn)制為00000011,4的二進(jìn)制為00000100,逐位執(zhí)行按位與操作的結(jié)果是00000111,即7^按位異或。兩個(gè)位不同時(shí),按位異或等于1;否則按位與等于03&4的結(jié)果是7。因?yàn)?的二進(jìn)制為00000011,4的二進(jìn)制為00000100,逐位執(zhí)行按位與操作的結(jié)果是00000111,即7算數(shù)操作符算數(shù)操作符可以對兩個(gè)整型數(shù)據(jù)進(jìn)行算數(shù)操作,返回整數(shù)值。比較操作符說明例
子+加法1+1的結(jié)果是2-減法2-1的結(jié)果是1*乘法2*2的結(jié)果是4/除法4/2的結(jié)果是2**乘方4**2的結(jié)果是16%求余8%3的結(jié)果是23.整型數(shù)據(jù)的上限不同類型的整型數(shù)據(jù)都是有上限的,比如uint8的上限為255。在上限的基礎(chǔ)上再加上1,會出現(xiàn)向上溢出的錯(cuò)誤,比如uint8數(shù)據(jù)255+1得到的結(jié)果為0,這與預(yù)期的結(jié)果是有偏差的。3.3.3定長浮點(diǎn)型所謂定長浮點(diǎn)型指限定長度的帶有小數(shù)點(diǎn)的浮點(diǎn)數(shù)類型。Solidity的定長浮點(diǎn)型分為有符號定長浮點(diǎn)型和無符號定長浮點(diǎn)型兩種。有符號定長浮點(diǎn)型的定義格式為fixedMxN。M表示整數(shù)部分的位數(shù),必須是8的倍數(shù),范圍為8~256;N表示小數(shù)部分,范圍為0~80。也可以不指定M和N,默認(rèn)情況下,fixed表示fixed128x19,ufixed表示ufixed128x19。3.3.4布爾類型布爾類型通常用來判斷條件是否成立。包含true(邏輯真)和false(邏輯假)。定義布爾類型變量的方法如下:boolbpublic;布爾類型操作符操作符說明!邏輯非操作。如果布爾類型變量a的值為true,則!a的結(jié)果是false;如果布爾類型變量a的值為false,則!a的結(jié)果是true&&包含兩個(gè)操作數(shù)的邏輯與操作。布爾類型變量a和b都等于true,則a&&b的結(jié)果等于true;否則等于false||包含兩個(gè)操作數(shù)的邏輯或操作。布爾類型變量a和b只要有一個(gè)等于true,a||b的結(jié)果就等于true;當(dāng)a和b都為false時(shí),a||b等于false==判斷2個(gè)布爾值是否相等!=判斷2個(gè)布爾值是否不等3.3.5地址類型地址類型是Solidity語言特有的數(shù)據(jù)類型,用于表示一個(gè)以太坊賬戶的地址。地址類型數(shù)據(jù)的長度為20個(gè)字節(jié)。選擇當(dāng)前智能合約的賬戶在remix頁面中的開發(fā)工具面板中,選擇“運(yùn)行”選項(xiàng)卡,可以選擇當(dāng)前智能合約的賬戶。賬戶地址的格式如下0x+40個(gè)數(shù)字例如,下面就是一個(gè)以太坊賬戶地址的例子:0xca35b7d915458ef540ade6068dfe2f44e8fa733c一個(gè)以太坊賬戶地址的長度可以用以下公式計(jì)算這是一個(gè)16進(jìn)制數(shù)字,每個(gè)數(shù)字代表4位的二進(jìn)制數(shù)字以太坊賬戶地址的長度=4位*40=160位又因?yàn)?字節(jié)=8位,所以以太坊賬戶地址的長度為20個(gè)字節(jié)。以太坊中有如下幾個(gè)特殊的地址智能合約地址this:在智能合約中,this代表當(dāng)前合約對象的地址。合約擁有者:第一次部署合約時(shí),花費(fèi)Gas的賬戶即合約擁有者。已部署合約的地址調(diào)用函數(shù)時(shí)的發(fā)起人:調(diào)用智能合約中函數(shù)時(shí),msg.sender表示調(diào)用者的賬戶地址。例如,下面的代碼在智能合約Demo的構(gòu)造函數(shù)中設(shè)置合約擁有者_(dá)owner的值。【例3-4】pragmasolidity^0.5.1;contractDemo{address_owner;//合約的擁有者
constructor()public{_owner=msg.sender;}
functionGetOwner()publicviewreturns(address){return_owner;}}查看智能合約Demo的擁有者地址3.3.6合約類型每個(gè)智能合約都有自己的類型,也可以轉(zhuǎn)換為其繼承的智能合約。關(guān)于智能合約編程的具體情況,將在第5章介紹。3.4復(fù)合數(shù)據(jù)類型3.4.1枚舉類型3.4.2結(jié)構(gòu)體3.4.3映射3.4.4數(shù)組3.4.1枚舉類型枚舉類型是一種自定義類型,如果一個(gè)變量只有有效的幾種可能的取值,則可以將其定義為枚舉類型??梢允褂胑num關(guān)鍵字定義枚舉類型,具體方法如下:enum類型名稱{取值1,取值2,取值3,取值4……}例如下面的代碼可以定義枚舉類型Sex,可選項(xiàng)為Male和Female。
enumSex{Male,Female}
聲明枚舉類型變量的方法如下:
枚舉類型名稱變量名;可以將枚舉類型與uint類型互相轉(zhuǎn)換例如,將Sex變量sex轉(zhuǎn)換成uint變量isex的代碼如下:
uintisex=uint(sex);【例3-5】pragmasolidity^0.5.1;contractPerson{enumSex{Male,Female}stringname;uintage;Sexsex;
functionSetFemale()public{sex=_Sex.Female;}functionGetSex()publicviewreturns(Sex){returnsex;}}例3-5的運(yùn)行結(jié)果3.4.2結(jié)構(gòu)體structBook{stringName;stringPublisher;uintPagecount;uintPrice;}在類wxModelMessage中添加一個(gè)靜態(tài)方法GetCreateTime()privatestaticintGetCreateTime(){DateTimestartDate=newDateTime(1970,1,1,8,0,0);return(int)(DateTime.Now-startDate).TotalSeconds;}初始化一個(gè)Book變量b的方法Bookb=Book("以太坊Solidity語言智能合約設(shè)計(jì)與開發(fā)","人民郵電出版社",350,38);【例3-6】結(jié)構(gòu)體類型的使用實(shí)例pragmasolidity^0.5.1;contractstructDemo{structBook{stringName;stringPublisher;uintPagecount;uintPrice;}Bookb=Book("以太坊Solidity語言智能合約設(shè)計(jì)與開發(fā)","人民郵電出版社",350,38);
functiongetName()viewpublicreturns(stringmemory){returnb.Name;}functiongetPublisher()viewpublicreturns(stringmemory){returnb.Publisher;}
functiongetPagecount()viewpublicreturns(uint){returnb.Pagecount;}functiongetPrice()viewpublicreturns(uint){returnb.Price;}}例3-6的運(yùn)行結(jié)果3.4.3映射mapping(<鍵>=><值>)<變量名>;例如,下面的映射可以用于記錄對電影的投票數(shù)量。鍵代表電影的id,值代表電影得到的投票數(shù)量。
mapping(uint=>uint)movieVote;【例3-7】給電影投票的使用實(shí)例pragmasolidity^0.5.1;contractmovieVote{mapping(uint=>uint)publicVoteCount;mapping(address=>uint)publicvoteRecord;functionvote(uint_movieId)publicreturns(stringmemory){if(voteRecord[msg.sender]==0){//未投過票
voteRecord[msg.sender]=_movieId;VoteCount[_movieId]=VoteCount[_movieId]+1;return"投票成功";}return"您已經(jīng)投過票了";}functiongetVoteCount(uint_movieId)viewpublicreturns(uint){returnVoteCount[_movieId];}
functiongetVoteRecord()viewpublicreturns(uint){returnvoteRecord[msg.sender];}}智能合約movieVote中定義的函數(shù)說明如下?vote:為指定的電影投票,參數(shù)movieId指定電影Id。voteRecord[msg.sender]==0表示之前未投票,可以進(jìn)行投票。投票的過程分為兩步:第一步以msg.sender為鍵,將movieId存入voteRecord中,記錄當(dāng)前地址已經(jīng)投過票;第二步將VoteCount[_movieId]的值加1,記錄電影_movieId的投票數(shù)量。?getVoteCount:返回指定電影的投票數(shù)量。?getVoteRecord:返回當(dāng)前地址投票的電影Id。給movieId等于1的電影投票重復(fù)投票的結(jié)果再次在vote按鈕后面的輸入框中輸入2,然后單擊vote按鈕,在左側(cè)的控制臺面板中單擊Debug按鈕旁邊的圖標(biāo),可以看到運(yùn)行結(jié)果為“
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024蘇州二手房買賣合同協(xié)議范本:房屋交易保障及售后服務(wù)協(xié)議3篇
- 2025年度廠區(qū)綠化養(yǎng)護(hù)與生態(tài)景觀提升合同3篇
- 2025年度360借條合同多(信用評級合作版)3篇
- 2025年度油氣田廢棄井修復(fù)打井合同范本4篇
- 2025年度文化創(chuàng)意產(chǎn)業(yè)出資協(xié)議合同模板3篇
- 2024美團(tuán)外賣配送配送員配送區(qū)域合作伙伴服務(wù)標(biāo)準(zhǔn)合同3篇
- 2024網(wǎng)絡(luò)安全風(fēng)險(xiǎn)評估及防護(hù)服務(wù)合同
- 2025年度圖書檔案庫房智能化儲藏系統(tǒng)合同4篇
- 2025年度智能車場租賃服務(wù)合同(新能源汽車版)4篇
- 2025年度電磁兼容性實(shí)驗(yàn)室設(shè)備采購合同2篇
- 《C語言從入門到精通》培訓(xùn)教程課件
- 2023年中國半導(dǎo)體行業(yè)薪酬及股權(quán)激勵(lì)白皮書
- 2024年Minitab全面培訓(xùn)教程
- 社區(qū)電動車棚新(擴(kuò))建及修建充電車棚施工方案(純方案-)
- 項(xiàng)目推進(jìn)與成果交付情況總結(jié)與評估
- 鐵路項(xiàng)目征地拆遷工作體會課件
- 醫(yī)院死亡報(bào)告年終分析報(bào)告
- 建設(shè)用地報(bào)批服務(wù)投標(biāo)方案(技術(shù)方案)
- 工會工作人年度考核個(gè)人總結(jié)
- 上海民辦楊浦實(shí)驗(yàn)學(xué)校初一新生分班(摸底)語文考試模擬試卷(10套試卷帶答案解析)
- 機(jī)器人論文3000字范文
評論
0/150
提交評論