JOYSO dev update

Hsieh Yung-chen
JOYSO
Published in
4 min readMar 15, 2018

JOYSO 合約架構

考慮到增加 JOYSO 在 Ethereum 上的交易吞吐量,我們必須盡量節省 gas 的使用量。JOYSO主合約只有一個,可以免除大部分的外部合約函式呼叫,除了繼承 OpenZeppelin 提供的常用套件之外 (Ownable.sol, SafeMath.sol, ERC20.sol),我們把大部分 pure 型別的函式切到另一個合約 (JoysoDataDecoder.sol) 來增加可讀性。

在 JOYSO contract 裡,主要函式基本上可分為 deposit, withdraw, match 。其中會影響使得使用者餘額減少的函式 (withdraw, match),會由 admin 發起或是透過 (lock / unlock) 時間鎖來使其為合法。整體架構如下:

關於這樣的編成方式主要原因有幾個:

  1. 節省常用函式所需要花費的gas數量,比如 Ether 與 Token 的 deposit 分成兩個函式。
  2. EVM 提供三個階層的存取控制:Storage, Memory, 以及 Stack。Stack 像 cache 一樣無法直接編程,有 1024 格可用,但多為內部運行所需。只有 16 個的額度可供一個函式使用,意即每個函式能使用到的變數量有限。
  3. Event 可在運行合約時吐出當下狀態,作為開發階段我們會留下大部分的 metadata 用以除錯。但因為其所耗費的 gas 過多,在正式上線後會拿掉。

Functional test

Truffle 提供兩種測試,一種為測試合約 (TestXXX.sol),可以用來做單元測試;另一種為模擬外部行為的腳本測試 (XXXX.sol)。在執行測試的時候,需要模擬 EVM 行為並作出有效簽章即等待交易。testrpc 可有效幫你移除等待時間,可以透過外接 testrpc ,或直接使用 truffle 內建的 testrpc。

除了 testrpc 之外,Ganache 提供類似的功能卻多了 ui 介面,在區塊產生的規則也更彈性。搭配 truffle debug ${transaction hash},可以進到類似 gdb 的模式做一步步的除錯分析。

Ganache
truffle debug

利用 solidity-coverage 搭配 Truffle test 可以做測試的覆蓋率檢查。solidity-coverage 為延伸 Istanbul 實做出合約的覆蓋率測試,具體執行時會需要對合約做預處理,在合約適當的位置插入 Event 。也因為大量的 Event 產生,需要對 EVM 調整所需 gas 數量。同時使用這個方式,會使得某些合約撰寫方式無法使用,如果要使用這個工具要額外注意 。更多 solidity-coverage 介紹

使用 solidity-coverage 會產生結果如下圖:

TestToken.sol 為測試用 ERC20 合約。除了幾個較難實現的 branch 用 assert 來做檢查以外,基本上每個函式都依照我們的預期執行。我們會根據這個結果作 JOYSO 的延伸以及安全性、效率分析。

聯絡方式

如果對 JOYSO 有興趣或有問題可以加入 Telegram ,或是寄信到 support@joyso.io

--

--

Hsieh Yung-chen
JOYSO
Editor for

CTO @ JOYSO project. A PhD student of National Taiwan University. And a dencentralize app developer/researcher.