Solidity 入門

Ming-der Wang, twitter @mingderwang


11/26/2016 9:30-12am

Blockchain Summit 2016, Taipei


Taipei Ethereum

Taipei Ethereum Meetup 社團

以色龍 Ethereum 臉書 討論區

那什麼是 "智能合約"? - Smart Contracts

如何在 Ethereum 網路上開發應用?




注意!  它名字取的不好 (既沒有A.I. 也沒有法律效用)


  • 一件事需要有 trust (“相信") 的時候
  • 需要公開透明, 卻又不能篡改的東西 (比如說, 歷史? No!)
  • 你跟政府有簽合約嗎? 你為何相信政府的鈔票? (美金呢?)



  • 眾籌募資: Digix        , WeiFund,        TheDAO     (名字取的不好, 被"盜“了約 12 億台幣)
  • 選舉, 選委員, 民主投票, 公證, 契約...
  • 網路樂透, 紅利點數
  • 想些超大的應用? 你生活周遭發生的事, 能用智能合約來解決嗎?
  • 其他... (請發揮您最豐富的想像力)



  • 類似 Javascript, 但不是 Javascript
  • 可以編譯成 bytecode 在 Ethereum VM 上執行
  • 程式只能在 blockchain 測試和執行
  • 無需主機, 程式永遠存在(理論上)
  • 須透過 Ethereum-Wallet (Mist) 或 Parity browser 來部署


  • 你至少要安裝一個 Ethereum Wallet

  • 程式編輯與編譯, 可以用網路版

  • 或用你最喜歡的編輯器 vim 也行

  • 最高竿的直接用 web3.js 在 Chrome debugger 裡用 CLI 指令集直接執行也行.

  • 也可用 devtool 介面

Ethereum Wallet

Solidity Realtime Compiler

Chrome devtool

Solidity 語言特性

  • 它也是物件導向程式語言
  • 除了 float 以外, 有各種 types
  • 也有 structs 結構
  • 有 mappings (a kind of arrays)
  • 有 arrays
  • 有一個 address 特殊 object
  • data location 資料放哪?
  • 有 functions and exceptions
  • 說明文件 (英文) 還算清楚


contract mortal {
    address owner;
    function mortal() {

          owner = msg.sender;     }

    function kill() {

          if (msg.sender == owner)

     selfdestruct(owner);    }


contract helloworld is mortal {

    /* helloworld 就會繼承了 mortal 的 kill 功能*/ 

string storeData;

  function set(string x) {
    storeData = x;  }

  function get() constant returns (string data) {
    return storeData;  }


物件導向 - 繼承

格式 (type)


int8, int16, int24 ... int256

uint8, uint16,  ... uint256

uint and int are aliases for uint256 and int256



bytes1bytes2bytes3, ..., bytes32

byte is an alias for bytes1

結構 (struct)

 struct Funder {
    address addr;
    uint amount;
  • 目前不支援浮點運算 float

Explicit Conv. 

int8 y = -3;
uint x = uint(y);

Type Deduction

uint20 x = 0x123;
var y = x;

// y will be unit20 too

uint32 a = 0x12345678;
uint16 b = uint16(a); 
// b will be 0x5678 now
  • The type is only deduced from the first assignment, so the loop in the following snippet is infinite, as i will have the type uint8 and any value of this type is smaller than 2000. for (var i = 0; i < 2000; i++) { ... }


  • Mapping types are declared as mapping (_KeyType => _ValueType), where _KeyType can be almost any type except for a mapping and _ValueType can actually be any type, including mappings.
  • Mappings are only allowed for state variables (or as storage reference types in internal functions).
  • no length

contract MyToken { /* This creates an array with all balances */

mapping (address => uint256) public balanceOf;

function MyToken() {
     balanceOf[msg.sender] =
21000000; }



contract C {
  function f(uint len) {
    uint[] memory a = new uint[](7);
    bytes memory b = new bytes(len);// memory
    // Here we have a.length == 7 and b.length == len
    a[6] = 8;
  • An array of fixed size k and element type T is written as T[k], an array of dynamic size as T[].

Functions and Exceptions

contract Sharer {
    function sendHalf(address addr) returns (uint balance) {
        if (!addr.send(msg.value/2))
            throw; // also reverts the transfer to Sharer
        return this.balance;

address' Methods

address holds a 20 byte value (size of an Ethereum address). Address types also have members, like send()


address x = 0x123;
address myAddress = this;
if (x.balance < 10 && myAddress.balance >= 10) x.send(10);

All contracts inherit the members of address, so it is possible to query the balance of the current contract using this.balance.

if the address is a contract

address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;"register", "MyName");"fun(uint256)")), a);
  • call returns a boolean indicating whether the invoked function terminated (true) or caused an EVM exception (false).
  • delegatecall is to use library code which is stored in another contract.
  • callcode was available that did not provide access to the original msg.sender and msg.value values.


[ { "constant": false, "inputs": [], "name": "kill", "outputs": [], "type": "function" }, { "constant": false, "inputs": [ { "name": "x", "type": "string" } ], "name": "set", "outputs": [], "type": "function" }, { "constant": true, "inputs": [], "name": "get", "outputs": [ { "name": "data", "type": "string", "value": "hello CCLiang" } ], "type": "function" } ]

跟你的 Contract Address



寄給他們 Contract JSON

按 Show Interface


Contract Address

Contract JSON Interface

想執行別人的 Contract


填如地址跟Contract JSON

Hello Contract

我有哪些 DApps 可以參考

還有 EtherCamp, 正有駭客松比賽

我還可以用其他語言寫 S.C. 嗎?

  • Solidity - Javascript/C++ like
  • Serpent - Python-like
  • LLL - Lisp-like
  • EtherScript - Scratch-like
    • ​類似早期的 Lego MindStroms
  • ​eris              -> 改名為 monax 了





  • sidechain, counterparty, chaincode ...
  • ...

還有哪些 frameworks 可以用嗎?

  • web3.js
  • solc (solidity 編譯器)
  • Truffle
  • Embark
  • Dapple & Dappsys



Q & A

歡迎參加 線上討論   <---- 加入slack





Taipei Ethereum

Solidity 入門 - 智能合約程式語言

By Ming-der Wang

Solidity 入門 - 智能合約程式語言

  • 2,470
Loading comments...

More from Ming-der Wang