地址javascript
以太坊的每一個帳戶都有一個地址,這個地址就是這個帳戶的標識,相似這個樣子:php
0x3C7f1E9B49B2f7c92e25224199d05D5Cb6923824java
映射typescript
映射是以太坊中另外一種存儲和組織數據的方法,映射本質上是存儲和查找數據所用的鍵值對,咱們看一個例子:數組
mapping (uint => string) userIdToName;//這個例子中咱們能夠經過 id 去存儲或查找用戶名
msg.sender微信
msg.sender 是 solidity 中的一個全局變量,他表示的是當前調用者(或智能合約)的地址app
mapping (address => uint) favoriteNumber;//設置一個映射,鍵是address,值是uintfunction setMyNumber(uint _myNumber) public { // 寫個函數來設置favoriteNumber favoriteNumber[msg.sender] = _myNumber; // 設置favoriteNumber映射,將_myNumber存儲在msg.sender名下}function whatIsMyNumber() public view returns (uint) { // 寫一個查詢favoriteNumber的函數 return favoriteNumber[msg.sender]; // 若調用者還沒調用setMyNumber,則值爲0}
require函數
能夠經過 require 來作一些限制,好比 _name 要等於 yichen 才能繼續執行,不然報錯:
區塊鏈
function test(string _name) returns (string){retuire(keccak256(_name) == keccak256("yichen"));//solidity 不支持字符串直接比較,因此這裏用散列值比較return "hello";}
若是調用的時候是 test("yichen"); 就會返回 hello,不然報錯ui
繼承(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";
Storage與Memory
solidity 中有兩個能夠存儲變量的地方 Storage 與 Memory
Storage 變量是永久的存儲在區塊鏈中的變量
Memory 變量則是臨時的,當外部函數對某合約調用完成時,內存型變量即被移除
一個比較好的比喻是:Storage 理解爲硬盤上存儲的數據,Memory 理解爲內存上的數據
狀態變量(在函數以外聲明的變量)默認爲 Storage 形式,並永久寫入區塊鏈
在函數內部聲明的變量是 Memory 型的,它們函數調用結束後消失
還有一些特殊狀況,須要手動指定存儲類型,好比:處理函數內部的結構體和數組
更多函數可見性
函數聲明 private 以後,哪怕是繼承這個合約的子合約都不能調用,因此可使用更好的方法 internal
用 internal 聲明的函數,繼承了這個函數所在合約的子合約能夠調用這個函數,同時又限制了其餘人隨便調用
external 聲明的函數只能在合約以外調用,不能被合約內的其餘函數調用
接口
若是咱們想要與其餘合約進行交互的話,須要聲明一個接口
好比上面的那個最愛的數字的合約
contract LuckyNumber { mapping (address => uint) favoriteNumber; function setMyNumber(uint _myNumber) public { favoriteNumber[msg.sender] = _myNumber; } function whatIsMyNumber(address _myaddress) public view returns (uint) { return favoriteNumber[_myaddress]; }}
若是咱們想要在另外一個合約中調用它,來調用者的數字
首先要定義一個接口,能夠對比看一下,接口與合約不一樣之處在於咱們只聲明瞭要交互的函數並且沒有函數體
編譯器就是靠着這些特徵識別出這個接口的
contract NumberInterface {function whatIsMyNumber(address _myAddress) public view returns (uint);}
使用接口
只要咱們的合約是 public 或者 external,就能夠與其餘合約進行交互
NumberInterface numberContract = NumberInterface(LuckyNumber合約的Address);// 如今變量 numberContract 指向另外一個合約對象uint num = numberContract.getNum(msg.sender);//把咱們的 favoriteNumber 賦值給 num
if語句
if (keccak256(_name) == keccak256("yichen")) { hello();}
本文分享自微信公衆號 - 陳冠男的遊戲人生(CGN-115)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。