Beispiele für Solidity-Smart-Contracts

Solidity ist eine der am häufigsten verwendeten Programmiersprachen für die Entwicklung von Smart Contracts auf der Ethereum-Blockchain. Diese Sprache ermöglicht es Entwicklern, sichere und effiziente Smart Contracts zu erstellen, die eine Vielzahl von Funktionen und Anwendungen unterstützen können. In diesem Artikel werden wir einige grundlegende Beispiele für Solidity-Smart-Contracts durchgehen, die von einfachen Verträgen bis hin zu komplexeren Anwendungen reichen. Wir werden die Syntax der Sprache untersuchen, gängige Muster und Best Practices diskutieren und sehen, wie diese Verträge in der Praxis funktionieren. Die Beispiele werden Schritt für Schritt erklärt, um ein besseres Verständnis für die Erstellung und Implementierung von Smart Contracts zu vermitteln.

Einfacher Storage-Smart-Contract

Dieser Vertrag speichert eine einzelne Zahl auf der Blockchain. Er zeigt grundlegende Konzepte wie das Setzen und Abrufen von Daten.

solidity
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract SimpleStorage { uint256 public storedNumber; function set(uint256 _number) public { storedNumber = _number; } function get() public view returns (uint256) { return storedNumber; } }

Erklärung:

  • pragma solidity ^0.8.0; gibt die Version von Solidity an, die verwendet werden soll.
  • contract SimpleStorage definiert einen neuen Smart Contract namens SimpleStorage.
  • uint256 public storedNumber; ist eine öffentliche Variable, die eine Zahl speichert.
  • function set(uint256 _number) public ist eine Funktion zum Setzen der Zahl.
  • function get() public view returns (uint256) ist eine Funktion zum Abrufen der gespeicherten Zahl.

Erweiterter Storage-Smart-Contract mit Events

Dieser Vertrag erweitert den einfachen Storage-Smart-Contract, indem er ein Event hinzufügt, das ausgelöst wird, wenn eine Zahl gesetzt wird.

solidity
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract StorageWithEvents { uint256 public storedNumber; event NumberUpdated(uint256 newNumber); function set(uint256 _number) public { storedNumber = _number; emit NumberUpdated(_number); } function get() public view returns (uint256) { return storedNumber; } }

Erklärung:

  • event NumberUpdated(uint256 newNumber); definiert ein Event, das bei jeder Änderung der Zahl ausgelöst wird.
  • emit NumberUpdated(_number); löst das Event aus, wenn die Zahl gesetzt wird.

Einfacher Token-Smart-Contract (ERC-20)

Ein ERC-20 Token ist ein Standard für fungible Token auf der Ethereum-Blockchain. Dieser Vertrag implementiert grundlegende Funktionen eines ERC-20 Tokens.

solidity
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract MyToken is IERC20 { string public constant name = "MyToken"; string public constant symbol = "MTK"; uint8 public constant decimals = 18; uint256 private _totalSupply; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; constructor(uint256 initialSupply) { _totalSupply = initialSupply * 10 ** uint256(decimals); _balances[msg.sender] = _totalSupply; emit Transfer(address(0), msg.sender, _totalSupply); } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public override returns (bool) { require(recipient != address(0), "ERC20: transfer to the zero address"); require(_balances[msg.sender] >= amount, "ERC20: transfer amount exceeds balance"); _balances[msg.sender] -= amount; _balances[recipient] += amount; emit Transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { require(spender != address(0), "ERC20: approve to the zero address"); _allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(_balances[sender] >= amount, "ERC20: transfer amount exceeds balance"); require(_allowances[sender][msg.sender] >= amount, "ERC20: transfer amount exceeds allowance"); _balances[sender] -= amount; _balances[recipient] += amount; _allowances[sender][msg.sender] -= amount; emit Transfer(sender, recipient, amount); return true; } }

Erklärung:

  • interface IERC20 definiert die grundlegenden Funktionen eines ERC-20 Tokens.
  • contract MyToken implementiert diese Schnittstelle und fügt zusätzliche Funktionen hinzu.
  • constructor(uint256 initialSupply) initialisiert die Token-Versorgung und weist dem Ersteller des Vertrags den gesamten Anfangsvorrat zu.

Smart-Contract für eine dezentrale Abstimmung

Dieser Smart Contract ermöglicht es Benutzern, an einer Abstimmung teilzunehmen und ihre Stimmen abzugeben.

solidity
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Voting { struct Candidate { uint id; string name; uint voteCount; } mapping(uint => Candidate) public candidates; mapping(address => bool) public voters; uint public candidatesCount; uint public totalVotes; constructor() { addCandidate("Alice"); addCandidate("Bob"); } function addCandidate(string memory name) private { candidatesCount++; candidates[candidatesCount] = Candidate(candidatesCount, name, 0); } function vote(uint candidateId) public { require(!voters[msg.sender], "You have already voted."); require(candidateId > 0 && candidateId <= candidatesCount, "Invalid candidate ID."); voters[msg.sender] = true; candidates[candidateId].voteCount++; totalVotes++; } function getCandidate(uint candidateId) public view returns (string memory name, uint voteCount) { Candidate memory candidate = candidates[candidateId]; return (candidate.name, candidate.voteCount); } }

Erklärung:

  • struct Candidate definiert die Struktur eines Kandidaten.
  • mapping(uint => Candidate) public candidates; speichert die Kandidaten.
  • mapping(address => bool) public voters; speichert, ob ein Benutzer bereits abgestimmt hat.
  • function vote(uint candidateId) public ermöglicht es Benutzern, für einen Kandidaten abzustimmen.

Zusammenfassung

Diese Beispiele zeigen die grundlegenden Funktionen und Konzepte von Solidity-Smart-Contracts. Von einfachen Speichervorgängen bis hin zu komplexen Token-Implementierungen und Abstimmungssystemen, Solidity bietet eine robuste Grundlage für die Entwicklung dezentraler Anwendungen. Die gezeigten Beispiele sind ein guter Ausgangspunkt, um die Fähigkeiten von Solidity zu erlernen und eigene, maßgeschneiderte Smart Contracts zu erstellen.

Beliebte Kommentare
    Derzeit keine Kommentare
Kommentar

0