基礎語法(一)
1)函式定義:
function 函式名(引數型別 引數1, 引數型別 引數2) [訪問許可權] [讀取資料型別函式] returns (返回資料型別){}
訪問許可權:public 、private (一般private許可權的話,引數命名前面加乙個_ ,例如:_name)
讀取資料型別函式:view函式(唯讀且不可修改);pure函式(不訪問應用裡的資料)
2)定義結構體並例項化:
struct zombie
//建立struct動態陣列zombies
zombie zombies;
//例項化
temp = zombie("jack", 10);
//新增資料進陣列
zombies.push(temp);
//一行**實現新增資料
zombies.push(zombie("jack", 10));
//結構體作為引數傳入:
function _dostuff(zombie storage _zombie) internal
3)強制型別轉換:
uint8 a = 5;
uint b =3;
//強制轉換;高位不可直接轉低位,需要強制轉換
uint8 c = a * uint8(b);
4)事件監聽
//建立事件
event work(uint x, uint y, uint result);
function add(uint _x, uint _y) public
基礎語法(二)
例如:2)全域性變數呼叫函式:
msg.sender :當前呼叫者(或智慧型合約)的address
例如:uint id = zombies.push(zombie(_name, _dna)) - 1;//id為例子
//更新zombietoowner值
zombietoowner[id] = msg.sender;
//為這個 msg.sender 名下的 ownerzombiecount 加 1
ownerzombiecount[msg.sender]++;
3)require:函式在執行過程中,當不滿足某些條件時丟擲錯誤,並停止執行
// 兩字串的 keccak256 雜湊值來進行判斷)
require(keccak256(_name) == keccak256("vitalik"));
4)繼承:
例如:zombiefeeding 繼承自 zombiefactory 合約
contract zombiefeeding is zombiefactory
5)引入(import):
例如:將 zombiefactory.sol 匯入到我們的新檔案 zombiefeeding.sol 中
import "./zombiefactory.sol ";
6)storage和memory:
storage 變數是指永久儲存在區塊鏈中的變數。 memory 變數則是臨時的,當外部函式對某合約呼叫完成時,記憶體型變數即被移除。
solidity預設處理:狀態變數(在函式之外宣告的變數)預設為「儲存」形式,並永久寫入區塊鏈;而在函式內部宣告的變數是「記憶體」型的,它們函式呼叫結束後消失。
例如:
//建立乙個storage變數 (zombie為struct型別)
zombie storage storage;
7)internal和external修飾符:
internal:如果某個合約繼承自其父合約,這個合約即可以訪問父合約中定義的「內部」函式。
external:函式只能在合約之外呼叫,它們不能被合約內的其他函式呼叫。
8)合約介面:
例如:建立kittyinte***ce 介面
contract kittyinte***ce
使用介面:建立乙個名為 kittycontract 的 kittyinte***ce,並用 ckaddress 為它初始化
kittycontract kittycontract = kittycontract(ckaddress);
9)處理返回多個值:
例如:multiplereturns()函式可以返回3個值
(a, b, c) = multiplereturns();
若只返回c:
( , , c) = multiplereturns();
基礎語法(三)
1)智慧型協議永固性:
**不可更改和更新
2)onlyowner函式修飾符;
為了確保函式值能被合約擁有者呼叫,新增onlyowner函式修飾符確保
(呼叫許可權限制)
例如:function likeaboss() external onlyowner
4)時間單位:
變數now可以返回當前的時間戳
5)公有函式和安全性:
檢查宣告為public和external的函式,若沒有onlyowner,可以在能夠使用internal避免安全問題。
基礎語法(四)
1)可支付函式修飾符:payable
總結:private 意味著它只能被合約內部呼叫; internal 就像 private 但是也能被繼承的合約呼叫; external 只能從合約外部呼叫;最後 public 可以在任何地方呼叫,不管是內部還是外部。
view 告訴我們執行這個函式不會更改和儲存任何資料; pure 告訴我們這個函式不但不會往區塊鏈寫資料,它甚至不從區塊鏈讀取資料。這兩種在被從合約外部呼叫的時候都不花費任何gas(但是它們在被內部其他函式呼叫的時候將會耗費gas)。
onlyowner 和 abovelevel。 對於這些修飾符我們可以自定義其對函式的約束邏輯。
payable 方法是一種可以接收以太的特殊函式。
例如:
contract onlinestore
}
msg.value
是一種可以檢視向合約傳送了多少以太的方法。
2)提現:
contract getpaid is ownable
}
transfer 函式向乙個位址傳送以太, 然後 this.balance 將返回當前合約儲存了多少以太。
3)隨機數(不安全的方式):
uint random = uint(keccak256(now, msg.sender, randnonce));
基礎語法(五)
1)erc721標準和多重繼承:
contract erc721
例如:
// 對 erc721 和zombieattack 的繼承
contract zombieownership is zombieattack , zrc721
2)預防溢位
溢位:假設我們有乙個 uint8, 只能儲存8 bit資料。這意味著我們能儲存的最大數字就是二進位制 11111111 (或者說十進位制的 2^8 - 1 = 255)。
下溢:果你從乙個等於 0 的 uint8 減去 1, 它將變成 255 (因為 uint 是無符號的,其不能等於負數)。
安全數學庫:safemath
使用庫:using safemath for uint256
safemath 庫有四個方法:add, sub, mul, 以及 div。
呼叫:
uint256 =a;
a.add(1);
防止 uint16 和 uint32 溢位或下溢。我們可以將其命名為 safemath16 和 safemath32。
solidity智慧型合約重要特性
solidity智慧型合約的一些重要特性,如變長陣列中的storage和memory變數,storage和memory的儲存位置以及字串陣列string使用。區塊鏈開發 以太坊 fabric bcos 密碼技術 共識演算法 位元幣 其他鏈 string,bytes 對於變長陣列,在初始化分配空間前不...
solidity 智慧型合約之間的呼叫
在智慧型合約的編譯過程中,有兩種情況 呼叫者和被呼叫者在乙個sol檔案中和分別在不同的檔案中。在下面的智慧型合約中,demo1和demo在同乙個檔案中,可進行同時編譯,然後逐個發布。pragma solidity 0.5.10 contract demo1 contract demo2 當發布完成,...
以太坊solidity智慧型合約設計模式
設計模式是許多開發場景中的首選解決方案,本文將介紹五種經典的智慧型合約設計模式並給出 以太坊solidity實現 自毀合約 工廠合約 名稱登錄檔 對映表迭代器和提款模式。合約自毀模式用於終止乙個合約,這意味著將從區塊鏈上永久刪除這個合約。一旦被銷毀,就不可能呼叫合約的功能,也不會在賬本中記錄交易。現...