Beispiele für Solidity-Smart-Contracts
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 namensSimpleStorage
.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