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

智能合约(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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,639评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,093评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,079评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,329评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,343评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,047评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,645评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,565评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,201评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,338评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,014评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,701评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,194评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,685评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,345评论 2 358

推荐阅读更多精彩内容