Solidity 101

智能合約程式設計

ming@Log4Analytics.com


12/13/2016

晚上 6:30-9:00

高雄應用科技大學建工校區中正堂

王銘德

區塊鏈技術日新月異, 本教材僅供參考用, 需配合新資料例如:

Taipei Ethereum Meetup 社團

以色龍 Ethereum 臉書

ethertw.slack.com 討論區

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

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

也就是寫一個所謂的 " 智能合約 “

 

 

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

什麼東西可以寫成或利用智能合約

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

 

例如:

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

Solidity

一種最常用的智能合約程式語言

  • 類似 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

geth -> https://github.com/ethereum/go-ethereum/releases

Solidity 語言特性

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

Mortal

contract mortal {
    address owner;
    function mortal() {

          owner = msg.sender;     }

   
    function kill() {

          if (msg.sender == owner)

     selfdestruct(owner);    }
}

HelloWorld

contract helloworld is mortal {

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

string storeData;


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


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

}

物件導向 - 繼承

格式 (type)

bool

int8, int16, int24 ... int256

uint8, uint16,  ... uint256

uint and int are aliases for uint256 and int256

address

string

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++) { ... }

mappings

  • 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; }

}

Arrays

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
; nameReg.call("register", "MyName"); nameReg.call(bytes4(sha3("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.

如何讓別人執行你的 Contract

[{"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

 
0x141fd413A40a4163A8ecF1A02f902A1abE8ff7c5

 

寄給他們 Contract JSON

按 Show Interface

點擊

Contract Address

Contract JSON Interface

想執行別人的 Contract

點擊

填如地址跟 Contract JSON

Hello Contract

還有 EtherCamp, 正有駭客松比賽

https://hack.ether.camp/

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

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

 

 

Ethereum-based

Bitcoin-based

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

還有哪些 frameworks 可以用嗎?

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

 

Ethereum-based

Q & A

歡迎參加 EtherTW.slack.com 線上討論

https://goo.gl/S6nhKv   <---- 加入 slack

 

通關密語:decentralized

 

 

Taipei Ethereum

Solidity 101 - 智能合約程式語言

By Ming-der Wang

Solidity 101 - 智能合約程式語言

  • 2,946