第19讲 | 上手搭建一条自己的智能合约
下载APP
关闭
渠道合作
推荐作者
第19讲 | 上手搭建一条自己的智能合约
2018-05-07 陈浩 来自北京
《深入浅出区块链》
课程介绍
讲述:黄洲君
时长08:58大小4.10M
上一篇我们聊到了区块链智能合约,我主要介绍了智能合约的概念,但是并没有给你提供智能合约的实际运行案例,那么今天,我们就自己动手写一个智能合约,并且介绍一下智能合约标准模板,供你参考学习, 并搭建起自己的智能合约。
本篇将以以太坊作为基础知识进行讲解,本篇面向没有任何智能合约基础的人群,所以配备了较多的插图和操作命令,如果你正在收听音频,可以点击文稿查看,希望读完这篇文章可以帮助你快速入门智能合约。
搭建一条智能合约
在实际操作智能合约之前,我们首先回顾一下以太坊,以太坊又称以太坊钱包。以太坊钱包提供了包括账户管理,以太坊转账、Dapp 部署与使用在内的一些常规功能。
以太坊社区提供了多种语言实现的客户端和开发库,多数客户端支持 JSON-RPC2.0 标准,目前支持的客户版本有 Go-ethereum(Go 语言)、Parity(Rust 语言)、Cpp-ethereum(C++ 语言)、Ethereum-lib(Javascript)、EthererumJ(Java 语言)、Pyethapp(Python 语言),基本涵盖了主流编程语言。
图片来自以太坊官方文档
官方推荐使用的版本是 Go-ethererum,这是 Go 语言实现的版本,又称 Geth 客户端。
需要提醒你的是,这里客户端的实现语言并不是要求用户熟悉相应的编程语言,这里的用户是指 Dapp 开发者,比如在操作 Geth 客户端的时候,用户其实并不需要了解 Go 语言。
1. 下载与安装 Geth
本文使用 Geth 来进行测试,首先我们要获取 Geth 客户端,如果用户使用的是 Ubuntu 环境的话,可以直接从 PPA 安装。
安装成功后,我们可以查看 Geth 的版本。
表示我们已经安装成功,当然你可以也可以编译安装,由于篇幅有限,你可以另寻资料进行尝试。
2. 搭建以太坊私链
如果在以太坊的主网上运行和开发测试智能合约,这是不明智的,因为会消耗真实的以太币,不过我们可以使用 Geth 搭建一条属于自己的以太坊区块链,也就是以太坊私链。
怎么搭建呢?其实很简单,只需要修改配置文件和一些运行参数即可。
然后执行:
这样,我们就初始化了属于自己的创世区块信息。
接下来我们创建一个账户,由于是用户私链挖矿,只有你一个人挖矿,所以使用 CPU 挖矿完全没有问题。
我们通过如下命令进入 Geth 命令行交互页面:
如上图所示的那样,运行通过。
我们创建了一个新账户,这个账户就是 EOA 账户,并通过 eth.getBalance 获取了当前地址的余额,显示为 0。
输入 Exit 退出后,我们开始以挖矿模式启动,这里我们最好记录一下我们的地址:
【0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab】
我们使用如下命令启动挖矿,注意在 Etherbase 的地方填上述地址:
以太坊的 PoW 挖矿算法是内存困难型的,首先需要生成 DAG,这个视你设备的性能而定,需要耗费一定时间,请耐心等待,如下图所示,我们可以看到 DAG 生成非常耗费时间。
在我的远程开发机上一共耗费了 6 分半,又经过了 4 分钟,我挖到了第一个块,如下图所示。
这期间机器的负载如下。
可以看到 CPU 和内存占用很高,我这里使用测试的机器是 2Core 4GB Ubuntu16.04。
现在我们再去检查一下 Etherbase 所指向地址的余额。
可以看到已经有 5 个以太币了,以太币的最小单位 wei,所以 5 后面 18 个零表示 5 个以太币。
3. 编写并部署属于自己的智能合约
智能合约的开发与钱包是独立的,用户可以使用 IDE 进行调试等操作,目前 Dapp 的 IDE 并不多,常见有 Truffle、Embark、Remix 几种;
这篇文章中,我并不使用 IDE,这里仅仅会给出一些示例代码,即经典的 Hello Word,你如果想尝试编写自己的智能合约,可以使用在线 IDE。
首先我们要获取 Solidity 编译器,通过 apt-get install solc 来安装。
安装成功后,我们新建一个 Solidity 源码文件,命名为 helloword.sol,并且写入代码如下。
执行 solc --bin helloword.sol 获得 EVM 二进制码。
编译器警告我们暂时不必理会,接下来我们还需要生成 ABI 部署参数,使用命令 solc --abi helloword.sol。
开始部署,我们进入 console,
定义 code 和 abi 两个变量如下,注意 code 的值最前面有 0x,二进制数据是用十六进制表示的。
你可以在控制台分别执行,由于结果比较长,这里就不放出来了。
最终执行结果如下。
我们可以通过 txpool 来查看未确认的交易。
接下来只要等待出块即可,你的合约就会成为正常运行的合约了,否则合约还不可以调用。
由于我本地挖矿出块异常缓慢,所以我尝试了 Remix IDE,运行后我们可以得到如下结果。
至此一个简单的 HelloWord 智能合约就生成啦,不过它的运行成本非常高昂,所以我们极力建议使用在一些方便的虚拟环境中。
智能合约标准模板
当任何人都可以写代码自定义业务逻辑的时候,也就意味着需要一套标准让人们降低开发门槛,标准化的接口让产品之间可以协作。那么我们接下来就来讨论一下以太坊上的三种智能合约标准模板。
这三种模板都与 Token 有关。那么首先我们就来区分一下数字货币与 Token 的概念,数字货币一般指一个区块链项目的平台代币,比如以太坊上的以太币,元界上的 ETP 都是基础代币。
而 Token 往往代表了一种资产,这些资产在已经存在的其他区块链之上运行,资产还可以像商品一样交易,例如消费积分、游戏虚拟资产。Token 离具体的区块链应用也会更近,因为区块链应用的项目方通常也是 Token 的发行方。
目前最广泛使用的三种 Token 标准都是基于以太坊的,它们分别是 ERC20、ERC223、ERC721。这里的 ERC 表示 Ethereum Request for Comments,翻译过来就是以太坊意见征求稿。
1.ERC20
2015 年 11 月,V 神在 Github 上提交了 ERC20 代币的技术标准,随后 2016 年到 2017 年,大量的区块链项目都使用 ERC20 作为工具进行 ICO。这使得 ERC20 成为了区块链整个行业内的 Token 标准,可见这种标准的影响之大。
实际上 ERC20 代币是一类运行在以太坊区块链上的智能合约,只不过这些合约代码遵循一定的规范,这个规范就是 ERC20 标准,它规定了跨 Dapp 转移 Token、Token 交易以及一些使用接口。
ERC20 一共定义了 6 个函数和两个触发事件,他们都是使用 Solidity 语言编写的。
6 个函数描述了如何转移以及 Token 的相关数据如何被访问,市面上 99% 的 ERC20 Token 都可以找到这 6 个函数。2 个事件提供了 Approve 和 Transfer 的格式化输出。
下面我们重点看一看 ERC20 的接口。
Allowance:允许多次创建两个不同的地址之间的单向交易,Token 的拥有者可以从此智能合约中提取 Token;
Approve:这个函数需要引用 Allowance,顾名思义,它定义了 Token 的拥有者同意创建属于自己的交易,这个函数要求两个参数作为输入,分别是花费者的地址,以及发送金额;
BalanceOf:定义了查询目标地址账户余额的接口;
Transfer 和 TransferFrom:定义了 Token 如何转移以及执行转移过程;
TotalSupply:定义了这个 Token 最大发行量。
上面我们简要介绍了 ERC20 标准合约的接口,下面我们来看看升级版的 ERC20。
2.ERC223
在某些情况下,ERC20 也有些缺陷。例如某人使用 ERC20 发送 100 个 Token 到另外一个账户,如果目标账户是一个合约账户,目标账户的合约代码如果不兼容 ERC20 标准怎么办呢?
这一点非常有可能,由于合约代码无法识别交易,所以这笔交易就会被拒绝。
我们知道以太坊使用的并不是 UTXO,这意味着合约之间不满足 ACID,那么很遗憾,发送方的这 100 个 Token 就永久地丢失了。
为了解决这个问题,非官方的社区开发者提交了 ERC223模板,可以解决这个问题,使用者需要把既存的 ERC20 合约升级到 ERC223 合约。
3.ERC721
2018 年初,有一个区块链游戏火了,叫做以太坊养猫游戏,这个游戏也是一个智能合约。它基于 ERC721 标准,实际上它也是一种 Token 标准。
ERC721 与 ERC20 最大的区别是:ERC721 定义了每一份 Token 都是唯一的,它们有唯一的标识。例如芒果和米饭是两种不同属性的资产,从物理世界来看,他们是不能直接混在一起使用的,我们不能把芒果加到大米中。
这样一来,ERC721 中 Token 的含义也转变成了一种物权所有权凭证,不再是 ERC20 中的同质资产。
总结
今天我们介绍了以太坊钱包,手把手教你搭建了一条以太坊私链,并告诉你如何编译和部署智能合约,最后我还介绍了三种流行的智能合约模板,希望能帮助你上手并能深入地理解智能合约。
今天的问题是,除了以太坊之外,还有哪些主打智能合约的区块链项目呢?你可以给我留言,我们一起讨论。感谢你的收听,我们下次再见。
参考链接:
分享给需要的人,Ta购买本课程,你将得18元
生成海报并分享
赞 4
提建议
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
上一篇
第18讲 | 智能合约与以太坊
下一篇
第20讲 | 区块链项目详解:比特股BTS
精选留言(17)
- 未来十年2021-10-12这个配置文件的使用的时候是有问题的,主要是年代有点久远了。参数与配置都有变化,我把我运行成功的参数提供给大家,部分内容优化于其他同学。 1. 下载与安装 Geth # apt-get install software-properties-common # add-apt-repository -y ppa:ethereum/ethereum # apt-get update # apt-get install ethereum 2. 搭建以太坊私链 参数: { "config": { "chainId": 666, "homesteadBlock": 0, "eip150Block": 0, "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "istanbulBlock": 0, "ethash": {} }, "nonce": "0x0", "timestamp": "0x5ddf8f3e", "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x47b760", "difficulty": "0x00002", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { }, "number": "0x0", "gasUsed": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" } $ geth --datadir /root/geth-test/ init genesis.json Geth 命令行交互页面: $ geth --datadir /root/geth-test/ --networkid 98 console 运行: personal.newAccount() Etherbase 的地方填上述地址: geth --datadir geth-test --networkid 98 console --mine --miner.threads=1 --miner.etherbase=0xa8bad128cee139a7279b41e23fd0064eccf71efb展开16
- Geek_JasonFun2019-12-24按步骤进行了一遍操作,觉得还是要有实际动手才会更解,尤其对我们这种软件工程师出身的人来说,不过还是遇到了一些问题,这些步骤估计也是由于时间原因,有些配置需要更新了3
- Crystal2021-05-13在执行该操作后 $ geth --datadir /root/geth-test/ --networkid 98 console 存在目标页面,但有不同,请问老师,这个该怎么处理呢? 还存在下面的信息: INFO [05-13|20:38:52.360] Looking for peers peercount=0 tried=41 static=01
- sun留白2020-02-20安装执行.json文件的时候,报错这个 Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"。老师能解释一下吗?1
- 杨家荣2020-01-22极客时间第二期 21天打卡行动 17/21 <<深入浅出区块链19>>上手搭建一条自己的智能合约 今日所学: 1. 下载与安装 Geth # apt-get install software-properties-common # add-apt-repository -y ppa:ethereum/ethereum # apt-get update # apt-get install ethereum 2. 搭建以太坊私链 参数: { "config": { "chainId": 98, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "200000000", "gasLimit": "2100000", "alloc": { "7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" }, "f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" } } } $ geth --datadir /root/geth-test/ init genesis.json Geth 命令行交互页面: $ geth --datadir /root/geth-test/ --networkid 98 console 运行: personal.newAccount() Etherbase 的地方填上述地址: $ geth --datadir /root/geth-test/ --networkid 98 --mine --minerthreads=1 --etherbase=0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab 3. 编写并部署属于自己的智能合约 4,目前最广泛使用的三种 Token 标准都是基于以太坊的,它们分别是 ERC20、ERC223、ERC721。 5,以太坊养猫游戏展开1
- L。__2022-09-28 来自北京部署私链后,你获取了5个Ether, 这个5个Ether 是挖矿获得,我想知道 挖的是谁的?不是私链吗?
- saltedfish2022-08-26 来自上海"在我的远程开发机上一共耗费了 6 分半,又经过了 4 分钟"......你直接说10分半不行吗。。。
- 阿俊2022-03-31老是出现ERROR[03-31|00:17:48.209] Snapshot extension registration failed peer=1d4fc8e3 err="peer connected on snap without compatible eth support" 是为什么呢
- 成运来2022-02-27按这操作一直提示如下信息 INFO [02-27|13:42:31.650] Looking for peers peercount=0 tried=26 static=0 运行几个小时停止后, 账户还是没有余额咧
- 辣么大2019-12-12棒!!!!!
- iusugar2019-11-24老师您好,下载安装GETH 总是提示连接超时,网络不可达... 网上的办法试了还是这样
- 漂泊的小飘2019-07-30请问pending之后等待出块是啥意思?再开一个窗口去挖矿吗?
- Jason2018-07-24以太坊一般都搭建在Ubuntu上哪?其他Linux可以不?另外想写一个智能合约,用C++可以嘛,部署上有没有什么需要注意的地方?谢谢!
作者回复: 当然可以,你需要从以太坊官网下载对应的版本。 需要用solidty哦,不可以用C++。EOS上你可以用C++
- 神盾局局长2018-05-25truffle不是solidity的一个框架吗?
作者回复: 啊,不好意思,我更正一下,感谢纠正。
- 一单成名2018-05-24老师,能在windows下做这个智能合约的开发么?
作者回复: 你好,当然可以的,参考metamask
- 沃野阡陌2018-05-17私链上挖的以太币是真的Ether吗?还是demo的没有价值的币?
作者回复: 是后者
- Hesher2018-05-09hyperledger也是主打智能合约的,但不需要挖矿,更适合作为联盟链使用