全局变量Msg.sender

msg.sender

在 Solidity 中,有一些全局变量可以被所有函数调用。 其中一个就是 msg.sender,它指的是当前调用者(或智能合约)的 address。

注意:在 Solidity 中,功能执行始终需要从外部调用者开始。 一个合约只会在区块链上什么也不做,除非有人调用其中的函数。所以 msg.sender总是存在的。

以下是使用 msg.sender 来更新 mapping 的例子:

mapping (address => uint) favoriteNumber;

function setMyNumber(uint _myNumber) public {
  // 更新我们的 `favoriteNumber` 映射来将 `_myNumber`存储在 `msg.sender`名下
  favoriteNumber[msg.sender] = _myNumber;
  // 存储数据至映射的方法和将数据存储在数组相似
}

function whatIsMyNumber() public view returns (uint) {
  // 拿到存储在调用者地址名下的值
  // 若调用者还没调用 setMyNumber, 则值为 `0`
  return favoriteNumber[msg.sender];
}

在这个小小的例子中,任何人都可以调用 setMyNumber 在我们的合约中存下一个 uint 并且与他们的地址相绑定。 然后,他们调用 whatIsMyNumber 就会返回他们存储的 uint。

使用 msg.sender 很安全,因为它具有以太坊区块链的安全保障 —— 除非窃取与以太坊地址相关联的私钥,否则是没有办法修改其他人的数据的。

pragma solidity ^0.4.19;

contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint dna);

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    mapping (uint => address) public zombieToOwner;
    mapping (address => uint) ownerZombieCount;

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        // 从这里开始
        zombieToOwner [id] = msg.sender;
        ownerZombieCount[msg.sender]++; 
        NewZombie(id, _name, _dna);
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}
### Solidity 全局变量概述 Solidity 提供了一系列全局变量,用于访问区块链的相关信息以及合约运行时的状态。这些变量对于编写安全可靠的智能合约至关重要。 #### 常见的全局变量及其用途 - `block.timestamp`:当前区块的时间戳(以秒为单位),自 Unix 纪元以来的时间[^1]。 - `tx.origin`:交易最初发送者的地址,这可能不同于 `msg.sender`,特别是在有多个合约调用的情况下[^4]。 - `gasleft()`:返回剩余的 gas 数量作为 uint256 类型的数据[^3]。 - `msg.data`:完整的 calldata 字节序列,即传入的消息数据[^5]。 - `abi.encode(...)`:将参数编码成 ABI 编码格式并返回字节数组形式的结果;此函数可用于准备跨合约调用所需的数据[^2]。 - `this`:代表当前合约的对象实例,可以通过显式转换获得合约部署所在地址。 下面是一些具体的例子来展示如何使用上述提到的一些常用全局变量: ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Example { address public owner; constructor() { owner = msg.sender; // 设置创建合同时的发送者为owner } function checkTimestamp() external view returns (uint) { return block.timestamp; // 返回当前时间戳 } } ``` 另一个涉及销毁合约的例子如下所示: ```solidity function destroyContract(address payable _recipient) external onlyOwner { selfdestruct(_recipient); // 将合约余额转移至Recipient并将合约移除链上 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值