solidity智慧型合約程式設計基礎

2021-10-05 20:11:16 字數 4005 閱讀 7370

基礎語法(一)

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實現 自毀合約 工廠合約 名稱登錄檔 對映表迭代器和提款模式。合約自毀模式用於終止乙個合約,這意味著將從區塊鏈上永久刪除這個合約。一旦被銷毀,就不可能呼叫合約的功能,也不會在賬本中記錄交易。現...