这是个人学习solidity整理
可支付
我们有决定函数何时和被谁调用的可见性修饰符: private 意味着它只能被合约内部调用;
internal 就像 private 但是也能被继承的合约调用;
external 只能从合约外部调用;
public 可以在任何地方调用,不管是内部还是外部。
我们也有状态修饰符, 告诉我们函数如何和区块链交互:
view 告诉我们运行这个函数不会更改和保存任何数据;
pure 告诉我们这个函数不但不会往区块链写数据,它甚至不从区块链读取数据。这两种在被从合约外部调用的时候都不花费任何gas(但是它们在被内部其他函数调用的时候将会耗费gas)
然后我们有了自定义的 modifiers, 对于这些修饰符我们可以自定义其对函数的约束逻辑
payable 修饰符
payable 方法是让 Solidity 和以太坊变得如此酷的一部分 —— 它们是一种可以接收以太的特殊函数。
在这里,msg.value 是一种可以查看向合约发送了多少以太的方法,另外 ether 是一个內建单元。
提现
写一个函数来从合约中提现以太
可以通过
transfer 函数向一个地址发送以太, 然后 this.balance 将返回当前合约存储了多少以太。 所以如果100个用户每人向我们支付1以太, this.balance 将是100以太。
你可以通过 transfer 向任何以太坊地址付钱。
随机数
用 keccak256 来制造随机数。
Solidity 中最好的随机数生成器是 keccak256 哈希函数.
我们可以这样来生成一些随机数
这个方法首先拿到 now的时间戳、 msg.sender、 以及一个自增数 nonce (一个仅会被使用一次的数,这样我们就不会对相同的输入值调用一次以上哈希函数了)。
然后利用 keccak 把输入的值转变为一个哈希值, 再将哈希值转换为 uint, 然后利用 % 100 来取最后两位, 就生成了一个0到100之间随机数了
这个方法很容易被不诚实的节点攻击
尽管这个方法在以太坊上不安全,在实际中,除非我们的随机函数有一大笔钱在上面,你游戏的用户一般是没有足够的资源去攻击的。