堅牢性共通キーワード
- public、変数および関数は変更でき、変更された関数または変数は任意のコントラクトによって呼び出す (またはアクセスする) ことができ、既定の変数および関数はこのプロパティを使用します。
- プライベート、変数、および関数は変更できます。変更されたものは、現在のコントラクト内のコードによってのみ呼び出す (またはアクセスする) ことができ、それを継承する外部コントラクトまたはサブコントラクトによって呼び出す (またはアクセスする) ことはできません。
- 外部、関数のみを変更でき、変更された関数は現在のコントラクト以外のコントラクトによって呼び出す (またはアクセスする) ことができますが、それ自体およびそれを継承するコントラクトによって呼び出す (またはアクセスする) ことはできません。
- 内部、変数、および関数は変更できます。変更されたものは、現在のコントラクトおよびそれを継承するコントラクトによって呼び出す (またはアクセスする) ことができますが、外部コントラクトによって呼び出す (またはアクセスする) ことはできません。
- ビューは関数のみを変更でき、関数は外部変数を読み取ることができますが、それらを変更することはできません。
- 純粋で、関数を変更することしかできません。関数内で外部変数を読み書きすることはできません。パラメータによって入力されたパラメータ量を読み書きすることしかできません。
ABI (アプリケーション バイナリ インターフェイス): アプリケーション バイナリ インターフェイス
その直感的な形式は Json 文字列の文字列であり、Json には次のキーがあります。
name: 字符串类型,对应的是当前项的名称。name只知道这个项的名称,究竟对于它是函数function还是uint8变量还是什么,并不清楚。
type: 字符串类型,标明当前项的项是什么类型(具体是一个函数还是一个变量)。常见的type有下面的取值
1.function 函数
2. construct 构造函数
3. event 事件
4. 变量类型,如: address, uint8, bool ...
constant: 布尔类型,代表当前项的操作结果是否会被写进区块链上,是则为true,否则为false。
stateMutability: 字符串类型。stateMutability有如下取值
1. pure: 代表不会读和写区块链状态
2. view: 代表会读区块链状态,但是不会改写区块链状态
3. nonpayable: 代表会改写区块链状态,如转账transfer和授权approve这连个ERC20标准的函数就是可以用来改写区块链
payable: 布尔类型,代表当前的函数function是否可以接收ETH Token,可以则为true,否则为false
inputs: 其类型是Json数组,代表当前项入参信息,内部会把每个参数的名称及其所对应的类型列出。一般来说,input会跟随type是function或者事件event而含有值。inputs中的Json变量除了name和type外,还含有如下变量:
1. Indexed,在Solidity代码事件event中,其入参有设置为Indexed关键字,此时Json中的这个变量对应的值为true,反之为false
2. components: 该变量的类型是Json数组,当参数的type是struct结构类型是,该变量就会出现
outputs: 和inputs的含义类似,其类型也是Json数组,代表的是当前项的返回值,内部表达是返回值的名称和类型。inputs和outputs如果没有值,便默认是[]。
anonymous: 布尔类型,它和"标准的事件(Event)"的Indexed的设置有关,当为true的时候,在event中的入参即使是属于Indexed关键字的形式也不会保存到Topic中,为false则会。
ABI を探す
[
{
"inputs":[
{
"internalType":"address",
"name":"_logic",
"type":"address"
},
{
"internalType":"bytes",
"name":"_data",
"type":"bytes"
}
],
"stateMutability":"payable",
"type":"constructor"
},
{
"anonymous":false,
"inputs":[
{
"indexed":false,
"internalType":"address",
"name":"previousAdmin",
"type":"address"
},
{
"indexed":false,
"internalType":"address",
"name":"newAdmin",
"type":"address"
}
],
"name":"AdminChanged",
"type":"event"
},
{
"anonymous":false,
"inputs":[
{
"indexed":true,
"internalType":"address",
"name":"beacon",
"type":"address"
}
],
"name":"BeaconUpgraded",
"type":"event"
},
{
"anonymous":false,
"inputs":[
{
"indexed":true,
"internalType":"address",
"name":"implementation",
"type":"address"
}
],
"name":"Upgraded",
"type":"event"
},
{
"stateMutability":"payable",
"type":"fallback"
},
{
"stateMutability":"payable",
"type":"receive"
}
]
契約基準
スマート コントラクトには多くの種類がありますが、現在のトークン コントラクトの標準は主にERC20とERC721に基づいています。
ERC20規格
ERC20 標準には、メンバー変数、関数、およびイベントが含まれます。
(1) 標準メンバ変数
- 文字列公開名、これはトークンの名前、フルネーム、イーサリアム
- 文字列 パブリック シンボル。これは ETH などの略語です。
- uint8 10 進数、精度、つまり小数点以下の桁数
- uint256 totalSupply, 総供給量
(2) 標準機能と標準イベント
interface IERC20 {
// 这是token的名称,全称,Ethereum
string public name;
// 这是简称,如ETH
string public symbol;
// 精度,即小数点的位数
uint8 decimals;
// 总发行量
uint256 totalSupply;
/*
标准的函数
*/
// 查询totalSupply函数
function totalSupply() external view returns (uint256);
// 查询某用户Token余额函数
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);
/*
标准的事件
// ERC20标准中,规定了在编写转账、授权函数代码时,必须在成功转账后触发事件。
*/
// Transfer在transfer和transferFrom函数内触发
event Transfer(address indexed from, address indexed to, uint256 value);
// 在成功调用approve函数后对应的一个事件
event Approval(address indexed owner, address indexed spender, uint256 value );
}
以下は標準のERC20コントラクトです
contract ERC20 {
// 这是token的名称,全称,Ethereum
string public name;
// 这是简称,如ETH
string public symbol;
// 精度,即小数点的位数
uint8 decimals;
// 总发行量
uint256 totalSupply;
/*
标准的函数
*/
// 查询totalSupply函数
function totalSupply() external view returns (uint256){
};
// 查询某用户Token余额函数
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){
};
/*
标准的事件
// ERC20标准中,规定了在编写转账、授权函数代码时,必须在成功转账后触发事件。
*/
// Transfer在transfer和transferFrom函数内触发
event Transfer(address indexed from, address indexed to, uint256 value);
// 在成功调用approve函数后对应的一个事件
event Approval(address indexed owner, address indexed spender, uint256 value );
}
ERC721規格
ERC721 標準には、メンバー変数、関数、およびイベントが含まれます。契約は主に1対1の関係に基づいています。
(1) メンバー変数
ERC721 と ERC20 のメンバー変数は基本的に同じですが、ERC721 では 10 進変数は必要ありません。
(2) 標準機能と標準イベント
/*
标准的函数
*/
// 查询totalSupply函数
function totalSupply() external view returns (uint256){
};
// 查询某用户Token余额函数
function balanceOf(address account) external view returns (uint256){
};
// 转账函数
function transfer(address recipient, uint256 amount) external returns (bool){
};
// 所有权查询
function ownerOf(uint256 _tokenId) external view returns (uint256 balance){
};
// 授权函数
function approve(address spender, uint256 amount) external returns (bool){
};
// 转账函数
function transferFrom(address sender, address recipient, uint256 amount ) external returns (bool){
};
// 该标准主要的作用是用来检测当前智能合约实现了哪些接口,可以根据interfaceID来查询接口ID,存在返回true,否则返回false
// 该标准函数会消耗gas,至少消耗30000Gas
function supportsInterface(bytes4 _interfaceID) external view returns (bool){
};
// 可选实现函数
function name() public view returns (string name);
function symbol() public view returns (string symbol);
function tokenOfowner(address _owner) external view returns(uin256 [] tokenIds);
function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);
ERC20 と比較して、ERC721 は主に次の機能を備えています。
function ownerOf(uint256 _tokenId) 外部ビューは (uint256 balance){} を返します。
この関数の機能は、tokenIdに従ってトークンの所有者を照会することです。
function tokenOfowner(address _owner) external view returns(uin256 [] tokenIds){};
この関数の機能は、アドレスに従って、アドレスが所有する tokenId を照会することです。
function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl){};
この関数内には、いくつかの基本的な情報であるカスタム文字列があります。たとえば、ここに書かれているのは url で、これは NFT の保存場所へのリンクとして理解できます。
function supportsInterface(bytes4 _interfaceID) 外部ビューは (bool){} を返します。
標準の主な機能は、現在のスマート コントラクトによって実装されているインターフェイスを検出することです. インターフェイス ID は、interfaceID に従ってクエリできます. 存在する場合は true を返し、存在しない場合は false を返します. この標準機能は、少なくとも 30000Gas のガスを消費します。
以下はERC721スマートコントラクトです
contract ERC721 {
// 这是token的名称,全称,Ethereum
string public name;
// 这是简称,如ETH
string public symbol;
// 精度,即小数点的位数
uint8 decimals;
// 总发行量
uint256 totalSupply;
/*
标准的函数
*/
// 查询totalSupply函数
function totalSupply() external view returns (uint256){
};
// 查询某用户Token余额函数
function balanceOf(address account) external view returns (uint256){
};
// 转账函数
function transfer(address recipient, uint256 amount) external returns (bool){
};
// 所有权查询
function ownerOf(uint256 _tokenId) external view returns (uint256 balance){
};
// 授权函数
function approve(address spender, uint256 amount) external returns (bool){
};
// 转账函数
function transferFrom(address sender, address recipient, uint256 amount ) external returns (bool){
};
// 该标准主要的作用是用来检测当前智能合约实现了哪些接口,可以根据interfaceID来查询接口ID,存在返回true,否则返回false
// 该标准函数会消耗gas,至少消耗30000Gas
function supportsInterface(bytes4 _interfaceID) external view returns (bool){
};
// 可选实现函数
function name() public view returns (string name);
function symbol() public view returns (string symbol);
function tokenOfowner(address _owner) external view returns(uin256 [] tokenIds);
function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);
/*
标准的事件
// ERC721标准中,规定了在编写转账、授权函数代码时,必须在成功转账后触发事件。
*/
// Transfer在transfer和transferFrom函数内触发
event Transfer(address indexed from, address indexed to, uint256 value);
// 在成功调用approve函数后对应的一个事件
event Approval(address indexed owner, address indexed spender, uint256 value );
}