博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CryptoZombies - 1 Solidity 教程】010 msg.sender
阅读量:4074 次
发布时间:2019-05-25

本文共 2305 字,大约阅读时间需要 7 分钟。

一、前言

看了一些区块链的教程,论文,在网上刚刚找到了一个项目实战,CryptoZombies。

如果你想了解更多有关于机器学习、深度学习、区块链、计算机视觉等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!

二、msg.sender

当我们有了一套映射来记录僵尸的所有权时,我们可以用msg.sender来运用他们。并且,msg.sender可以被所有函数调用。msg.sender指的是当前调用者(或智能合约)的 address

注意:

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

下面是使用 msg.sender 来更新 mapping 的例子,更新我们定义的映射`favoriteNumber` 来将 `_myNumber`存储在 `msg.sender`下。存储数据至映射的方法和将数据存储在数组相似。然后我们可以返回存储在调用者地址名下的值,若调用者还没调用 setMyNumber, 则值为 `0`。

mapping (address => uint) favoriteNumber;function setMyNumber(uint _myNumber) public {  // Update our `favoriteNumber` mapping to store `_myNumber` under `msg.sender`  favoriteNumber[msg.sender] = _myNumber;  // ^ The syntax for storing data in a mapping is just like with arrays}function whatIsMyNumber() public view returns (uint) {  // Retrieve the value stored in the sender's address  // Will be `0` if the sender hasn't called `setMyNumber` yet  return favoriteNumber[msg.sender];}

在这个小小的例子中,任何人都可以调用 setMyNumber 在我们的合约中存下一个 uint 并且与他们的地址相绑定。 然后,他们调用 whatIsMyNumber 就会返回他们存储的 uint。使用 msg.sender 很安全,因为它具有以太坊区块链的安全保障 —— 除非窃取与以太坊地址相关联的私钥,否则是没有办法修改其他人的数据的

四、实战

1、要求

修改 _createZombie 方法,将僵尸分配给函数调用者。

1.首先,在得到新的僵尸 id 后,更新 zombieToOwner 映射,在 id 下面存入 msg.sender

2.然后,为这个 msg.sender 名下的 ownerZombieCount 加 1。

注:跟在 JavaScript 中一样, 在 Solidity 中也可以用 ++ 使 uint 递增。

2、代码

pragma solidity >=0.5.0 <0.6.0;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 memory _name, uint _dna) private {        uint id = zombies.push(Zombie(_name, _dna)) - 1;        // start here        zombieToOwner[id] = msg.sender;        ownerZombieCount[msg.sender]++;        emit NewZombie(id, _name, _dna);    }    function _generateRandomDna(string memory _str) private view returns (uint) {        uint rand = uint(keccak256(abi.encodePacked(_str)));        return rand % dnaModulus;    }    function createRandomZombie(string memory _name) public {        uint randDna = _generateRandomDna(_name);        _createZombie(_name, randDna);    }}

 

转载地址:http://izyni.baihongyu.com/

你可能感兴趣的文章
Android 解决TextView设置文本和富文本SpannableString自动换行留空白问题
查看>>
Android开发中Button按钮绑定监听器的方式完全解析
查看>>
Android自定义View实现商品评价星星评分控件
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
postgresql查看表的和索引的情况,判断是否膨胀
查看>>
postgresql中根据oid和filenode去找表的物理文件的位置
查看>>
postgresql减少wal日志生成量的方法
查看>>
swift中单例的创建及销毁
查看>>
获取App Store中App的ipa包
查看>>
iOS 关于pods-frameworks.sh:permission denied报错的解决
查看>>
设置tabbaritem的title的颜色及按钮图片
查看>>
动态设置label的高度
查看>>
获取 一个文件 在沙盒Library/Caches/ 目录下的路径
查看>>
图片压缩
查看>>
检测缓存文件是否超时
查看>>
十进制字符串转十六进制字符串
查看>>
属性字符串(富文本)的使用
查看>>
cell上label的背景颜色在选中状态下改变的解决办法
查看>>
GPS定位
查看>>
地图、显示用户位置、大头针
查看>>