区块链特辑——solidity语言基础(六)

Solidity语法基础学习

十、实战项目(二):

1.实战准备:

ERC20代币接口

ERC20 Token Interface接口

Interface IName {……}

·关键字:interface

  ·宣告一个接口,定义了需要满足的函数与事件

·在界面中的限制:

  ·所有宣告的函数接口必须是“external”,即使最终在合约使用的是public也一样。

  ·不能宣告构造函数(constructor)

  ·不能宣告在存储空间的变量(状态变量,state variables)

  ·不能宣告修饰符(modifier)

 

示例代码

ERC20接口

Interface IERC20{
    event Transfer(address indexed from,address indexed to,uint256 value);
    event Approval(address indexed owner,address indexed spender,uint256 value);

    funciton totalSupply() external view returns(unit256);

    funciton balance0f(address account) external view returns(uint256);
    function allowance(address owner,address spender) external view returns(uint256);

    function approve(address spender,uint256 amount) external returns(bool);
function transfer(address to,uint256 amount) external returns(bool);
    function transferFrom(address to,uint256 amount) external returns(bool);
}

2.分段解读:

发行量函数

·function totalSupply() external view returns(uint256);

·回传代币的发行量

·使用状态变量uint256_totalSupply来储存

 

账户函数查询函数

·function balance0f(address account) external view returns(uint256);

·给定一个账户(address),回传给该账户拥有的代币余额(uint256)

·因为是个address→uint256的关系,因此使用mapping来储存:mapping(address => uint256) _balance;

 

账户函数

·function transfer(address to,uint256 amount) external returns(bool);

·呼叫者“msg.sender”,转移“amount”数量的代币给特定账户“to”

·成功时回传true,反之,回传false

 

转账事件

·event Transfer(address indexed from,address indexed to,uint256 value);

·当发生代币转移时,必须触发此事件,即使转移的数量为“0”也是

 

授权函数

·function approve(address spender,uint256 amount) external returns(bool);

·呼叫者“msg.sender”,授权“amount”数量的代币给第三方账户“spender”使用

·成功时回传true,反之,回传false

 

授权事件

·event Approval(address indexed owner,address indexed spender,uint256 value);

·当授权函数被使用时,必须触发授权事件,即使授权的数量“value”为“0”也是。

 

授权数量查询函数

·function allowance(address owner,address spender) external view returns(uint256);

·回传代币拥有者“owner”授权给第三方账户“spender”的代币数量

·我们可以观察到授权的行为是owner→spender→uint256

  ·因此在储存授权的资讯时,会使用

  ·mapping(address => mapping(address => uint256))

 

第三方转账函数

·function transferFrom(address from,address to,uint256 amount) external returns(bool);

·呼叫者为“被授权的第三方账户”,从授权者“from”转移“amount”数量的代币给接收者“to”

·成功时回传true,反之,回传false

本文转载于网络 如有侵权请联系删除

相关文章

  • android之ListView的Adapter使用

    大家好,又见面了,我是全栈君。在做一个小练习的时候,又遇到了Adapter,才发现以前没有对它进行过记录现在介绍一下:其实Adapter就是数据和视图之间的桥梁,数据在adapter中做处理,然后显示到ListView上面Adapter有很多种,有ArrayAdapter<T>,BaseAdapter,CursorAdapter,HeaderViewListAdapter,ListAdapter,ResourceCursorAdapter,SimpleAdapter,SimpleCursorAdapter,SpinnerAdapter,WrapperListAdapter.这里就以ArrayAdapter<T>为例来介绍我自己写的一个例子:有两个类,一个是主界面Activity,用来处理输入和显示,效果图在最下面,可以翻到最后看一下,布局如下:<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schem

  • 简易集成websocket技术实现消息推送

    Websocket简介首先介绍下WebSocket,它是一种网络通信技术,该技术最大的特点就是,服务器端可以主动往客户端发送消息;当然,客户端也可以主动往服务器发送消息,实现两端的消息通信,属于网络推送消息技术的一种。好处为什么我们需要websocket这门技术呢,通常情况下,我们要想实现类似于消息通知的功能,得主动刷新才能知道是否有新的消息?这样的话,就显得我们的项目很笨重,不灵活。集成了websocket技术的话,消息就能实时刷新,这样对于一些类似于文章点赞,评论等这些实时消息,用户体验感会大大提高。话不多说,下面看下代码实现代码实现pom.xml 首先先添加websocket的依赖(这是spring的)<dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.3.7.RELEASE</version> </dependency>复制Sp

  • PyInstaller关于No such file or directory报错

    一、错误原因报错:Nosuchfileordirectory:'C:\\Users\\BJ7K8F3\\AppData\\Local\\Temp\\_MEI91362\\cairosvg\\VERSION'原因:_MEI***是pyinstaller的解压目录,报这个错是说明cairosvg\\VERSION没有打包进去这类错误可总结为一个模式:Nosuchfileordirectory:'C:\\Users\\BJ7K8F3\\AppData\\Local\\Temp\\_MEI91362\\xxx\\yyy'二、解决方案找到pyinstaller所在的目录,类似于(E:\Python_and_PyCharm\SoftWareSpace\Python\Lib\site-packages\PyInstaller),重要的是后面这半截(\Python\Lib\site-packages\PyInstaller)。直接在“此电脑”的搜索栏,搜索“PyInstaller”也是可以找到的,对比一下示例的路径,后半截一致就行。进入PyInstaller文件

  • How to deactive Virus scan via view IWFNDCCONFIG

    CreatedbyJerryWang,lastmodifiedonJan13,2015在保存一个Opportunity时遇到如下errormessage: 该errormessage在READ_ENTRY方法里面抛出: 扫描的content正是在OpportunitycreationUI上enduser手动输入的数据: scan_contentmethod里读取当前的virusscanprofile: debug能发现当前的virusscanprofilename: SM30:viewname:/IWFND/C_CONFIG,将profilename改成"-"即可deactivevirusscan:

  • win10+Ubuntu 20.04 LTS双系统安装(UEFI + GPT)(图文,多图预警)

    win10安装(已安装的略过)win10安装请看:win10u盘重装系统全新安装ubuntu安装准备官网下载镜像:https://ubuntu.com/download/desktop下载rufus(官网推荐)https://rufus.ie/如果下载速度慢,可以用我下好的(含镜像、rufus):链接:https://pan.baidu.com/s/1qwgUFa-ME-EXLrAZ7rQJvw提取码:v6af制作启动u盘插入U盘,运行rufus-3.10.exe,按照下面选择,然后点击开始,等待完成即可为Ubuntu安装空出分区此电脑->管理->磁盘管理,选择一个磁盘右键选择压缩卷,压缩出50G以上的空白分区(我分了100G)关闭win10快速启动菜单->设置->系统->电源和睡眠->其他电源设置->选择电源按钮的功能->取消勾选启用快速启动BIOS设置开机按F2进入BIOS设置(我的电脑是F2,请根据自己电脑型号自行百度) SecureBoot设为DisabledUSBUEFIBIOSSupport设置为EnabledUEFI/Leg

  • 2020 年开源许可证最新趋势:67% 为宽松许可证

    作者|AYALAGOLDSTEIN译者|苏本如,责编|伍杏玲出品|CSDN(ID:CSDNnews)以下为译文: 开放源码许可证通常被开发人员视为是法律顾问在他们忙于创建软件产品时,必须处理的“枯燥”合规性问题。随着各行各业使用开源代码,一些开源项目已成为“大生意”,这使得关于开放源码许可证的再次成为争论的焦点。开源许可证的使用趋势我们从WhiteSource数据库收集包括400万+个开源软件包,1.3亿个开源文件,涵盖200多种编程语言等信息,来帮助我们了解哪些是2019年最受欢迎的开源许可证。结果表明,对宽松(permissive)的开放源代码许可证的采用继续增长,而Copyleft许可证(尤其是GPL系列)的使用则继续减少。宽松式开放源码许可证呈增长趋势宽松式开源许可证的使用在不断增长,MIT和Apache2.0许可证再次在本年度十大最受欢迎的开源许可证排行榜上分别排名第一和第二,各自比去年增长了百分之一。宽松的开放源码许可证对其他人如何使用开放源代码组件设置了最小的限制。这种类型的许可证允许我们在不同程度自由使用、修改和重新分发开源代码,允许在专有的派生作品中使用开源代码,几乎

  • 一分钟了解Python生成器

    什么是生成器当我们讨论生成器的时间一般会涉及两个方面生成器函数:生成器函数类似正常的函数,但是当它需要返回值的时候使用yield来代替return。如果一个函数包含yield,那么就可以说这个函数是生成器函数。defgen_fun():  yield'a'  yield'b'foritemingen_fun():  print(item)执行以上代码,输出:ab生成器对象:生成器函数返回的就是生成器对象,通过调用生成器对象的next()方法(Python3为__next__()或内置的next函数)或forin语法来使用生成器对象。defgen_func():  yield'a'  yield'b'#这里的g就是一个生成器对象g=gen_func()#通过forin来去除生成的数据foriteming:  print(item)执行以上代码,输出:ab生成器有什么特点同样是可以用forin来遍历对比直接返回['a','b']的正常函数,它具有以下特殊之处:它并没有把所

  • git命令使用笔记2

    列举使用到的一些git命令。切换到某个分支 gitcheckout分支名查看分支 gitbranch-a分支切换并创建 gitcheckout-b分支名提交ID删除本地分支 gitbranch-d分支名删除远程分支 gitpushorigin--delete分支名推送远程tag gitpushorigintag名字本地删除tag gittag-dtag名字git只合并某一个分支的commit1)只合并一个commit(将分支2的提交id合并到分支1)gitcheckout分支1 gitcherry-pick分支2提交id 复制2)合并连续的多个commit到指定的分支上(将分支2的范围commit合并到分支1)为分支2创建一个临时的最后范围commit的分支gitcheckout-btemp最后范围commit 复制将tmp分支最开始范围的commit用rebase合并范围commitgitrebase--onto分支1最开始范围commit复制

  • Spark——RDD转换操作

    概述每一次转换操作都会产生不同的RDD,供给下一个操作使用。惰性机制RDD的转换过程是惰性求值的,也就是,整个转换过程只记录轨迹,并不会发生真正的计算,只有遇到了行动操作时,才会触发真正的计算。filter(func)过滤出满足函数func的元素,并返回存入一个新的数据集valconf=newSparkConf().setAppName("spark").setMaster("local") valsc=newSparkContext(conf) valrdd=sc.parallelize(List(1,2,3,4,5,6)) valresult=rdd.filter(_%2==0) println(result.collect().mkString(","))复制map(func)将每个元素传递到函数func中进行操作,并将结果返回为一个新的数据集。 collect()以数组的形式返回rdd的结果,但列表中每个数乘以2valconf=newSparkConf().setAppName("spark").s

  • 是否拘留,算法说了算!加州全美首个废除保释金制度,用算法评估取代

    【新智元导读】上周,加州州长签署通过一项具有颠覆性的保释金改革法案——取消保释金制度,使用算法评估是否拘押。加州将成为全美第一个禁止等待审判的嫌疑人用现金保释的州,而算法是否公平的问题也再次引发讨论。从2019年10月开始,加州将取消保释金制度,在加州被控犯罪的人将使用一种算法进行打分评估,而不再使用巨额保释金作为自由的抵押品。然后,县官员将根据算法的打分决定被告是应该释放,还是应该关进监狱。上周,加州州长JerryBrown签署了一项颠覆性的保释金改革法案SB10,该法案要求使用一个算法系统取代现金保释。每个县都必须建立一套系统,以确定嫌疑人在审判过程中逃跑或犯下另一项罪行的风险。该系统可以自行开发,或使用第三方承包商提供的系统,但必须在2019年10月的截止日期之前完成。多年来,现金保释制度一直被一些活动人士强烈抗议,这项立法让民权组织大获全胜。他们的论点是,现金保释使司法处于一种不公平的竞争环境,将穷人关进监狱,同时允许有钱人或有资产的人避免坐牢。但算法风险评估使得这项新立法的实施细节变得更加重要——一些活动人士表示,现金保释创造了一个掠夺性的保释债券产业,另一些人则指出以往使用

  • 树链剖分简单分析及模板(杂谈)

    这几天学习了一下树链剖分,顺便写一下我的理解、早上看了一下别人的讲解,云里雾里,终于算是搞懂了、树链剖分是解决在树上进行插点问线,插线问点等一系列树上的问题 假如现在给你一棵树,然后没两条边之间有一条权值,有一些操作,1:x---y之间的最大权值是多少,2:改变x---y之间的权值当前这样的操作有很多,如果直接用暴力的方法的话肯定不行,那么就要想一个好的方法,我们可以想一下能不能借助线段树解决,能不能想一种方法对树上的边进行编号,然后就变成区间了。那么我们就可以在线段树上进行操作了,树链剖分就是这样的一个算法。当然编号不是简单的随便编号,如果我们进行随便的编号,然后建立一个线段树,如果要更新一个边的权值,是log2(n)的复杂度,而查找的话,我们要枚举x--y的之间的所有的边,假如我们随便以一个点为根节点进行编号,最大的长度是树的直径,这个值本身是比较大的,而在线段树上查找任意一个区间的复杂度也是log2(n),这样查找一次的时间复杂度比直接暴力还要高,所以很明显是不行的。那么就要想想办法了,我们能不能把x--y之间的一些边一块儿查找,这就是关于树链剖分的重边和轻边,重边:某个节点x到

  • 泛函编程(17)-泛函状态-State In Action

      对OOP编程人员来说,泛函状态State是一种全新的数据类型。我们在上节做了些介绍,在这节我们讨论一下State类型的应用:用一个具体的例子来示范如何使用State类型。以下是这个例子的具体描述:模拟一个自动糖果贩售机逻辑:贩售机有两种操作方法:投入硬币和扭动出糖旋钮。贩售机可以处于锁定和放开两种状态。模拟运作跟踪贩售机内当前的糖果和硬币数量。贩售机的操作逻辑要求如下:1、如果机内有糖的话,投入硬币贩售机从锁定状态进入放开状态2、在放开状态下扭动旋钮贩售机放出一块糖果后自动进入锁定状态3、在锁定状态下扭动旋钮贩售机不做反应4、在放开状态下投入硬币贩售机不做反应5、没有糖果的贩售机对任何操作都不做反应我们先把涉及到的数据类型设计出来:1typecandy=Int//方便表达 2typecoin=Int//方便表达 3sealedtraitInput 4caseobjectCoinextendsInput//投币 5caseobjectTurnextendsInput//旋钮 6caseclassMachine(locked:Boolean,candies:candy,coins:co

  • 带你彻底读懂React任务调度以及背后的算法

    小思考 刚刚遇到小明,问了他一个问题:给你一个数字数组,找出最小的数字,怎么整?小明:Array.sort!我:如果这个数组是动态的,每次我都要找最小值,找到之后就从数组里删除这个元素,然后下次还想找最小值,怎么整。并且这个过程中,还会不断有新的数字插入数组。小明:Array.sort!我:可是数组是动态的,每次sort,但是我只要最小值,你浪费那么多时间把第二和第一万都排那么准确,不觉得在浪费时间吗?小明:好像确实是浪费时间。可能是个算法吧,没做过。React中的任务池其实这不是个纯算法题,说回React,大家肯定听过React中有个fiber任务吧,而且不同的fiber任务有不同的优先级,为了用户体验,React需要先处理优先级高的任务。为了存储这些任务,React中有两个任务池,源码中定义如下://Tasksarestoredonaminheap vartaskQueue=[]; vartimerQueue=[];复制taskQueue与timerQueue都是数组,前者存储的是立即要执行的任务,而后者存的则是可以延迟执行的任务。源码中任务的初始结构定义如下:varnewTask

  • &lt;img&gt; to image_tag

    <imgsrc="clean_wave.jpg?"alt="Clean_wave"><%=image_tag("clean_wave.jpg?",:class=>"img_preview")%>复制

  • 注入DLL之主线程方式

    目前对于APC注入方式依然还没有了解内幕, QueueUserAPC((PAPCFUNC)LoadLibraryA,hThread,(ULONG_PTR)param); 但看其调用方式可以猜出一二。,基本也是插入到线程再装载DLL。 以前在黑客防线里看到过主线程注入方式装载DLL,研究了一下,发现很像是手工实现了QueueUserApc的功能。。。不过这种比直接调用API更自由灵活。 另不知怎么回事,WIN7下与黑客防线所载文章实例中的细节有些出入。 首先黑客防线里的找主线程的方式有些绕,他比较了线程时间,我也没细看,观察了一阵,发现一般第一个线程就是主线程,姑且就这么着吧   分析一下:【主要用于备忘,别人能不能看懂我就不知道了】 一,读取线程的等待状态下的数据,线程一般分等待与激活状态,如果没有任务就会处于等待状态,当有操作就会处于激活状态。 二,写注入代码到注入进程     1,保存并改写线程RET时的ESP值,里面放的是调用该函数处存放的下一条指令地址。。。指向注入代码    &nbs

  • C# Ajax 手机发送短信验证码 校验验证码 菜鸟级别实现方法

    1.Ajax请求处理页面: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Web; usingSystem.Web.SessionState; usingSystem.Web.Services; namespaceWeb.User.Ajax { ///<summary> ///SendCheckcode的摘要说明 ///</summary> [WebService(Namespace="http://tempuri.org/")] [WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)] publicclassSendCheckcode:IHttpHandler,IRequiresSessionState { //发送验证码 publicvoidProcessRequest(HttpContextcontext) { context.Response.ContentType="text/pl

  • Vue 路由跳转

    图中path即localhost:1234/path

  • 第二阶段冲刺第八天

    1.计划会议内容 总的工作量为20天,剩余工作量为3天。 2.任务看板照片 3.产品的状态 4.任务燃尽图

  • iterm2

    Mac下配置iterm2 http://www.dreamxu.com/mac-terminal/ 快捷键 http://cnbin.github.io/blog/2015/06/20/iterm2-kuai-jie-jian-da-quan/  

  • linux常用命令

     1.ls命令       红色:表示hello.sh这个文件的所有者是root 绿色:表示hello.sh这个文件的所属组是root组。 分所有者和所有组是为了分配权限,rwxr-xr-x,中rwx的权限分配给所有者,即hello.sh这个文件,所有者root有读r,写w,执行x的权限,所属组root的权限是r-x,拥有读和执行的权限,不能写,r-x是分配给其他人,也只有读和执行的权限,也不能写。 ls-h:将文件的大小从字节变成m root@ubuntu:/home/yanyanzhang/shell_study/sh#ll-h total12K drwxr-xr-x2rootroot4.0KMay315:57./ drwxr-xr-x3rootroot4.0KMay316:46../ -rwxr-xr-x1rootroot33May315:57hello.sh*复制   ls-d:显示目录的信息 root@ubuntu:/home/yanyanzhang/shell_study/sh#ll-d/home/ drwxr-xr

  • 快速自检电脑是否被黑客入侵过(Windows版)

    我们经常会感觉电脑行为有点奇怪,比如总是打开莫名其妙的网站,或者偶尔变卡(网络/CPU),似乎自己"中毒"了, 但X60安全卫士或者X讯电脑管家扫描之后又说你电脑"非常安全",那么有可能你已经被黑客光顾过了.这种时候也许要专业的取证人员出场, 但似乎又有点小提大作.因此本文介绍一些低成本的自检方法,对于个人用户可以快速判断自己是否已经被入侵过. 1.异常的日志记录 通常我们需要检查一些可疑的事件记录,比如: “Eventlogservicewasstopped.”(事件记录服务已经停止) “WindowsFileProtectionisnotactiveonthissystem.”(Windows文件保护未开启) “TheprotectedSystemfile[filename]wasnotrestoredtoitsoriginal,validversionbecauseoftheWindowsFileProtection…”(受保护的系统文件XXX无法还原) “TheMSTelnetServicehasstartedsuccessfully.”(Telnet服务开启成功) 复制 除此

相关推荐

推荐阅读