溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

以太坊DAO的概念是什么

發(fā)布時(shí)間:2022-01-15 14:36:51 來(lái)源:億速云 閱讀:293 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“以太坊DAO的概念是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“以太坊DAO的概念是什么”吧!

Decentralized Autonomous Organization,簡(jiǎn)稱DAO,以太坊中重要的概念。一般翻譯為去中心化的自治組織。

“在區(qū)塊鏈上,沒(méi)有人知道你是一臺(tái)冰箱”——理查德布朗

到目前為止,我們列出的所有合約都是由人類持有的其他賬戶擁有和執(zhí)行的。但是在以太坊生態(tài)系統(tǒng)中不存在對(duì)機(jī)器人或人類的歧視,合約可以像任何其他帳戶一樣創(chuàng)造任意行為。合約可以擁有代幣,參與眾籌,甚至是其他合約的投票成員。

在本節(jié)中,我們將建立一個(gè)去中心化的民主組織機(jī)構(gòu),僅存在于區(qū)塊鏈上,但這可以做任何簡(jiǎn)單賬戶所能做到的事情。該組織有一個(gè)中央經(jīng)理,負(fù)責(zé)決定誰(shuí)是成員和投票規(guī)則,但正如我們所看到的,這也可以改變。

這種特殊民主的運(yùn)作方式是它擁有一個(gè)像管理員,首席執(zhí)行官或總統(tǒng)一樣工作的所有者Owner。所有者可以向組織添加(或刪除)投票成員。任何成員都可以提出一個(gè)提議,該提議以以太坊交易的形式發(fā)送以太或執(zhí)行某些合約,其他成員可以投票支持或反對(duì)該提案。一旦預(yù)定的時(shí)間量和一定數(shù)量的成員投票,就可以執(zhí)行提案:合約計(jì)票,如果有足夠的票數(shù),它將執(zhí)行給定的交易。

區(qū)塊鏈大會(huì)

文末附全部代碼。

pragma solidity >=0.4.22 <0.6.0;

contract owned {
    address public owner;

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address newOwner) onlyOwner  public {
        owner = newOwner;
    }
}

contract tokenRecipient {
    event receivedEther(address sender, uint amount);
    event receivedTokens(address _from, uint256 _value, address _token, bytes _extraData);

    function receiveApproval(address _from, uint256 _value, address _token, bytes memory _extraData) public {
        Token t = Token(_token);
        require(t.transferFrom(_from, address(this), _value));
        emit receivedTokens(_from, _value, _token, _extraData);
    }

    function () payable external {
        emit receivedEther(msg.sender, msg.value);
    }
}

interface Token {
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
}

contract Congress is owned, tokenRecipient {
    // Contract Variables and events
    uint public minimumQuorum;
    uint public debatingPeriodInMinutes;
    int public majorityMargin;
    Proposal[] public proposals;
    uint public numProposals;
    mapping (address => uint) public memberId;
    Member[] public members;

    event ProposalAdded(uint proposalID, address recipient, uint amount, string description);
    event Voted(uint proposalID, bool position, address voter, string justification);
    event ProposalTallied(uint proposalID, int result, uint quorum, bool active);
    event MembershipChanged(address member, bool isMember);
    event ChangeOfRules(uint newMinimumQuorum, uint newDebatingPeriodInMinutes, int newMajorityMargin);

    struct Proposal {
        address recipient;
        uint amount;
        string description;
        uint minExecutionDate;
        bool executed;
        bool proposalPassed;
        uint numberOfVotes;
        int currentResult;
        bytes32 proposalHash;
        Vote[] votes;
        mapping (address => bool) voted;
    }
.....
如何部署

打開(kāi)錢(qián)包(如果你只是測(cè)試,請(qǐng)轉(zhuǎn)到菜單開(kāi)發(fā)>網(wǎng)絡(luò)>testnet),轉(zhuǎn)到合約選項(xiàng)卡Contracts ,然后點(diǎn)擊部署合約deploy contract ,在solidity code box上粘貼上面的代碼。在合約選擇器上,選擇Congress ,你將看到設(shè)置變量。

  • 提案的最低法定人數(shù)是提案在執(zhí)行之前需要的最低票數(shù)。

  • 爭(zhēng)論的時(shí)間是在執(zhí)行之前需要經(jīng)過(guò)的最短時(shí)間(以分鐘為單位)。

  • 多數(shù)票的保證金如果超過(guò)50%的票數(shù)加上保證金,則提案通過(guò)。在簡(jiǎn)單多數(shù)時(shí)保留為0,將其設(shè)為成員數(shù)-1要求絕對(duì)共識(shí)。

以太坊DAO的概念是什么

你可以稍后更改這些參數(shù)。首先,你可以選擇5分鐘進(jìn)行辯論,并將剩余參數(shù)保留為0。在頁(yè)面上稍微低一點(diǎn),你將看到在以太網(wǎng)中部署合約的成本估算值。如果要保存,可以嘗試降低價(jià)格,但這可能意味著必須等待更長(zhǎng)時(shí)間才能創(chuàng)建合約。 單擊部署Deploy ,鍵入密碼并等待。

幾秒鐘后,你將被帶到儀表板dashboard,向下滾動(dòng),你將能夠看到正在創(chuàng)建的交易。在不到一分鐘的時(shí)間內(nèi),你將看到交易成功,并且將創(chuàng)建一個(gè)新的唯一圖標(biāo)。單擊合約的名稱以查看它(你可以隨時(shí)在合約選項(xiàng)卡Contracts上找到它)。

以太坊DAO的概念是什么

與他人分享

如果你想與他人共享你的DAO,那么他們需要合約地址和接口文件,這是一個(gè)小文本字符串,作為合約的使用說(shuō)明書(shū)。單擊復(fù)制地址copy address以獲取前者并 顯示界面show interface以顯示后者。

在另一臺(tái)計(jì)算機(jī)上,進(jìn)入合約選項(xiàng)卡Contracts,然后單擊監(jiān)視合約watch contract 。添加正確的地址和界面,然后單擊OK。

以太坊DAO的概念是什么

與合約互動(dòng)

在從合約中讀取Read from contract中,你可以看到合約中可以免費(fèi)執(zhí)行的所有功能,因?yàn)樗鼈冎皇菑膮^(qū)塊鏈中讀取信息。例如,你可以在此處查看合約的當(dāng)前所有者owner(應(yīng)該是上載合約的帳戶)。

在寫(xiě)入合約Write to contract中,你有一個(gè)列表,其中列出了將嘗試進(jìn)行某些計(jì)算以將數(shù)據(jù)保存到區(qū)塊鏈的所有函數(shù),因此將花費(fèi)以太。選擇New Proposal,它將顯示該功能的所有選項(xiàng)。

在與合約交互之前,你需要添加新成員才能投票。 在Select function選擇器上,選擇Add Member。添加你要成為會(huì)員的人的地址(要?jiǎng)h除會(huì)員,請(qǐng)選擇Remove Member功能)。 在execute from時(shí),請(qǐng)確保你擁有與所有者相同的帳戶,因?yàn)檫@只是主要管理員可以執(zhí)行的操作。點(diǎn)擊執(zhí)行execute并等待幾秒鐘,以便下一個(gè)塊進(jìn)行更改。

沒(méi)有成員列表,但你可以通過(guò)將其地址放在Read from contract列的Members功能上來(lái)檢查是否有人是成員。

此外,如果你想讓合約有自己的錢(qián),你需要存入一些以太(或其他代幣),否則你將擁有一個(gè)非常無(wú)聊的組織。按右上角的transfer Ether & Tokens。

添加一個(gè)簡(jiǎn)單的提案:發(fā)送以太

現(xiàn)在讓我們將第一個(gè)提案添加到合約中。在函數(shù)選擇器上,選擇New Proposal

對(duì)于“受益人”,添加你要發(fā)送以太的人的地址,并在標(biāo)有“Wei Amount”的框中輸入你要發(fā)送的數(shù)量。Wei是以太的最小單位,等于10^-18以太,并且必須始終作為整數(shù)給出。例如,如果要發(fā)送1以太,請(qǐng)輸入1000000000000000000(即18個(gè)零)。最后,添加一些描述你要執(zhí)行此操作的原因的文本。暫時(shí)將“Transaction bytecode”留空。單擊執(zhí)行execute并鍵入密碼。幾秒鐘后,numProposals將增加到1,第一個(gè)提案編號(hào)0將出現(xiàn)在左列上。當(dāng)你添加更多提案時(shí),只需將提案編號(hào)放在proposals字段中即可看到其中的任何提案,你可以閱讀所有提案。

投票提案也很簡(jiǎn)單。在函數(shù)選擇器上選擇Vote。在第一個(gè)框中鍵入提議編號(hào),如果你同意,請(qǐng)選中Yes框(或?qū)⑵淞艨找詫?duì)其進(jìn)行投票)。點(diǎn)擊execute發(fā)送你的投票。

以太坊DAO的概念是什么

投票時(shí)間過(guò)后,你可以選擇executeProposal。如果提案只是發(fā)送以太,那么你也可以將transactionBytecode字段留空。在點(diǎn)擊execute之后但在輸入密碼之前,請(qǐng)注意出現(xiàn)的屏幕。

如果estimated fee consumption即估計(jì)費(fèi)用消耗字段上有警告,則表示由于某種原因,被調(diào)用的函數(shù)將不會(huì)執(zhí)行并將突然終止。這可能意味著許多事情,但在本合約的上下文中,只要你在截止日期過(guò)后嘗試執(zhí)行合約,或者用戶嘗試發(fā)送的字節(jié)碼數(shù)據(jù)與原始提案不同,就會(huì)顯示此警告。出于安全原因,如果發(fā)生任何這些事情,合約執(zhí)行將突然終止,并且嘗試非法交易的用戶將失去他發(fā)送的用于支付交易費(fèi)用的所有以太費(fèi)用。

如果交易被執(zhí)行,那么幾秒鐘之后你應(yīng)該能夠看到結(jié)果:執(zhí)行將變?yōu)檎?,并且?yīng)該從該合約的余額和收件人地址中減去正確的以太量。

添加復(fù)雜提案:擁有另一個(gè)代幣

你可以使用此民主方式來(lái)執(zhí)行以太坊上的任何交易,只要你能夠找出該交易生成的字節(jié)碼即可。幸運(yùn)的是,你可以使用錢(qián)包做到這一點(diǎn)!

在這個(gè)例子中,我們將使用一個(gè)代幣來(lái)表明這個(gè)合約可以容納多于以太,并且可以在任何其他基于以太坊的資產(chǎn)中進(jìn)行交易。首先,創(chuàng)建一個(gè)屬于你的普通帳戶的代幣 。在合約頁(yè)面上,單擊轉(zhuǎn)移以太網(wǎng)和代幣以將其中一些轉(zhuǎn)移到新的congress合約中(為簡(jiǎn)單起見(jiàn),不要將超過(guò)一半的硬幣發(fā)送到你的DAO)。之后,我們將模擬你要執(zhí)行的操作。因此,如果你想建議DAO向個(gè)人發(fā)送500毫克黃金代幣作為付款,請(qǐng)按照你從你擁有的帳戶執(zhí)行該交易的步驟,然后點(diǎn)擊send但是當(dāng)確認(rèn)屏幕時(shí)彈出,不要輸入密碼 。

以太坊DAO的概念是什么

而是單擊顯示原始數(shù)據(jù)SHOW RAW DATA鏈接并復(fù)制RAW DATA字段上顯示的代碼并將其保存到文本文件或記事本中。取消交易。你還需要你將要為該操作調(diào)用的合約的地址,在這種情況下是代幣合約。你可以在Contracts選項(xiàng)卡上找到它:將其保存在某處。

現(xiàn)在回到congress合約并使用以下參數(shù)創(chuàng)建新提案:

  • 作為受益人,請(qǐng)?zhí)顚?xiě)你的代幣地址(如果它是相同的圖標(biāo)請(qǐng)注意)。

  • 將以太幣量留空。

  • 在工作描述上,只需寫(xiě)下你想要完成內(nèi)容的描述。

  • Transaction Bytecode上 ,粘貼你在上一步中從數(shù)據(jù)字段中保存的字節(jié)碼。

以太坊DAO的概念是什么

幾秒鐘后,你應(yīng)該能夠看到提案的詳細(xì)信息。你會(huì)注意到交易字節(jié)碼不會(huì)在那里顯示,而是只有一個(gè)交易哈希transaction hash。與其他字段不同,字節(jié)碼可能非常冗長(zhǎng),因此存儲(chǔ)在區(qū)塊鏈上非常昂貴,因此稍后執(zhí)行調(diào)用的人將提供字節(jié)碼,而不是對(duì)其進(jìn)行存檔。

但是,這當(dāng)然會(huì)造成一個(gè)安全漏洞:如果沒(méi)有實(shí)際代碼,投票如何投票?什么阻止用戶在提案投票后執(zhí)行不同的代碼?這就是交易哈希的用武之地。在從合約中讀取read from contract功能列表中滾動(dòng)一下,你會(huì)看到一個(gè)提議檢查功能,任何人都可以放置所有的功能參數(shù)并檢查它們是否與被投票的匹配。這也保證了除非字節(jié)碼的hash與提供的代碼上的hash完全匹配,否則不會(huì)執(zhí)行提議。

以太坊DAO的概念是什么

任何人都可以通過(guò)遵循相同的步驟來(lái)獲取正確的字節(jié)碼,然后將提議編號(hào)和其他參數(shù)添加到從合約中讀取read from contract底部的名為 檢查提案代碼Check proposal code的功能,從而可以非常輕松地檢查提案。

其余的投票過(guò)程保持不變:所有成員都可以投票,在截止日期之后,有人可以執(zhí)行該投標(biāo)。唯一的區(qū)別是,這次你必須提供之前提交的相同字節(jié)碼。注意確認(rèn)窗口上的任何警告:如果它說(shuō)它不會(huì)執(zhí)行你的代碼,請(qǐng)檢查截止日期是否已經(jīng)過(guò)去,是否有足夠的投票以及你的交易字節(jié)碼是否已檢出。

讓它更好

以下是當(dāng)前DAO的一些缺點(diǎn),我們將其作為練習(xí)留給讀者:

  • 你可以將會(huì)員列表公開(kāi)并編入索引嗎?

  • 你能否允許成員改變他們的選票(在投票后但在投票結(jié)果出來(lái)之前)?

  • 目前投票信息僅在日志上可見(jiàn),你是否可以創(chuàng)建一個(gè)顯示所有投票的功能?

======================================================================

分享一些以太坊、EOS、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實(shí)戰(zhàn)教程:

  • java以太坊開(kāi)發(fā)教程,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的web3j詳解。

  • python以太坊,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的詳解。

  • php以太坊,主要是介紹使用php進(jìn)行智能合約開(kāi)發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建、交易、轉(zhuǎn)賬、代幣開(kāi)發(fā)以及過(guò)濾器和交易等內(nèi)容。

  • 以太坊入門(mén)教程,主要介紹智能合約與dapp應(yīng)用開(kāi)發(fā),適合入門(mén)。

  • 以太坊開(kāi)發(fā)進(jìn)階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階。

  • C#以太坊,主要講解如何使用C#開(kāi)發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開(kāi)發(fā)與交互、過(guò)濾器和交易等。

  • EOS教程,本課程幫助你快速入門(mén)EOS區(qū)塊鏈去中心化應(yīng)用的開(kāi)發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢(qián)包、發(fā)行代幣、智能合約開(kāi)發(fā)與部署、使用代碼與智能合約交互等核心知識(shí)點(diǎn),最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開(kāi)發(fā)。

  • java比特幣開(kāi)發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢(qián)包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程。

  • php比特幣開(kāi)發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢(qián)包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程。

  • tendermint區(qū)塊鏈開(kāi)發(fā)詳解,本課程適合希望使用tendermint進(jìn)行區(qū)塊鏈開(kāi)發(fā)的工程師,課程內(nèi)容即包括tendermint應(yīng)用開(kāi)發(fā)模型中的核心概念,例如ABCI接口、默克爾樹(shù)、多版本狀態(tài)庫(kù)等,也包括代幣發(fā)行等豐富的實(shí)操代碼,是go語(yǔ)言工程師快速入門(mén)區(qū)塊鏈開(kāi)發(fā)的最佳選擇。

匯智網(wǎng)原創(chuàng)翻譯,轉(zhuǎn)載請(qǐng)標(biāo)明出處。這里是原文以太坊DAO之區(qū)塊鏈大會(huì)

附代碼:

pragma solidity >=0.4.22 <0.6.0;

contract owned {
    address public owner;

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address newOwner) onlyOwner  public {
        owner = newOwner;
    }
}

contract tokenRecipient {
    event receivedEther(address sender, uint amount);
    event receivedTokens(address _from, uint256 _value, address _token, bytes _extraData);

    function receiveApproval(address _from, uint256 _value, address _token, bytes memory _extraData) public {
        Token t = Token(_token);
        require(t.transferFrom(_from, address(this), _value));
        emit receivedTokens(_from, _value, _token, _extraData);
    }

    function () payable external {
        emit receivedEther(msg.sender, msg.value);
    }
}

interface Token {
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
}

contract Congress is owned, tokenRecipient {
    // Contract Variables and events
    uint public minimumQuorum;
    uint public debatingPeriodInMinutes;
    int public majorityMargin;
    Proposal[] public proposals;
    uint public numProposals;
    mapping (address => uint) public memberId;
    Member[] public members;

    event ProposalAdded(uint proposalID, address recipient, uint amount, string description);
    event Voted(uint proposalID, bool position, address voter, string justification);
    event ProposalTallied(uint proposalID, int result, uint quorum, bool active);
    event MembershipChanged(address member, bool isMember);
    event ChangeOfRules(uint newMinimumQuorum, uint newDebatingPeriodInMinutes, int newMajorityMargin);

    struct Proposal {
        address recipient;
        uint amount;
        string description;
        uint minExecutionDate;
        bool executed;
        bool proposalPassed;
        uint numberOfVotes;
        int currentResult;
        bytes32 proposalHash;
        Vote[] votes;
        mapping (address => bool) voted;
    }

    struct Member {
        address member;
        string name;
        uint memberSince;
    }

    struct Vote {
        bool inSupport;
        address voter;
        string justification;
    }

    // Modifier that allows only shareholders to vote and create new proposals
    modifier onlyMembers {
        require(memberId[msg.sender] != 0);
        _;
    }

    /**
     * Constructor
     */
    constructor (
        uint minimumQuorumForProposals,
        uint minutesForDebate,
        int marginOfVotesForMajority
    )  payable public {
        changeVotingRules(minimumQuorumForProposals, minutesForDebate, marginOfVotesForMajority);
        // It’s necessary to add an empty first member
        addMember(address(0), "");
        // and let's add the founder, to save a step later
        addMember(owner, 'founder');
    }

    /**
     * Add member
     *
     * Make `targetMember` a member named `memberName`
     *
     * @param targetMember ethereum address to be added
     * @param memberName public name for that member
     */
    function addMember(address targetMember, string memory memberName) onlyOwner public {
        uint id = memberId[targetMember];
        if (id == 0) {
            memberId[targetMember] = members.length;
            id = members.length++;
        }

        members[id] = Member({member: targetMember, memberSince: now, name: memberName});
        emit MembershipChanged(targetMember, true);
    }

    /**
     * Remove member
     *
     * @notice Remove membership from `targetMember`
     *
     * @param targetMember ethereum address to be removed
     */
    function removeMember(address targetMember) onlyOwner public {
        require(memberId[targetMember] != 0);

        for (uint i = memberId[targetMember]; i<members.length-1; i++){
            members[i] = members[i+1];
            memberId[members[i].member] = i;
        }
        memberId[targetMember] = 0;
        delete members[members.length-1];
        members.length--;
    }

    /**
     * Change voting rules
     *
     * Make so that proposals need to be discussed for at least `minutesForDebate/60` hours,
     * have at least `minimumQuorumForProposals` votes, and have 50% + `marginOfVotesForMajority` votes to be executed
     *
     * @param minimumQuorumForProposals how many members must vote on a proposal for it to be executed
     * @param minutesForDebate the minimum amount of delay between when a proposal is made and when it can be executed
     * @param marginOfVotesForMajority the proposal needs to have 50% plus this number
     */
    function changeVotingRules(
        uint minimumQuorumForProposals,
        uint minutesForDebate,
        int marginOfVotesForMajority
    ) onlyOwner public {
        minimumQuorum = minimumQuorumForProposals;
        debatingPeriodInMinutes = minutesForDebate;
        majorityMargin = marginOfVotesForMajority;

        emit ChangeOfRules(minimumQuorum, debatingPeriodInMinutes, majorityMargin);
    }

    /**
     * Add Proposal
     *
     * Propose to send `weiAmount / 1e18` ether to `beneficiary` for `jobDescription`. `transactionBytecode ? Contains : Does not contain` code.
     *
     * @param beneficiary who to send the ether to
     * @param weiAmount amount of ether to send, in wei
     * @param jobDescription Description of job
     * @param transactionBytecode bytecode of transaction
     */
    function newProposal(
        address beneficiary,
        uint weiAmount,
        string memory jobDescription,
        bytes memory transactionBytecode
    )
        onlyMembers public
        returns (uint proposalID)
    {
        proposalID = proposals.length++;
        Proposal storage p = proposals[proposalID];
        p.recipient = beneficiary;
        p.amount = weiAmount;
        p.description = jobDescription;
        p.proposalHash = keccak256(abi.encodePacked(beneficiary, weiAmount, transactionBytecode));
        p.minExecutionDate = now + debatingPeriodInMinutes * 1 minutes;
        p.executed = false;
        p.proposalPassed = false;
        p.numberOfVotes = 0;
        emit ProposalAdded(proposalID, beneficiary, weiAmount, jobDescription);
        numProposals = proposalID+1;

        return proposalID;
    }

    /**
     * Add proposal in Ether
     *
     * Propose to send `etherAmount` ether to `beneficiary` for `jobDescription`. `transactionBytecode ? Contains : Does not contain` code.
     * This is a convenience function to use if the amount to be given is in round number of ether units.
     *
     * @param beneficiary who to send the ether to
     * @param etherAmount amount of ether to send
     * @param jobDescription Description of job
     * @param transactionBytecode bytecode of transaction
     */
    function newProposalInEther(
        address beneficiary,
        uint etherAmount,
        string memory jobDescription,
        bytes memory transactionBytecode
    )
        onlyMembers public
        returns (uint proposalID)
    {
        return newProposal(beneficiary, etherAmount * 1 ether, jobDescription, transactionBytecode);
    }

    /**
     * Check if a proposal code matches
     *
     * @param proposalNumber ID number of the proposal to query
     * @param beneficiary who to send the ether to
     * @param weiAmount amount of ether to send
     * @param transactionBytecode bytecode of transaction
     */
    function checkProposalCode(
        uint proposalNumber,
        address beneficiary,
        uint weiAmount,
        bytes memory transactionBytecode
    )
        view public
        returns (bool codeChecksOut)
    {
        Proposal storage p = proposals[proposalNumber];
        return p.proposalHash == keccak256(abi.encodePacked(beneficiary, weiAmount, transactionBytecode));
    }

    /**
     * Log a vote for a proposal
     *
     * Vote `supportsProposal? in support of : against` proposal #`proposalNumber`
     *
     * @param proposalNumber number of proposal
     * @param supportsProposal either in favor or against it
     * @param justificationText optional justification text
     */
    function vote(
        uint proposalNumber,
        bool supportsProposal,
        string memory justificationText
    )
        onlyMembers public
        returns (uint voteID)
    {
        Proposal storage p = proposals[proposalNumber]; // Get the proposal
        require(!p.voted[msg.sender]);                  // If has already voted, cancel
        p.voted[msg.sender] = true;                     // Set this voter as having voted
        p.numberOfVotes++;                              // Increase the number of votes
        if (supportsProposal) {                         // If they support the proposal
            p.currentResult++;                          // Increase score
        } else {                                        // If they don't
            p.currentResult--;                          // Decrease the score
        }

        // Create a log of this event
        emit Voted(proposalNumber,  supportsProposal, msg.sender, justificationText);
        return p.numberOfVotes;
    }

    /**
     * Finish vote
     *
     * Count the votes proposal #`proposalNumber` and execute it if approved
     *
     * @param proposalNumber proposal number
     * @param transactionBytecode optional: if the transaction contained a bytecode, you need to send it
     */
    function executeProposal(uint proposalNumber, bytes memory transactionBytecode) public {
        Proposal storage p = proposals[proposalNumber];

        require(now > p.minExecutionDate                                            // If it is past the voting deadline
            && !p.executed                                                         // and it has not already been executed
            && p.proposalHash == keccak256(abi.encodePacked(p.recipient, p.amount, transactionBytecode))  // and the supplied code matches the proposal
            && p.numberOfVotes >= minimumQuorum);                                  // and a minimum quorum has been reached...

        // ...then execute result

        if (p.currentResult > majorityMargin) {
            // Proposal passed; execute the transaction

            p.executed = true; // Avoid recursive calling
            
            (bool success, ) = p.recipient.call.value(p.amount)(transactionBytecode);
            require(success);

            p.proposalPassed = true;
        } else {
            // Proposal failed
            p.proposalPassed = false;
        }

        // Fire Events
        emit ProposalTallied(proposalNumber, p.currentResult, p.numberOfVotes, p.proposalPassed);
    }
}

感謝各位的閱讀,以上就是“以太坊DAO的概念是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)以太坊DAO的概念是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI