第一部分·前言
第一部分·前言
想像一下,你正在駕駛著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官網