Solidity 智慧合約入門(二)----------基礎語法
阿新 • • 發佈:2022-03-25
address 以太坊地址的長度,20個位元組
int/uint 變長的有符號或無符號整型。支援以8遞增,uint8到uint256。uint 預設為uint256。
bool 布林型
mapping 鍵值對對映關係,如mapping(address => uint) 類似 key value
fixed/ufied 定點數?
string 字串
byte/byte32 位元組 陣列
struct 結構體 類似字典?
struct test{ address addr unit amount }
public、private、internal external 四種訪問許可權
- 1.函式預設宣告為public,即可以以internal方式呼叫,也可以通過external方式呼叫。可以理解為能夠被內部合約訪問和外部合約訪問。
- 2.Internal宣告的只允許通過internal方式呼叫,不能被外部合約。而external能夠被外部合約訪問。
- 3.private和internal類似,都不能被外部合約訪問,唯一的不同是private函式不能被子類呼叫,而internal可以。
pure 返回非變數
view constant 返回全域性變數
pragma solidity ^0.8.7; //指定版本 contract Testcoin//合約名 { uint storedData; function get() public view returns (uint) { return storedData; } }
constructor 建構函式修飾符
看起來還有個裝飾器的語法的語法 用於modifier 關鍵字
下面寫個無限增發的 測試
pragma solidity ^0.4.21; //指定版本contract Ceshicoin //合約名 { uint storedData; address public sender; mapping (address => uint) public balances;
event Sent(address from, address to, uint amount);
constructor init(){ sender = 0x6526b6b3B454b04E5F340d8501F70ebB82201817; // 初始化 設定合約建立者地址 }
modifier checkowner(){ // modifier 裝飾器關鍵字 if(msg.sender!=sender) return; // 直接return _; }
function adminsend(address receiver, uint amount) public checkowner { // set之前先呼叫checkowner方法 balances[receiver] += amount; }
function send(address receiver, uint amount) public { if (balances[msg.sender] < amount) return; balances[msg.sender] -= amount; balances[receiver] += amount; emit Sent(msg.sender, receiver, amount); }
}
初始化沒搞懂。。。
建立完先呼叫下 init方法
之後address就被設定成內建地址 只有內建地址才可以呼叫 adminsend方法
無限增發
require
類似於 try if
constructor 建構函式關鍵字 在合約建立時執行 event 事件是以太坊虛擬機器(EVM)日誌功能中提供的一組方便的介面。當事件被觸發時,它們會將引數儲存到交易日誌中——區塊鏈中一種特殊的資料結構。這些日誌與合約地址相關聯,並且會被打包進區塊中,因此可以被永久訪問(不過 Serenity 版本或許會有所改變)。注意,日誌和事件的資料是不能被合約訪問的,即便是建立它們的合約也不行(不然常規的資料儲存就沒意義了) msg.sender msg.sender 是 solidity 中的一個全域性變數,他表示的是當前呼叫者(或智慧合約)的地址 msg.value 交易轉入本幣的數量 now 交易打包進塊鏈的時間戳 blackhash 返回區塊的hash block.number 打包該區塊的高度 address.balance 給定地址本幣數量 transfer 代表把eth轉到合約賬戶 address.call 呼叫指定地址合約的方法 selfdestruct 自毀
繼承(Inheritance)
當代碼很長的時候我們可以把它們拆分成不同的合約,通過繼承來獲得其他合約的功能
contract welcome { function hi() public returns (string) { return "hi!"; } } contract welcome2 is welcome { function hello() public returns (string) { return "hello"; } }
引入(Import)
solidity 也支援 import(solidity 檔案字尾是 sol) import "./sayhello.sol";