timezone |
---|
Asia/Taipei |
-
前端工程師,轉職到 Web3 公司工作,想學習合約開發技術。
-
會
-
前端工程師,轉職到 Web3 公司工作,想學習合約開發技術。
-
會
Remix,可以直接使用瀏覽器開發,並可以佈署在獨立的測試鏈,提供測試帳號,每個帳號有大約 100 顆ETH測試幣來方便進行測試。
使用 Ctrl + S
可以編譯程式碼,編譯後可以點按 Deploy
,將合約佈署至測試鏈上來進行測試。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
contract HelloWeb3{
string public _string = "Hello Web3!";
}
分為三個主要部份
- License 的設套
// SPDX-License-Identifier: MIT
- 使用的 Solidity 版本
pragma solidity ^0.8.21;
- 合約邏輯主體
contract HelloWeb3 {
string public _string = "Hello Web3!"
}
Solidity 變數型態基本上分成 3 類
- Value Type: 布林值、整數值等等…,變數存放的是實際資料
- Reference Type: Array 、Struct,變數存放的是資料所在的記憶體位置
- Mapping Type: 用來儲存鍵值對的資料類型,就像 HashTable
存放 true
or false
這兩種資料。
布林值能使用的邏輯運算子為:
- !
- &&
- ||
- ==
- !=
bool public bool1 = true;
需注意的是, &&
及 ||
套用短路原則,當已經有運算結果的時候,就不會將所有邏輯運算都值行完,例如
true || false //會直接回傳 true,不會再往後確認
false && true // 會直接回傳 false,不會再往後確認
可以存放正、負整數值
可使用的運算子包含:
- 比較運算子:
<=
>=
<
==
!=-
j>
- 計算運算子:
+
,-
,*
,/
,%
,**
int public _int = -`
unit public _unit = 1 // 正整數
地址可以分為兩種
- 普通地址
address
: 存放一個20字元的值 (以太坊地址長度) - 付費地址
payable address
: 比普通地址多了transfer
及send
兩個方法,來用於進行轉帳
address public _address = 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;
address payable public _address1 = payable(_address);
字元陣列分為有固定長度及不固定長度兩種:
- 固定長度:屬於
Value Type
長度宣告後不能變更,根據資料長度分別有bytes1
、bytes8
、bytes32
,最長就是32個字元 - 不固定長度:屬於 `Reference Type) 長度宣告後可以變更
bytes32 public _byte32 = "MiniSolidity";
bytes1 public _byte = _byte32[0];
一個較為冷門的變數型別,沒什麼人使用。
enum ActionSet { Buy, Hold, Sell }
function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]
-
function:宣告函式定義的開始
-
: 函式名稱
-
(): 函式允許傳入的參數的基態及名稱
-
{internal | external | public | private }: 函式的可見度宣告
- public: 內外部都可見
- private: 只能從合約內部進行呼叫,就算是繼承也不可使用
- external: 只能從合約外部呼叫,而內部可以透過
this.<function name>()
的方式來呼叫 - internal: 只能在合約內部使用,繼承的的合約也可以使用
注意1: 要明確定義可見度,沒有預設值
注意2: 可見度也可以用來定義變數的可見度,當定義為
public
的時候會自動生成同名的getter
函式,如果變數未標明可見度的話默認為 internal -
[pure|view|payable]:
- pure: 不能讀取也不能入變數,就是一個純粹的函式,因為不會改變鏈上資料,所以不會有 gas fee 產生
- view: 單純讀取變數,不可改變變數資料
- paybale: 可以進行支付的函式
Solidity 有兩個關鍵字 return
及 returns
差別在
returns
: 用來定義函式的回傳值的型態及名稱return
: 在函式內,用於在設定回傳值
// 對回傳參數進行命名
function returnNamed() public pure returns(unit256 _number, bool _bool, unit256[3] memory _array) {
return(1, true, [unit256(1),2,5])
}
- 讀取所有返回值
uint256 _number;
bool _bool;
uint256[3] memory _array;
(_number, _bool, _array) = returnNamed();
- 讀取部份返回值
// 不讀取的留空,單存只設定要讀取返回值的變量
(, _bool2, ) = returnNamed();
Solidity 儲存的位置總共有三種
storage
儲存在鏈上,合約狀態變數預設都是儲存在storage
meomry
函式裡的參數和臨時變數一般是用memory
,不上鏈calldata
和memory
一樣不上鏈,唯一的差別是calldata
變數不能修改
作用域主要分三種
- 狀態變數
contract Variables {
uint public x = 1;
uint public y;
string public z;
}
合約內函數都可以訪問, gas
的清秏高
- 局部變數
function bar() external pure returns(uint){
uint xx = 1;
uint yy = 3;
uint zz = xx + yy;
return(zz);
}
只有在函式的執行過程中有用,退出後就無效, gas
低
-
全局變數 solidity 的保留關鍵字,可以不宣告就直接使用,完整的列表請參考連結
-
全局變數 - 以太及時間單位
- wei: 1
- gwei: 1e9 = 1000000000
- ether: 1e18 = 1000000000000000000
function weiUnit() external pure returns(uint) { assert(1 wei == 1e0); assert(1 wei == 1); return 1 wei; } function gweiUnit() external pure returns(uint) { assert(1 gwei == 1e9); assert(1 gwei == 1000000000); return 1 gwei; } function etherUnit() external pure returns(uint) { assert(1 ether == 1e18); assert(1 ether == 1000000000000000000); return 1 ether; }
- seconds: 1
- minutes: 60 seconds = 60
- hours: 60 minutes = 3600
- days: 24 hours = 86400
- weeks: 7 days = 604800
function secondsUnit() external pure returns(uint) { assert(1 seconds == 1); return 1 seconds; } function minutesUnit() external pure returns(uint) { assert(1 minutes == 60); assert(1 minutes == 60 seconds); return 1 minutes; } function hoursUnit() external pure returns(uint) { assert(1 hours == 3600); assert(1 hours == 60 minutes); return 1 hours; } function daysUnit() external pure returns(uint) { assert(1 days == 86400); assert(1 days == 24 hours); return 1 days; } function weeksUnit() external pure returns(uint) { assert(1 weeks == 604800); assert(1 weeks == 7 days); return 1 weeks; }