day02 智能合约
上午
1>部署智能合约网络 语法 require
2>利用第三方的节点 同步到以太坊
3>智能合约部署的步骤:
1.查看区块
2.发布合约
deploy后台经历的事情:就是部署合约的代码
显示部署到的智能合约
前端和测试用例的开发
编译合约
测试合约
创建账户
提供 测试
交互
使用web3转账
以太坊水龙头
下午#
使用web3转账
1.脑子里是整个流程
2.细化到每一个api的使用
新建空工程,操作步骤
1>
2>
老师笔记
node开发环境搭建
nodejs的版本必须大于8.0.0
下载地址 https://nodejs.org/en/download/
配置npm的镜像仓库
命令行指定
npm --registry https://registry.npm.taobao.org info underscore
编辑 ~/.npmrc
加入下面内容
registry = https://registry.npm.taobao.org
智能合约编译
源代码---> solidity 编译器 ---> abi/ bytecode --->部署到某个网络
truffle (智能合约创建,本地测试,部署) ---> rinkeby, 网上的demo大多数都是基于truffle的
truffle的问题, 1. api不稳定, 2.bug比较多 3.一些功能缺失
以太坊的很多工具集都处于不稳定的版本,开发状态.
我们从最底层,手把手实现每一个步骤.手动操作理解每一个底层工具的细节.
源代码类型 | 字节码类型 | 执行环境 | 调用者 |
---|---|---|---|
.java源文件 | .class字节码 | jvm执行 | java代码调用 |
.sol源文件 | bytecode字节码 | 区块链环境执行 | javascript代码调用 |
solidity开发环境搭建
- solidity编译器,编译环境
- mocha 抹茶测试环境
- 部署智能合约的脚本 到指定网络
npm init
一路yes下来
开发环境的目录结构
- contracts目录
- Inbox.sol
- test
- Inbox.test.js
- package.json
- compile.js
- deploy.js
编写js
部署js
package.json配置
.test.js测试代码
.sol的智能合约
插件安装
https://plugins.jetbrains.com/plugin/9475-intellij-solidity
solidity编译
npm install --save solc
https://www.npmjs.com/package/solc
读文件
const path = require('path');
const fs = require('fs');
const solc = require('solc')
const inboxPath = path.resolve(__dirname,'contracts','Inbox.sol');
const source = fs.readFileSync(inboxPath,'utf-8');
solc.compile(source,1)
把编译后的结果打印到控制台
对照java的字节码 和 机器码
编译脚本优化
node compile.js
看看编译出来的json对象
:Inbox
- bytecode(机器码)
- interface(ABI)
module.exports = solc.compile(source,1).contracts.[':Inbox']
题外话,智能合约的安全问题
http://baijiahao.baidu.com/s?id=1599034807067855966&wfr=spider&for=pc
http://www.bitcoin86.com/szb/eth/20518.html
软分叉,硬分叉
- 软分叉:如果区块链的共识规则改变后,这种改变是向前兼容的,旧节点可以兼容新节点产生的区块,即为软分叉。
- 硬分叉:如果区块链软件的共识规则被改变,并且这种规则改变无法向前兼容,旧节点无法认可新节点产生的区块,即为硬分叉
区块链的价值在于共识, 所有人达成一致,这种一致性带来的价值是无法衡量的, 为什么只有比特币有价值?现在事实给了你们一些答案,你可以复制比特币的代码,创造无数个比特币,但是比特币背后的生态(开发者、矿工、交易所、商家、用户)你无法复制。就像如果把淘宝、微信的源码给你,你能再造一个淘宝和微信吗?
以太坊硬分叉
https://baijiahao.baidu.com/s?id=1574463853064616&wfr=spider&for=pc
以太坊的智能合约测试
每一行代码都价值千金, 一行代码就可能搞死一个家公司
npm install --save mocha
使用ganache环境进行测试,
ganache是testrpc的升级版, (一个local test network)
npm install --save ganache-cli
bytecode--->部署到ganache-cli
ABI--->使用web3.js进行调用
npm install --save web3
区块链开发就学两个新东西:
- web3.js
- 智能合约
剩下来的内容都是传统技术解决的
区块链项目是解决传统业务中心化,不信任,数据不公开可能被篡改的痛点.
web3.js的安装
npm install --save web3
- 创建test文件夹
- 创建Inbox.test.js
- 引入断言库
const asset = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
注意Web3 是构造函数, 首字母大写
若安装报错, 注意,部分windows电脑可能要安装的工具
npm install --global --production windows-build-tools
终极大招,安装visual studio
web3.js的版本
Web3的版本, v0.x.x v1.x.x
网上的教材基本上都是v0.x.x 只能用回调来完成异步代码, 写起来是回调地狱
v1.x.x 是支持async/await. 新版本. 但是基本上没有教程.
我们上课采用v1.x.x的web3
Web3的工作模式
Web3 大写的Web3是构造函数,
通过构造函数 生成web3的实例.
web3的实例需要装入provider电话卡(联通卡,移动卡,电信卡)
才可以去以太坊网络进行交互
const web3 = new Web3(ganache.provider());//测试电话卡
小括号里面的参数,接不同的电话卡, 不同的电话卡接入不同的网络
后面我们会修改这个参数, 连接到rankybe网络等.
mocha测试框架的使用
函数 | 作用 |
---|---|
it | 跑一个测试或者断言 |
describe | it函数分组 |
beforeEach | 执行一些初始化代码 |
class Dog{
say(){
return 'wangwang';
}
happy({
return 'wuwu';
})
}
describe('dog',()=>{
it('test say',()=>{
const dog = new Dog();
assert.equal(dog.say(),'wangwang');
}) ;
});
package.json添加 scripts
"test":"mocha"
npm run test
- 抽取new Dog()的过程 到beforeEach()
- 每个测试函数it 需要使用到dog, 声明类的全局变量 let
mocha代码测试流程
- mocha start
- 部署智能合约 beforeEach
- 调用智能合约 it
- 进行断言 it
web3的常见api
web3.version
web3.currentProvider
web3.utils.toHex
var str = "abcABC";
var obj = {abc: 'ABC'};
var bignumber = new BigNumber('12345678901234567890');
var hstr = web3.utils.toHex(str); //新版api web3 1.x.x
var hobj = web3.toHex(obj); //旧版api 0.2.x 0.6.x
var hbg = web3.toHex(bignumber);
web3.utils.toAscii
var str = web3.utils.toAscii("0x657468657265756d000000000000000000000000000000000000000000000000");
console.log(str); // "ethereum"
web3.utils.fromAscii
var str = web3.utils.fromAscii('ethereum');
console.log(str); // "0x657468657265756d"
var str2 = web3.utils.fromAscii('ethereum', 32);
console.log(str2); // "0x657468657265756d000000000000000000000000000000000000000000000000"
web3.utils.fromWei
var value = web3.fromWei('21000000000000', 'finney');
console.log(value); // "0.021"
web3.utils.toWei
var value = web3.toWei('1', 'ether');
console.log(value); // "1000000000000000000"
web3.eth.getBalance
var balance = web3.eth.getBalance("0xa23D7B053aBce4500b2cD452ce6d680CA8b114ff");
console.log(balance); // instanceof BigNumber
console.log(balance.toString(10)); // '1000000000000'
console.log(balance.toNumber()); // 1000000000000
从ganache测试框架获取测试账户
beforeEach()=>{
web3.eth.getAccounts().then(account =>{
console.log(account)
});
}
descirbe('Inbox',()=>{
it('test',()=>{
});
});
es6的async和await
let accounts;
accounts = await web3.eth.getAccounts();
函数体用async修饰
使用web3部署智能合约
const {interface, bytecode} = require('../compile');
inbox = await new web3.eth.Contract(JSON.parse(interface)).deploy({
data:bytecode, arguments:['hi']
}.send({from:accounts[0],gas:'1000000'}));
打印inbox
回顾部署智能合约的流程
- 设置web3 模块部署的智能合约有什么接口可以供交互 contract(interface)
- 设置web3 模块要部署的智能合约真正的字节码 deploy(bytecode)
- send方法 指引web3去发送transaction,部署智能合约 send(trans)
web3 不仅可以部署智能合约 abi ,bytecode
也可以调用部署好的智能合约 abi, address
注意异步的代码
对部署的智能合约进行测试
- 测试智能合约是不是已经拿到了address
assert.ok(inbox.options.address)
- 测试验证message设置
call的调用和invoke
inbox.methods.message().call();
inbox.methods.setMessage('hello').send({
from: accounts[0]
});
返回值是hash
部署智能合约到真实网络
修改电话卡provider
介绍infura api
注册infura api
安装 新的module
https://www.npmjs.com/package/truffle-hdwallet-provider
npm install --save truffle-hdwallet-provider
var HDWalletProvider = require("truffle-hdwallet-provider");
var mnemonic = "opinion destroy betray ..."; // 12 word mnemonic
var provider = new HDWalletProvider(mnemonic, "http://infura/xxx");
const web3 = new Web3(provider);
const deploy = async()=>{
const accounts = await web3.eth.getAccounts();
console.log(accounts[0]);
new web3.eth.Contract(xxxx;).deploy(xxx).send(xxx);
}
etherscan使用介绍
介绍www.etherscan.io
输入智能合约的地址.
智能合约开发总结
- solc 编译智能合约
- mocha测试框架 beforeEach describ it
- ganache 创建账户
- provider 测试provider hd-wallet provider
- web3 交互
使用web3转账
let accounts;
const deploy = async () => {
accounts = await web3.eth.getAccounts();
console.log(accounts);
const translation = await web3.eth.sendTransaction({from: accounts[0], to: accounts[1], value: 3000000})
console.log(translation);
console.log(await web3.eth.getBalance(accounts[0]));
console.log(await web3.eth.getBalance(accounts[1]));
};
deploy();
开发以太坊水龙头
var express = require('express');
var Web3 = require('web3');
var HDWalletProvider = require("truffle-hdwallet-provider");
var mnemonic = "skill fragile view aspect tragic depend flock river uncover century pioneer xxxx"; // 12 word mnemonic
var provider = new HDWalletProvider(mnemonic, "https://rinkeby.infura.io/xxxxx");
const web3 = new Web3(provider);
var app = express();
app.get('/:address', async (req,res) => {
console.log('begin');
try {
var accounts = await web3.eth.getAccounts();
var str = 'info.'
let data = Buffer.from(str).toString('hex');
data = '0x'+data;
var id = await web3.eth.sendTransaction({from: accounts[0],
data:data,
to: req.params.address, value: 100000000000000});
res.send('黑马程序员送您0.0001个以太币,转账id为: ' + id.transactionHash)
}catch (error){
res.send('转账失败,请检查地址合法性'+error);
}
console.log('end');
});
app.listen(3000);
day02 智能合约的更多相关文章
- 以太坊智能合约Hello World示例程序
简介 以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开 ...
- Hyperledger智能合约Hello World示例程序
简介 Hyperledger是Linux 基金会主导的一个开源的区块链(BlockChain)项目. 本文介绍了一个简单的Hyperledger智能合约的开发过程. 开发环境 本文使用Docker作为 ...
- 以太坊系列之十六: 使用golang与智能合约进行交互
以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper ...
- 智能合约开发环境搭建及Hello World合约
如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...
- 智能合约语言Solidity教程系列2 - 地址类型介绍
智能合约语言Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你 ...
- 智能合约语言 Solidity 教程系列3 - 函数类型
Solidity 教程系列第三篇 - Solidity 函数类型介绍. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以 ...
- 智能合约语言 Solidity 教程系列4 - 数据存储位置分析
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 这部分的内容官方英文文档讲的不是很透,因此我在参考Soli ...
- 智能合约语言 Solidity 教程系列6 - 结构体与映射
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本系列文章一部分是参考Solidity官方文档(当前最新版 ...
- 智能合约语言 Solidity 教程系列5 - 数组介绍
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本文前半部分是参考Solidity官方文档(当前最新版本: ...
随机推荐
- html 固定长度 超出长度 显示省略号
a{ width: 80px;/* 要显示文字的宽度 */ float: left;/* 左对齐,不设置的话只在IE下好用 */ overflow: h ...
- Oracle oerr工具介绍
(1)什么是oerr oerr是Oracle提供的在UNIX/Linux上查看Oracle错误的小工具,使用起来非常方便. (2)如何使用 oerr工具位于ORACLE_HOME下面,可以使用whic ...
- RL 编、解码(EncodedString、DecodedString) - iOS
开发中对文本传输或二进制传输,都需要将传输的对象进行二进制字节的转化操作,所以无异于编.解码便会经常用到的操作; 当然除了这种方式之外,还有一种常用的 Base64,此文中不具体细谈, Base64 ...
- c#数据库连接池Hikari重构升级
Hikari是我自定义的数据库连接池,前面已经提供了地址.因为c#的连接池按照规范的ADO.NET里面实现定义的.由数据库官方提供,但是实现方式就不知道了,反正没有看出来,估计一般是连接类实现的,但是 ...
- Zabbix 3.x中使用Percona Monitoring Plugins监控MySQL
1.下载安装percona-zabbix-templates-1.1.7-2.noarch.rpm 下载地址:https://www.percona.com/downloads/percona-mon ...
- Linux系统文件和目录的属性及权限
1 文件属性概述 Linux系统中的文件或目录的属性主要包括:索引节点(inode).文件类型.权限属性.硬链接数.所归属的用户和用户组.最近修改时间等内容(文件名严格来说不属于文件的属性): 下面是 ...
- dos命令操作数据库(上)
1.cd到mysql安装目录bin目录: 2.输入id.用户名和密码: 3.查看数据库实例: 4.创建一个实例: 5.删除一个实例: 6.创建一个表: 7.删除一个表: 8.表结构: 9.修改表: 你 ...
- Mysql基础1-基础语法-字段类型
主要: 基础 字段类型 基础 基本概念 1) 数据库分类 层次数据库,网状数据库,关系数据库 常见:SQL Server, Oracle,infomix,sybase,ibmDB2,Mysql 2)数 ...
- ctf题目writeup(8)
2019.2.11 南京邮电的ctf平台: 地址http://ctf.nuptzj.cn/challenges# 他们好像搭新的平台了...我注册弄了好半天... 1. 签到题,打开网址: 查看一下页 ...
- AIM Tech Round 5C. Rectangles 思维
C. Rectangles time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...