風險提示:防範以"虛擬貨幣""區塊鏈"名義進行非法集資的風險。——銀保監會等五部門
資訊
發現
搜索
登錄
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt
BTC
ETH
HTX
SOL
BNB
查看行情
解構智能合約
2018-12-03 11:51
本文約4852字,閱讀全文需要約7分鐘
和作者一起揭開智能合約的神秘面紗

第一部分·前言


第一部分·前言

想像一下,你正在駕駛著1969年的Mustang Mach在美國西部的公路上快速行駛,陽光照耀在華麗的鍍金輪輞上,整條道路只有你和沙漠,一望無際的地平線見證著你和落日的追逐.. . ...

心曠神怡間,突然一身巨響,你335馬力的快馬被滾滾的白煙吞沒,瞬間變成了蒸汽機車,於是你被迫停在路邊。



你打算看看出現了什麼問題,當你翻開前車蓋,發現自己完全看不懂。你根本就不知道這該死的機器是怎麼工作的,於是你拿起手機準備求救,發現附近沒有信號... ...

上面描述的情形是不是和你正在做的DApp開發很像?在開發Dapp的過程中,在類比中,豪車是你的智能合約,輪輞和改造過的地方是那些經過深思熟慮的小細節。而一旦出現問題,你就需要在智能合約EVM字節碼中尋找答案,大部分情況下你都完全不知道發生了什麼。

如果你是Dapp的開發者,並且遇到過上面的尷尬狀況的話,那麼以後再也不用擔心了!


一級標題

pragma solidity ^0.4.24;

    contract BasicToken {


    uint256 totalSupply_;

    mapping(address => uint256) balances;

    constructor(uint256 _initialSupply) public {

    totalSupply_ = _initialSupply;

    balances[msg.sender] = _initialSupply;

    }


    function totalSupply() public view returns (uint256) {

    return totalSupply_;

    }


    function transfer(address _to, uint256 _value) public returns (bool) {

    require(_to != address(0));

    require(_value <= balances[msg.sender]);

    balances[msg.sender] = balances[msg.sender] - _value;

    balances[_to] = balances[_to] + _value;

    return true;

    }


   function balanceOf(address _owner) public view returns (uint256) {

   return balances[_owner];

   }

}

一級標題


一級標題

編譯合約

為了編譯合約,我們將使用Remix(地址:https://remix.ethereum.org)。

當你打開Remix編譯器,單擊文件瀏覽器區域上方左上角的+按鈕,創建新的智能合約。將文件名設置為BasicToken.sol。創建好之後,將上面的代碼粘貼到編輯器上。

“ version:0.4.24 +commit.e67f0147.Emscripten.clang ”。

在右側,轉到“ Setting”的選項中,確保選中了“ Enable Personal Mode”。另外,要注意選擇的Solidity編譯器版本是

一級標題

608060405234801561001057600080fd5b5060405160208061021783398101604090815290516000818155338152600160205291909120556101d1806100466000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318160ddd811461005b57806370a0823114610082578063a9059cbb146100b0575b600080fd5b34801561006757600080fd5b506100706100f5565b60408051918252519081900360200190f35b34801561008e57600080fd5b5061007073ffffffffffffffffffffffffffffffffffffffff600435166100fb565b3480156100bc57600080fd5b506100e173ffffffffffffffffffffffffffffffffffffffff60043516602435610123565b604080519115158252519081900360200190f35b60005490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b600073ffffffffffffffffffffffffffffffffffffffff8316151561014757600080fd5b3360009081526001602052604090205482111561016357600080fd5b503360009081526001602081905260408083208054859003905573ffffffffffffffffffffffffffffffffffffffff85168352909120805483019055929150505600a165627a7a72305820a5d999f4459642872a29be93a490575d345e40fc91a7cccb2cf29c88bcdaf3be0029

一級標題


一級標題

部署合約

接下來,轉到Remix中的Run部分。首先,確保您使用的是Javascript VM。這基本上是一個嵌入式Javascript EVM +網絡,理想的以太坊訓練場。確保在ComboBox中選擇了BasicToken ,並在Deploy輸入框中輸入數字10000 。接下來,單擊“ Deploy”按鈕進行部署。這部署的是我們創建的BasicToken智能合約實例,最初提供的10000個token由當前在ComboBox帳戶頂部選擇的帳戶擁有,該帳戶會保留我們設置的所有token供應。

在“ Run”選項卡的“Deployed Contracts”中,您可以看到已部署的智能合約,其中包含與合約進行交互的三個字段:transfer,balanceOf和totalSupply。在這裡,我們能夠與剛剛部署的智能合約實例進行交互。

一級標題

一級標題


一級標題

反彙編字節碼

000 PUSH1 80

002 PUSH1 40

004 MSTORE

005 CALLVALUE

006 DUP1

007 ISZERO

008 PUSH2 0010

011 JUMPI

012 PUSH1 00

014 DUP1

015 REVERT

016 JUMPDEST

017 POP

018 PUSH1 40

020 MLOAD

021 PUSH1 20

023 DUP1

024 PUSH2 0217

027 DUP4

028 CODECOPY

029 DUP2

030 ADD

031 PUSH1 40

033 SWAP1

034 DUP2

035 MSTORE

036 SWAP1

037 MLOAD

038 PUSH1 00

040 DUP2

041 DUP2

042 SSTORE

043 CALLER

044 DUP2

045 MSTORE

046 PUSH1 01

048 PUSH1 20

050 MSTORE

051 SWAP2

在控制台中心,transaction框框的右側,有個“ debug”(調試)按鈕。點擊這個按鈕,你將激活Remix右側區域中的Debugger選項。我們可以一起看看Instructions部分,如果向下滾動,應該是出現以下內容:

...(縮寫)

一級標題

0x60 => PUSH

0x01 => ADD

0x02 => MUL

0x00 => STOP

...

一級標題


Opcode

一級標題

在解構智能合約代碼開始之前,你將需要一個基本的工具集理解單個opcode,如PUSH,ADD,SWAP,DUP等的操作碼,到最後,每個操作嗎只能從EVM的堆棧,內存或屬於合約的存儲中壓入一個項或消費一個項。

雖然和大家推薦了這麼多文檔,現在從頭到尾閱讀這些資源沒有什麼意義,你只要記住有這麼個資料就行,我們將在需要的時候使用到它們。

指令

一級標題

88 PUSH1 0x04

| | |

| | Hex value for push.

| Opcode

Instruction number

策略


策略

策略

任何一開始看上去不可能完成的任務,其實都可以通過不斷的拆解,分解成可以解決的任務,我們遇到的問題也不例外,面對這個問題,我所採取的策略就是“分而治之” 。

*本文由Alejandro Santander首發於medium,由獵豹區塊鏈安全翻譯並整理*


獵豹區塊鏈安全以金山毒霸的技術為依托,結合人工智能、nlp等技術,為區塊鏈用戶提供合約審計、情感分析等生態安全服務。

*本文由Alejandro Santander首發於medium,由獵豹區塊鏈安全翻譯並整理*

獵豹區塊鏈安全以金山毒霸的技術為依托,結合人工智能、nlp等技術,為區塊鏈用戶提供合約審計、情感分析等生態安全服務。

獵豹區塊鏈安全以金山毒霸的技術為依托,結合人工智能、nlp等技術,為區塊鏈用戶提供合約審計、情感分析等生態安全服務。您可訪問Ratingtoken官網