自己做家具的网站,一个网站的制作过程,wordpress 百度不收录,常熟智能网站开发Solidity 小白教程#xff1a;11. 构造函数和修饰器
这一讲#xff0c;我们将用合约权限控制#xff08;Ownable#xff09;的例子介绍solidity语言中构造函数#xff08;constructor#xff09;和独有的修饰器#xff08;modifier#xff09;。
构造函数
构造函数11. 构造函数和修饰器
这一讲我们将用合约权限控制Ownable的例子介绍solidity语言中构造函数constructor和独有的修饰器modifier。
构造函数
构造函数constructor是一种特殊的函数每个合约可以定义一个并在部署合约的时候自动运行一次。它可以用来初始化合约的一些参数例如初始化合约的owner地址
address owner; // 定义owner变量// 构造函数constructor() {owner msg.sender; // 在部署合约的时候将owner设置为部署者的地址}注意⚠️构造函数在不同的 solidity 版本中的语法并不一致在 Solidity 0.4.22 之前构造函数不使用 constructor 而是使用与合约名同名的函数作为构造函数而使用由于这种旧写法容易使开发者在书写时发生疏漏例如合约名叫 Parents构造函数名写成 parents使得构造函数变成普通函数引发漏洞所以 0.4.22 版本及之后采用了全新的 constructor 写法。 构造函数的旧写法代码示例
pragma solidity 0.4.21;
contract Parents {// 与合约名Parents同名的函数就是构造函数function Parents () public {}
}修饰器
修饰器modifier是solidity特有的语法类似于面向对象编程中的decorator声明函数拥有的特性并减少代码冗余。它就像钢铁侠的智能盔甲穿上它的函数会带有某些特定的行为。modifier的主要使用场景是运行函数前的检查例如地址变量余额等。 我们来定义一个叫做 onlyOwner 的 modifier
// 定义modifiermodifier onlyOwner {require(msg.sender owner); // 检查调用者是否为owner地址_; // 如果是的话继续运行函数主体否则报错并revert交易}带有onlyOwner修饰符的函数只能被owner地址调用比如下面这个例子
function changeOwner(address _newOwner) external onlyOwner{owner _newOwner; // 只有owner地址运行这个函数并改变owner}我们定义了一个changeOwner函数运行他可以改变合约的owner但是由于onlyOwner修饰符的存在只有原先的owner可以调用别人调用就会报错。这也是最常用的控制智能合约权限的方法。
OppenZepplin 的 Ownable 标准实现
OppenZepplin是一个维护solidity标准化代码库的组织他的Ownable标准实现如下 https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
Remix 演示示例
以 Owner.sol 为例。
在 Remix 上编译部署代码。点击 owner 按钮查看当前 owner 变量。以 owner 地址的用户身份调用 changeOwner 函数交易成功。以非 owner 地址的用户身份调用 changeOwner 函数交易失败因为 modifier onlyOwner 的检查语句不满足。
总结
这一讲我们介绍了solidity中的构造函数和修饰符并举了一个控制合约权限的Ownable合约。