# PXN合约安全分析：合约间交互和Solidity修饰器`modifier`

By [natQiu](https://paragraph.com/@natqiu) · 2022-05-10

---

这是**NFT黑魔法**第二期作业，关于PXN合约的审计分析和业务逻辑全面分析请参考末尾链接。本篇将主要解释Solidity 构造函数和修饰器知识如何在NFT合约中应用，以PXN合约为例。

合约间交互（contract interact) 是NFT合约发生漏洞原因之一。在Solidity 语言中主要通过构造函数( `constructor`) 和独有的修饰器 （`modifier`)来实现合约限制控制 (Ownable), 从而判断是否禁止合约间交互。

* * *

### 修饰器 （modifier)

是Solidity 专有语法，类似于Python 中的 decorator。 装饰器就是一种语法糖，会使代码显得简洁和直观；同理，修饰器可以声明函数拥有的特性，减少代码冗余。具体而言，`modifier`可作为函数运行前例行检查，例如余额、地址、变量等。这是PXN的主网合约地址， 下面是该合约中`modifier`部分：

![](https://storage.googleapis.com/papyrus_images/8def299e3e4071cc67dd80ce912053ea152e6eaef8b718f1b1f3d207d43abc18.png)

> 定义一个叫做`callerIsUser` 的修饰器，用于检查调用者是否为`msg.sender`地址；如果是的话，继续运行函数主体，否则报错；
> 
> 带有`callerIsUser`修饰函数只能被`msg.sender`地址调用，若被合约地址调用就会报错，从而有效禁止合约间交互。这也是最常用的控制智能合约权限 `Ownable`方法。

### 更多关于OppenZepplinOwnable 标准实现请参考：

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

### 关于PXN合约的审计分析和业务逻辑分析请参考：

[https://mirror.xyz/gamfi.eth/yhwhIWIW6OkDQPoHUxTzXRowsaZvtfj3gqMH\_rHWujc](https://mirror.xyz/gamfi.eth/yhwhIWIW6OkDQPoHUxTzXRowsaZvtfj3gqMH_rHWujc)

### 关注NFT黑魔法Twitter:

[https://twitter.com/MrsZaaa](https://twitter.com/MrsZaaa)

---

*Originally published on [natQiu](https://paragraph.com/@natqiu/pxn-solidity-modifier)*
