持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
前言
Solidity 合约类似于面向对象语言中的类。合约中有用于数据持久化的状态变量,和可以修改状态变量的函数。 调用另一个合约实例的函数时,会执行一个 EVM 函数调用,这个操作会切换执行时的上下文,这样,前一个合约的状态变量就不能访问了。
合约的引入
如果我们的合约需要部署很多个给不同的人使用,那么我们就可以使用一个工厂模式的概念,把基础合约定义好,在增加一个工厂合约,用来生产我们的子合约。
如下是一个工厂合约 合约的引入关键字是import,这个合约里我们需要引入SimpleStorage.sol合约来使用,那么只需要import '合约位置'即可导入
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./SimpleStorage.sol";
contract StorageFactory {
SimpleStorage[] public simpleStorageArray;
function createSimpleStorageContract() public {
SimpleStorage simpleStorage = new SimpleStorage();
simpleStorageArray.push(simpleStorage);
}
function sfStore(uint256 _simpleStorageIndex, uint256 _simpleStorageNumber) public {
// Address
// ABI
// SimpleStorage(address(simpleStorageArray[_simpleStorageIndex])).store(_simpleStorageNumber);
simpleStorageArray[_simpleStorageIndex].store(_simpleStorageNumber);
}
function sfGet(uint256 _simpleStorageIndex) public view returns (uint256) {
// return SimpleStorage(address(simpleStorageArray[_simpleStorageIndex])).retrieve();
return simpleStorageArray[_simpleStorageIndex].retrieve();
}
}
createSimpleStorageContract 方法表示创建合约,每调用一次都会创建一个新的合约,并存储在我们的合约数组里。
sfStore 方法表示存储某个数字到对应的合约里。
sfGet 表示通过对应的合约索引,来获取到对应存储的值。
我们这里把工厂合约部署一下,如图所示成功
点击createSimpleStorageContract 方法会马上创建一个合约,
然后获取数组的第一个元素,即打印出了合约地址,即第一个的合约地址显示出来。
接着我们往这个第一个合约里存储值
点击transact,就执行
可以看到sfGet方法能得到对应的值了。
继承和承载
合约中继承的关键字是is
// SPDX-License-Identifier: MIT
pragma solidity 0.8.8;
import "./SimpleStorage.sol";
contract ExtraStorage is SimpleStorage {
function store(uint256 _favoriteNumber) public override {
favouriteNumber = _favoriteNumber + 5;
}
}
这里写了ExtraStorage 合约继承了 SimpleStorage合约,这时候编译合约,会出现
表示函数如果需要重载,要声明对应的关键字,override表示这个函数是重载的函数,要想对应的函数可以给子合约重载,那么父合约的函数应该声明为 virtual,如下
这样编译才会正常通过,即完成了store函数的重载。
总结
正常开发来说,合约肯定是分成了很多文件,互相引入,因此要知道本地合约如何引入,还可以直接通过github引入,同时继承和重载也是常用的。