利用View函数节省Gas
酷炫!现在高级别区块宠物可以拥有特殊技能了,这一定会鼓动我们的玩家去打怪升级的。你喜欢的话,回头我们还能添加更多的特殊技能。
现在需要添加的一个功能是:我们的 DApp 需要一个方法来查看某玩家的整个区块宠物基地 - 我们称之为 getPetsByOwner。
实现这个功能只需从区块链中读取数据,所以它可以是一个 view 函数。这让我们不得不回顾一下“gas优化”这个重要话题。
“view” 函数不花 “gas”
当玩家从外部调用一个view函数,是不需要支付一分 gas 的。
这是因为 view 函数不会真正改变区块链上的任何数据 - 它们只是读取。因此用 view 标记一个函数,意味着告诉 web3.js,运行这个函数只需要查询你的本地以太坊节点,而不需要在区块链上创建一个事务(事务需要运行在每个节点上,因此花费 gas)。web3.js 是一组库,允许我们使用 HTTP、IPC 或 WebSocket 与本地或远程以太坊节点进行交互。
稍后我们将介绍如何在自己的节点上设置 web3.js。但现在,你关键是要记住,在所能只读的函数上标记上表示“只读”的“external view 声明,就能为你的玩家减少在 DApp 中 gas 用量。
注意:如果一个 view 函数在另一个函数的内部被调用,而调用函数与 view 函数的不属于同一个合约,也会产生调用成本。这是因为如果主调函数在以太坊创建了一个事务,它仍然需要逐个节点去验证。所以标记为 view 的函数只有在外部调用时才是免费的。
实战演习
我们来写一个”返回某玩家的整个区块宠物基地“的函数。当我们从 web3.js 中调用它即可显示某一玩家的个人资料页。
这个函数的逻辑有点复杂,我们需要好几个章节来描述它的实现:
创建一个名为 getPetsByOwner 的新函数。它有一个名为 _owner 的 address 类型的参数。
将其申明为 external view 函数,这样当玩家从 web3.js 中调用它时,不需要花费任何 gas。
函数需要返回一个uint [](uint数组)。
先这么声明着,我们将在下一步中填充函数体。


