合约¶
引入合约¶
// 本地引入
import "./path/Demo.sol";
// 通过npm目录引入
import '@openzeppelin/contracts/access/Ownable.sol';
// 通过网址引入
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol';
// 源文件中有多个合约,可以只引入指定合约
import {A} from './path/Demo.sol';
重载 override¶
// virtual关键字表示该方法可以被子合约继承后重载
function store(uint256 _favoriteNumber) public virtual {
favoriteNumber = _favoriteNumber;
}
继承 inheritance¶
https://docs.soliditylang.org/en/latest/contracts.html#inheritance
// 引入合约
import "./Base.sol";
// is关键字来继承合约
contract Demo is Base {
// 使用override关键字重载合约,对父合约的方法进行改写
function store(uint256 _favoriteNumber) public override {
favoriteNumber = _favoriteNumber + 5;
}
}
扩展¶
super
关键字
调用¶
与其他合约交互,需要两个参数
- 合约地址
- 合约
ABI
(Application Binary Interface) 应用程序二进制接口
抽象合约¶
interface¶
msg.sender¶
无论嵌套调用链有多深,msg.sender
始终是最后一个合约的地址。
Ownable¶
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract Ownable {
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "not owner");
_;
}
// 只有当前Owner才能设置新Owner
function setOwner(address _newOwner) external onlyOwner {
require(_newOwner != address(0), "invalid address"); // 新的Owner不要设置为空地址
owner = _newOwner;
}
function onlyOwnerCanCall() external onlyOwner {
// code
}
function anyOneCanCall() external {
// code
}
}
最后更新:
2023-06-01