以太坊構建DApps系列教程(結束八):啓動StoryDAO

在本系列關於使用以太坊構建DApps教程的第7部分中,咱們展現瞭如何構建應用程序的前端,爲咱們一直在研究的這個Story故事設置和部署UI。是時候進行一些部署並編寫一些最終功能了。php

這是使用以太坊區塊鏈構建去中心化應用程序系列的第八部分。咱們正在建設的項目名爲The Neverending Story。完整的項目能夠在storydao.bitfalls.com找到。它的完整代碼在GitHub上 。前端

如下是整個系列的概述:java

  • 第1部分中,咱們引導你們作了兩個版本的本地區塊鏈進行開發:Ganache版本和完整的私有PoA版本。
  • 第2部分中,咱們構建並部署了TNS代幣。
  • 第3部分,咱們將介紹如何編譯,部署,測試和驗證咱們的自定義TNS代幣,該代幣與全部交易所兼容,可用做常規ERC20代幣。
  • 第4部分中,咱們邁出了開發Story DAO的第一步,包括白名單和測試。
  • 第5部分中,咱們處理向故事Story添加內容,查看如何添加參與者從DAO購買代幣的能力以及向故事中添加提交內容。
  • 第6部分中,咱們將DAO置於最終形式,添加投票,黑名單/取消黑名單,股息分配和撤銷,同時投入一些額外的輔助函數以得到良好的評價標準。
  • 第7部分中,咱們將展現如何構建應用程序的前端,爲咱們一直在研究的這個故事story設置和部署UI。
  • 在最後一部分中,咱們將介紹部署應用程序和編寫一些最終功能的最後步驟。

自毀程序

有些東西可能會很是很是錯誤,而且使得整個DAO會以某種方式被破壞——不管是經過糟糕的編寫代碼,仍是因爲參與者太多而沒法完成循環。(提案上的選民太多也可能破壞系統;咱們實際上沒有采起任何預防措施!)爲了防止發生這種狀況,擁有至關於「紅色大按鈕」可能會頗有用。首先,讓咱們升級咱們的StoryDaonode

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);

調用它將禁用有問題的合約,從區塊鏈的狀態中刪除其代碼並禁用全部功能,同時將該地址中的以太網發送到提供的地址。在咱們的案例中,這不是一個好主意:咱們仍然但願人們可以撤回他們的以太;咱們不想從他們那裏拿走它。此外,直接發送到自殺合約地址的任何以太幣將永遠丟失(燒燬),由於沒有辦法將其取回。

部署合約

要徹底部署智能合約,咱們須要執行如下操做:

  • 部署到主網
  • 將代幣發送到StoryDAO地址
  • 將Token合約的全部權轉讓給StoryDao。

咱們走吧。

主網部署

要部署到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地址

從部署過程當中獲取代幣的地址和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上代幣的合約將對咱們有很大幫助。綠色的複選標記是一條很長的路。

按照該部分中的說明驗證你的合約。請注意,在驗證步驟中,你如今必須將優化器標記爲活動,由於咱們正在優化代碼以實現更便宜的部署!

部署到Web

要部署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

相關文章
相關標籤/搜索