【精解】开发一个智能合约

关键字:智能合约,remix,Solidity,truffle,geth,leveldb,datadir,ganache,web3j

合约

合约也称合同、协议,是甲乙双方参与的,制定一系列条目规范双方权利与义务的文件。智能合约是电子化的,自动执行的,去中心化的,具有不可抵赖性,本质上它是一段代码,依托于区块链技术,它可以做很多事情,基于以太坊的智能合约可以让你的区块链扩展出任何你想要的功能。

我相信,智能合约是区块链的未来,因为基于它能做的商业模型太多样了,远远不仅是数字货币一种。

Solidity

智能合约的编程语言是Solidity,扩展名为.sol,它是基于C++、JavaScript、Python创造而来的,这里是官方文档。

Solidity是静态类型的,支持继承,有自己的函数库,它同样支持面向对象语言的自定义类型等其他功能。

Solidity编写的智能合约代码运行在EVM,即以太坊虚拟机,正如java编写的代码运行在JVM一样,在同一个区块链中每一个结点的EVM都是相同的运行环境。通过智能合约,可以开发匿名投票、匿名拍卖、众筹以及多重签名的钱包等,以太坊每一个结点可以有多个账户,所以每个结点都可以称作钱包,可以管理名下的账户,以及转账、挖矿等操作。

官方推荐IDE:Remix

其实Solidity智能合约开发的IDE有很多,官方推荐的Remix是基于浏览器的,运行环境可以切换:

挂在自己的JavaScript EVM

也可以使用web3 provider

还可以使用注入的web3连接到本机调试环境

我使用以后,觉得浏览器的方式还是不习惯,尤其保存的文件无故消失,让我始终心有余悸,经过调研,下面我们将采用goLand,安装Intellij-Solidity-2.0.4插件的方式开发智能合约,然后使用Remix环境进行智能合约的部署。当然我们也可以使用Remix进行运行、测试以及调试工作,下面酌情展示。

gas

区块链中比较有意思的命名,相当于手续费但又有些不同。gas为天然气,用来代表我们程序运行所有的能耗,当发生交易等操作时会消耗相应的gas,gas的计算方式是

gas 单价 × gas 数量

其中gas单价是由用户,像我们这样的发起者愿意为此次操作付出多少以太币而定的(相当于你开车上路前愿意给你的油箱加多少油,假设你的油箱是无限大的)。gas数量是程序根据你操作的复杂度自动定义的。

智能合约也是一样的,当一个发起者部署运行一段智能合约时,以太坊会收取gas费用,就像汽车行驶需要烧油一样,直到你的智能合约运行完毕,“油箱”中剩余的gas会退还给你,如果你的代码死循环了,耗尽了你“油箱”中的gas,那么以太坊会自动报出异常停止你的智能合约。我们在学习智能合约阶段,可以使用testnet环境来避免真的花费以太币。

Dapp

Dapp为Solidity提供了源码构建工具,包管理工具,单元测试以及智能合约部署,一会儿我们看看是否必须要用它。有时它也被称作去中心化的应用程序(Decentralized App)。这种应用程序除了有一段代码的智能合约以外,还需要UI,UE设计等,正如apple的app开发,我们未来的目标之一可以是开发自己的Dapp。

准备工作

首先要开启一个本地的EVM,前面的文章对Geth做了详细的介绍,这里直接启动一个本地开发模式的结点。

geth --datadir testNet --dev console 2>>Documents/someLogs/testGeth.log

简介一下geth的参数选项:

dev

Ephemeral proof-of-authority network with a pre-funded developer account, mining enabled

短暂的认证证明网络,同时创建一个预存款很多钱的一个开发者账户,并自动开始挖矿。

datadir

datadir,指定结点文件目录,如果没有会自动创建一个,该目录包含:

geth

chaindata 区块数据、状态数据的目录,数据库是leveldb(一个键值对数据库)

000001.log

CURRENT 指向MANIFEST

LOCK 区块数据锁定标识文件

LOG 数据库(区块和状态)操作日志

*.ldb 块数据文件

MANIFEST-000000 (TODO,我也不知道是什么,谁能告诉我一下)

LOCK 结点锁定标识文件

nodekey 结点身份公钥,用于p2p网络寻找结点使用

transactions.rlp

geth.ipc Mist是以太坊钱包,该文件是Mist用来内部过程通信的socket文件。

keystore 存储私钥

UTC--2018-02-06T03-46-35.626115529Z--740b9c48d67cf333c8b1c0e609b6b90b40d3cdea

以上目录中元素精解:

① nodekey

结点之间相互寻找是通过一个发现协议:一个基于S/Kademlia的网络协议。这个协议会把包含IP地址的公钥联系起来。实际上在结点之间的peer连接使用的是一个完全不同的,加密的协议(RLPX)。RLPX加密的工作方式需要远程终端连接发起者的公钥作为身份识别。本质上来说,这个key链接了发现协议和RLPX。

你可以随时删除这个nodekey,重启的时候会自动生成一个新的。

② keystore/UTC--2018-02-06T03-46-35.626115529Z--740b9c48d67cf333c8b1c0e609b6b90b40d3cdea

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywsjf.html