重构通用逻辑
不管谁调用我们的 battle 函数 —— 我们想确保用户的确拥有他们用来攻击的区块宠物。如果你能用其他人的区块宠物来攻击将是一个很大的安全问题。
你能想一下我们如何添加一个检查步骤来看看调用这个函数的人就是他们传入的 _petId 的拥有者么?
想一想,看看你能不能自己找到一些解决方案。
花点时间…… 参考我们前面课程的代码来获得灵感。
解决方案在下面,提前思考下再来看下面的解决方案。
解决方案
我们在前面的课程里面已经做过很多次这样的检查了。 在 changeName(), changeDna(), 和 mateAndMulitply()里,我们做过这样的检查:
require(msg.sender ==petToOwner[_petId]);
这和我们 battle 函数将要用到的检查逻辑是相同的。 正因我们要多次调用这个检查逻辑,让我们把它移到它自己的 modifier 中来清理代码并避免重复编码。
实战演习
我们回到了 petmating.sol, 因为这是我们第一次调用检查逻辑的地方。让我们把它重构进它自己的 modifier。
创建一个 modifier, 命名为 ownerOf。它将传入一个参数, _petId (一个 uint)。
它的函数体内部使 require msg.sender 等于 petToOwner[_petId], 然后继续这个函数剩下的内容。 如果你忘记了修饰符的写法,可以参考 pethelper.sol。
将这个函数的 mateAndMulitply 定义修改为其使用修饰符 ownerOf。
现在我们使用 modifier了,你可以删除这行了: require(msg.sender ==petToOwner[_petId]);


