Codieren Sie Ihr erstes DAO
DAOs sind eine effektive und sichere Möglichkeit, mit Gleichgesinnten auf der ganzen Welt zusammenzuarbeiten. DAOs sind wie digitale Organisationen mit einem Bankkonto. Dies könnte der nächste große Trend in der Kryptotechnik sein, und sie könnten die Zukunft von Unternehmen sein
Warum brauchen wir DAOs?
Eine Organisation mit jemandem zu gründen, bei der es um Finanzierung und Geld geht, erfordert viel Vertrauen in die Menschen, mit denen Sie zusammenarbeiten. Aber es ist schwer, jemandem zu vertrauen, mit dem man bisher nur im Internet interagiert hat. Mit DAOs müssen Sie niemandem in der Gruppe vertrauen, sondern nur dem DAO-Code, der zu 100 % transparent und von jedem überprüfbar ist.
Dies eröffnet so viele neue Möglichkeiten für die globale Zusammenarbeit und Koordination.
Token-basierte Mitgliedschaft
Normalerweise völlig genehmigungsfrei, abhängig vom verwendeten Token. Meistens können diese Governance-Token an einer dezentralen Börse zulassungsfrei gehandelt werden. Andere müssen durch die Bereitstellung von Liquidität oder einem anderen „Arbeitsnachweis“ verdient werden. In jedem Fall gewährt das einfache Halten des Tokens Zugang zur Abstimmung.
Wird normalerweise verwendet, um breite dezentrale Protokolle und / oder Token selbst zu steuern.
MakerDAO – Der Token MKR von MakerDAO ist an dezentralen Börsen weit verbreitet. Jeder kann also kaufen, Stimmrecht über die Zukunft des Maker-Protokolls zu haben.
Konfiguration
Wir werden dafür das Hardhat-Framework verwenden; Erstellen Sie zunächst einen Ordner und führen Sie ihn aus
npm init - ja
npm install --save-dev hardhat
Führen Sie im selben Verzeichnis, in dem Sie Hardhat installiert haben, Folgendes aus:
npx Schutzhelm
Und wählen Sie create an empty hardhat.config.js
Installieren Sie schließlich ethers.js und Waffel
npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
Fügen Sie die hervorgehobene Zeile oben in hardhat.config.js hinzu:
require("@nomiclabs/hardhat-waffle");
Erstellen Sie zunächst ein neues Verzeichnis namens Contracts und erstellen Sie innerhalb des Verzeichnisses eine Datei namens GovernanceToken.sol
Wir verwenden openzeppelin für unser Token, also installieren Sie es mit
npm install --save-dev @openzeppelin/contracts
Intelligente Verträge
Als Nächstes erstellen wir unser Governance-Token mit einem maximalen Angebot von 1000 und überschreiben einige der erforderlichen Funktionen.
Lassen Sie uns nun ein Protokoll erstellen, das wir mit diesem Token steuern möchten. Das ist dieser wirklich einfache Box-Vertrag, der dem von uns erstellten DAO gehören wird.
Lassen Sie uns eine Funktion namens store erstellen, die vom DAO aufgerufen werden kann, um die Zustandsvariable zu ändern.
// Verträge/Box.sol
// SPDX-Lizenzkennung: MIT
Pragma Solidität ^0.8.0;
importiere „@openzeppelin/contracts/access/Ownable.sol“;
Vertragsbox ist besitzbar {
uint256 privater Wert;
// Wird ausgegeben, wenn sich der gespeicherte Wert ändert
Ereignis ValueChanged (uint256 newValue);
// Speichert einen neuen Wert im Vertrag
Funktionsspeicher (uint256 newValue) public onlyOwner {
Wert = neuerWert;
emittiere ValueChanged(newValue);
}
// Liest den letzten gespeicherten Wert
function retrieve() öffentliche Ansicht gibt zurück (uint256) {
Rückgabewert;
}
}Als Nächstes erstellen wir unsere Governance-Verträge. Erstellen Sie also in einem Ordner mit dem Namen Governance eine Datei mit dem Namen GovernanceContract.sol. Dieser Vertrag enthält die gesamte Logik für unser DAO.
// SPDX-Lizenzkennung: MIT
Pragma Solidität ^0.8.0;
importieren Sie "@openzeppelin/contracts/governance/Governor.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";
import "../GovernanceToken.sol";
Vertrag GovernorContract ist
Gouverneur,
GouverneurZählenEinfach,
GouverneurStimmen,
GouverneurStimmenQuorumFraktion,
GovernorTimelockControl
{
uint256 öffentlich s_votingDelay;
uint256 öffentlich s_votingPeriod;
Konstrukteur(
GovernanceToken _token,
TimelockController _timelock,
uint256 _quorumPercentage,
uint256 _votingPeriod,
uint256 _votingDelay
)
Gouverneur ("Gouverneursvertrag")
GovernorVotes(_token)
GovernorVotesQuorumFraction(_quorumPercentage)
GovernorTimelockControl(_timelock)
{
s_votingDelay = _votingDelay;
s_votingPeriod = _votingPeriod;
}
Funktion VotingDelay() Überschreiben der öffentlichen Ansicht gibt zurück (uint256) {
Rückgabe s_votingDelay; // 1 = 1 Block
}
Funktion VotingPeriod () Überschreiben der öffentlichen Ansicht gibt zurück (uint256) {
Rückgabe s_votingPeriod; // 45818 = 1 Woche
}
// Die folgenden Funktionen sind Überschreibungen, die von Solidity benötigt werden.
Funktionsquorum (uint256 blockNumber)
Öffentlichkeit
Aussicht
override(IGovernor, GovernorVotesQuorumFraction)
gibt zurück (uint256)
{
super.quorum(blockNumber) zurückgeben;
}
Funktion getVotes (Adresse Konto, uint256 Blocknummer)
Öffentlichkeit
Aussicht
override(IGovernor, GovernorVotes)
gibt zurück (uint256)
{
super.getVotes (Konto, Blocknummer) zurückgeben;
}
Funktionsstatus (uint256 ProposalId)
Öffentlichkeit
Aussicht
überschreiben (Governor, GovernorTimelockControl)
Rückgaben (ProposalState)
{
super.state(proposalId) zurückgeben;
}
Funktion vorschlagen (
address[] Speicherziele,
uint256[] Speicherwerte,
bytes[] Speicheraufrufdaten,
Zeichenfolge Speicherbeschreibung
) public override(Governor, IGovernor) gibt (uint256) zurück {
return super.propose (Ziele, Werte, Aufrufdaten, Beschreibung);
}
Funktion _execute(
uint256 Angebots-ID,
address[] Speicherziele,
uint256[] Speicherwerte,
bytes[] Speicheraufrufdaten,
Bytes32 BeschreibungHash
) interne Überschreibung (Governor, GovernorTimelockControl) {
super._execute(proposalId, Ziele, Werte, Calldatas, descriptionHash);
}
Funktion _cancel(
address[] Speicherziele,
uint256[] Speicherwerte,
bytes[] Speicheraufrufdaten,
Bytes32 BeschreibungHash
) Interne Überschreibung (Governor, GovernorTimelockControl) gibt (uint256) zurück {
return super._cancel(targets, values, calldatas, descriptionHash);
}
Funktion _executor()
intern
Aussicht
überschreiben (Governor, GovernorTimelockControl)
Rückgabe (Adresse)
{
super zurückgeben._executor();
}
Funktion unterstützt Interface (bytes4 interfaceId)
Öffentlichkeit
Aussicht
überschreiben (Governor, GovernorTimelockControl)
gibt zurück (bool)
{
super.supportsInterface(interfaceId) zurückgeben;
}
}
Sie können den openzepplin-Assistenten verwenden, um Ihren Governancevertrag anzupassen
Zuletzt müssen wir eine GovernanceTimelock.sol erstellen. Dies ist der Vertrag, der unser Protokoll einschließlich der Gelder in unserem DAO besitzen wird.
Es werden 3 Eingabeparameter benötigt: eine Mindestverzögerung ist, wie lange Sie warten werden, bevor Sie ausführen, Vorschlagende sind eine Liste von Mitgliedern, die an der Abstimmung teilnehmen können, und Ausführende ist eine Liste von Adressen, die Vorschläge ausführen werden.
// SPDX-Lizenzkennung: MIT
Pragma Solidität ^0.8.0;
import "@openzeppelin/contracts/governance/TimelockController.sol";
Vertrag GovernanceTimeLock ist TimelockController {
// minDelay gibt an, wie lange Sie vor der Ausführung warten müssen
// Proposers ist die Liste der Adressen, die Vorschläge machen können
// Executors ist die Liste der Adressen, die ausgeführt werden können
Konstrukteur(
uint256 minVerzögerung,
address[] Speichervorschläger,
address[] Speicherausführer
) TimelockController(minDelay, Proposer, Executors) {}
}
Zurück zu GovernanceContract.sol nimmt der Konstruktor zwei Parameter: die Governance, die wir erstellt haben, um die Stimmrechte zu bestätigen, und die GovernanceTimelock-Instanz, um unser DAO zu verwalten.
Nun zum Kompilierungslauf:
npx Hardhat kompilieren
Fazit
Das war es also für dieses Codierungs-Tutorial eines DAO.
Wenn Sie mehr über DAOs erfahren möchten, sehen Sie sich dieses Video an, in dem Julien erklärt, wie DAOs funktionieren.
Opmerkingen