以太坊学习笔记(五)——智能合约与Dapp开发环境与工具

96
古川不爱笑
2018.09.07 21:29* 字数 1541

智能合约(Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1994年由Nick Szabo首次提出。

智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。

DApp 是decentralized application(分布式应用)的缩写,用一句非常直白的话来解释DAPP,那就是:把我们目前依靠IOS和Android系统开发的APP抓出来,扔在区块链系统上,结合智能合约,它就成了DAPP。

只有当满足以下所有条件时,一个应用才可以称之为DAPP。

  • 应用必须完全开源、自治并且没有一个实体控制着该应用的大部分代币(Token)。该应用必须能够根据市场的反馈及技术要求进行升级,但是升级必须由应用的用户达成共识之后才可以进行;
  • 应用的数据必须加密后存储在公开的区块链上;
  • 应用必须拥有代币机制(可以使用已存在的代币或者新发行一种内置代币),矿工或者应用维护节点需要得到代币奖励;
  • 应用代币的产生必须依据标准的加密算法,有价值的节点可以根据该算法获取应用的代币奖励。

智能合约

Solidity 是目前编写智能合约最常用的语言,语法有些类似JavaScript文件扩展名.sol。当然开发语言还有与Python接近的Serpent文件扩展名.s,但比较流行的还是Solidity
Solidity网上文档很多,但大部分都是翻译过来的,有实力的小伙伴可以Solidity自己学习和理解英文版的。

solc编译器 用Solidity写好智能合约之后,需要用solc来编译。它是一个使用C++客户端实现的组件。solc-js的用法可以在官方Github上查看
安装solc

//通过npm安装
npm install -g solc

//验证安装成功
solcjs --help
Usage: solcjs [options] [input_file...]

选项:
  --version         显示版本号                                             [布尔]
  --optimize        Enable bytecode optimizer.                            [布尔]
  --bin             Binary of the contracts in hex.                       [布尔]
  --abi             ABI of the contracts.                                 [布尔]
  --standard-json   Turn on Standard JSON Input / Output mode.            [布尔]
  --output-dir, -o  Output directory for the contracts.                 [字符串]
  --help            显示帮助信息                                          [布尔]

Remix 如果你觉得使用solc编译器太过于麻烦,可以使用官方推荐的在线开发环境Remix,不过官方已经换过几次地址,我不敢保证时间久了链接依然有效。

web3.js API 当合约部署到以太坊网络上之后,你可以使用以太坊的web3.js JavaScript API来调用它,开发能够与智能合约交互的应用。

以上就是智能合约开发需要的一些基本工具,如果想非常熟练的开发智能合约,上面提到的内容就必须要熟练掌握与运用。

智能合约的部署流程

智能合约的部署流程大致如下:
1.启动一个以太坊节点,例如:geth或testrpc;
2.编译已写好的智能合约;
3.将编译好的智能合约部署到节点网络(这一步会消耗以太币,还需要使用你的节点的默认地址或者指定地址来给合约签名。) => 获得合约的区块链地址和ABI;
4.用web3.js提供的JavaScript API来调用合约。

下图比较详细的描述了整个流程:
流程图

DAPP

Truffle 是针对基于以太坊的Solidity语言的一套开发框架,对客户端做了深度集成。开发,测试,部署一行命令都可以搞定。本身基于Javascript,但对Javascript的要求比较低,知道基本语法、模块、Promise的概念差不多就可以了,如果不知道碰到不懂的,再查资料也不会有太大的问题。

Truffle的安装
1.首先安装solc,智能合约那部分已经讲过如何安装;
2.testrpc安装,testrpc需要Pythonpip

  • Python安装可以直接到官网下载安装程序
//验证安装成功
python --version
//输出信息
Python 2.7.10
//下载
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

//安装
sudo python get-pip.p
//输出信息
Installing collected packages: pip, wheel
Successfully installed pip-18.0 wheel-0.31.1

//验证安装
pip --help

Usage:   
  pip <command> [options]

Commands:
  install                     Install packages.
  download                    Download packages.
  uninstall                   Uninstall packages.
...

提示:如果不使用sudo切换账户可能会报Permission denied错误

  • 安装testrpc
sudo npm install -g ethereumjs-testrpc
//输出信息
+ ethereumjs-testrpc@6.0.3
added 404 packages in 37.952s

备注:之前这个地方安装有些问题,故此重新调整了一下。另外,testrpc这种方式已经不推荐了,官方推荐使用Ganache

3.安装Truffle

//安装
npm install -g truffle

//验证安装
truffle list
Truffle v4.1.14 - a development framework for Ethereum

Usage: truffle <command> [options]

Commands:
  init      Initialize new and empty Ethereum project
  compile   Compile contract source files
  migrate   Run migrations to deploy contracts
  deploy    (alias for migrate)
  build     Execute build pipeline (if configuration present)
  test      Run JavaScript and Solidity tests
  debug     Interactively debug any transaction on the blockchain (experimental)
  opcode    Print the compiled opcodes for a given contract
  console   Run a console with contract abstractions and commands available
  develop   Open a console with a local development blockchain
  create    Helper to create new contracts, migrations and tests
  install   Install a package from the Ethereum Package Registry
  publish   Publish a package to the Ethereum Package Registry
  networks  Show addresses for deployed contracts on each network
  watch     Watch filesystem for changes and rebuild the project automatically
  serve     Serve the build directory on localhost and watch for changes
  exec      Execute a JS module within this Truffle environment
  unbox     Download a Truffle Box, a pre-built Truffle project
  version   Show version number and exit

See more at http://truffleframework.com/docs

Truffle的使用
按照上面的操作成功安装了truffle以及需要的环境,我们接着来初步尝试一下truffle的使用
1.创建一个新的文件夹,并进入到创建的文件夹内

mkdir /你的路径/conference

cd /你的路径/conference

2.初始化项目,使用truffle init来完成项目的创建

truffle init
//输出信息
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:        truffle compile
  Migrate:        truffle migrate
  Test contracts: truffle test

创建好的文件结构如下:

conference
├── contracts
│   └── Migrations.sol
├── migrations
│   └── 1_initial_migration.js
├── test
├── truffle-config.js
└── truffle.js

现在truffle init只是初始化了一个dapp开发的基本框架,并不是一个完整的dapp,截止我写这篇文章的时间,我找到的资料大部分都讲的是init能够初始化一个完整的事例demo,所以我不敢保证几个月、几年后的读者看到我的这篇文章依然能够操作成功,所以我就先不讲truffle compile, truffle deploy, truffle serve这些操作,因为我通过这些操作还没能够顺利的运行一个demo,即便是官方的demo也存在合约语法变更没有及时维护到最新状态的情况。
当然前面提到的这些情况,有很大可能是因为我的知识体系不够完善,某些内容刚好触及到我的知识盲区,所以我打算先写到这里,后面专门写篇文章来讲truffle的使用,大伙儿有时间最好读一下官方的Truffle Doc熟练掌握truffle的用法。
最后补充一点,大伙儿可以通过truffle unbox来获取官方提供的一个完整的demo

truffle unbox webpack
//输出信息
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:              truffle compile
  Migrate:              truffle migrate
  Test contracts:       truffle test
  Run linter:           npm run lint
  Run dev server:       npm run dev
  Build for production: npm run build
区块链
Gupao