Ethereum有两个账户
第一种:
合约账户(contract accounts)
可以接收、和持有资金,但是不能转账,因为没有private key
第二种:
外部拥有账户(externally owned accounts)
可以对资金进行接收、持有、和转账,有private key
应该要知道的
- 1.
payable
关键字表示该函数可以接收funds - 2.
msg.value
关键字表示接收了多少的funds,但是wei - 3.如果把资金转账到了合约账户里,那么这个资金永远取不出来了,因为合约账户没有private key,无法进行transfer
- 4.
address.transfer()
是安全的,会花费2300的gas,遇到错误时,抛出异常 - 5.
address.send()
有时候安全,也会花费2300的gas,遇到错误时,return false(建议使用address.transfer()函数) - 6.
address.call.value()
是非常不安全的,会花费掉所有的gas(一定要避免使用它) - 7.不要使用tx.origin,要使用
msg.sender
msg.sender是函数的调用者caller,tx.origin是调用此合约的上一个来源链上的,可能是其他合约
SafeMath
我们将使用SafeMath来避免对资金的加减乘除的bug[SafeMath](https://github.com/OpenZeppelin/openzeppelin-contracts/blo