什么是智能合约? 智能合约到底做什么的?

2023-11-12

Solidity

Solidity是一种用于编写智能合约的高级语言,语法类似于JavaScript。在以太坊平台上,Solidity编写的智能合约可以被编译成字节码在以太坊虚拟机上运行。使用Solidity语言编写智能合约避免了直接编写底层的以太坊虚拟机代码,提高了编码效率,同时该语言也具有更好的可读性。

代币合约

目前,在以太坊上的众多智能合约之中,应用最为广泛的是代币合约(Token Contract)。代币合约是在以太坊上管理__账户及其拥有的代币__的智能合约,实质上可以理解为一张账户地址和对应账户代币余额的映射表。从某种意义上讲,以太坊上的代币可以被称为数字资产,记录资产数据的代币合约就是一份账本。代币既可以__表示某一虚拟货币的价值__,又可以__象征某些实际的物理量__,甚至可用于__记录账户持有者的信誉值__。但归根结底,以太坊上的数字资产就是指以太坊上代币合约中记录的账户代币余额数据。

数字资产的发行无须经过复杂的“挖矿”程序,代币合约的创建者可以通过智能合约定义自己的代币发行标准,直接在合约代码中实现“铸币”功能。并且,代币的流通是通过在以太坊交易中调用智能合约的函数接口进行转账,代币合约创建者同样可以在这一过程中添加一些自定义的操作。

以太坊上的代币作为一种数字资产,需要有它的发行和流通机制。相较于以太币等加密货币基于PoW和PoS共识算法的发行机制以及基于发送交易进行转账的流通机制,以太坊上数字资产的发行和流通更加简便灵活,相关的操作一般由代币合约创建者在代币合约中实现。常见的代币合约在记录账户及代币余额的基础上,还包含一些基本的数字资产管理操作,如铸造代币、销毁代币以及代币转账等

  • 代币转账

    代币转账是代币合约的一项基本功能,也是数字资产流通功能的具体实现。例如,账户Alice调用合约的转账功能函数,向账户Bob转入50个代币,此时合约中记录的Alice账户余额减少了50,而Bob账户余额增加了50。

  • 铸造代币

    当其他账户通过向合约转入以太币或其他方式调用合约铸造功能时,该代币合约向账户对应的余额值增加相应数量的代币,代币的总供应量也相应增加,完成铸币

  • 销毁代币

    账户通过调用合约的销毁功能函数,销毁其账户余额中的代币,代币总供应量也相应地减少。但是,通常代币合约的代币销毁功能是通过向特殊的__零地址0x000…0000__中转入相应数量的代币来完成,此时代币总供应量不会减少。

ERC 20代币合约

ERC 20代币合约标准规定了一个以太坊代币合约所需实现的函数功能和事件记录。该标准满足了代币作为数字资产所必须具备的一些基本功能和要求,如注明代币名称、代币转账、本账户中允许链上第三方使用的代币限额等。ERC 20的出现为以太坊上的代币合约提供了一个标准化的方案,也对以太坊上数字资产的实现进行了一定的规范。ERC 20标准使得种类繁多的代币能够被更多的去中心化应用(DApp)、交易所等兼容。

自2015年提出以来,ERC 20代币合约标准在以太坊开发社区的协商下逐步确定为11个标准接口。ERC 20标准接口总共可分为三类:常量、功能函数以及事件。

  • 常量

常量类接口包含代币名称、代币符号和小数点位三个常量,分别定义了合约代币的名称、符号等基本信息。

值得注意的是代币名称以及代币符号都是合约创建者指定的,其无法唯一标示一个智能合约。但在代币交易所中,符合ERC 20标准的代币可以向交易所提供代币名称进行注册,交易所通过注册机制可以检查并保证代币名称与代币合约一一对应,实现类似于ENS的效果。
 
 之所以要引入小数点位这一常量,是因为以太坊虚拟机不支持小数计算,智能合约代码中涉及小数的数值只能先转换为整数后再进行计算。当数字资产用于表示一些无法分割的实际物品,如软件证书时,代币的最小单位应为1,此时小数点位应设为0。

  • 函数功能

    函数功能包含总供应量、余额、转账、从他人处转账、允许量值以及限额6个功能函数,分别规定了实现代币合约所必需的查询、转账、权限控制等基本功能的函数接口。

(1)总供应量

总供应量totalSupply()函数用于查看代币当前的总供应量,即当前合约账本中所有账户余额的总和。该函数没有输入参数,返回值为无符号整数常量。

(2)余额
     
   余额balanceOf()函数用于查看当前合约中指定账户的代币余额。

(3)转账

转账transfer()函数用于__从当前账户向其他账户进行代币转账__。该函数的输入参数为目标账户地址和转账的代币数额,返回值为布尔型变量。当账户满足当前有足够的余额、转账数额为正数以及合约编写者指定的其他条件时,转账成功,则合约中当前账户的余额减少,目标账户中的余额增加,函数返回值为真;否则转账失败,函数返回值为假。

(4)从他人处转账

  从他人处转账transferFrom()函数用于__从他人账户向其他账户进行代币转账__。在有些情况下,用户不仅可以使用transfer()函数自己发起转账,还可以__授权他人在一定限额下调用transferFrom()函数从自己账户中转出代币,而无须自己介入__。

(5)允许量值

   允许量值approve()函数用于设定当前账户对指定账户的__允许转账量值(allowed)__。allowed是一个二元组,allowed[A][B]记录的是用户A对本账户中允许账户B转走的代币额度。该函数的输入参数为代币使用方地址和允许使用的额度,返回值为设置是否成功的布尔型变量。__用户A通过调用approve()函数并指定账户B和允许额度,对allowed[A][B]进行设置__。当账户B调用transferFrom()函数从账户A中转出代币时,需先通过检查,确保转出的数额不超过账户A设置的allowed[A][B]值,并且转账之后allowed[A][B]值会减少相应的数额。

(6)限额

   限额allowance()函数用于查看当前的allowed值。__该函数的输入参数为代币持有方A的地址和代币使用方B的地址,返回值为当前在账户A中允许账户B转出的代币数额allowed[A][B],为无符号整型常量__。
  • 事件

    智能合约中还包括了记录事件的event类型接口,ERC 20合约标准也对代币合约基本的事件接口进行了规范。ERC 20标准要求代币合约包含至少两个事件:转账(Transfer)和允许(Approval)

    (1)转账

    Transfer()事件用于记录代币合约最基本的功能——转账。事件的输入参数为转账的发起方、接收方以及转账的代币金额,一般位于transfer()函数和transferFrom()函数中转账成功之后触发。用户可以从交易收据(receipt)中查看每一笔代币转账的相关信息。
    

    (2)允许

    Approval()事件__用于记录代币合约的进阶功能——允许他人从本账户中转出代币__。事件的输入是代币的持有者、使用者以及所设置的允许金额,一般位于approve()函数中,设置允许限额成功之后触发。用户可以从交易收据(receipt)中查看代币持有者对他人设置的允许转账限额等相关信息。
    

智能合约案例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是智能合约? 智能合约到底做什么的? 的相关文章

  • Spring核心之一:IOC

    IOC Inversion of Control 其实是一种思想 这种思想并不是Spring独有的 而是在软件开发中 大家提出的一种开发原则 类似面向接口编程原则 开闭原则等 网上有很多类似的文章尝试去通俗易懂地解释IOC思想 这里我根据自
  • BugkuCTF-Crypto题小山丘的秘密

    本题考查希尔密码 解题流程 题目信息 1 根据提示知道是希尔 hill 密码 解密网站 www atoolbox net Tool php Id 914 ac csdn flag txt 里给出A 1 一般的希尔密码是A 0 B 1 C 2

随机推荐

  • Vue.js 学习笔记 第5章 内置指令

    本篇目录 5 1 基本指令 5 2 条件渲染指令 5 3 列表渲染指令 v for 5 4 方法与事件 5 5 实战 利用计算属性 指令等知识开发购物车 回顾一下第2 2节 我们己经介绍过指令 Directive 的概念了 Vue js的指
  • JAVA 【基础】 log4j 输出样式

    先了解一下log4j 的打印参数如下 参数 说明 L 输出代码中的行号 l 输出日志事件的发生位置 包括类目名 发生的线程 以及在代码中的行数 如 Testlog main TestLog java 10 m 输出代码中指定的消息 p 输出
  • 使用vs2013编译qt4库

    一 废话 由于项目需要搭建qt msvc2013的环境 而官方提供的qt4库最高只支持和vs2010关联 如果需要配置qt msvc2010只需要安装官方给的qt4库的安装包 然后下载addin就可以了 本人也是第一次搭建该环境 在网上找了
  • GDB 程序调试常用命令

    调试之前 若要在GDB中调试程序在编译时需要加上调试信息 在GCC中添加的方法 GCC g a c o a exe 或下面提供更符合GDB的调试信息 GCC ggdb a c o a exe 运行流程 命令 作用 start 开始执行程序
  • elasticsearch评分进阶

    elasticsearch 评分进阶 原文引用自 Advanced Scoring in elasticsearch 作者还有一篇Elasticsearch评分的经验说明 建议爬墙参考slideshare上的资源对照查看 如有侵权请联系 s
  • 几张架构图阐述微服务架构治理相关知识点

    微服务架构的技术点 超时时间设置 接口重试机制 流量QPS限流 请求熔断处理 请求降级处理 今天给大家分享一下以上相关的知识点 通过微服务系统之间RPC通信的方式 以架构图的形式给大家展开介绍 1 超时时间设置 应用访问业务系统A 业务系统
  • 程序员都要学学任正非的坚强!这个老头,在逆境中崛起!

    点赞再看 养成习惯 微信搜一搜 findyi 关注这个喜欢写情怀的程序员 回复 1 获得程序员职场晋升PPT一份 2019年的最后一天 罗胖在跨年演讲中引用了何帆老师的一句话 用一个人的长期主义 对冲世界的不确定性 那时候 谁也无法想到 世
  • 【STM32】为什么STM32的Flash地址要设置到0x08000000

    参考 不是问题的问题 为什么STM32的Flash地址要设置到0x08000000 这边涉及到分散加载文件 启动文件等等 先挖坑 搞定IAP升级以后再填 为什么STM32的Flash地址要设置到0x08000000 主flash启动时 是从
  • tomcat多系统部署方案

    多系统部署到一个 Tomcat 中 如果某一个系统崩溃可能会同时使其他系统不能正常工作 因为它们运行在同一个 JVM 上 就需要在同一个服务器中安装多个 Tomcat 来运行不同的 WEB 系统 一 Tomcat 版本选择 安装 JDK 版
  • 事件循环(Event Loop)

    目录 一 浏览器的进程模型 1 1 进程 1 2 线程 1 3 浏览器的进程和线程 二 渲染主线程 2 1 渲染主线程中为什么使用异步 2 2 js的异步 2 3 队列的优先级 添加任务到微队列的主要 式主要是使 Promise NextT
  • 板材眼镜大小调整方法

    http v youku com v show id XNTY0NjUwOTU2 html
  • ROS 2正式版来了,到底有哪些新变化?

    锋影 email 174176320 qq com 如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 2017 12 09 机器人开源操作系统软件ROS 2终于推出首个正式版 新版本命名为
  • openGL之API学习(一零三)glGetActiveUniform

    获取活跃一致变量的信息 变量可以在程序执行期间被访问 则该变量被认为是活动的 void glGetActiveUniform GLuint program GLuint index GLsizei bufSize GLsizei lengt
  • 微信小程序唤起键盘页面溢出的解决方案

    文章目录 背景 解决方案 效果 背景 微信小程序的 input 组件 如果使用自带的adjust position会引起除了 input 元素的其他元素一并上移 解决方案 首先获取到屏幕的高度screenHeight 确定好每个元素所占的大
  • 静态代码分析工具清单:开源篇(多语言)

    http hao jobbole com static code analysis tool list opensource utm source hao jobbole com utm medium relatedResources 静态
  • 百度地图入门

    百度地图官网百度api 进入官网选择javascript API 里面有详细的教程 跟着教程先登录注册一个个人开发账号 并创建一个应用获取ak 创建时js需要填白名单 如果是在本地运行填写localhost就好了 当你在控制台看到这个界面是
  • eclipse双击变量高亮显示开关

    eclipse双击变量高亮显示开关 在eclipse myeclipse中如果不小心把变量的高亮显示弄丢了 可真是件愁人的事 不过看到这你就不用愁了 windows gt preferences gt java gt Editor gt M
  • Springboot读取jar下的文件(在springboot打包成jar后)

    关于取web jar中的配置数据 以及存储下载的数据临时目录 按如下方法处理 均已测试验证过 1 更新了文件路径问题 所有的初始化数据Jason直接从reasource目录的mockdata里读 2 所有下载的数据 放到web jar同一级
  • C语言学习———函数

    目录 编辑 1 函数的概念 2 函数的分类 3 库函数是什么 3 1库函数的查找学习方法 3 2库函数的分类 4 自定义函数 4 1形参与实参 4 2传值与传址调用 4 3总结一句 5 函数的嵌套定义与链式访问 5 1嵌套定义 5 2链式访
  • 什么是智能合约? 智能合约到底做什么的?

    Solidity Solidity是一种用于编写智能合约的高级语言 语法类似于JavaScript 在以太坊平台上 Solidity编写的智能合约可以被编译成字节码在以太坊虚拟机上运行 使用Solidity语言编写智能合约避免了直接编写底层