加密僵尸:ERC721标准和加密收藏品

news/2024/11/24 2:19:57/

ERC721 标准, 多重继承

让我们来看一看 ERC721 标准:

contract ERC721 {event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);function balanceOf(address _owner) public view returns (uint256 _balance);function ownerOf(uint256 _tokenId) public view returns (address _owner);function transfer(address _to, uint256 _tokenId) public;function approve(address _to, uint256 _tokenId) public;function takeOwnership(uint256 _tokenId) public;
}
contract SatoshiNakamoto is NickSzabo, HalFinney {// 啧啧啧,宇宙的奥秘泄露了
}

正如你所见,当使用多重继承的时候,你只需要用逗号 , 来隔开几个你想要继承的合约。在上面的例子中,我们的合约继承自 NickSzaboHalFinney

ERC721: 转移标准

注意 ERC721 规范有两种不同的方法来转移代币:

function transfer(address _to, uint256 _tokenId) public;function approve(address _to, uint256 _tokenId) public;
function takeOwnership(uint256 _tokenId) public;
  1. 第一种方法是代币的拥有者调用transfer 方法,传入他想转移到的 address 和他想转移的代币的 _tokenId

  2. 第二种方法是代币拥有者首先调用 approve,然后传入与以上相同的参数。接着,该合约会存储谁被允许提取代币,通常存储到一个 mapping (uint256 => address) 里。然后,当有人调用 takeOwnership 时,合约会检查 msg.sender 是否得到拥有者的批准来提取代币,如果是,则将代币转移给他。

你注意到了吗,transfer 和 takeOwnership 都将包含相同的转移逻辑,只是以相反的顺序。 (一种情况是代币的发送者调用函数;另一种情况是代币的接收者调用它)。

所以我们把这个逻辑抽象成它自己的私有函数 _transfer,然后由这两个函数来调用它。 这样我们就不用写重复的代码了。

ERC721: 批准 

记住,使用 approve 或者 takeOwnership 的时候,转移有2个步骤:

  1. 你,作为所有者,用新主人的 address 和你希望他获取的 _tokenId 来调用 approve

  2. 新主人用 _tokenId 来调用 takeOwnership,合约会检查确保他获得了批准,然后把代币转移给他。

因为这发生在2个函数的调用中,所以在函数调用之间,我们需要一个数据结构来存储什么人被批准获取什么。

预防溢出

需要将safemath.sol引入

比如,使用 SafeMath 库的时候,我们将使用 using SafeMath for uint256 这样的语法。 SafeMath 库有四个方法 — add, sub, mul, 以及 div。现在我们可以这样来让 uint256 调用这些方法:

using SafeMath for uint256;uint256 a = 5;
uint256 b = a.add(3); // 5 + 3 = 8
uint256 c = a.mul(2); // 5 * 2 = 10

还可以是SafeMath32,SafeMath16等 

SafeMath

library SafeMath {function mul(uint256 a, uint256 b) internal pure returns (uint256) {if (a == 0) {return 0;}uint256 c = a * b;assert(c / a == b);return c;}function div(uint256 a, uint256 b) internal pure returns (uint256) {// assert(b > 0); // Solidity automatically throws when dividing by 0uint256 c = a / b;// assert(a == b * c + a % b); // There is no case in which this doesn't holdreturn c;}function sub(uint256 a, uint256 b) internal pure returns (uint256) {assert(b <= a);return a - b;}function add(uint256 a, uint256 b) internal pure returns (uint256) {uint256 c = a + b;assert(c >= a);return c;}
}

首先我们有了 library 关键字 — 库和 合约很相似,但是又有一些不同。 就我们的目的而言,库允许我们使用 using 关键字,它可以自动把库的所有方法添加给一个数据类型:

using SafeMath for uint;
// 这下我们可以为任何 uint 调用这些方法了
uint test = 2;
test = test.mul(3); // test 等于 6 了
test = test.add(5); // test 等于 11 了

注意 mul 和 add 其实都需要两个参数。 在我们声明了 using SafeMath for uint 后,我们用来调用这些方法的 uint 就自动被作为第一个参数传递进去了(在此例中就是 test)

另外:

function add(uint256 a, uint256 b) internal pure returns (uint256) {uint256 c = a + b;assert(c >= a);return c;
}// 如果我们在`uint8` 上调用 `.add`。它将会被转换成 `uint256`.
// 所以它不会在 2^8 时溢出,因为 256 是一个有效的 `uint256`.


http://www.ppmy.cn/news/903659.html

相关文章

基于同态加密的恶意安全 MPC:BDOZ、SPDZ

参考文献&#xff1a; Bendlin R, Damgrd I, Orlandi C, Zakarias S. Semi-homomorphic encryption and multiparty computation[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2011: 169…

基于JAVA的RSA文件加密软件的设计与实现免费源代码+LW

2.1.1 功能分析 经过1.2.2节的论述&#xff0c;我们可以将对软件的要求总结如下&#xff1a; ① 可以按要求的位数生成非对称密钥。 ② 可以保存密钥和装载密钥&#xff0c;密钥保存为纯文本。 ③ 可以用指定密钥以RSA算法加密任意一个文件&#xff0c;加密生成的数据为纯文本。…

sam文件获取与解密

前言 ntds.dit文件位置: C:\Windows\NTDS\NTDS.dit system文件位置:C:\Windows\System32\config\SYSTEM sam文件位置:C:\Windows\System32\config\SAM #通过SAM数据库获得用户hash的方法 远程读取 mimikatz在线读取SAM数据库 privilege::debug token::elevate lsadump::sam po…

前女友闺蜜给我发了一个压缩包,居然还带密码?暴力破解ZIP加密文件的密码!

前言 今晚下班后微信收到一跳消息&#xff01;是前女友的闺蜜发过来的&#xff0c;然后让我自己去猜密码&#xff0c;本来我是不打算理她的&#xff01;但是她后面说里面有你想不到的福利&#xff01;这句话对于一枚&#xff08;lsp&#xff09;不对一枚宅男程序员没有抵抗力&a…

linux下SHA-512加密及暴力破解

文章目录 1 密文解析2 手动生成密文3 暴力破解 SHA-512 加密密码 在 /etc/shadow 文件中我们可以看到如下行 lilei:$6$zvt9aWzy$aoZDNPL0.mXFfsJczn.9gZtHZwmFTAFIbe4qHZd48zeB1mIka7jOsrmGvGMBV8LUV.iUdr6bk0hQZyGSOPiTy/:18420:0:99999:7:::文件中每行代表一个用户&#xff…

使用JohnTheRipper对有密码加密的ZIP压缩包文件进行暴力破解

背景 对加密的ZIP压缩包进行密码破解的方式有很多&#xff0c;网上也有很多文章&#xff0c;今天只介绍一种——JohnTheRipper。 JohnTheRipper 摘自百度百科&#xff1a; John the Ripper&#xff0c;是一个快速的密码破解工具&#xff0c;用于在已知密文的情况下尝试破解出…

实验二:文件破解(zip密码/zip伪加密/doc密码)

一、实验目的 学会使用Advanced ZIP Password Recovery、Free Word Excel password recovery wizard等工具&#xff0c;了解并掌握DOC、ZIP文件破解的方法 二、实验题目 2.1 破解zip密码 破解压缩包 01.zip 的密码&#xff0c;获取压缩包中 flag.txt 中的内容 提示&#xf…

exew文件加密:利用破解版exe文件加密器对exe文件进行加密保护(图文教程)

exew文件加密&#xff1a;利用破解版exe文件加密器对exe文件进行加密保护(图文教程) 目录 加密过程步骤 解密过程步骤 加密过程步骤 解密过程步骤