day02 智能合約

上午

1>部署智能合約網絡 語法 require
2>利用第三方的節點 同步到以太坊
3>智能合約部署的步驟:
1.查看區塊
2.發佈合約
deploy後臺經歷的事情:就是部署合約的代碼
顯示部署到的智能合約
前端和測試用例的開發
編譯合約
測試合約
建立帳戶
提供 測試
交互javascript

使用web3轉帳html

以太坊水龍頭前端

下午

使用web3轉帳
1.腦子裏是整個流程
2.細化到每個api的使用java

新建空工程,操做步驟
1>
2>node

老師筆記程序員

node開發環境搭建

nodejs的版本必須大於8.0.0
下載地址 https://nodejs.org/en/download/es6

配置npm的鏡像倉庫web

命令行指定express

npm --registry https://registry.npm.taobao.org info underscore

編輯 ~/.npmrc 加入下面內容npm

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

image.png

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);
相關文章
相關標籤/搜索