# Solidity极简入门: 11. 构造函数和修饰器


By [0xAA](https://paragraph.com/@wtfacademy) · 2022-04-14

---

我最近在重新学solidity，巩固一下细节，也写一个“Solidity极简入门”，供小白们使用（编程大佬可以另找教程），每周更新1-3讲。

欢迎关注我的推特：[@0xAA\_Science](https://twitter.com/0xAA_Science)

WTF技术社群discord，内有加微信群方法：[链接](https://discord.gg/5akcruXrsk)

所有代码和教程开源在github（1024个star发课程认证，2048个star发社群NFT）: [github.com/AmazingAng/WTFSolidity](https://github.com/AmazingAng/WTFSolidity)

* * *

这一讲，我们将用合约权限控制（`Ownable`）的例子介绍solidity语言中构造函数（`constructor`）和独有的修饰器（`modifier`）。

构造函数
----

构造函数（`constructor`）是一种特殊的函数，每个合约可以定义一个，并在部署合约的时候自动运行一次。它可以用来初始化合约的一些参数，例如初始化合约的`owner`地址：

       address owner; // 定义owner变量
    
       // 构造函数
       constructor() public {
          owner = msg.sender; // 在部署合约的时候，将owner设置为部署者的地址
       }
    

修饰器
---

修饰器（`modifier`）是solidity特有的语法，类似于面向对象编程中的`decorator`，声明函数拥有的特性，并减少代码冗余。它就像钢铁侠的智能盔甲，穿上它的函数会带有某些特定的行为。`modifier`的主要使用场景是运行函数前的检查，例如地址，变量，余额等。

![钢铁侠的modifier](https://storage.googleapis.com/papyrus_images/6fead81e344454294d8d3a60f318e40ad49342aa1d6a6e1054cc993b33bbc693.jpg)

钢铁侠的modifier

我们定义一个叫做`onlyOwner`的`modifier`：

       // 定义modifier
       modifier 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`标准实现：

[

openzeppelin-contracts/contracts/access/Ownable.sol at master · OpenZeppelin/openzeppelin-contracts
---------------------------------------------------------------------------------------------------

OpenZeppelin Contracts is a library for secure smart contract development. - openzeppelin-contracts/contracts/access/Ownable.sol at master · OpenZeppelin/openzeppelin-contracts

https://github.com

![](https://storage.googleapis.com/papyrus_images/3dd1af02b0158489530ad460402b5e9a67959c63eebb12bdbf8ce7675fe699fa.png)

](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol)

总结
--

这一讲，我们介绍了solidity中的构造函数和修饰符，并举了一个控制合约权限的`Ownable`合约。

---

*Originally published on [0xAA](https://paragraph.com/@wtfacademy/solidity-11)*
