iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
1
Blockchain

區塊練起來-智能合約與DApp開發系列 第 12

[區塊練起來-智能合約與DApp開發] DAY 12 - Solidity 特殊變數

  • 分享至 

  • xImage
  •  

貼心小語

前一篇學習了函式庫的撰寫與串接方式,我們已經可以靠前面所學的東西做一些簡單的應用了,不過其實 Solidity 還有一些特殊的變數可以使用,讓我們一探究竟吧!


什麼是特殊變數?

特殊變數只存在於以太坊的執行環境中,是以太坊提供的內建函式庫與保留字,不用特別宣告就可以使用該變數提供的功能。

訊息(msg)

這個大家都不陌生吧!前面其實有出現過,用來做合約權限的時候有使用到,提供的方法有:

  • msg.sender :呼叫合約的帳戶位址,型別為 address ,如果在 constructor 時使用 msg.sender ,就意味著該帳戶位址就是合約發起人,所以可以利用這點來設置權限管理
  • msg.data :取得完整的 calldata ,型別為 bytes
  • msg.sig :取得 calldata 的前4個bytes,型別為 bytes4
  • msg.value :呼叫合約中的函式時所付的以太幣,單位是 wei ,型別為 uint

交易(tx)

  • tx.gasprice :交易的 Gas Price ,型別為 uint
  • tx.origin :交易發起者,型別為 address

區塊(block)

  • block.number :區塊的編號,型別為 uint
  • block.coinbase :當前區塊的礦工帳戶,型別為 address
  • block.timestamp :當前區塊的時間戳記,亦可使用 now 來取得,型別為 uint
  • block.difficulty :當前區塊的困難度,型別為 uint
  • block.gaslimit :當前區塊的 Gas Limit ,型別為 uint

內建函式

  • gasleft() :剩餘的 Gas ,回傳型別為 uint
  • blockhash(uint) :取得該區塊編號的 blockhash ,只能使用在最近的256個區塊,回傳型別為 bytes32
  • keccak256(bytes memory) :用 Ethereum-SHA-3 計算傳入值的雜湊值,回傳型別為 bytes32
  • sha256(bytes memory) :用 SHA-256 計算傳入值的雜湊值,回傳型別為 bytes32
  • ripemd160(bytes memory) :用 RIPEMD-160 計算傳入值的雜湊值,回傳型別為 bytes20
  • addmod(uint x, uint y, uint k) :加法函式,計算式為(x + y) % k ,k不等於0,回傳型別為 uint
  • mulmod(uint x, uint y, uint k) :乘法函式,計算式為(x * y) % k,k不等於0,回傳型別為 uint

金融相關

  • {{ address }}.balance :該位址所持有的以太幣,單位為 wei ,型別為 uint256
  • {{ address payable }}.send(uint256) :將給定的以太幣數量發送給該帳戶,單位為 wei ,會花費 2300 Gas,回傳型別為 bool ,若為 false 表示失敗,需要另外寫判斷式做處理
  • {{ address payable }}.transfer(uint256) :將給定的以太幣數量發送給該帳戶,單位為 wei ,會花費 2300 Gas,發生錯誤時會 throw

合約相關

  • this :跟 JAVA 的 this 差不多,在 Solidity 中的 this 是指合約本身
  • super :繼承合約時會使用到,當呼叫 super 中的函式時,表示呼叫被繼承之合約的該函式
  • selfdestruct(address) :銷毀合約,把合約中的錢轉到指定的位址

今日小結

今天介紹了 Solidity 中的特殊變數與一些函式,大多數都是其他程式語言所沒有的,畢竟什麼區塊、交易之類的東西是區塊鏈獨有的XD,總而言之,這些特殊變數與函式其實蠻常使用到的,務必要熟悉!


參考資料

Solidity 官方文檔


上一篇
[區塊練起來-智能合約與DApp開發] DAY 11 - Solidity 函式庫
下一篇
[區塊練起來-智能合約與DApp開發] DAY 13 - 實戰智能合約!區塊鏈履歷(1)
系列文
區塊練起來-智能合約與DApp開發31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言