以太坊智能合約學習筆記(一)

本文由【區(qū)塊鏈研習社】優(yōu)質內容計劃支持,更多關于區(qū)塊鏈的深度好文妨马,請點擊【區(qū)塊鏈研習社】簡書專欄:區(qū)塊鏈研習社簡書專欄

合約的基本結構

程序版本(Version Pragma):Solidity 大多都是開源的程序咐熙,在代碼中加上程序版本是為了方便社區(qū)合作弱恒。描述程序版本的規(guī)則和 npm 的一樣。

pragma solidity ^0.4.19;

合同(contract)聲明:合同類似于面向對象語言中的類(Class)棋恼。

contract SimpleStorage {

}

狀態(tài)變量(State variable)聲明:狀態(tài)變量是永久存儲在合同存儲中的值返弹。

contract SimpleStorage {
    uint storedData; // State variable
}

函數(function)聲明:函數是合約內代碼的可執(zhí)行單元锈玉。

contract SimpleStorage {
    function get () {
    }
}

類型

boolfalse / true

操作符:! , && , || , == , !=

uinit/int:無符整型、有符整型

操作符:

  • 比較:<= , < , == , >= , >
  • 位計算:& , | , ^ , ~
  • 計算:+ , - , * , / , % , **

注意:solidity 暫時沒有浮點數义起,有定點數但也支持性不好拉背。

address:用于表示以太坊地址,

address x = 0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF

成員:

  • address.banlance (uint256):地址余額默终,單位 Wei椅棺,,
  • address.transfer(uint256 value) :給 address 轉賬 value(Wei)齐蔽。
  • address.send(value):和 transfer 類似两疚,transfer 更常用。
  • address.call, address.callcode, address.delegatecall:智能合約相互調用時使用

注意:在 solidity 源碼中含滴,address 不需要加雙引號诱渤。但在 Remix 的對話界面中輸入 address 時,務必加上雙引號蛙吏,否則會報錯源哩,且報錯的消息非常詭異。

全局變量

ether 變量:1 ether 代表數字 1*10^x18 鸦做,而不是幣的單位励烦。

  • wei == 1
  • szabo == 10^12 wei
  • finney == 10^15 wei
  • ether == 10^18 wei

時間變量:1 seconds 代表數字 1,而不是時間的單位泼诱。同理 1 years 代表的是數字 3652460*60坛掠, 而不是現(xiàn)實世界中的一年,因為現(xiàn)實世界中有會有 閏秒治筒。如合同中需用到準確的一年屉栓,需要外部預言機(oracle)。

  • 1 seconds == 1
  • 1 minutes == 60 seconds
  • 1 hours == 60 minutes
  • 1 days == 24 hours
  • 1 weeks == 7 days
  • 1 years == 365 days

block:塊

  • block.blockhash(uint blockNumber) returns (bytes32): 傳入 blockNumber耸袜,返回塊的哈希值
  • block.coinbase (address): 挖到當前塊礦工的地址
  • block.difficulty (uint): 當前塊的難度
  • block.gaslimit (uint): 當前塊最多的 gas
  • block.number (uint): 當前塊是第幾個
  • block.timestamp (uint): 當前塊創(chuàng)建的時間戳
  • now (uint): block.timestamp 的別名

msg: 當執(zhí)行某一個函數的時候友多,函數想要知道調用函數的數據信息

  • msg.data (bytes): 包括函數名字等等,一些沒有經過加工的信息堤框。
  • msg.gas (uint): 函數調用方攜帶的 gas
  • msg.sender (address): 函數調用方的地址
  • msg.sig (bytes4): 整個 msg.data 的前 4 個 byte
  • msg.value (uint): 函數調用方攜帶的 gas域滥,以 wei 為單位計價。

關鍵詞

  • constant 用于變量: 表明當前變量不可修改蜈抓。如果修改启绰,編輯器會報錯。
  • constant 用于函數: 表明當前函數中沟使,不應該修改狀態(tài)委可。但要十分小心,因為即便修改了腊嗡,編譯器也不會報錯着倾。
  • view : 和 constant 用于函數時功能一樣拾酝。
  • payable: 表明調用函數可以接受以太幣。
  • this: 指向的是當前合同的 address屈呕。
  • revert: 函數執(zhí)行失敗微宝,需要通過調用 revert() 拋異常告訴函數調用方。調用后恢復合同狀態(tài)虎眨,并將剩余 gas 返還蟋软。throw 已被廢棄。

其他

  • 合約是中介:由于調用函數的動作是在挖礦時執(zhí)行的嗽桩,所以Solidity 沒有原生定時器岳守,不通過合約本身自動觸發(fā)函數執(zhí)行。應該將合約看做一個中介碌冶,需要外部來觸發(fā)合約函數的執(zhí)行湿痢。

  • 本地狀態(tài)變量聲明提升:類似于 JS 用 val 聲明變量。

contract SimpleStorage {
    function set(uint data){
        if (true) {
            uint temp = 1; // 本地狀態(tài)變量
        }
        uint temp; // 報錯扑庞,因為聲明本地狀態(tài)變量的作用域是函數譬重,而不是 {}。
    }
}

省幣秘訣

  • fn() 代替 this.fn():通過 this.fn() 調用函數罐氨,在 EVM 底層是通過 msg來調用合約函數的臀规。相對于直接調用 fn() 花費的 gas 更多。

  • 減少重復計算栅隐。Solidity 編譯器沒有對重復計算做優(yōu)化塔嬉,需開發(fā)者手動使用臨時變量保存重復計算的值。

function(int a, int b){
    // 錯誤租悄。應該使用 int x = a + b 減少重復計算
    if(a + b > 0) {
        int y = a + b; 
    }
}

安全

  • 一定要把內部變量修改完成之后谨究,再給外部錢。
frank.transfer(salary);
// 錯誤泣棋,應該將先修改內部變量胶哲,再 transfer。
lastPayday = lastPayday + payDuration;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末潭辈,一起剝皮案震驚了整個濱河市纪吮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萎胰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棚辽,死亡現(xiàn)場離奇詭異技竟,居然都是意外死亡,警方通過查閱死者的電腦和手機屈藐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門榔组,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熙尉,“玉大人,你說我怎么就攤上這事搓扯〖焯担” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵锨推,是天一觀的道長铅歼。 經常有香客問我,道長换可,這世上最難降的妖魔是什么椎椰? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮沾鳄,結果婚禮上慨飘,老公的妹妹穿的比我還像新娘。我一直安慰自己译荞,他們只是感情好瓤的,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吞歼,像睡著了一般圈膏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浆熔,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天本辐,我揣著相機與錄音,去河邊找鬼医增。 笑死慎皱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的叶骨。 我是一名探鬼主播茫多,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忽刽!你這毒婦竟也來了天揖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤跪帝,失蹤者是張志新(化名)和其女友劉穎今膊,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體伞剑,經...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡斑唬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恕刘。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缤谎,死狀恐怖,靈堂內的尸體忽然破棺而出褐着,到底是詐尸還是另有隱情坷澡,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布含蓉,位于F島的核電站频敛,受9級特大地震影響,放射性物質發(fā)生泄漏谴餐。R本人自食惡果不足惜姻政,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岂嗓。 院中可真熱鬧汁展,春花似錦、人聲如沸厌殉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽公罕。三九已至器紧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楼眷,已是汗流浹背铲汪。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留罐柳,地道東北人掌腰。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像张吉,于是被迫代替她去往敵國和親齿梁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內容