1>部署智能合約網絡 語法 require
2>利用第三方的節點 同步到以太坊
3>智能合約部署的步驟:
1.查看區塊
2.發佈合約
deploy後臺經歷的事情:就是部署合約的代碼
顯示部署到的智能合約
前端和測試用例的開發
編譯合約
測試合約
建立帳戶
提供 測試
交互javascript
使用web3轉帳html
以太坊水龍頭前端
使用web3轉帳
1.腦子裏是整個流程
2.細化到每個api的使用java
新建空工程,操做步驟
1>
2>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代碼調用 |
npm init
一路yes下來
編寫js
部署js
package.json配置
.test.js測試代碼
.sol的智能合約
https://plugins.jetbrains.com/plugin/9475-intellij-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
區塊鏈開發就學兩個新東西:
剩下來的內容都是傳統技術解決的
區塊鏈項目是解決傳統業務中心化,不信任,數據不公開可能被篡改的痛點.
npm install --save web3
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的版本, v0.x.x v1.x.x
網上的教材基本上都是v0.x.x 只能用回調來完成異步代碼, 寫起來是回調地獄
v1.x.x 是支持async/await. 新版本. 可是基本上沒有教程.
咱們上課採用v1.x.x的web3
Web3 大寫的Web3是構造函數,
經過構造函數 生成web3的實例.
web3的實例須要裝入provider電話卡(聯通卡,移動卡,電信卡)
才能夠去以太坊網絡進行交互
const web3 = new Web3(ganache.provider());//測試電話卡
小括號裏面的參數,接不一樣的電話卡, 不一樣的電話卡接入不一樣的網絡
後面咱們會修改這個參數, 鏈接到rankybe網絡等.
函數 | 做用 |
---|---|
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
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);
var str = web3.utils.toAscii("0x657468657265756d000000000000000000000000000000000000000000000000"); console.log(str); // "ethereum"
var str = web3.utils.fromAscii('ethereum'); console.log(str); // "0x657468657265756d" var str2 = web3.utils.fromAscii('ethereum', 32); console.log(str2); // "0x657468657265756d000000000000000000000000000000000000000000000000"
var value = web3.fromWei('21000000000000', 'finney'); console.log(value); // "0.021"
var value = web3.toWei('1', 'ether'); console.log(value); // "1000000000000000000"
var balance = web3.eth.getBalance("0xa23D7B053aBce4500b2cD452ce6d680CA8b114ff"); console.log(balance); // instanceof BigNumber console.log(balance.toString(10)); // '1000000000000' console.log(balance.toNumber()); // 1000000000000
beforeEach()=>{ web3.eth.getAccounts().then(account =>{ console.log(account) }); }
descirbe('Inbox',()=>{ it('test',()=>{ }); });
let accounts; accounts = await web3.eth.getAccounts();
函數體用async修飾
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 不只能夠部署智能合約 abi ,bytecode
也能夠調用部署好的智能合約 abi, address
注意異步的代碼
assert.ok(inbox.options.address)
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); }
介紹www.etherscan.io
輸入智能合約的地址.
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);