在本系列關於使用以太坊構建DApps教程的第7部分中,咱們展現瞭如何構建應用程序的前端,爲咱們一直在研究的這個Story故事設置和部署UI。是時候進行一些部署並編寫一些最終功能了。php
這是使用以太坊區塊鏈構建去中心化應用程序系列的第八部分。咱們正在建設的項目名爲The Neverending Story
。完整的項目能夠在storydao.bitfalls.com
找到。它的完整代碼在GitHub上 。前端
如下是整個系列的概述:java
有些東西可能會很是很是錯誤,而且使得整個DAO會以某種方式被破壞——不管是經過糟糕的編寫代碼,仍是因爲參與者太多而沒法完成循環。(提案上的選民太多也可能破壞系統;咱們實際上沒有采起任何預防措施!)爲了防止發生這種狀況,擁有至關於「紅色大按鈕」可能會頗有用。首先,讓咱們升級咱們的StoryDao
:node
function bigRedButton() onlyOwner external { active = false; withdrawToOwner(); token.unlockForAll(); }
而後,讓咱們能夠在代幣合約中當即解鎖全部代幣:python
/** @dev unlocks the tokens of every user who ever had any tokens locked for them */ function unlockForAll() public onlyOwner { uint256 len = touchedByLock.length; for (uint256 i = 0; i < len; i++) { locked[touchedByLock[i]] = 0; } }
固然,咱們須要在合約中添加這個新的地址列表:android
address[] touchedByLock;
咱們須要升級咱們的increaseLockedAmount
函數以向此列表添加地址:git
/** @dev _owner will be prevented from sending _amount of tokens. Anything beyond this amount will be spendable. */ function increaseLockedAmount(address _owner, uint256 _amount) public onlyOwner returns (uint256) { uint256 lockingAmount = locked[_owner].add(_amount); require(balanceOf(_owner) >= lockingAmount, "Locking amount must not exceed balance"); locked[_owner] = lockingAmount; touchedByLock.push(_owner); emit Locked(_owner, lockingAmount); return lockingAmount; }
咱們還應該更新StoryDao
合約中代幣所需的接口,以包含這個新函數的簽名:程序員
// ... function getUnlockedAmount(address _owner) view public returns (uint256); function unlockForAll() public; }
使用咱們以前添加的活動故事塊(除非故事的active
標誌爲真,不然沒法運行某些功能),這應該能夠解決問題。沒有人須要在發送合約時浪費錢,每一個人的代幣都會被解鎖。github
全部者沒有獲得人們提交的以太。取而代之的是退出功能變得可用,所以人們能夠收回他們的以太,而且每一個人都會獲得照顧。web
如今咱們的合約終於能夠部署了。
有一個名爲selfdestruct
的函數能夠銷燬合約。它看起來像這樣:
selfdestruct(address);
調用它將禁用有問題的合約,從區塊鏈的狀態中刪除其代碼並禁用全部功能,同時將該地址中的以太網發送到提供的地址。在咱們的案例中,這不是一個好主意:咱們仍然但願人們可以撤回他們的以太;咱們不想從他們那裏拿走它。此外,直接發送到自殺合約地址的任何以太幣將永遠丟失(燒燬),由於沒有辦法將其取回。
要徹底部署智能合約,咱們須要執行如下操做:
咱們走吧。
要部署到mainnet
,咱們須要在truffle.js
文件中添加一個新網絡:
mainnet: { provider: function() { return new WalletProvider( Wallet.fromPrivateKey( Buffer.from(PRIVKEY, "hex")), "https://mainnet.infura.io/"+INFURAKEY ); }, gasPrice: w3.utils.toWei("20", "gwei"), network_id: "1", },
幸運的是,這很是簡單。它與Rinkeby部署幾乎相同;咱們只須要移除gas量(讓它本身計算)並改變gas價格。咱們還應該將網絡ID更改成1,由於這是主網ID。
咱們這樣使用:
truffle migrate --network mainnet
這裏有一點須要注意。若是你在先前部署的網絡上進行部署(即便你剛剛將代幣部署到主網上並但願稍後部署StoryDao),你可能會收到此錯誤:
Attempting to run transaction which calls a contract function, but recipient address XXX is not a contract address
之因此發生這種狀況,是由於Truffle會記住部署已經部署的合約的位置,以便它能夠在後續遷移中重複使用它們,從而避免從新部署。可是若是你的網絡從新啓動(即Ganache)或者你進行了一些不兼容的更改,可能會發生它保存的地址實際上再也不包含此代碼,所以會報錯。你能夠經過重置遷移來解決此問題:
truffle migrate --network mainnet --reset
從部署過程當中獲取代幣的地址和StoryDao的地址。
而後只需使用前面描述的MEW來發送代幣。
若是出現gas缺失,只需增長gas限制便可。請記住:剩餘的未使用的gas老是會退回來,因此不用擔憂會損失比交易成本更多的錢(發送代幣應該低於40000gas)。
將代幣的全部權轉讓給StoryDao要轉移全部權,咱們須要在代幣上調用transferOwnership
函數。讓咱們將代幣加載到MEW中。在Contracts
屏幕中,咱們輸入地址和合約的ABI(從/build文件夾中獲取)。而後單擊Access
將容許咱們在菜單中訪問該合約中的功能,咱們從中選擇transferOwnership
。
提示:僅包含你要調用的函數的ABI就足夠了,它沒必要是代幣的整個ABI!你能夠只包括transferOwnership
函數的ABI,它就沒事了!
而後咱們選擇新的全部者(已部署的StoryDao的地址)並解鎖當前全部者的錢包(咱們以前發送的錢包相同的錢包)。
寫完此更改後,咱們能夠檢查代幣合約中的只讀功能owner
(與transferOwnership
相同的菜單)。它應該如今顯示新的全部者。
爲了確保StoryDao地址實際上有代幣,咱們能夠選擇balanceOf
函數並在_owner
字段中輸入StoryDao的地址,而後單擊Read
:
事實上,StoryDao地址中有1億個代幣。
提示:咱們也能夠在部署步驟中完成代幣發送和全部權轉移。嘗試弄清楚如何在測試環境中。
根據本系列的第3部分,驗證DAO和Etherscan上代幣的合約將對咱們有很大幫助。綠色的複選標記是一條很長的路。
按照該部分中的說明驗證你的合約。請注意,在驗證步驟中,你如今必須將優化器標記爲活動,由於咱們正在優化代碼以實現更便宜的部署!
要部署StoryDao的Web UI,請按照「常規」Web開發世界中的說明進行操做。由於,在這種狀況下,全部的都是靜態代碼,你甚至能夠在GitHub頁面或相似的東西上託管它。
頁面啓動後,配置UI以使用咱們從遷移步驟得到的合約地址。或者,註冊代幣和StoryDao的ENS名稱,你能夠保持Web UI靜態和固定,硬編碼地址,而後只更改ENS名稱所指向的以太坊地址。
DAO教程到此結束。咱們但願它能幫助你認識到Solidity開發的複雜性,但咱們也但願它能讓事情更加清晰,讓你更加好奇。
一如既往,最好的學習方式就是作。實驗,犯錯,重啓和重建。這種類型的區塊鏈開發需求量很大,並且它愈來愈受歡迎,因此你有機會接觸到底層。
祝好運!
======================================================================
分享一些以太坊、EOS、比特幣等區塊鏈相關的交互式在線編程實戰教程:
- java以太坊開發教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智能合約開發交互,進行帳號建立、交易、轉帳、代幣開發以及過濾器和交易等內容。
- 以太坊入門教程,主要介紹智能合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括帳戶管理、狀態與交易、智能合約開發與交互、過濾器和交易等。
- EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、帳戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- tendermint區塊鏈開發詳解,本課程適合但願使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操代碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裏是原文以太坊構建DApps系列教程(八):啓動StoryDAO