10、以太坊智能合约开发(编写智能合约的安全性相关和注意事项)

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

你可能感兴趣的:(以太坊开发,区块链,智能合约)