智能合约(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需要Python和pip
- Python安装可以直接到官网下载安装程序
//验证安装成功
python --version
//输出信息
Python 2.7.10
- pip安装,首先需要下载 get-pip.py
//下载
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 [options]
Commands:
install Install packages.
download Download packages.
uninstall Uninstall packages.
...
提示:如果不使用
sudo
切换账户可能会报Permission denied
错误
- 安装testrpc
sudo npm install -g ethereumjs-testrpc
//输出信息
+ [email protected]
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 [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