跳转至

合约

引入合约

// 本地引入
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
    }
}