目錄
- 注意事項
- 編譯器選擇
- 一些說明
- 1. 變數
- 1.1 狀態變數
- 1.2 區域變數
- 2. 資料型別
- 2.1 值型別
- 2.1.1 布爾型別(Booleans):
- 2.1.2 整型(Integers):
- 2.1.3 定長浮點型(Fixed Point Numbers):
- 2.1.4 定長位元組陣列(Fixed-size byte arrays)
- 2.1.5 有理數和整型常量(Rational and Integer Literals)
- 2.1.6 列舉(Enums)
- 2.1.7 函式型別(Function Types)
- 修飾符
- 函式定義
- 函式回傳值
- 建構式
- 2.1.8 地址型別(Address)
- 基礎知識
- 轉賬
- 2.2 參考型別
- 2.2.1 字串
- 2.2.2 陣列
- 2.2.3 結構體:
- 2.2.4 mapping:映射,
- 2.2.5 storage和memory
- bytes1、bytes、string相互轉換
- 最后

Solidity是一種智能合約高級語言,運行在Ethereum虛擬機(EVM)之上,Solidity是以太坊的首選語言,它內置了Serpent的所有特性,它的語法接近于Javascript,是一種面向物件的語言,這降低了學習門檻,易于被掌握和使用,因為JavaScript是Web開發者的常用語言,因此,Solidity充分利用了現有數以百萬程式員已掌握JavaScript這一現狀,
以太坊智能合約編程語言,語法簡單,但是有不成熟不完善,有bug,沒有多執行緒
注意事項
編譯器選擇
使用的是Remix IDE編譯器 下載地址 —> Remix IDE下載地址
這個編譯器對中文很不友好!吐槽一下!
一些說明
- 一個
contract里面就是一個合約,沒有main函式,只要合約部署就可以運行 - 一定要有頭部版本號申明:
pragma solidity 0.4.24; - 每一行結尾得有分號
(;)結束
注釋:中文必須在外面寫好然后拷貝,不能直接在里面寫中文注釋!對中文很不友好!

1. 變數
1.1 狀態變數
定義在合約之內,但是在函式之外的變數,叫做狀態變數,這些變數會上傳到區塊鏈保存的,默認是私有的,可以使用public和private修飾
pragma solidity 0.4.24;
contract HelloWorld{
string public name; // 這個就是狀態變數,使用public修飾
function hello(string memory text) public pure returns(string memory) {
return text;
}
}
1.2 區域變數
在合約之內,在函式之內,區域變數不能使用public
pragma solidity 0.4.24;
contract Hello{
function hello(string memory text) public pure returns(string memory) {
string name = "FanOne"; // 這個就是區域變數
return text;
}
}
狀態變數默認是私有的,可以使用public修飾
2. 資料型別
2.1 值型別
2.1.1 布爾型別(Booleans):
true或false,默認是false
!邏輯非
&& 邏輯與
|| 邏輯或
== 等于
!=不等于
pragma solidity 0.4.24;
contract DataType {
// bool public ok = true;
bool public ok; // def is false
function test() returns(string){
if (ok) {
return "this is true";
}else {
return "this is false";
}
}
}
2.1.2 整型(Integers):
int/uint: 表示有符號和無符號不同位數整數
以8位為區間,有int8,int16,int24,…,int256,int默認是int256,uint同理
int8 num;
int256 total = 120;
舉例:兩個數相加的結果
pragma solidity 0.4.24;
contract Add {
int8 i1 = 10;
int16 i2 = 11;
function add() returns (int8){
return i1 + int8(i2); // 型別強轉
}
}
2.1.3 定長浮點型(Fixed Point Numbers):
fixed/ufixed: 表示有符號和無符號的固定位浮點數
還不完全支持,它可以用來宣告變數,但不可以用來賦值
2.1.4 定長位元組陣列(Fixed-size byte arrays)
關鍵字有:bytes1, bytes2, bytes3, …, bytes32,
byte 代表 bytes1,bytes1存盤1個位元組,即8位,bytes2存盤2個位元組,步長為1位元組遞增
.length:表示這個位元組陣列的長度(只讀),回傳的是定長位元組陣列型別的長度,而不是值的長度
長度不能修改
可以通過下標獲取
元素值不可修改,只讀
pragma solidity 0.4.24;
contract TestBytes {
bytes1 public b0; // 位元組:0x00
bytes1 public b1 = "f"; // 0x66
bytes2 public b2 = "fa"; // 0x6661
bytes6 public b6 = "fanone";
bytes32 public b32 = "FanOne";
function getLen() returns(int256){
return b32.length;
}
function getByIndex() returns(bytes1){
return b1[0];
}
}

2.1.5 有理數和整型常量(Rational and Integer Literals)
運算式中直接出現的數字常量:
整數,小數,科學計數都支持(9e30:6*200^10)
2.1.6 列舉(Enums)
自定義型別
至少要有一個元素,默認位uint8,不要忘了花括號
enum Gender {
Male,
FeMale
}
// Gender為自定義型別,設定默認值
Gender default = Gender.Male
2.1.7 函式型別(Function Types)
- 狀態變數:默認是private
- 函式:默認是public
修飾符
public:公有,擁有以太坊的賬戶都可以呼叫,可以修飾狀態變數
private:私有,只有合約內部可以呼叫,可以修飾狀態變數
view / constant:函式會讀取但是不會修改任何合約的狀態變數
pure:函式不適用任何合約的狀態變數
payable:呼叫函式需要付錢,錢付給了智能合約的賬戶
returns:回傳值函式宣告中使用
external:僅合約外部可以呼叫,合約內部需要使用this呼叫
internal:僅合約內部和繼承的合約可以呼叫
修飾符在returns宣告的前面,可以有多個修飾符
view、constant、pure的區別:都是針對狀態變數的
函式中訪問了狀態變數,但是沒有修改,使用view或者constant
如果沒有使用狀態變數,則使用pure修飾
如果即訪問了狀態變數,又修改了,則不要修飾即可,
注意坑:constant修飾的函式中,修改了狀態變數,編譯器不會報錯,但是運行是修改不成功的,
payable
想要轉錢,修飾符必須是payable
payable的修飾符,轉的錢到合約中了
function setMoney(string str) public payable returns(string) {
return str;
}
部署的時候,交易金額給個值,會發現金額減少了,錢到了合約,注意交易金額的單位,用ether,不然看不到大的變化
獲取合約中的錢
function getMoney() public view returns(uint256){
return this.balance;
}
this代表當前合約本身,balance獲取當前合約的余額
函式定義
function 函式名稱(可選引數) 修飾符 回傳值{
函式體
}
例:
function Add(a int8) public view returns(int8){
return a
}
函式回傳值
-
使用returns指定回傳的型別
-
回傳值宣告一定要放在最后
-
多個回傳值使用元組:使用括號括起來()
建構式
進入合約就執行,一般設定一些初始化后不變的資料
constractor() public {
owner = msg.sender;
}
public:共有,可以修飾函式,可以修飾狀態變數
provate:私有,可以修飾函式,可以修飾狀態變數
view/constant:用了狀態變數,但是沒有修改狀態變數,只能修飾函式
pure:沒有使用狀態變數,只能修飾函式
payable:只能修飾函式,轉賬的話必須使用payable,錢從賬戶過來,錢到合約
returns:在函式最后,回傳值
狀態變數在函式中修改了,就不要使用(view\constant\pure)修飾符
2.1.8 地址型別(Address)
基礎知識
地址是所有合約的基礎,所有合約都繼承地址物件
通過合約的地址串,呼叫合約內的函式,本質是uint160,可以進行加減,需要強轉
balance:獲取余額
transfer:轉賬,推薦使用,誰呼叫就是給誰轉
send:轉賬,不安全,不推薦使用,合約余額不夠需要自己手動處理,不會報錯
call:合約內部呼叫合約,呼叫底層代碼,別用
callcode:呼叫底層代碼,別用
delegatecall:呼叫底層代碼,別用
this指合約本身
address(this),直接使用this會有warning
賬戶–>賬戶:不支持
賬戶–合約:paybable
合約–賬戶:transfer,誰呼叫就是給誰轉
合約–合約 看高級用法
換算:1ether = 10**18wei (10^18),單位默認是wei
轉賬
pragma solidity 0.4.24;
contract TransferDemo {
uint256 public a;
function constractGetMoney() public payable{
}
function getConstractBalance() public {
a = address(this).balance;
}
address to_addr = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
function trans() public {
to_addr.transfer(5 * 10 ** 18 ); //define is wei
//need to transfer eth
}
}
這里有很多地址可選擇


錢到哪去:向誰轉錢,就用誰呼叫
transfer
錢從哪來:合約的錢(payable),合約的錢不夠transfer的時候會報錯

2.2 參考型別
2.2.1 字串
- 不支持索引
- 不支持length和push方法
- 可以修改,需要通過bytes轉換
string me = "fanone";
轉bytes,然后就可以使用bytes的特性了
bytes(me).length;
bytes轉string
string(bytes)
不定長位元組陣列:bytes:
- 支持length,push(在最后追加)方法
- 可以修改
- 支持索引,如果未分配空間(new分配空間),使用下標會報角標越界,其他的會自動分配空間
- 以十六進制格式賦值
bytes me = "fanone"
name.push("666")
2.2.2 陣列
-
內置陣列:string、bytes、bytes1…bytes32
-
自定義定長陣列:長度不可變,支持length,不支持push
uint256[5] public nums = [1,2,3,4,5];
- 自定義不定長陣列:長度可變,內容可修改,支持length,push方法
uint256[] public nums = [1,2,3,4,5];
nums.push(6)
delete nums;
- 函式中使用new分配空間
uint8[] memory aa = new uint8[](10);// 10個長度的空間
2.2.3 結構體:
函式不支持回傳結構體物件,可以把值放到元組中回傳(按個放到()中,回傳元組)
struct 結構體名稱{
型別 欄位名;
}
struct Person {
string name;
uint age;
}
// 指定欄位名,必須用()括起來,里面是花括號
Person public p1 = Person({name:"hallen",age:18});
// 按順序初始化值,注意是括號()不是花括號{}
Person public p2 = Person("hallen",18);
// 結構體不定長陣列
Person[] persons;
// 函式中可以往里面添加值,型別必須是結構體初始化物件
persons.push(p1);
2.2.4 mapping:映射,
無法判斷是否存在某個key
不支持length
mapping(string=>string) map_data;
// 函式中賦值
map_data["name"] = "hallen";
//獲取指定的key的值
string storage aa = map_data["name"];
2.2.5 storage和memory
storage:資料永遠保存,參考傳遞,只有參考型別的變數才可以顯示的宣告為storage,
memory:存在記憶體中,會被回收,資料會過期丟失,類似值型別
bytes1、bytes、string相互轉換
bytes1轉string要經過中間的bytes
角標用uint256型別,不然會型別不匹配
最后
小生凡一,期待你的關注,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/289887.html
標籤:其他
