iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 15
0
Blockchain

以太坊-探索智能合約的多種面向系列 第 15

Day 15 Solidity 語法類型(一)

  • 分享至 

  • xImage
  •  

Day 15:

1.整數類型
   int64 c;
   uint8 b;
   uint248 e;
   int256 constant a = 8;
   對於 int and uint 可以自行設定佔用空間大小,佔用大小範圍 8 ~ 256,以8個 
   位元為一個單位 .
   uint一般用來做為貨幣數量的類型(Solidity中沒有double 和 float)和日期
  ( unix time ),所以在Solidity中 7/2 = 3 ,小數部份不會顯示出來.

  // 貨幣表示
  uint balance = 1 ether;

  // 時間表示
  uint now = 1 hours;

  // 不支持 float and double
  uint x = 7;
  uint y = 2;
  uint z = x/y; //z = 3;

  // 十六進制整數表示
  uint VERSION_ID = 0x123A1;

  //  宣告整數常數 使用 constant 常數關鍵字
  int constant a = 8; // 一旦初始化後就不可以修改

  /* SOlidity 中沒有內置隨機函數, 必須使用合約建構隨機數功能 */
  Example :
  pragma solidity ^0.4.8;
  contract random{
    function rand(uint min, uint max) public returns (uint){
      uint256 lastBlockNumber = block.number - 1;
      uint256 hashVal = uint256(block.blockhash(lastBlockNumber));
      return hashVal%(min+max) - min;
    }
  }

  // Bool 型態 取值為 true or false
  bool b = true; or var b = true; //類型推斷

2.地址,Address
  // 以太坊中的地址為 160 bit , 20 Byte , 所以可以用 uint160 表示
  address public owner;
  (1). 查看餘額
  owner.balance;
  (2). 發送以太幣有兩種方法 :
  - transfer 從合約發起方,向某個地址轉入以太幣,當地址無效或餘額發起方不足時transfer
             將拋出異常。
  // 向 addressA 轉了一個以太幣
  addressA.transfer(1 ether);
  // or 附帶 Gas
  addressA.transfer.gas(12000)(1 ether);
  - send 是 transfer 的簡單版本. 當合約執行失敗時, send會返回false
  owner.send(SOME_BALANCE); // 失敗時返回 false
  
  使用send時有以下三點需要注意 :
  (1). send函數需要包含在 if 中 , 因為在呼叫 send 函數時 , 合約可能會有函數
       執行,這些函數可能會執行失敗 .
  (2). 在用 send函數發送以太幣之前 , 請先執行減少帳戶餘額的操作 , 因為可能
       會有Recursive call 消耗完餘額的風險.
  (3). 用戶可以重載 send函數 
  Example:
    if(owner.send(SOME_BALANCE)){}
     
    x.transfer(y) == if(!x.send(y))throw; , send 是 transfer的底層實現,
    建議盡可能使用transfer。

3.位元組陣列
	(1).固定(位元組)陣列
    	固定陣列是以bytes加上數字後綴的方式定義,例如bytes2表示2個位元組大 
        小的陣列。
    	位元組可以設定 1 ~ 32 ,最小的遞增單位是 1,例如: bytes1 , bytes2 , 
        bytes3 , ....bytes31 , bytes32。byte默認為bytes1。
    	Example :
    	byte a; /* 等於 bytes1 a */
    	bytes2 b; /* 宣告佔據2個位元的Array */
    	bytes32 c;  /* 宣告佔據32個位元的Array */
    (2). 動態(位元組)陣列
    	● bytes
    	bytes類似byte[],當bytes作為參數時,會自動為傳進的數值配置適合的位元          
        組大小
    	以節省記憶體,所以應該盡量使用bytes。
    	●string (以 UTF-8 格式編碼 )
    	類似於bytes,不提供指定索引的訪問方式。
    	Example:
    	string n = "hello"; /* 字串首與字串尾需要加上雙引號 */
    	n.length; /* 宣告的字串長度 */

上一篇
Day 14 智能合約(三) - 交互
下一篇
Day 16 Solidity 語法類型(二)
系列文
以太坊-探索智能合約的多種面向20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言