文章目录
- cryptozombies合约4
- 私有 / 公共函数
- 实战
- 函数的更多属性
- 返回值
- 函数的修饰符
- 实战
cryptozombies合约4
私有 / 公共函数
Solidity 定义的函数的属性默认为公共。 这就意味着任何一方 (或其它合约) 都可以调用你合约里的函数。
显然,不是什么时候都需要这样,而且这样的合约易于受到攻击。 所以将自己的函数定义为私有是一个好的编程习惯,只有当你需要外部世界调用它时才将它设置为公共。
定义一个私有的函数
uint[] numbers;function _addToArray(uint _number) private {numbers.push(_number);
}
可以看到,在函数名字后面使用关键字== private== 即可。和函数的参数类似,私有函数的名字用==(_)==起始。
实战
改变createZombie 为私有函数,不要忘记遵守命名的规矩哦!
pragma solidity ^0.4.19;contract ZombieFactory {uint dnaDigits = 16;uint dnaModulus = 10 ** dnaDigits;struct Zombie {string name;uint dna;}Zombie[] public zombies;function _createZombie(string _name, uint _dna) private {zombies.push(Zombie(_name, _dna));}
}
函数的更多属性
返回值
要想函数返回一个数值,按如下定义:
string greeting = "What's up dog";function sayHello() public returns (string) {return greeting;
}
Solidity 里,函数的定义里可包含返回值的数据类型(如本例中 string)。
函数的修饰符
上面的函数实际上没有改变 Solidity 里的状态,即,它没有改变任何值或者写任何东西。
这种情况下我们可以把函数定义为== view==, 意味着它只能读取数据不能更改数据:
function sayHello() public view returns (string) {}
Solidity 还支持 pure 函数, 表明这个函数甚至都不访问应用里的数据,例如:
function _multiply(uint a, uint b) private pure returns (uint) {return a * b;
}
这个函数甚至都不读取应用里的状态 — 它的返回值完全取决于它的输入参数,在这种情况下我们把函数定义为 pure.
注:可能很难记住何时把函数标记为 pure/view。 幸运的是, Solidity 编辑器会给出提示,提醒你使用这些修饰符。
实战
创建一个 private 函数,命名为 _generateRandomDna。它只接收一个输入变量 _str (类型 string), 返回一个 uint 类型的数值。
此函数只读取我们合约中的一些变量,所以标记为view。
函数内部暂时留空,以后我们再添加代码。
pragma solidity ^0.4.19;contract ZombieFactory {uint dnaDigits = 16;uint dnaModulus = 10 ** dnaDigits;struct Zombie {string name;uint dna;}Zombie[] public zombies;function _createZombie(string _name, uint _dna) private {zombies.push(Zombie(_name, _dna));}// 这里开始function _generateRandomDna(string _str) private view returns (uint) {}
}