Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ethereum Smart Contract Development / ethereum-...

Avatar for Titangene Titangene
October 25, 2018

Ethereum Smart Contract Development / ethereum-smart-contract-development

使用 Truffle 區塊鏈開發框架 + Ganache 自建私有鏈開發 DApp

Avatar for Titangene

Titangene

October 25, 2018
Tweet

Other Decks in Programming

Transcript

  1. [ titangene@stust ~ ] $ cat .profile # author: 郭柏均

    (Titan) # email: [email protected] # blog: https://titangene.github.io # facebook: titangene.blog # github: titangene # date: 2018-10-25 14:00:00 以太坊智能合約開發 Slide
  2. 大綱 • 區塊鏈 (Blockchain) • 以太坊 (Ethereum) • 智能合約 (Smart

    Contract) • Solidity • 開發環境 • Truffle • ganache-cli 1
  3. 區塊鏈 (Blockchain) • 中本聰 在 2008 年,於 Bitcoin: A Peer-to-Peer

    Electronic Cash System 此篇 paper 中提出區塊鏈概 念,作為加密貨幣比特幣的公開交易帳本 • 區塊鏈通常指的是虛擬貨幣 (比特幣、以太幣) 交易網路 所使用的技術 • 比特幣:第一大加密貨幣 • 以太幣:第二大加密貨幣 • 以廣義來說,區塊鏈用多個舊技術的組合技 • 去中心化:分散式帳本 • 共享帳本:P2P、密碼學 (非對稱式加密、雜湊、簽章) 2
  4. EVM (Ethereum Virtual Machine) • EVM 是 Ethereum 提供了一個去中心化的 VM

    來執行智 能合約。利用特定程式語言開發智能合約,再將程式碼 經編譯後轉換成 bytecode,並存至區塊中。 5 ref:Ethereum DApp 初心者之路 (3): 簡介 Ethereum (乙太坊)、Smart Contract (智能合約)
  5. Ethereum Network • 用於轉移資金和儲存資料 • networks 是由一個或多個節點所組成 • 每個節點都是跑 Ethereum

    client 端的主機 • 任何人都可以是節點 • 每個節點都可以包含區塊鏈的完整或單獨副本 • 區塊鏈可視為 DB,用於儲存每筆已發生的交易記錄 6
  6. Ethereum Network 分類 Main net (主網路) • 可以和法定貨幣或其他虛擬貨幣進行交易 • 用於部署正式智能合約的網路

    Private net (私有網路) • 在 local 建立的網路,不需連接 internet • 通常帳戶都是虛擬的,由開發者控制多個虛擬帳戶進行交易或部署合約 • 便於開發,在私網挖礦相對容易,不用等待長時間的驗證 Test net (測試網路) • 用於測試環境,測試網路上的 Ether 沒有實際價值 • 用於完成私有網路的測試後,再發布至主網路前的最後測試 • 需要等待交易驗證 (慢),不建議在測試網路開發智能合約 7
  7. Ethereum 測試網路 Ropsten • 以太坊官方提供的測試網絡 • 使用 PoW (Proof-of-Work,工作量證明) 共識機制

    Kovan • 由以太坊錢包 Parity 的開發團隊發起 • 僅有 Parity 錢包 client 端可以使用這個測試網絡 • 解決測試網絡中 PoW 共識機制的問題,改用權威證明 (Proof- of-Authority,PoA) 共識機制 Rinkeby • 以太坊官方提供的測試網絡 • 使用 PoA 共識機制 • 開發人員常用的測試網路 8
  8. Etherscan • Ethereum Block Explorer • 可方便查看在區塊鏈上發生的交易 • 錢包餘額 •

    錢包、智能合約的交易紀錄、狀態 • 主網路的 Etherscan • 測試網路的 Etherscan • Ropsten • Kovan • Rinkeby 9
  9. Ethereum 帳戶 • 外部帳戶 (External owned accounts,EOAs): • 由使用者所持有的帳戶 •

    包含帳戶地址 (由公鑰產生)、帳戶餘額、私鑰 • 可以通過建立和簽署交易從 EOA 發送訊息 • 合約帳戶 (Contract accounts,CA): • 由 EOA 發行的交易作為 Trigger 來執行智能合約內的 程式碼 • 合約地址是由建立合約時產生的 • 在合約帳戶中,每次合約帳戶收到一條訊息或交易時, 會執行該合約的程式碼,允許其讀取和寫入資料,並發 送其他訊息或依次建立合約 10
  10. Ethereum client • go-ethereum (Golang) • Parity (Rust) • cpp-ethereum

    (C++) • EthereumJ (Java) • ruby-ethereum (Ruby) 使用 go-ethereum 和 Parity 占多數 11
  11. Ethereum 錢包 MetaMask (Web browser extension) • Chrome, Firefox, Opera

    Mist / Ethereum Wallet (Electrum) • Mist 是 Electrum App,也就是帶有 Web 界面的桌面 混合 (hybrid) 應用程式 • Ethereum Wallet 只是 Mist 的一個實作,只能存取 一個 DApp,就是 Ethereum Wallet Ðapp 12
  12. Ethereum 貨幣單位 • Ether 是 Ethereum 的貨幣單位 • 用於支付 EVM

    中的計算 13 Unit Wei value Wei wei 1 wei 1 Kwei (babbage) 103 wei 1,000 Mwei (lovelace) 106 wei 1,000,000 Gwei (shannon) 109 wei 1,000,000,000 microether (szabo) 1012 wei 1,000,000,000,000 milliether (finney) 1015 wei 1,000,000,000,000,000 Ether 1018 wei 1,000,000,000,000,000,000
  13. Gas • 類似燃料 (fuel),用於執行、部署合約,以太坊上 轉賬都需要消耗 Gas • 交易費用 = Gas

    Limit x Gas Price • 一般以 GWei 為單位 (1 GWei = 10-9 ETH) • 交易費用就是礦工挖礦的獎勵 • 交易費用越低交易時間便越長 • 交易時,可以決定 Gas 價格,不能決定 Gas 用量 • 程式越複雜越貴 • out of gas:交易費不夠時,會取消交易 • 交易費還是會被礦工全拿走 14
  14. Solidity • Contract-Oriented Programming Language (智能合約導向的程式語言) • 在以太坊平台上開發智能合約的主要程式語言 • 靜態型別的程式語言

    • 會被編譯成可在 EVM 上執行的 bytecode • 類似 Java 在會被編譯成可在 JVM 上執行的 Java bytecode 17
  15. 開發環境 - 入門版 • Mist (以太坊官方錢包) / MetaMask (瀏覽器外掛錢包) •

    需準備足量的 Ether • Solidity IDE:Remix • 可在線上 IDE 開發、編譯、部署智能合約,並且能發行交易 • web3.js • Ethereum JavaScript API • 實作了通用的 JSON-RPC 規範 • 通過 RPC 呼叫與本地端節點溝通 20
  16. 開發環境 - 框架版 • 編輯器:VS Code • 擴充功能:solidity • 私有鏈:

    • Ganache CLI (以前叫做 TestRPC) • 提供快速方便的測試環境,建立以太坊私有鏈 • 每次執行都會產生 10 組帳戶,而且每組賬戶都有 100 ether,讓你有充 足的 ether 做測試 • 挖礦是自動的 (每個 transaction 執行都是即時的) • Ganache:GUI 版 • 開發框架:Truffle • 可自動化從智能合約的測試到編譯到部署合約再到 app 建置的過程 • 其中不含鏈的建置和操作,所以要搭配 Ganache (或用客戶端軟體自 建一個節點並開放 RPC) • web3.js 21
  17. ABI (Application Binary Interface) • API 和 ABI 都是程式間互動的介面 •

    API:包含程式提供外界存取的 functions、 variables 等 • ABI:程式是被編譯後的 binary code,傳遞是 binary 格式的資料 • ABI 就要描述如何 decode/encode 程式間傳遞 的 binary 資料 28