理解智能合约

2023-10-28

链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。
在这里插入图片描述
0x00 前言
理解智能合约对理解区块链技术至关重要。我们先来看下什么是智能合约。

智能合约是 1990s 年代由尼克萨博提出的理念,几乎与互联网同龄。由于缺少可信的执行环境,智能合约并没有被应用到实际产业中,自比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境,以太坊首先看到了区块链和智能合约的契合,发布了白皮书《以太坊:下一代智能合约和去中心话应用平台》,并一直致力于将以太坊打造成最佳智能合约平台,所以比特币引领区块链,以太坊复活智能合约。[1]

也就是说,智能合约概念并不是随着区块链技术诞生的。区块链技术天然给智能合约带来得天独厚的应用前提。如果说区块链落地应用,比特币和以太坊就是最大的应用了。

了解什么是智能合约概念,我们接下来看下怎么样去理解它。

0x01 智能合约
智能合约程序不只是一个可以自动执行的计算机程序:它自己就是一个系统参与者。它对接收到的信息进行回应,它可以接收和储存价值,也可以向外发送信息和价值。

这个程序就像一个可以被信任的人,可以临时保管资产,总是按照事先的规则执行操作。

下面这个示意图就是一个智能合约模型:一段代码(智能合约),被部署在分享的、复制的账本上,它可以维持自己的状态,控制自己的资产和对接收到的外界信息或者资产进行回应。

智能合约模型:它是运行在可复制、共享的账本上的计算机程序,可以处理信息,接收、储存和发送价值。

简单地说,智能合约就是传统合约的数字化版本。它们是在区块链数据库上运行的计算机程序,可以在满足其源代码中写入的条件时自行执行。智能合约一旦编写好就可以被用户信赖,合约条款不能被改变,因此合约是不可更改的。

现实世界是怎么样应用智能合约的呢?开发人员会为智能合约撰写代码。智能合约可用于交易和(或)两方/多方之间的任何交换行为。该代码包含一些会触发合约自动执行的条件。一旦编码完成,智能合约就会被上传到区块链网络上,即它们被发送到所有连接到网络的设备上。一旦将数据上传到所有设备上,用户就可以与执行程序代码的结果达成协议。然后更新数据库以记录合约的执行情况,并监督合约的条款以检查合规性。[2]

0x02 Solidity
Solidity 是一种语法类似 JavaScript 的智能合约高级语言,它被设计成以编译的方式生成 以太坊虚拟机(Ethereum Virtual Machine,EVM) 代码。

它的语法接近于 Javascript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它又有很多的不同,下面列举一些:

以太坊底层是基于帐户,而非 UTXO 的,所以有一个特殊的Address的类型。用于定位用户,定位合约,定位合约的代码(合约本身也是一个帐户)。
由于语言内嵌框架是支持支付的,所以提供了一些关键字,如payable,可以在语言层面直接支持支付。
存储是使用网络上的区块链,数据的每一个状态都可以永久存储,所以需要确定变量使用内存,还是区块链。
运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络上的节点中的代码执行。
最后一个非常大的不同则是它的异常机制,一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。[3]
0x03 DAPP
去中心化应用(DAPP)是可以使用户和供应商之间直接互动的服务。以太坊去中心化应用典型地通过 HTML/Javascript 网络应用与用户互动,使用 Javascript API 与区块链通信。去中心化应用典型地在区块链上有自己的相关合约套件,用来编码商业逻辑,允许持久存储对共识要求严格的状态。

DAPP 和 APP 是对应的。APP 我们已经很熟悉了,目前我们主要在 iOS 和 Android 平台使用各种类型的 APP。通常一个 APP 从设计、开发、测试、上线等过程都是由一个中心化的组织完成的,APP 的应用也是基于 C/S 架构,其中的 S 表示 Server,也是中心化结构。而 DAPP 不完全是指它的开发是去中心化的,而是它的运行是去中心化的。

目前最为成功的 DAPP 是 CryptoKitties,也就是那个撸猫游戏。这个游戏上线一度造成以太坊网络严重堵塞。

根据 State of the DAPPS 网站统计,目前基于以太坊的 DAPP 有 977 个。感兴趣的读者不妨去搜索看看。

0x04 实践
如果要学习智能合约编程,以下事项需要读者注意:

学习智能合约之前,需要搞清楚区块链、比特币和以太坊的相关知识。
细读 ERC20 协议。
学习 JavaScript、Solidity 编程语言。
熟悉周边工具,如 Truffle、Remix、Metamask 等。
制定开发目标,实现一些小应用。
阅读知名基于 ERC20 区块链项目代码。
比如在第五步,你可以自行在以太坊测试网络或者正式网络发行 Token,还可以基于开源的 Pet Shop 实现第一个 DAPP。

0x05 相关资源
5.1 Terminal
Mist
MetaMask
MyEtherWallet
5.2 IDE
Remix-Solidity IDE
如果你使用 Sublime Text 进行 Solidity 编程,推荐使用以下插件:

Solium Gutter
Ethereum
EthereumSoliditySnippets
如果你使用 Atom 进行 Solidity 编程,推荐使用以下插件:

linter-solidity
autocomplete-solidity
linter-solium
5.3 Frameworks/Tools
JSON RPC API
Truffle development framework
Ethereum JavaScript API
Solidity GitHub
Open-zeppelin
truffle-artifactor
5.4 Docs
Ethereum 官网
Ethereum GitHub
Solidity 官方文档
embark’s documentation
《SOLIDITY 智能合约编程指南》
以太坊智能合约快速入门
The Ethereum Wiki
Dapp Developer Resources
EthFans 知识库
如何编写智能合约
汪晓明对区块链、以太坊的思考
5.5 Forum
web3-js 论坛
Ethereum for web developers
以太坊中文技术社区
台北以太坊社群專欄
区块链技术中文社区
developerWorks 社区
Story Backlog)
Gitter Chat
0x06 小结
本文介绍了智能合约,智能合约程序不只是一个可以自动执行的计算机程序:它自己就是一个系统参与者。它对接收到的信息进行回应,它可以接收和储存价值,也可以向外发送信息和价值。接着讲解了智能合约使用的编程语言 Solidity,接着介绍了 DAPP,然后给出了学习智能编程的步骤,最后给出了相关的资源,希望可以帮到读者。

未来会有更多的 DAPP 进入我们的生活,如果读者是个开发者,不妨找个场景实现个 DAPP。

0x07 参考
[1] GitHub (2016-07-07). 智能合约. Retrieved from https://github.com/EthFans/wiki/wiki/智能合约.
[2] 知乎 (2017-07-05). 为什么要用区块链技术实现智能合约?. Retrieved from https://www.zhihu.com/question/43404157/answer/193952393.
[3] 简书 (2016-12-18). Solidity 语言介绍. Retrieved from https://www.jianshu.com/p/b9f78f9b4c3e.

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

理解智能合约 的相关文章

  • 图形图像系统学习

    1 图像编程学习笔记 http blog csdn net Sun1956 article category 1359270
  • 手机丢了怎么办 如何冻结手机号码

    http jingyan baidu com article 1876c85293a1eb890b137685 html 手机丢了后如何冻结手机号码呢 如今手机号码与各种网络交易支付工具以及交流通讯工具进行了绑定操作 一定手机丢失 可能面临
  • 基于混合整数二阶锥(MISOCP)的配电网重构(附matlab代码)

    参考资料 主动配电网网络分析与运行调控 sciencereading cn 配电网重构是指在满足配电网运行基本约束的前提下 通过改变配电网中一个或多个开关的状态对配电网中一个或多个指标进行优化 通过配电网重构 可以在不增加设备投资的情况下

随机推荐

  • 传递函数H(s)-滤波器设计

    本来这期应该讲Buck的尖峰的 不过遇到些问题 所以就往后拖一拖吧 这次来个简单点儿的 来看看传递函数 也就是我们经常看到的H s 传递函数是怎么定义的呢 百科是这么定义的 传递函数是指零初始条件下线性系统响应 即输出 量的拉普拉斯变换 或
  • Vue项目代码优化,提高网页加载速度。

    一 在编译时不生成 map文件 减少webpack打包后的压缩文件 提高首页编译速度 修改config index js文件 productionSourceMap false 二 开启Gzip压缩 1 修改config index js文
  • 操作系统概念 第五章 下面的进程采用抢占轮转调度。每个进程都分配一个优先级数值,更大的数值表示更高优先级。除了这些进程外......

    操作系统概念 第九版 中文版 5 8 下面的进程采用抢占轮转调度 每个进程都分配一个优先级数值 更大的数值表示更高优先级 除了这些进程外 答案仅供参考 a b P1 20 0 20 P2 80 25 55 P3 90 30 60 查看完整版
  • windows10开启VT和Hyper-V无法安装模拟器的另一种x86 Android解决办法

    为什么80 的码农都做不了架构师 gt gt gt 后续更新 储存空间大小 受限于fat32的原因 即使拓展data img最大也只有4G的存储空间 丢在一边不搭理后进入假死状态 无法进行任何操作 只能重启 然后恶性循环 结论 进行单独软件
  • git在IDEA项目中的简单使用

    git add 全部提交到仓库 git commit m 添加说明 git push 提交到远程github仓库 git log 使用git log命令查看commit记录 git reset hard 4ba182e 填写相应的hash值
  • 将一张图片和一个TFRecord 文件相互转化

    将一张图片转换为TFRecord 文件 usr bin env python codint utf 8 author zhenghan time 2020 7 7 import tensorflow as tf def write test
  • 【DELL Power edge R730XD安装Windows Server 2019 Hyper-V之一】

    DELL Power edge R730XD安装Windows Server 2019 安装系统的时候也可以通过iDRAC虚拟控制台 挂载镜像文件作为虚拟介质安装系统 不过本片文章介绍用U盘安装系统 一 准备工作 在开始安装Server 2
  • 常用的msvcp140.dll丢失的解决方法,msvcp140.dll丢失的原因

    自从电脑出现故障 我的生活变得一团糟 他每天都需要使用电脑处理工作 可是突然有一天 他发现许多软件和游戏都无法正常运行 错误提示显示 找不到msvcp140 dll 这让他感到非常困扰 今天想和大家分享一个在计算机使用过程中经常遇到的问题
  • Android各版本对应的SDK版本,及SDK版本对应JDK版本

    Android各版本对应的SDK版本 及SDK版本对应JDK版本 平台版本 SDK版本 版本名称 Android 11 0 30 Android 11 Android 10 0 29 Android Q Android 9 0 28 Pie
  • element-ui动态设置tabel列时,无效果,表头抖动,表格错乱,值不能正常展示等问题

    踩坑日记 最近用element ui做一个动态列 频繁隐藏显示列 的表格踩坑记录下 1 在el table column上使用v show绑定是无效果 2 el table column几次切换显示 隐藏后 发现表格的排版完全乱了 或者值不
  • 消费升级,彩屏或将成为家电行业市场新风口

    手机的发展历程估计很多小伙伴们都看在眼里 从一开始没有屏幕到黑白屏 再到彩屏按键手机 最后走到智能手机 现在已经进入全面屏手机时代 彻底从 大哥大 变身 大屏控 因为屏幕将决定手机界面 手机应用操作性等许多重要要素 手机的迭代升级 带动整个
  • 恶意代码分析实战 --- 第三章 动态分析基础技术

    Lab 3 1 1 找出恶意代码的导入函数与字符串列表 导入函数只有一个ExitProcess 可能被加壳了 字符串存在两个注册表 1个url 还有1个PE文件名 2 这个恶意代码在主机上的感染迹象特征是什么 3 这个恶意代码是否存在一些有
  • 电商平台用户消费行为分析

    CD案例分析 本文对CD案例进行了一个分析总结 主要是根据用户消费记录 分析用户消费行为 统计电商领域的一些关键性指标 项目背景 CDNOW 是一个主打线上销售的CD品牌 通过 1 5年 的用户消费记录 针对这1 5年时间里的销售数据对用户
  • python之路 第八章 python异常、模块与包——了解异常、异常的捕获方法、异常的传递性、python模块、python包

    目录 第八章 python异常 模块与包 01 了解异常 02 异常的捕获方法 为什么我们要去捕获异常 如何捕获异常 03 异常的传递性 04 Python模块 什么是模块 模块的导入 自定义模块 05 Python包 什么是Python包
  • 教女朋友如何还原数据库?

    第一步右击选择要还原的数据库如下图 第二步选择数据库备份文件 如下图 出现选择文件的对话框如下 第三步选择 强制还原 如下图 最后点击确定 就可还原数据库 注意 对一下选项菜单中的被还原的数据库的物理路径是否正确 很多还原失败就是被还原的数
  • Linux笔记,全网最详细!!!(14)

    文章目录 第一章 Linux介绍 1 1 Linux是什么 1 2 Linux主要的发行版本 第二章 Linux的安装 2 1下载软件 2 1 1 虚拟机软件下载 2 1 2 CentOS下载 2 2 安装虚拟机 2 2 1 虚拟机介绍 2
  • 网络编程入门

    网络编程 网络介绍 网络设备 互联网是什么 IP 端口 传输控制协议 TCP UDP URL 单工 半双工 全双工 综合练习即时聊天系统 网络简介 网络设备 要组成一个局域网 必须要有路由器 每一个连接到路由器上的设备必须有网卡 每一个网卡
  • 离线安装大全

    tar打包解压 离线 打包文件夹 test 命名为test tar tar cvf test tar test 离线 解包文件夹 tar xvf test tar 离线安装yum包 在线 安装yum下载工具 yum install yum
  • 面向对象类设计7大技巧(如果已具备证明已是高级水平了)

    1 一定要保证数据私有 这是最重要的 绝对不要破坏封装性 有时候需要 编写一个访问器方法或更改器 但是嘴还还是保持实例的私有性 很多经验告诉我们 数据的表示形式很可能会改变 但他们的使用方式却不会经常发生改变 当数据保持私有时 它们的表示形
  • 理解智能合约

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 0x00 前言 理解智能合约对理解区块链技术至关重要 我们先来看下什么是智能合约 智能合约是 1990s 年代由尼克萨博提出的理念 几乎与互联网同龄 由于缺少可信的