Solidity学习-知识整理


智能合约的创建和运行
  • 智能合约的代码写完后,要编译成bytecode,是一个图灵完备的编程模型
  • 创建合约:外部账户发起一个转账交易到0x0的地址
    • 转账的金额是0,但是要支付gas费
    • 合约的代码放在data域里
  • 智能合约运行在EVM上
    • EVM有256位寻址空间
  • 以太坊是一个交易驱动的状态机
    • 调用智能合约的交易发布到区块链上后,每个矿工都会执行这个交易,从当前状态确定性地转移到下一个状态

什么是Gas? 

错误处理

  • 智能合约中不存在自定义的try-catch结构
  • 一旦遇到异常,除特殊情况外,本次执行操作全部回滚
  • 可以抛出错误的语句:
    • assert(bool condition): 如果条件不满足就抛出一个用于内部错误
    • require(bool condition): 如果要条件不满足就抛出一个用于输入或者外部组件引起的错误。    
function bit() public payable {
    //对于能接收以太币的函数,keyword: payable是必要的

    //for example:判断拍卖活动是否已结束
    require(now <= auctionEnd);
 }
  • revert(): 终止运行并回滚状态变动
  • 详细解释:

  

智能合约可以获得的区块信息

  • block.blockhash(uint blockNumber) returns (bytes32):指定区块的区块哈希——仅可用于最新的 256 个区块且不包括当前区块;而 blocks 从 0.4.22 版本开始已经不推荐使用,由 blockhash(uint blockNumber) 代替
  • block.coinbase (address): 挖出当前区块的矿工地址
  • block.difficulty (uint): 当前区块难度
  • block.gaslimit (uint): 当前区块 gas 限额
  • block.number (uint): 当前区块号
  • block.timestamp (uint): 自 unix epoch 起始当前区块以秒计的时间戳

智能合约可以获得的调用信息 

  • gasleft() returns (uint256):剩余的 gas
  • msg.data (bytes): 完整的 calldata
  • msg.gas (uint): 剩余 gas - 自 0.4.21 版本开始已经不推荐使用,由 gesleft() 代替
  • msg.sender (address): 消息发送者(当前调用)
  • msg.sig (bytes4): calldata 的前 4 字节(也就是函数标识符)
  • msg.value (uint): 随消息发送的 wei 的数量
  • now (uint): 目前区块时间戳(block.timestamp
  • tx.gasprice (uint): 交易的 gas 价格
  • tx.origin (address): 交易发起者(完全的调用链)

 详情查看 

重入攻击分析 

Solidity好的编程方式 安全考量

  1. 先要判断条件,如使用require
  2. 然后改变条件
  3. 最后再跟别的合约发生交互

很不错的Solidity学习网站