針對ERC20,你真的了解嗎?

• 我們下面使用在線 IDE Remix 來編寫我們的智能合約:簡單的發行 31415926 個 SOT tokens,支持簡單的合約轉賬功能。

• Remix 是以太坊官方推薦和維護的 IDE 環境,支持瀏覽器在線開發、調試、編譯,也支持本地部署該 IDE 環境。

下圖為使用 Remix 開發 SOT 合約的環境:

針對ERC20,你真的瞭解嗎?

在Remix 的 Editor 編輯器主要(通過 tab)顯示了正在打開的一個或多個合約源碼文件,Remix 也會自動編譯合約代碼,如果有編譯錯誤,會在左邊的 compile tab 頁面顯示。remix 的官方文檔 詳細介紹了 remix 的使用。

具體的合約代碼如下:

針對ERC20,你真的瞭解嗎?

針對ERC20,你真的瞭解嗎?

上述代碼支持基本的合約轉賬和合約代理轉賬功能,主要圍繞兩個數據成員balancesallowed 來實現,其中:

balance:主要使用 map 結構緩存賬號的 token 餘額;

allowed:採用二級 map 結構緩存 owner(一級 map key)授權給哪些 spender(二級 map key)可提取的 token 數 value;

編譯和編碼合約為 Java 代碼

因為我們希望能夠通過在 Java 代碼中實現合約的部署和轉賬等功能,因為我們需要將合約轉換成 Java 代碼,這裡採用 web3j 來轉換。

web3j 轉換需要提供合約的 .abi 和 .bin 文件,我們先用 solc 編譯器來生成 sot.abi 和 sot.bin 文件,如下命令:

針對ERC20,你真的瞭解嗎?

可以看到針對每個 contract 類都生成了對應的 .abi 和 .bin 文件。

Remix IDE 中也可以通過查看 details 來獲取對應的 abi 和 bin 文件。如下圖:

針對ERC20,你真的瞭解嗎?

接下來使用 web3j 將合約轉換為 Java 文件:

針對ERC20,你真的瞭解嗎?

生成的 SOT.java 文件中生成了一個派生於 Contract 類的 SOT 合約類,該類中實現了 ERC20 token 規範的那些方法,代碼摘略如下:

針對ERC20,你真的瞭解嗎?

針對ERC20,你真的瞭解嗎?

後續可以將生成的 SOT.java 文件導入至 Java 項目中。

• solidity 編譯器的安裝參考

• web3j 安裝參考

使用 Web3j 部署合約

部署合約之前先要有個自己的錢包賬號的,這個賬號可以用 web3j 的 WalletUtils.generateLightNewWalletFile 來創建,如下:

針對ERC20,你真的瞭解嗎?

剛創建好的錢包賬號中的餘額為 0,而部署合約是需要消耗一定的 ether 的,因此我們得先申請一點 ether,當然我們只能在測試環境下申請,在 rinkeby testnet 中,因為採用的是 PoA(clique) 共識機制,可以通過 faucet 提交如下三個支持的社交媒體的帖子URL,而對應的帖子內容中包括你需要申請 ether 的賬號地址:

• A public tweet on Twittero

• A public Facebook posto

• A public Google+ link

具體的申請內容和方式請參考 How to get on Rinkeby Testnet in less than 10 minutes 的 Step 4。申請成功之後,我們的錢包賬號中就可以查到餘額了,如下為在 etherscan rinkeby testnet 中查看到的賬號信息:

針對ERC20,你真的瞭解嗎?

其中 Transactions Tab 中第一條交易記錄就是在 faucet 申請的 ether 的賬號。

好了,ether 來了,開始使用 web3j 部署 SOT 合約,如下代碼:

針對ERC20,你真的瞭解嗎?

其中 web3 為使用 Web3jFactory.build 構建的實例,如下代碼為連接到 rinkeby 測試網絡

針對ERC20,你真的瞭解嗎?

finalCredentials為通過WalletUtils.load Credentials 從本地 keystore 加載的憑證,如下代碼:

針對ERC20,你真的瞭解嗎?

contract.getContractAddress() 在部署成功 SOT 合約之後返回對應的合約地址。部署成功之後,我們可以查看到對應的合約信息,如下圖:

針對ERC20,你真的瞭解嗎?

該合約信息頁面中顯示了 合約創建者(Contract Creator),ERC20 Token Contract 名稱為 Steven Ocean Token(SOT),以及交易列表中顯示了關聯的首筆交易(To 顯示的為 Contract Creation

),交易信息 如下圖:

針對ERC20,你真的瞭解嗎?

在交易信息的 Input Data 中其實承載的是 SOT 合約的 BIN 代碼。另外,可以查看 SOT token 頁面,如下圖:

針對ERC20,你真的瞭解嗎?

其中顯示了 SOT token 的很多信息,包括如下幾個關鍵信息:

Total Supply:token 總的供應量,這裡為我們發行了 31415926 個 SOT;

ERC20 Contract:展示了 SOT token 對應的合約地址,即我們在上面看到的那個截圖;

Token Holders:Token 持有者,下面的列表展示了持有 SOT 的賬戶地址列表;注:上圖中的 Token Transfers 中的記錄是在下一步(合約轉賬)中完成之後出現的。

合約轉賬 - 給好基友轉點幣

我是 SOT token 的創建者,我給自己發行了 31415926 個 token,下面給好基友轉點過去。繼續使用 web3j 如下代碼:

針對ERC20,你真的瞭解嗎?

調用成功後,會提交到以太坊網絡中,在交易被確認之前,為 pending 狀態,如下圖:

針對ERC20,你真的瞭解嗎?

在交易最終被確認,並被區塊打包之後,如下圖:

針對ERC20,你真的瞭解嗎?

目前 Brahma Wallet 目前已經支持近 600 種 ERC20 Token 資產的管理和轉賬,並且後續還會藉助於 IPFS 技術來動態支持更多優質項目的 ERC20 Token,另外,ERC20 Token 本質上也是智能合約,而因為智能合約漏洞導致的各種“悲劇”事件也一直層出不窮,因此在編寫 ERC20 Token 的過程中,我們還是要注意避免一些常見的安全問題。附:BrahmaWallet 是一個完全開源、去中心化的錢包,真正的讓用戶安全放心的使用,我們錢包的源碼地址是https://github.com/brahmaos/wallet


分享到:


相關文章: