• 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学习网站

  • 相关阅读:
    SAP应用真的不性感么
    从ABAP Netweaver的SICF到SAP Kyma的Lambda Function
    WordPress,SAP Kyma和微信三者的集成
    SAP官方发布的ABAP编程规范
    SAP官方提供的人脸识别API
    第三方应用如何在SAP Kyma上进行服务注册
    Just a Hook
    Backward Digit Sums
    Balanced Substring
    hdu 1358 Period
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/16341493.html
Copyright © 2020-2023  润新知