以下是本人专业《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;
}
}