上午

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开发环境搭建

  1. solidity编译器,编译环境
  2. mocha 抹茶测试环境
  3. 部署智能合约的脚本 到指定网络
npm init

一路yes下来

开发环境的目录结构

  • contracts目录

    • Inbox.sol
  • test
    • Inbox.test.js
  • package.json
  • compile.js
  • deploy.js

  1. 编写js

  2. 部署js

  3. package.json配置

  4. .test.js测试代码

  5. .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

区块链开发就学两个新东西:

  1. web3.js
  2. 智能合约

剩下来的内容都是传统技术解决的

区块链项目是解决传统业务中心化,不信任,数据不公开可能被篡改的痛点.

web3.js的安装

npm install --save web3

  1. 创建test文件夹
  2. 创建Inbox.test.js
  3. 引入断言库
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
  1. 抽取new Dog()的过程 到beforeEach()
  2. 每个测试函数it 需要使用到dog, 声明类的全局变量 let

mocha代码测试流程

  1. mocha start
  2. 部署智能合约 beforeEach
  3. 调用智能合约 it
  4. 进行断言 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

注意异步的代码

对部署的智能合约进行测试

  1. 测试智能合约是不是已经拿到了address
	assert.ok(inbox.options.address)
  1. 测试验证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

输入智能合约的地址.

智能合约开发总结

  1. solc 编译智能合约
  2. mocha测试框架 beforeEach describ it
  3. ganache 创建账户
  4. provider 测试provider hd-wallet provider
  5. 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 智能合约的更多相关文章

  1. 以太坊智能合约Hello World示例程序

    简介 以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开 ...

  2. Hyperledger智能合约Hello World示例程序

    简介 Hyperledger是Linux 基金会主导的一个开源的区块链(BlockChain)项目. 本文介绍了一个简单的Hyperledger智能合约的开发过程. 开发环境 本文使用Docker作为 ...

  3. 以太坊系列之十六: 使用golang与智能合约进行交互

    以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper ...

  4. 智能合约开发环境搭建及Hello World合约

    如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...

  5. 智能合约语言Solidity教程系列2 - 地址类型介绍

    智能合约语言Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你 ...

  6. 智能合约语言 Solidity 教程系列3 - 函数类型

    Solidity 教程系列第三篇 - Solidity 函数类型介绍. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以 ...

  7. 智能合约语言 Solidity 教程系列4 - 数据存储位置分析

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 这部分的内容官方英文文档讲的不是很透,因此我在参考Soli ...

  8. 智能合约语言 Solidity 教程系列6 - 结构体与映射

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本系列文章一部分是参考Solidity官方文档(当前最新版 ...

  9. 智能合约语言 Solidity 教程系列5 - 数组介绍

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本文前半部分是参考Solidity官方文档(当前最新版本: ...

随机推荐

  1. html 固定长度 超出长度 显示省略号

    a{         width: 80px;/* 要显示文字的宽度 */         float: left;/* 左对齐,不设置的话只在IE下好用 */         overflow: h ...

  2. Oracle oerr工具介绍

    (1)什么是oerr oerr是Oracle提供的在UNIX/Linux上查看Oracle错误的小工具,使用起来非常方便. (2)如何使用 oerr工具位于ORACLE_HOME下面,可以使用whic ...

  3. RL 编、解码(EncodedString、DecodedString) - iOS

    开发中对文本传输或二进制传输,都需要将传输的对象进行二进制字节的转化操作,所以无异于编.解码便会经常用到的操作; 当然除了这种方式之外,还有一种常用的 Base64,此文中不具体细谈, Base64 ...

  4. c#数据库连接池Hikari重构升级

    Hikari是我自定义的数据库连接池,前面已经提供了地址.因为c#的连接池按照规范的ADO.NET里面实现定义的.由数据库官方提供,但是实现方式就不知道了,反正没有看出来,估计一般是连接类实现的,但是 ...

  5. Zabbix 3.x中使用Percona Monitoring Plugins监控MySQL

    1.下载安装percona-zabbix-templates-1.1.7-2.noarch.rpm 下载地址:https://www.percona.com/downloads/percona-mon ...

  6. Linux系统文件和目录的属性及权限

    1 文件属性概述 Linux系统中的文件或目录的属性主要包括:索引节点(inode).文件类型.权限属性.硬链接数.所归属的用户和用户组.最近修改时间等内容(文件名严格来说不属于文件的属性): 下面是 ...

  7. dos命令操作数据库(上)

    1.cd到mysql安装目录bin目录: 2.输入id.用户名和密码: 3.查看数据库实例: 4.创建一个实例: 5.删除一个实例: 6.创建一个表: 7.删除一个表: 8.表结构: 9.修改表: 你 ...

  8. Mysql基础1-基础语法-字段类型

    主要: 基础 字段类型 基础 基本概念 1) 数据库分类 层次数据库,网状数据库,关系数据库 常见:SQL Server, Oracle,infomix,sybase,ibmDB2,Mysql 2)数 ...

  9. ctf题目writeup(8)

    2019.2.11 南京邮电的ctf平台: 地址http://ctf.nuptzj.cn/challenges# 他们好像搭新的平台了...我注册弄了好半天... 1. 签到题,打开网址: 查看一下页 ...

  10. AIM Tech Round 5C. Rectangles 思维

    C. Rectangles time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...