以太坊智能合約基礎(理解智能合約/Solidity)
無需編程經驗,也可以幫助你了解Solidity獨特的部分;如果本身就有相應的編程經驗如java,python等那么學起來也會非常的輕松
一、Solidity和EVM字節碼
實際上以太坊鏈上儲存的就是EVM的字節碼,編譯好的程序;EVM和Solidity實際上就和java中的jvm虛擬機和java語言的關系
Solidity是靜態類型的
? 類似于Java,C,Rust 而非python或者js
例子:-整數:uint(256位無符號整數)
? int(256位帶符號整數)
for (uint i = 0;i<10;i++){users[i].balance = 1;}
二、數據類型
**值類型(value Type)**布爾值,整數型等等
**引用類型(Reference Type)**包括數組和結構體,這類變量占用的空間大,賦值是直接傳遞地址值(類似于Java的指針)
**映射類型 (mapping Type) ** 類似于java的map key–value
-映射:健值存儲/哈希表
-每個鍵初始值都映射為0
-沒有內置的方法來查詢映射的長度,或者、迭代其非零元素。可以使用單獨的變量
三、函數簽名
智能合約的代碼總是包含在函數或者是一個運算程序中的;和Java,python的編程語言的函數類似
構造函數
第一次創建合約時調用
用于自定義設置或給出初始狀態
BoardAction的智能合約函數,類似于java中的賦值操作,把constructor的address的地址值賦值給上面的public的值
contract BoardAction{address public president;address public vicePresident;constructor(address initialPresident,address initialVP) public {/** initialize the contract **/president = initialPresident;vicePresident = initialVP;}
}
四、可見修飾器
用于函數
function calledByAnyone()public {/*anyone can all */}
function calledInternally() internal {/* only called by another funcation in this contract*/}
用于實例變量;幾乎和java的public和private一摸一樣
int public myPublicField;
int private myPrivateField;
問:myPrivateField所取的值時秘密的嗎?
剛開始學習 solidity
時,pure
和 view
關鍵字可能令人費解,因為其他編程語言中沒有類似的關鍵字。solidity
引入這兩個關鍵字主要是因為 以太坊交易需要支付氣費(gas fee)。合約的狀態變量存儲在鏈上,gas fee 很貴,如果計算不改變鏈上狀態,就可以不用付 gas
。包含 pure
和 view
關鍵字的函數是不改寫鏈上狀態的,因此用戶直接調用它們是不需要付 gas 的(注意,合約中非 pure
/view
函數調用 pure
/view
函數時需要付gas)。
function ordinary() public {/*can modify state and call other functions*/}
function viewOnly() public view {/*cannot modify any storage or call another ono-view funcation*/}
funcation localOnly() public pure {/*doesnot even read any state either*/}
五、事件
這個類似于java中日志
查看合約狀態主要有兩種方式:
-使用***View函數***,例如用于公共字段的getter函數
-查看***事件日志***。是否可以“訂閱”合約中的事件
首先使用event聲明一個事件,然后在想要查看的地方emit這個事件即可
六、調用其他合約的方法
如下代碼所示Token為外部的合約接口;tokenA,tokenB外部合約地址實例;sqap1函數的調用
abstract contract Token {function transferFrom (address from,address to,uint amount) public virtual;
}
contract Exchanger {Token tokenA = Token(address(0x00))Token tokenB = Token(address(0x00))function sqap1(address Alice,address Bob) public{tokenA.transferFrom(Alice,Bob,1);tokenB.transferFrom(Bob,Alice,1);}
}
七、使用原生代幣
在solidity中接受和使用以太坊幣
如下代碼。有一個acceptExactlyTwoEther函數可以被以太坊的以太幣接受,然后還有函數修飾器payable 一定要指定payable ,如果沒有指定payable修飾的話那么以太坊將會拒絕所有的以太幣。
function acceptExactlyTwoEther() public payable returns(uint) {require(msg.value >= 2.0 ether);uint refund = msg.value - 2.0 ether;payable(msg.sender).transfer(refund);return address(this).balance;
}
讀取當前時間
function plcaeBid(int price) public {require(block.timestamp <= deadline);
}
關于區塊的其他元數據也是可以得到的
總結
本文介紹了Solidity智能合約的基本概念和核心特性。Solidity類似于Java/C等靜態語言,編譯為EVM字節碼運行。主要知識點包括:1)數據類型分為值類型、引用類型和映射類型;2)函數簽名與構造函數機制;3)可見性修飾符(public/private)和狀態修改標識(view/pure);4)事件機制用于日志記錄;5)調用外部合約的方法;6)原生代幣處理需使用payable修飾符;7)可讀取區塊時間等元數據。文章通過類比Java等傳統語言,幫助開發者快速理解Solidity獨特的設計邏輯,為智能合約開發打下基礎。