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

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

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

以下是整個系列的概述:

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

自毀程序

有些東西可能會非常非常錯誤,並且使得整個DAO會以某種方式被破壞——無論是通過糟糕的編寫代碼,還是由於參與者太多而無法完成循環。(提案上的選民太多也可能破壞系統;我們實際上沒有采取任何預防措施!)爲了防止發生這種情況,擁有相當於“紅色大按鈕”可能會很有用。首先,讓我們升級我們的StoryDao

function bigRedButton() onlyOwner external {
    active = false;
    withdrawToOwner();
    token.unlockForAll();
}

然後,讓我們可以在代幣合約中立即解鎖所有代幣:

/**
@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;
    }
}

當然,我們需要在合約中添加這個新的地址列表:

address[] touchedByLock;

我們需要升級我們的increaseLockedAmount函數以向此列表添加地址:

/**
@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標誌爲真,否則無法運行某些功能),這應該可以解決問題。沒有人需要在發送合約時浪費錢,每個人的代幣都會被解鎖。

所有者沒有得到人們提交的以太。取而代之的是退出功能變得可用,因此人們可以收回他們的以太,並且每個人都會得到照顧。

現在我們的合約終於可以部署了。

銷燬程序是什麼樣的?

有一個名爲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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章