Solidity & ERC 20 & ERC 721
Solidity & ERC 20 & ERC 721
Solidity basic
show code:
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import "./node_modules/@openzeppelin/contracts/token/erc20/ERC20.sol";
import "./node_modules/@openzeppelin/contracts/access/Ownable.sol";
contract abc is ERC20,Ownable{
constructor() ERC20("ABC", "ABC") {
}
// 测试时发钱用
function MintTo(address account,uint256 amount) public onlyOwner returns(uint256) {
// 打钱
_mint(account,amount);
return amount;
}
}
-
代码逻辑无关,带代码结构,以
prama solidity version
开头。 -
定义合约:
contract name {}
-
继承类:
contrack name is parentContract,xxxContract{}
-
构造函数:
constructor() parentConstructor() {}
,如果父类的具备有参构造函数,则必须在构造函数中声明父构造函数 -
定义函数:
function name(params) (puliic/private/internal/external) 函数修饰符 returns(int,string,byte32) {}
,可以看到支持多返回值,其中的internal
表示只有内部可调用,external
表示只有外部可调用
函数修饰符(modifier)
modifier onlySeller(){
require(msg.sender == seller);
_
}
function abort()public onlySeller{
// 逻辑
}
修饰符内的逻辑,会在函数执行前,去执行,函数可以具备多个修饰符。
_
下划线标识函数执行的位置。
事件(event)
event youDoSomeThing(address a,uint b);
function bid() public{
emit youDoSomeThing(xx,xx);
}
事件是能方便调用以太坊虚拟机日志功能的接口。
结构体(struct)
contract name{
struct Order{
uint amount;
address buyer;
address seller;
}
}
结构体是可以将变量划分成组,方便逻辑执行时的自定义类型,这点是不同于 go 中的 struct 的。
接口
/**
* @title Interface for contracts conforming to ERC-721
*/
interface ERC721Interface {
function ownerOf(uint256 _tokenId) external view returns (address _owner);
function approve(address _to, uint256 _tokenId) external;
function getApproved(uint256 _tokenId) external view returns (address);
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
function supportsInterface(bytes4) external view returns (bool);
}
interface NFTMarket{
function createOrder(
address nftAddress,
uint256 assetId,
uint256 price
)external;
}
接口的用法,和 go 的接口使用非常类似,无需显式的实现接口,而是如果合约内实现了接口中的全部函数,那么这个合约就是该接口的实现。
调用另外一个合约接口:
NFTMarket(Market).createOrder(address(this),_currentIndex - 1,price);
这里的 Market
变量是地址类型。
ERC 20
ERC20 是以太坊区块链上的一种代币合约,是一种同质化代币合约。
什么的同质化代币合约,就是普通货币,比如 1+1 = 2 的 RMB,2 = 1 + 1。
非同质化代币合约是 ERC721,非同质化就是不可拆分,最小和最大单位都是 1 ,比如,1 只猫,一只狗,它不能被拆分,也不能被加减。
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
这是 ERC20 合约的全部函数,去网上找找资料去看看,发现还是很简单的。
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
这是 ERC20 合约的事件,一个是转账时触发,一个是授权时触发。
https://ethereum.org/zh/developers/docs/standards/tokens/erc-20/
ERC 721
前面说到了,721 是非同质化的标准。
https://ethereum.org/zh/developers/docs/standards/tokens/erc-721/
function balanceOf(address _owner) external view returns (uint256);
function ownerOf(uint256 _tokenId) external view returns (address);
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
function setApprovalForAll(address _operator, bool _approved) external;
function getApproved(uint256 _tokenId) external view returns (address);
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
这是全部的函数
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
这是全部的事件,也是转账和授权事件。