简单合约分析

251 阅读3分钟

以下是本人专业《Dapp设计与开发》实践课内容,如有错误,请多多指教。

一.使用Solidity编写智能合约

合约名字为自己姓名的全拼,合约内容为:

  • 获取一个地址的CBI余额;
  • 获取一个区块的哈希值;
  • 获取上一个区块的哈希值;
  • 获取当前的时间戳;
  • 获取当前区块的高度;
  • 获取当前区块的难度(difficulty);
  • 获取当前区块的gas limit;
  • 获取当前区块的coinbase账户;

二. 合约分析

上述所提的每个内容对应一个方法,共8个方法。区块哈希,地址余额,时间戳等属性都是区块固有属性,在solidity中都有对应的属性直接调用。

  • blockhash(uint blockNumber)
  • block.coinbase (address): 当前块所属旷工地址
  • block.difficulty (uint): 当前块难度
  • block.gaslimit (uint): 当前块汽油上限
  • block.number (uint): 当前块号
  • block.timestamp (uint): 当前块的时间戳,UNIX时代以来的秒
  • gasleft() returns (uint256): 剩余汽油.在0.4.21版本,将msg.gas (uint)替换
  • msg.data (bytes): 提交的完整数据
  • msg.sender (address): 发送者
  • msg.sig (bytes4): calldata的前4个字节
  • msg.value (uint): 发送信息使用的wei数量
  • now (uint): 当前块的时间戳 (即 block.timestamp)
  • tx.gasprice (uint): 汽油的交易价格
  • tx.origin (address): 交易发送者

1.获取一个地址的CBI余额

function getEthBalance(address addr) public view returns(uint256 balance){
        balance = addr.balance;
}

2.获取一个区块的哈希,注意不是当前区块哈希

function getBlockHash(uint256 blockNumber)public view returns (bytes32 blockHash){
        blockHash = blockhash(blockNumber);
}

3.获取上一个区块哈希

想要获取上一个区块哈希,需要通过调用当前block.number-1得到上一个区块号

function getLastBlockHash() public view returns (bytes32 blockHash) {
        blockHash = blockhash(block.number - 1);
}

4.获取当前的时间戳

function getCurrentBlockTimestamp() public view returns (uint256 timestamp){
        timestamp = block.timestamp;
 }

5.获取当前区块的高度

当前区块高度就等于区块号

 function getCurrentBlockNumber() public view returns (uint256 number) {
        number = block.number;
}

6.获取当前区块的难度(difficulty)

 function getCurrentBlockDifficulty() public view returns (uint256 difficulty) {
        difficulty = block.difficulty;
}

7.获取当前区块的gas limit

 function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) {
        gaslimit = block.gaslimit;
}

8.获取当前区块的coinbase账户

coinbase指的是第一次将交易打包到区块并将其广播的矿工位置

 function getCurrentBlockCoinbase() public view returns (address coinbase) {
        coinbase = block.coinbase;
}

三. 个人总结

该实验本身不难,主要目的是记住区块属性内容,这些属性在后面的实验也是需要的。view关键词表示只读取区块链上数据,不修改数据,pure关键字表示不读取也不修改链上数据。都不消耗gas费用。

四. 源代码

// SPDX-License-Identifier: MIT

pragma solidity =0.6.12;
pragma experimental ABIEncoderV2;

/// @title Multicall - Aggregate results from multiple read-only function calls
/// @author Michael Elliot <mike@makerdao.com>
/// @author Joshua Levine <joshua@makerdao.com>
/// @author Nick Johnson <arachnid@notdot.net>

contract LDN {
 
    function getEthBalance(address addr) public view returns (uint256 balance) {
        balance = addr.balance;
    }
    
    function getBlockHash(uint256 blockNumber)public view returns (bytes32 blockHash){
        blockHash = blockhash(blockNumber);
    }

    function getLastBlockHash() public view returns (bytes32 blockHash) {
        blockHash = blockhash(block.number - 1);
    }

    function getCurrentBlockTimestamp() public view returns (uint256 timestamp){
        timestamp = block.timestamp;
    }

    function getCurrentBlockNumber() public view returns (uint256 number) {
        number = block.number;
    }

    function getCurrentBlockDifficulty() public view returns (uint256 difficulty) {
        difficulty = block.difficulty;
    }

    function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) {
        gaslimit = block.gaslimit;
    }

    function getCurrentBlockCoinbase() public view returns (address coinbase) {
        coinbase = block.coinbase;
    }
}