本文共 3288 字,大约阅读时间需要 10 分钟。
看了一些区块链的教程,论文,在网上刚刚找到了一个项目实战,CryptoZombies。
如果你想了解更多有关于机器学习、深度学习、区块链、计算机视觉等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!
继承是面向对象的一个很重要的一个功能,通过继承,我们可以让我们的代码更加简单,结构也更加好,相关关系也更加明确。在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
)。 但也可以简单地将类似的逻辑组合到不同的合约中以组织代码。
在 ZombieFactory
下创建一个叫 ZombieFeeding
的合约,它继承自 `ZombieFactory 合约。
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 herecontract ZombieFeeding is ZombieFactory {}
这里的引用和python中的引用是一样的,我们可以引用我们写的其他文件中的合约或者函数,因为我们不可能把所有的代码都写在一个文件中。
例如下面的示例,我们在同文件夹下有一个sol文件:mySol.sol,现在我们想在我们这个文件中来引用它。引用的格式如下:
import "./mySol.sol";
引用写在版本号下面,写在其他代码上面,所以在一个新的sol文件中,我们的引用写在如下位置中:
pragma solidity ^0.4.19;import "./mySol.sol";contract newSol { }
建立了一个多文件架构,并用 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); }}
pragma solidity >=0.5.0 <0.6.0;// put import statement hereimport "./zombiefactory.sol";contract ZombieFeeding is ZombieFactory {}
转载地址:http://vzyni.baihongyu.com/