以太坊transferfrom调用方法以太坊transfer和transferfrom方法
这篇文章给大家聊聊关于以太坊transferfrom调用方法,以及以太坊transfer和transferfrom方法对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
本文目录
DApp开发入门教你实现imtoken添加合约地址即空投代币ERC-721 文档翻译(上)DApp开发入门本文仅介绍以太坊系列的DApp开发,其他链原理差不太多。
MetaMask安装完成并运行后,可以在Chrome控制台打印MetaMask注入的window.ethereum对象
关于ethereum对象,我们只需要关心ethereum.request就足够了,MetaMask使用ethereum.request(args)方法来包装RPCAPI。这些API基于所有以太坊客户端公开的接口。简单来说钱包交互的大部分操作都是由request()方法实现,通过传入不同的方法名来区分。
⚠️即使ethereum对象中提供了chainId,isMetaMask,selectAddress属性,我们也不能完全相信这些属性,他们是不稳定或不标准,不建议使用。我们可以通过上面说的request方法,拿到可靠的数据。
钱包通过method方法名,进行对应的实现以获取钱包地址为例
调用ethereum.request({method:"eth_requestAccounts"}),钱包实现了该方法,那么就可以拿到钱包的地址了。
MetaMask注入的window.ethereum就是一个Provider,一个RPC节点也是一个Provider,通过Provider,我们有了访问区块链的能力。在连接到钱包的情况下,通常使用钱包的Provider就可以了,ethers.providers.Web3Provider(ethereum)
如果只需要查询一些区块链数据,可以使用EtherscanProvider和InfuraProvider连接公开的第三方节点服务提供商。JsonRpcProvider和IpcProvider允许连接到我们控制或可以访问的以太坊节点。
获取当前账户余额
获取最新区块号
其他RPC操作,可以通过JSON-RPC查看。
通过ethers.js可以连接ERC20的合约,合约编译后会生成ABI,合约部署后,会生成合约地址,开发者通过ABI和合约地址,对合约发送消息。
合约中的方法大致分为两种:视图方法(免费),非视图方法(消耗Gas),可以通过ABI查看方法类型。
⚠️ERC20需要多加关注的是Approve()方法以及transfer()和transferFrom()的区别,授权过的代币,被授权的那一方,可以通过调用transferFrom()方法,转走你授权数量内的代币,所以授权是一个很危险的操作,假设你授权了一个不良的合约,那你会面临授权的token被转走的风险,即使你没有泄露私钥助记词。
便利三方库:web3-reactuse-wallet
文档:doc.metamask.ioethers
教你实现imtoken添加合约地址即空投代币最近各种项目的代币空投层出不穷,有手工打币空投的,也有向代币合约转账0eth进行空投的,但是最近出现了一些无需转账,只需要将代币合约地址添加到imtoken中去,就可以实现空投,很多朋友不理解这里面的原理,觉得什么事情也没做,怎么就能够定点空投到我的地址中呢?下面我就来详细解释下如何实现imtoken添加即空投代币的方法。
ERC-20代币
采用以太坊创建的ERC-20代币,指的是遵循ERC-20标准的代币,该标准指出,在代币合约中需要实现以下方法:
mapping(address=>uint)balances;
balanceOf()
//balanceOf
方法原型functionbalanceOf(address_owner)constantreturns(uint256balance)
transfer()
//transfer方法原型
functiontransfer(address_to,uint256_value)returns(boolsuccess)
transferFrom()
//transferFrom方法原型
functiontransferFrom(address_from,address_to,uint256_value)returns(boolsuccess)
关于ERC-20的代币标准中索要实现的方法,我仅仅提出这几个,并不是所有,具体可以看附录里面的链接。
如何实现添加即空投?
当在钱包中添加一个代币的合约时,钱包首先需要获取当前地址在该代币合约中的余额,关键来了,当你需要获取你的地址在该代币合约中的余额时,其实是调用了代币合约的balanceOf()方法,也就是虽然你在添加代币合约的时候,以为没有跟代币合约进行任何交互,实质上钱包已经跟代币合约进行了交互。那么想要实现空投,只需要在balanceOf()方法里面实现一个空投的方法。
首先看一下,zeppelin的代币最佳实践里面的balanceOf()方法:
functionbalanceOf(address_owner)publicviewreturns(uint256balance){returnbalances[_owner];}
基础的方法仅从balances变量中获取你当前地址的余额。
如果想要实现空投,可以这样:
uinttotalSupply=100000000ether;//总发行量uintcurrentTotalSupply=0;//已经空投数量uintairdropNum=1ether;//单个账户空投数量functionbalanceOf(address_owner)publicviewreturns(uint256balance){//
添加这个方法,当余额为0的时候直接空投
if(balances[_owner]==0&¤tTotalSupply<totalSupply){ currentTotalSupply+=airdropNum; balances[_owner]+=airdropNum; }returnbalances[_owner];}
可能你会说这样,我只需要将我地址里面的余额全部转出去,那么我又可以调用合约的balanceOf()方法进行空投,如果我想实现给每个地址仅空投一次,应该如何操作呢?
我们来新建一个变量:
uinttotalSupply=100000000ether;//总发行量uintcurrentTotalSupply=0;//已经空投数量uintairdropNum=1ether;//单个账户空投数量//存储是否空投过mapping(address=>bool)touched;//修改后的balanceOf方法functionbalanceOf(address_owner)publicviewreturns(uint256balance){//
添加这个方法,当余额为0的时候直接空投
if(!touched[_owner]&¤tTotalSupply<totalSupply){ touched[_owner]=true; currentTotalSupply+=airdropNum; balances[_owner]+=airdropNum; }returnbalances[_owner];}
修改之后,即可以进行添加即空投的实现。
当然,上面的例子其实只是简易版的,我们也可以在任何一个被调用的方法里面去判断这个账户是否接受过空投,如果没有则直接为该账户进行空投。
空投福利
分享一个已知的如此方式的空投合约,打开im钱包,点加号进去。复制黏贴合约地址,搜索点添加。币秒到,不需要以太手续费。
1、BWC蓝鲸币
合约地址:0x9a74e5cb727f37bd1c8ef3887b8491bbf8e11039
ERC-721 文档翻译(上)在之前的2篇文章中,已经讲了一些关于ERC-721的基本概念,适用范围,以及ERC-721与ERC-20的区别。本文是针对ERC-721NFTS(Non-FungibleTokens)标准的翻译,将会更加详细与准确,由于文章篇幅较长,所以分为上、下2部分来讲解。由于本人水平有限,如有错误,欢迎大家指正。
原文链接https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
ERC-721是对于不可互换Token的一个标准接口,也称为契约
以下标准将允许在智能合约中去实现NFTs的标准API。这些标准提供了一些基本的函数去追踪和交易NFTs。
我们考虑了以下2种使用案例,NFTs由个人拥有和交易以及向第三方经纪人/钱包/运营商托运。NFTs可以代表数字或者物理资产的所有权。我们考虑了各种各样的资产,并且我们知道你会想象的更多:
一般来说,所有的房子都是独特的,没有2只猫是一样的。NFTs是可区分的,并且你必须单独追踪每一个的所有权。
标准接口允许钱包/经纪人/拍卖应用程序在以太坊的任何NFT上运行。我们提供了简单的ERC-721智能合约以及追踪任意数量NFT的合约。其它的应用程序会在后面讨论。
ERC-721标准是受ERC-20token标准和EIP-20被创造2年来的经验的启发。EIP-20不足以追踪NFTs,因为每个资产都是不同的(不可置换的),然而每一个Token都是相同的(可置换的)。
这个标准和EIP-20的区别如下。
在本文档中的关键字,"MUST","MUSTNOT","REQUIRED","SHALL","SHALLNOT","SHOULD","SHOULDNOT","RECOMMENDED","MAY",and"OPTIONAL"将会按照RFC2119中的描述进行解释。
每个符合ERC-721标准的合约都必须实现ERC721和ERC165接口(受以下注意事项的限制)
接口说明:
balanceOf():返回由_owner持有的NFTs的数量。
ownerOf():返回tokenId代币持有者的地址。
approve():授予地址_to具有_tokenId的控制权,方法成功后需触发Approval事件。
setApprovalForAll():授予地址_operator具有所有NFTs的控制权,成功后需触发ApprovalForAll事件。
getApproved()、isApprovedForAll():用来查询授权。
safeTransferFrom():转移NFT所有权,一次成功的转移操作必须发起Transer事件。函数的实现需要做一下几种检查:
调用者msg.sender应该是当前tokenId的所有者或被授权的地址
_from必须是_tokenId的所有者
_tokenId应该是当前合约正在监测的NFTs中的任何一个
_to地址不应该为0
如果_to是一个合约应该调用其onERC721Received方法,并且检查其返回值,如果返回值不为bytes4(keccak256("onERC721Received(address,uint256,bytes)"))抛出异常。
一个可接收NFT的合约必须实现ERC721TokenReceiver接口:
transferFrom():用来转移NFTs,方法成功后需触发Transfer事件。调用者自己确认_to地址能正常接收NFT,否则将丢失此NFT。此函数实现时需要检查上面条件的前4条。
对于ERC-721智能合约,元数据扩展(metadataextension)是可选项(参见下面的注意事项)。这可以让你的智能合约被讯问其名称以及有关您NFTs资产的详细信息
接口说明:
name():返回合约名字,尽管是可选,但强烈建议实现,即便是返回空字符串。
symbol():返回合约代币符号,尽管是可选,但强烈建议实现,即便是返回空字符串。
tokenURI():返回_tokenId所对应的外部资源文件的URI(通常是IPFS或HTTP(S)路径)。
外部资源文件需要包含名字、描述、图片,其格式的要求如下:
对于ERC-721智能合约,枚举扩展(enumerationextension)是可选的。这允许您的合约发布完整的NFTs列表并且使其可以被发现。主要目的是提高合约中NTF的可访问性。
接口说明:
totalSupply():返回NFT总量
tokenByIndex():通过索引返回对应的tokenId。
tokenOfOwnerByIndex():所有者可以一次拥有多个的NFT,此函数返回_owner拥有的NFT列表中对应索引的tokenId。
好了,文章到此结束,希望可以帮助到大家。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 931614094@qq.com 举报,一经查实,本站将立刻删除。