【CryptoZombies - 1 Solidity 教程】012 继承(Inheritance)和 引用 (import)
程序员文章站
2022-07-14 16:02:57
...
一、前言
看了一些区块链的教程,论文,在网上刚刚找到了一个项目实战,CryptoZombies。
如果你想了解更多有关于机器学习、深度学习、区块链、计算机视觉等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!
二、 继承(Inheritance)
1、讲解
继承是面向对象的一个很重要的一个功能,通过继承,我们可以让我们的代码更加简单,结构也更加好,相关关系也更加明确。在solidity中也有继承(Inheritance)。
例如下面的示例,我们创建一个小狗的合约,并创建一个新的狗宝宝合约来继承它。
contract Dog {
function speak() public returns (string) {
return "woof woof";
}
}
contract BabyDog is Dog {
function eat() public returns (string) {
return "milk";
}
}
由于 BabyDog
是从 Dog
那里 inherits(继承) 过来的。 这意味着当你编译和部署了 BabyDog
,它将可以访问speak()
和eat()
和其他在 Dog
中定义的公共函数。
这可以用于逻辑继承(比如表达子类的时候,Cat
是一种 Animal
)。 但也可以简单地将类似的逻辑组合到不同的合约中以组织代码。
2、实战
1.要求
在 ZombieFactory
下创建一个叫 ZombieFeeding
的合约,它继承自 `ZombieFactory 合约。
2.代码
pragma solidity >=0.5.0 <0.6.0;
contract ZombieFactory {
event NewZombie(uint zombieId, string name, uint dna);
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
mapping (uint => address) public zombieToOwner;
mapping (address => uint) ownerZombieCount;
function _createZombie(string memory _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
zombieToOwner[id] = msg.sender;
ownerZombieCount[msg.sender]++;
emit NewZombie(id, _name, _dna);
}
function _generateRandomDna(string memory _str) private view returns (uint) {
uint rand = uint(keccak256(abi.encodePacked(_str)));
return rand % dnaModulus;
}
function createRandomZombie(string memory _name) public {
require(ownerZombieCount[msg.sender] == 0);
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
// Start here
contract ZombieFeeding is ZombieFactory {
}
三、 引用(import)
1、讲解
这里的引用和python中的引用是一样的,我们可以引用我们写的其他文件中的合约或者函数,因为我们不可能把所有的代码都写在一个文件中。
例如下面的示例,我们在同文件夹下有一个sol文件:mySol.sol,现在我们想在我们这个文件中来引用它。引用的格式如下:
import "./mySol.sol";
引用写在版本号下面,写在其他代码上面,所以在一个新的sol文件中,我们的引用写在如下位置中:
pragma solidity ^0.4.19;
import "./mySol.sol";
contract newSol {
}
2、实战
1.要求
建立了一个多文件架构,并用 import
来读取来自另一个文件中合约的内容,将 zombiefactory.sol
导入到我们的新文件 zombiefeeding.sol
中。
其中zombiefactory.sol
文件内容如下:
pragma solidity >=0.5.0 <0.6.0;
contract ZombieFactory {
event NewZombie(uint zombieId, string name, uint dna);
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
mapping (uint => address) public zombieToOwner;
mapping (address => uint) ownerZombieCount;
function _createZombie(string memory _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
zombieToOwner[id] = msg.sender;
ownerZombieCount[msg.sender]++;
emit NewZombie(id, _name, _dna);
}
function _generateRandomDna(string memory _str) private view returns (uint) {
uint rand = uint(keccak256(abi.encodePacked(_str)));
return rand % dnaModulus;
}
function createRandomZombie(string memory _name) public {
require(ownerZombieCount[msg.sender] == 0);
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
2.代码
pragma solidity >=0.5.0 <0.6.0;
// put import statement here
import "./zombiefactory.sol";
contract ZombieFeeding is ZombieFactory {
}