solidity学习第四篇

158 阅读2分钟

这是个人学习solidity整理

可支付

我们有决定函数何时和被谁调用的可见性修饰符: private 意味着它只能被合约内部调用;

internal 就像 private 但是也能被继承的合约调用;

external 只能从合约外部调用;

 public 可以在任何地方调用,不管是内部还是外部。

我们也有状态修饰符, 告诉我们函数如何和区块链交互:  view 告诉我们运行这个函数不会更改和保存任何数据;

pure 告诉我们这个函数不但不会往区块链写数据,它甚至不从区块链读取数据。这两种在被从合约外部调用的时候都不花费任何gas(但是它们在被内部其他函数调用的时候将会耗费gas)

然后我们有了自定义的 modifiers, 对于这些修饰符我们可以自定义其对函数的约束逻辑

payable 修饰符

payable 方法是让 Solidity 和以太坊变得如此酷的一部分 —— 它们是一种可以接收以太的特殊函数。

image.png

在这里,msg.value 是一种可以查看向合约发送了多少以太的方法,另外 ether 是一个內建单元。

提现

写一个函数来从合约中提现以太

image.png 可以通过 transfer 函数向一个地址发送以太, 然后 this.balance 将返回当前合约存储了多少以太。 所以如果100个用户每人向我们支付1以太, this.balance 将是100以太。

你可以通过 transfer 向任何以太坊地址付钱。

image.png

随机数

用 keccak256 来制造随机数。 Solidity 中最好的随机数生成器是 keccak256 哈希函数.

我们可以这样来生成一些随机数

image.png

这个方法首先拿到 now的时间戳、 msg.sender、 以及一个自增数 nonce (一个仅会被使用一次的数,这样我们就不会对相同的输入值调用一次以上哈希函数了)。 然后利用 keccak 把输入的值转变为一个哈希值, 再将哈希值转换为 uint, 然后利用 % 100 来取最后两位, 就生成了一个0到100之间随机数了

这个方法很容易被不诚实的节点攻击

尽管这个方法在以太坊上不安全,在实际中,除非我们的随机函数有一大笔钱在上面,你游戏的用户一般是没有足够的资源去攻击的。