基于以太坊的智能合約開發Solidity(基礎篇)

參考教程:基于以太坊的智能合約開發教程【Solidity】_嗶哩嗶哩_bilibili

1、第一個程序——Helloworld:

//聲明版本號(程序中的版本號要和編譯器版本號一致)
pragma solidity ^0.5.17;
//合約
contract HelloWorld
{//合約屬性變量,也叫狀態變量(定義方式:數據類型 變量名 = 數據)string myName = "helloworld";  //在solidity中,用單引號包含字符串也是可以的//合約中的方法(注意語法順序,其中此處“view”代表方法只讀,不會消耗燃料;“returns”后的是返回值類型)function getName() public view returns(string){return myName;  //返回值類型要與returns聲明的嚴格相同}//可以修改屬性變量的值,但是會消耗燃料function changeName(string _newName) public{myName = _newName;}//“pure”代表不能讀取也不能改變狀態變量function pureName(string _name) public pure returns(string){return _name;}/*用constant、view、pure修飾function分別表示:constant:只能讀取不可改變狀態變量(就是contract中定義的變量)view:只能讀取不可改變狀態變量,和constant一樣pure:不能讀取也不能改變狀態變量*/}

(1)程序編譯完成后,需要在虛擬機上運行,將合約部署好后便可執行剛剛編寫的函數。(注意,合約一旦部署,就會永久存在于區塊鏈上,且不可篡改,不過可以銷毀)

(2)執行完成后,可以得到以下交易信息,下圖所示的就是生成的區塊信息:

(3)代碼相關:

①屬性變量定義方式:數據類型 變量名 = 數據(變量命名規則和c語言相同)

②一般用雙引號包含一串字符串,不過在solidity中,用單引號包含字符串也是可以的。

③Solidity值類型:(在Solidity中,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那么它就永遠是這個數據類型,在調用函數時如果形參和實參類型不同將會報錯

? 布爾類型(bool):可能的取值為字符常量值true或false

? 整型(int/uint):分別表示有符號和無符號的不同位數的整型變量,支持關鍵字uint8到 uint256(無符號,從8位到256位)以及int8到int256,以8位為步長遞增

? 定長浮點型(fixed / ufixed):表示各種大小的有符號和無符號的定長浮點型,在關鍵字ufixedMxN和fixedMxN中,M表示該類型占用的位數,N表示可用的小數位數

? 地址(address):存儲一個 20 字節的值(以太坊地址大小)

? 定長字節數組:關鍵字有 bytes1,bytes2,bytes3,...,bytes32

? 枚舉(enum):一種用戶可以定義類型的方法,與C語言類似,默認從0開始遞增,一般用來模擬合約的狀態

? 函數(function):一種表示函數的類型

④solidity函數的標準形式:

function?functionName() {private|internal|external|public} [pure|constant|view|payable] [returns()]

在合約中定義函數要以function開頭,后接函數名稱,括號內則是傳入函數中的參數(每一個參數的類型以及名稱要依次寫出,沒有參數則不寫),“returns”后接該函數返回值的類型(無返回值則可以不寫returns)。

⑤用constant、view、pure修飾function分別表示:

? ? constant:只能讀取、不可改變狀態變量(就是contract中定義的變量)

? ? view:只能讀取、不可改變狀態變量,和constant一樣,不消耗燃料

? ? pure:不能讀取也不能改變狀態變量,一個固定的輸入只能有一個固定的輸出

[1]以下情況被認為是修改狀態:修改狀態變量(函數體外部、合約內部創建的變量就是狀態變量)、產生事件、創建其它合約、使用selfdestruct、通過調用發送以太幣、調用任何沒有標記為view或者pure的函數、使用低級調用、使用包含特定操作碼的內聯匯編。

[2]以下被認為是從狀態中進行讀取:讀取狀態變量、訪問this.balance或者 <address>.balance、訪問block,tx,msg中任意成員(除msg.sig和msg.data之外)、調用任何未標記為pure的函數、使用包含某些操作碼的內聯匯編。

⑥用external、public、internal、private修飾function分別表示:

? ? external:外部函數作為合約接口的一部分,意味著可以從其他合約和交易中調用,? 一個外部函數f不能從內部調用(即f不起作用,但this.f()可以,這些后續都會詳細介紹),當收到大量數據的時候,外部函數有時候會更有效率。

? ? public:public函數是合約接口的一部分,可以在內部或通過消息調用對于public狀態變量,會自動生成一個getter函數

? ? internal:這些函數和狀態變量只能是內部訪問(即從當前合約內部或從它派生的合約 訪問),不使用this調用。

? ? private:private函數和狀態變量僅在當前定義它們的合約中使用,并且不能被派生合 約使用。

⑦solidity中函數可以遞歸調用。

⑧solidity可以使用import導入其它源文件:

[1]import "filename";??//從“filename”中導入所有的全局符號到當前全局作用域中

[2]import * as symbolName from "filename";??//創建一個新的全局符號symbolName,其成員均來自“filename”中的全局符號

[3]import {symbol1 as alias, symbol2} from "filename";??//創建新的全局符號alias和symbol2,分別從"filename"引用symbol1和symbol2

[4]import "filename" as symbolName;??//這條語句等同于import * as symbolName from "filename";

2、語法——邏輯運算:

//聲明版本號(程序中的版本號要和編譯器版本號一致)
pragma solidity ^0.5.17;
//合約
contract BoolTest
{bool a; ?//創建布爾類型變量時如不初始化,默認賦為falsefunction geta() public returns(bool){return a;}function getnota() public returns(bool){return !a; ?//a當前為false,經過非運算后會返回true}int c = 1;int d = 2;//(這部分與c語言幾乎完全相同,就不列舉所有情形了)function cdequal() public returns(bool){return c==d; ?//c與d當前不相等,c==d不成立,會返回false}function cdequalAnd() public returns(bool){return c==d && true; ?//c==d返回false,false與true進行與運算,結果為false}function cdequalOr() public returns(bool){return c==d || true; ?//c==d返回false,false與true進行或運算,結果為true}function cdnotequalAnd() public returns(bool){return c!=d && true; ?//c與d當前不相等,c!=d成立,返回true,true與true進行或運算,結果為true}
}

3、語法——整型與算術運算:

//聲明版本號(程序中的版本號要和編譯器版本號一致)
pragma solidity ^0.5.17;
//合約
contract MathTest
{//加(a與b為傳入方法中的參數,下同理)function add(uint a,uint b) public returns(uint){return a+b;}//減function minus(uint a,uint b) public returns(uint){return a-b;}//乘function multiply(uint a,uint b) public returns(uint){return a*b;}//除function divide(uint a,uint b) public returns(uint){return a/b;}//取余運算function mod(uint a,uint b) public returns(uint){return a%b;}//冪運算function square(uint a,uint b) public returns(uint){return a**b;}
}

4、語法——位運算:

//聲明版本號(程序中的版本號要和編譯器版本號一致)
pragma solidity ^0.5.17;
//合約
contract MathTest
{//uint8表示大小為8個位的無符號整型uint8 a = 3; ?//二進制表示為00000011uint8 b = 4; ?//二進制表示為00000100//按位與(該部分和c語言也幾乎完全相同)function bitwiseAnd() public returns(uint8){return a&b;}//按位或function bitwiseOr() public returns(uint8){return a|b;}//按位取反function tilde() public returns(uint8){return ~a;}//按位異或function caret() public returns(uint8){return a^b;}//左移(左移運算符后接左移的位數)function leftShift() public returns(uint8){return a<<1;}//右移(右移運算符后接右移的位數)function rightShift() public returns(uint8){return a>>1;}
}

(圖源:https://blog.csdn.net/aiwaston/article/details/113665723)

5、語法——復合運算:

//聲明版本號(程序中的版本號要和編譯器版本號一致)
pragma solidity ^0.5.17;
//合約
contract MathTest
{uint a = 1;//該語法也和c語言基本完全相同//輸出afunction add1() public returns(uint){return a++; ?//執行完該語句后a的值會加1}//輸出a+1function add2() public returns(uint){return ++a; ?//執行該語句前a的值會加1,然后再執行該語句}//輸出afunction sub1() public returns(uint){return a--; ?//執行完該語句后a的值會減1}//輸出a-1function sub2() public returns(uint){return --a; ?//執行該語句前a的值會減1,然后再執行該語句}
}

6、現象——整型溢出:

//聲明版本號(程序中的版本號要和編譯器版本號一致)
pragma solidity ^0.5.17;
//合約
contract MathTest
{//這部分也與c語言幾乎完全相同function flow() view public returns(uint8){uint8 mm ?= 255; ?//二進制為11111111mm++;return mm; ?//mm只有8位,但是對于mm,再加1會得到100000000,只能取前8位,于是返回0而不是256}function flow2() view public returns(uint256){uint8 mm ?= 255;mm++;return mm; ?//即使返回值聲明有256位,但是在“mm++”這一步mm就被修改為0,所以返回的還是0}function flow3() view public returns(uint){uint mm ?= 255; ?//這次沒對mm的位數進行限制,它可以裝下100000000mm++;return mm;}function flow4() view public returns(uint8){uint8 nn = 0;nn--;return nn; ?//對00000000做減法,會先給“第九位”添1(要明確nn的位數),那么就會得到結果11111111,轉換成十進制就是255(對于有符號數,就涉及到了補碼的運算,同理,先轉換成補碼按此規律運算,再轉換回十進制)}
}

7、現象——非法運算:

//聲明版本號(程序中的版本號要和編譯器版本號一致)
pragma solidity ^0.5.17;
//合約
contract MathTest
{function errorTest() view public returns(int){int a = 2;int b = 3;return a/b; ?//既然聲明了返回值為整型,那么就不可能得到小數//不過solidity允許整型運算的過程中存在小數,只是結果不能接納小數,比如2/5-2/5//solidity會將表達式計算出結果后再按照一定的規則(比如整形溢出等)進行處理,比如2**99-2**99+1}function errorTest2() view public returns(int){int a = 2;int b = 0;return a/b; ?//0不能做除數,這個方法甚至不能成功編譯}function errorTest3() view public returns(int){int a = -1;int b = 0;return b >> a; ?//位移運算符不接受負數}}

8、語法——固定長度字節數組:

//聲明版本號(程序中的版本號要和編譯器版本號一致)
pragma solidity ^0.5.17;
//合約
contract ByteArray
{bytes1 public num1 = 0x7a; ?//1個字節長度的變量bytes2 public num2 = 0x7a68; ?//2個字節長度的變量bytes12 public num3 = 0x7a68656e676a69616e78756e; ?//12個字節長度的變量
}

(1)在solidity中,直接用public聲明成員變量,編譯部署后,會生成一個默認的get方法,通過該方法可以直接查看這個成員屬性,而不需要通過自擬函數返回這個成員屬性。

(2)字節數組同樣支持位運算以及邏輯運算。

(3)固定長度字節數組不可以僅僅對某個字段進行更改(可以僅對某個字段進行讀取,如下表所示),要么就直接對其整體重新賦值

名稱

num3[0]

num3[1]

num3[2]

num3[3]

num3[4]

num3[5]

num3[6]

num3[7]

num3[8]

num3[9]

num3[10]

num3[11]

內容

0x7a

0x68

0x65

0x6e

0x67

0x6a

0x69

0x61

0x6e

0x78

0x75

0x6e

(4)定長字節數組的關鍵字有bytes1,bytes2,bytes3,...,bytes32。

(5)不管是定長數組還是動態長度數組,都不能越界訪問,否則會報錯。

9、語法——動態長度字節數組:

//聲明版本號(程序中的版本號要和編譯器版本號一致)
pragma solidity ^0.5.17;
//合約
contract DynamicByteArray
{bytes public name = new bytes(2); ?//為動態字節數組開辟2個字節的空間function initName() public{name[0] = 0x7a;  //對動態長度字節數組進行初始化name[1] = 0x68;}function getLength() view public returns(uint){return name.length; ?//8個位(一個字節)為一個長度單位}function changeName() public{name[0] = 0x88; ?//可以對某一字段進行修改}function changeLength() public{name.length = 5; ?//可以修改數組的長度,不過修改的同時會將數組的內容全部置為0}function pushTest() public{name.push(0x99); ?//可以在數組末尾追加字節元素,同時增加數組的長度}
}

(1)動態長度字節數組可以僅對某個字段進行更改

(2)可以通過修改動態長度數組的length屬性修改動態長度數組的長度,不過修改的同時會將數組的內容全部置為0。

(3)動態長度數組有push方法,使用該方法可以在數組末尾追加指定的字節元素,同時增加數組的長度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211738.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python軸承故障診斷 (四)基于EMD-CNN的故障分類

目錄 前言 1 經驗模態分解EMD的Python示例 2 軸承故障數據的預處理 2.1 導入數據 2.2 制作數據集和對應標簽 2.3 故障數據的EMD分解可視化 2.4 故障數據的EMD分解預處理 3 基于EMD-CNN的軸承故障診斷分類 3.1 訓練數據、測試數據分組&#xff0c;數據分batch 3.2 定義…

D : DS查找——折半查找求平方根

Description 假定輸入y是整數&#xff0c;我們用折半查找來找這個平方根。在從0到y之間必定有一個取值是y的平方根&#xff0c;如果我們查找的數x比y的平方根小&#xff0c;則x2<y&#xff0c;如果我們查找的數x比y的平方根大&#xff0c;則x2>y&#xff0c;我們可以據此…

stu05-前端的幾種常用開發工具

前端的開發工具有很多&#xff0c;可以說有幾十種&#xff0c;包括記事本都可以作為前端的開發工具。下面推薦的是常用的幾種前端開發工具。 1.DCloud HBuilder&#xff08;輕量級&#xff09; HBuilder是DCloud&#xff08;數字天堂&#xff09;推出的一款支持HTML5的web開發…

硬件開發筆記(十四):RK3568底板電路LVDS模塊、MIPI模塊電路分析、LVDS硬件接口、MIPI硬件接口詳解

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134634186 紅胖子網絡科技博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬…

linux 關于$-的解釋(帖子搜索合集)

在學習Linux的時候&#xff0c;今天遇到了$-&#xff0c;什么意思呢&#xff1f;網上搜索了一些帖子&#xff1a; 帖子1&#xff1a; linux命令 $- 是什么意思 $- 是什么意思&#xff1f;有什么用&#xff1f;可以判斷什么交互式shell&#xff1f; $-記錄著當前設置的shell…

軟考高級備考-系統架構師(機考后新版教材的備考過程與資料分享)

軟考高級-系統架構設計師 考試復盤1.考試結果2.備考計劃3.個人心得 資料分享 考試復盤 1.考試結果 三科壓線過&#xff0c;真是太太太太太太太幸運了。上天對我如此眷顧&#xff0c;那不得不分享下我的備考過程以及一些備考資料&#xff0c;幫助更多小伙伴通過考試。 2.備考…

time模塊(python)

一.sleep休眠 [rootrhel8 day04]# vim demo01_time.py import time def banzhuan():print("搬磚")time.sleep(3.5) #讓程序休眠3.5秒print("結束")banzhuan()[rootrhel8 day04]# python3 demo01_time.py 搬磚 結束運行時&#xff0c;會發現程序中間暫停…

【3DsMax】制作簡單的骨骼動畫

效果 步驟 首先準備4個板子模型展開放置好 添加一個4段的骨骼 選中其中的一塊板子添加蒙皮命令 在蒙皮的參數面板中&#xff0c;設置每塊板子對應哪塊骨骼 設置好后你可以發現此時就已經可以通過骨骼來控制模型了 接下來就可以制作動畫 點擊左下角“時間配置”按鈕 設置一下動…

HarmonyOS--ArkTS(1)--基本語法(1)

目錄 基本語法概述 聲明式UI描述 自定義組件 創建自定義組件 自定義組件的結構--struct &#xff0c;Component&#xff0c;build()函數 生命周期 基本語法概述 裝飾器&#xff1a; 用于裝飾類、結構、方法以及變量&#xff0c;并賦予其特殊的含義。如上述示例中Entry、C…

VSCode安裝與使用

VS Code 安裝及使用 1、下載 進入VS Code官網&#xff1a;地址&#xff0c;點擊 DownLoad for Windows下載windows版本 注&#xff1a; Stable&#xff1a;穩定版Insiders&#xff1a;內測版 2、安裝 雙擊安裝包&#xff0c;選擇我同意此協議&#xff0c;再點擊下一步 選擇你…

SQL Server查詢計劃(Query Plan)——SQL處理過程

6. 查詢計劃(Query Plan) 6.1. SQL處理過程 就SQL語句的處理過程而言,各關系庫間大同小異,尤其是商業庫之間實現機制和細節差別更小些,其功能及性能支持方面也更加強大和完善。SQL Server作為商業庫中的后起之秀,作為SQL語句處理過程的主要支撐和保障,其優化器及相關機…

【Vulnhub 靶場】【hacksudo: ProximaCentauri】【簡單 - 中等】【20210608】

1、環境介紹 靶場介紹&#xff1a;https://www.vulnhub.com/entry/hacksudo-proximacentauri,709/ 靶場下載&#xff1a;https://download.vulnhub.com/hacksudo/hacksudo-ProximaCentauri.zip 靶場難度&#xff1a;簡單 - 中等 發布日期&#xff1a;2021年06月08日 文件大小&…

第9節:Vue3 指令

如何在UniApp中使用Vue3的指令&#xff1a; <template> <view> <!-- 使用指令 --> <text v-show"isVisible" click"toggleVisibility">點擊隱藏/顯示</text> <button v-on:click"incrementCount">點擊…

【LeetCode:70. 爬樓梯 | 遞歸 -> 記憶化搜索 -> DP】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

【圖片版】計算機組成原理考前復習題【第3章 存儲系統-2(Cache)】

目錄 前言 考前復習題&#xff08;必記&#xff09; 結尾 前言 在計算機組成原理的學習過程中&#xff0c;我們深入探索了計算機系統概述這一重要領域。計算機系統作為現代科技的核心&#xff0c;是整個計算機科學的基石。我們將學到的知識與理論轉化為了能夠解決現實問題…

web api性能測試使用wrk

web api性能測試 這邊簡單的給出shell腳本 注意先安裝&#xff1a;wrk和gnuplot #!/bin/bash# Copyright 2020 Lingfei Kong <colin404foxmail.com>. All rights reserved. # Use of this source code is governed by a MIT style # license that can be found in the…

vue 學習 -- day39(vue3 — reactive 對比 ref)

從定義數據角度對比&#xff1a; ref用來定義&#xff1a;基本類型數據。reactive用來定義&#xff1a;對象&#xff08;或數組&#xff09;類型數據。備注&#xff1a;ref也可以用來定義對象&#xff08;或數組&#xff09;類型數據, 它內部會自動通過reactive轉為代理對象。從…

如何防止惡意調用和攻擊對抖音商品詳情API的影響?

防止惡意調用和攻擊對抖音商品詳情API的影響是開發者和平臺必須關注的問題。惡意調用和攻擊可能導致服務中斷、數據泄露或其他安全問題&#xff0c;對平臺和用戶造成損失。本文將介紹一些常見的惡意調用和攻擊方式&#xff0c;并提出相應的防范措施&#xff0c;以確保抖音商品詳…

JavaScript函數概念、聲明、調用

JavaScript函數是一段可以重復使用的代碼塊&#xff0c;用于執行特定的任務。函數封裝了一定的邏輯&#xff0c;可以接收輸入參數并返回結果&#xff0c;使得代碼更加模塊化&#xff0c;可讀性更高。 函數聲明可以使用function關鍵字來創建&#xff0c;通常包括函數名、參數列…

python畫動漫形象(魔法少女小圓曉美焰,super beautiful)

1.源代碼 import turtle as te import time WriteStep 15 # 貝塞爾函數的取樣次數 Speed 5 Width 600 # 界面寬度 Height 500 # 界面高度 Xh 0 # 記錄前一個貝塞爾函數的手柄 Yh 0 def Bezier(p1, p2, t): # 一階貝塞爾函數 return p1 * (1 - t) p2 * t def Bezier_2(x1…