架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9170|回复: 2

区块链应⽤开发指南

[复制链接]
发表于 2018-5-3 15:55:28 | 显示全部楼层 |阅读模式
声明:下面是迅雷公司写的“迅雷全球区块链应⽤⼤赛开发指南”文档,为什么拿迅雷公司写的文档作为区块链开发指南呢?

迅雷其实是用以太坊智能合约搭建的私有链,技术已经非常成熟,对区块链技术有着深入的研究,对我们区块链开发有着指导的意义。

熟话说“举一反三”,我们可以通过阅读迅雷公司写的区块链开发指南文档,开发出其他的区块链应用,感谢迅雷公司。

文档内容如下:

1/16
迅雷全球区块链应⽤⼤赛开发指南
合约开发⼊⻔线路推荐
1. 在编写智能合约前,需要对区块链基础有⼀定的了解(附:ethereumoverview)。
2. 学习solidity语⾔ (solidity API)。
3. 结合solidity的学习,学习使⽤ truffle 框架 。使⽤truffle develop在本地
区块链环境下运⾏合约。
4. 学习和使⽤zeppelin-solidty (致⼒于安全的标准化的合约框架) ,设计合
约模式,分离数据和逻辑合约,控制权限安全,考虑升级逻辑。
5. 学习使⽤ web3.js与合约交互。使⽤Metamask插件和web服务与区块链
交互。
6. 论坛答疑:http://wanke.xunlei.com/forum.php?
mod=forumdisplay&fid=53 (您碰到的任何问题,都可在此论坛反
馈,我们将在3个⼯作⽇内给您回复)
基本概念
区块链(Blockchain)
区块链是⼀种去中⼼化的分布式计算系统,主要的特点是数据永久不可篡改性、
不可伪造、公开透明信任度⾼。核⼼的技术包括拜占庭容错的共识算法(PBFT)、
加密技术、P2P技术等。
交易(Transaction)
区块链可以理解为⼀个全局共享的交易数据库系统。任何有权限的软件都可以读
取区块链⽹络中的数据。当需要改变区块⽹络中的数据时,就必须发起⼀个被所
有区块节点接受的请求,这个请求在系统中统称为交易(Transaction)。
交易具有事务性,提交到区块链,要么全部不执⾏,要么全部执⾏。⼀个交易执
⾏完成后永久保存到区块链,不能再做修改和再次执⾏。
交易由系统中的账户(Account)发起并且签名,通过加密技术,交易只能由私钥持
2/16
有⼈发起,其他⼈不能修改和伪造。这样保证了交易的真实和安全。
账户(Account)
在区块链系统中有两类账户,⼀个是外部账户,⼀个是合约账户。外部账户拥有
⾃⼰独有的公私密钥,账户由这个密钥对控制。合约账户有⾃⼰的代码,账户由
⾃⼰的代码控制。
账户由⼀个地址标识,地址⻓度是⼀样的,两类账户⽆差别。外部账户的地址由
其公钥产⽣,合约地址使⽤创建合约账户的地址以及创建合约账户的交易数
(nonce)产⽣。合约由官⽅地址统⼀部署,普通账户不能直接发布合约。⽤户的合
约必须经过官⽅评审,由迅雷统⼀发布。
在系统内部,对待这两类账户是⽆差别的。每个账户在系统内部有⼀个256bits
到256bits的key-value存储结构,叫做storage。每个账户有个余额叫做
balance,单位是wei,可以通过发送带数值的交易到账户进⾏修改。
合约(Contract)
合约就是存储了代码的区块链账户,通过给这个账户发送交易实现合约调⽤。当
前⽐较流⾏的合约编程语⾔是Solidity。当前⼤赛只⽀持Solidity语⾔提交合约。
合约内部分为两个部分,数据储存和函数,数据存储着合约的状态,函数是合约
对外的接⼝,通过调⽤函数实现数据查询和状态修改。
通过编程语⾔书写合约,编译后得到EVM字节码。通过给合约账户发送交易,实
现合约调⽤。
Gas
Gas是区块链的付费单位,⼀个交易创建的时候,会指定⽀付⼀定数量的Gas。主
要是为了约束交易的运算量,以及为交易执⾏⽀付费⽤。交易执⾏过程中,Gas
会以⼀个EVM设定的规则消耗。
Gas价格(Gas price)是由交易创建者指定的⼀个值,交易执⾏需要⽀付的费⽤数
量为Gas_Price*Gas。交易结束如果Gas有剩余,剩余部分会返回给创建建议的
⽤户。如果Gas不⾜,交易执⾏会失败,为了系统安全防⽌泛洪攻击,交易失败
的⼿续费不返回。Gas价格的最⼩单位是wei,10^18 wei = 1 链克。
Solidity
3/16
Solidity是针对智能合约设计的⼀⻔⾼级编程语⾔,运⾏环境是EVM(Ethereum
Virtual Machine)。语⾔设计实现中受到了C++/Python/JavaScript的影响。
Solidity是强类型语⾔,⽀持继承、多态、接⼝、抽象、库、⾃定义数据类型等特
性。Solidity⽀持汇编指令编程,代码编译为字节码后运⾏在EVM上。Solidity是
当下最流⾏的智能合约开发语⾔,也是迅雷合约平台推荐和⽀持的语⾔。
注意事项
1. Ethereum Virtual Machine 是在以太坊上为智能合约提供运⾏时环境的虚
拟机。⼤赛平台兼容EVM,但需遵循官⽅平台的使⽤约束。
2. 账户类型分为外部账户(普通的交易账户地址)和合约账户。创建合约就
是向⽬标账户地址0发送交易的过程。
3. ⼤赛指定使⽤truffle(truffle v4.1.5 solidity v0.4.21)开发智能合
约,平台⽅会根据参赛者提交的⽂件源码校验bytecode。,
使⽤truffle 开发合约
智能合约solidity开发框架truffle。 提供了⼀套完善的开发、调试、编
译、部署、测试的本地环境。 可以使⽤模板命令unbox根据⼀些模板快速
⽣成对应的合约架构。
安装truffle
npm i -g truffle
[root@opennode sandai]# truffle version
Truffle v4.1.5 (core: 4.1.5)
Solidity v0.4.21 (solc-js)
开始
1. 使⽤truffle 初始化合约⼯程
4/16
mkdir simple-storage
cd simple-storage
truffle init
2. 新建合约⽂件:可以使⽤ truffle create contract
SimpleStorage 命令⾏新建,也可以直接新建⽂件
contract/SimpleStorage.sol
// SimpleStorage.sol
pragma solidity ^0.4.21;
contract SimpleStorage {
uint myVariable;
function set(uint x) public {
myVariable = x;
}
function get() constant public returns
(uint) {
return myVariable;
}
}
3. 添加migrate脚本:可以使⽤truffle create migration
2_deploy_contract 命令⾏⽅式新增,也可以直接新建⽂件
migrations/2_deploy_contract.js
// 2_deploy_contract.js;truffle migrate命令的执
⾏顺序与⽂件名有关,所以多个部署脚本需要按照顺序命名
var SimpleStorage =
artifacts.require("SimpleStorage");
module.exports = function(deployer) {
deployer.deploy(SimpleStorage);
5/16
};
4. 执⾏truffle compile编译合约,编译后的合约在build⽂件夹下。每个合约
有⼀个对应的json⽂件,内含部署所需的bytecode,abiCode等
5. 编辑 truffle.js ,设置truffle部署合约及与区块链交互的rpc连接。
[root@localhost opennode]# vi truffle.js
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*"
}
}
};
6. 控制台开启truffle默认的区块链环境。
truffle develop
Truffle Develop started at
http://127.0.0.1:9545/
Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de
6/16
Private Keys:
(0)
c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e
4a9ec0a0f44dc0d3
(1)
ae6ae8e5ccbfb04590405997ee2d52d2b330726137b87505
3c36d94e974d162f
(2)
0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8
ad91193c05875ef1
(3)
c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd8
5da83b71f772aa6c
(4)
388c684f0ba1ef5017716adb5d21a053ea8e90277d086833
7519f97bede61418
(5)
659cbb0e2411a44db63778987b1e22153c086a95eb6b18bd
f89de078917abc63
(6)
82d052c865f5763aad42add438569276c00d3d88a2d062d3
6b2bae914d58b8c8
(7)
aa3680d5d48a8283413f7a108367c7299ca73f553735860a
87b08f39395618b7
(8)
0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07
700d8669ff12b7c4
(9)
8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362
dcae9012b548b1e5
Mnemonic: candy maple cake sugar pudding cream
honey rich smooth crumble sweet treat
⚠ Important ⚠ : This mnemonic was created for
you by Truffle. It is not secure.
Ensure you do not use it on production
7/16
blockchains, or else you risk losing funds.
truffle(develop)>
这为truffle运⾏合约提供了本地的区块链环境,默认⽣成10个账户,每个
账户初始余额为100ether。 也可以使⽤Ganache提供的图形化界⾯应
⽤,需要修改配置连接的端⼝。
7. 在⼀个新的控制台执⾏truffle migrate移植部署合约(或者在truffle
develop控制台执⾏ migrate)。
8. 使⽤truffle develop测试合约代码。
SimpleStorage.deployed().then(function(instance
){return
instance.get.call();}).then(function(value)
{return value.toNumber()})
// 0
SimpleStorage.deployed().then(function(instance
){return instance.set(100);});
// 输出transaction信息
SimpleStorage.deployed().then(function(instance
){return
instance.get.call();}).then(function(value)
{return value.toNumber()});
// 100
9. 使⽤truffle test 测试合约 使⽤truffle create test SimpleStorage新建或
直接新建⽂件test/SimpleStorage.test.js。
const SimpleStorage =
artifacts.require('SimpleStorage');
contract('SimpleStorage', function(accounts) {
8/16
it("should assert true", function(done)
{
var simpleStorage =
SimpleStorage.deployed();
var instance;
simpleStorage.then(res => {
instance = res;
return instance.get()
}).then(value => {
assert.equal('0',
value.toNumber(), 'not equal 0')
}).then(() => {
instance.set(100)
}).then(() => {
return instance.get()
}).then(value => {
assert.equal('100',
value.toNumber(), 'not equal 100')
})
done();
});
});
在新开的控制台⾥,输⼊truffle test ./test/SimpleStorage.test.js。
10. 使⽤remix测试合约 将使⽤truffle 开发的合约,放在remix⾥,可快速模
拟合约的部署和调⽤。 remix提供了合约的编译运⾏环境,并可以在控制
台看到合约每条交易的详细信息,如输⼊输出参数,签名后的⽅法data,
交易hash等信息。⽀持调试。
1. 使⽤compile detail,可以看到合约编译详情。包括bytecode,abi
和使⽤web3.js快速部署的滴啊⽤⽅法。
9/16
2. 使⽤run来create 合约,控制台可查看创建合约的交易。
使⽤truffle unbox创建可交互合约应⽤
上⾯的步骤使⽤基本的truffle init创建了⼀个可编译部署调试的合约环境。 下⾯
使⽤truffle unbox创建⼀个新的⼯程,unbox为我们提供了truffle⼯程模板,内
置了⼀些合约应⽤交互的环境依赖。 可以在truffle boxes⾥查看官⽅提供的各种
模板boxes。 下⾯使⽤的是react模板.
1. 新建⼯程 truf-react
mkdir truf-react
10/16
cd truf-react
truffle unbox react
unbox过程会下载解压模板,执⾏npm install等操作。
2. 配置项⽬的truffle.js
module.exports = {
// See
<http://truffleframework.com/docs/advanced/confi
guration>
// to customize your Truffle
configuration!
networks: {
development: {
host: '127.0.0.1',
port: '9545',
network_id: '*' // Match
any network id
}
}
};
3. 启动⼀个truffle develop
4. 修改src/App.js
import React, { Component } from 'react'
import SimpleStorageContract from
'../build/contracts/SimpleStorage.json'
import getWeb3 from './utils/getWeb3'
import './css/oswald.css'
import './css/open-sans.css'
import './css/pure-min.css'
11/16
import './App.css'
const contract = require('truffle-contract')
const simpleStorage =
contract(SimpleStorageContract)
class App extends Component {
constructor(props) {
super(props)
this.state = {
storageValue: 0,
web3: null,
inputValue: 0,
address: null
}
this.changeValueHandle =
this.changeValueHandle.bind(this)
this.setHandle =
this.setHandle.bind(this)
}
componentWillMount() {
// Get network provider and web3
instance.
// See utils/getWeb3 for more
info.
getWeb3
.then(results => {
this.setState({
web3:
results.web3
})
// Instantiate contract
once web3 provided.
12/16
this.instantiateContract()
})
.catch(() => {
console.log('Error
finding web3.')
})
}
instantiateContract() {
/*
* SMART CONTRACT EXAMPLE
*
* Normally these functions would
be called in the context of a
* state management library, but
for convenience I've placed them here.
*/
this.simpleStorageSet(5)
}
changeValueHandle(event) {
this.setState({
inputValue:
Number(event.target.value)
})
}
setHandle() {
this.simpleStorageSet(this.state.inputValue)
}
simpleStorageSet(x) {
simpleStorage.setProvider(this.state.web3.curren
tProvider)
// Declaring this for later so
13/16
we can chain functions on SimpleStorage.
var simpleStorageInstance
// Get accounts.
this.state.web3.eth.getAccounts((error,
accounts) => {
simpleStorage.deployed().then((instance) => {
simpleStorageInstance = instance
this.setState({
address: instance.address })
// Stores a
given value, 5 by default.
return
simpleStorageInstance.set(x, {from:
accounts[0]})
}).then((result) => {
// Get the value
from the contract to prove it worked.
return
simpleStorageInstance.get.call(accounts[0])
}).then((result) => {
// Update state
with the result.
return
this.setState({ storageValue: result.c[0] })
})
})
}
render() {
return (
<div className="App">
<nav
className="navbar pure-menu pure-menuhorizontal">
14/16
<a href="#" className="pure-menu-heading puremenu-link">Truffle
Box</a>
</nav>
<main
className="container">
<div
className="pure-g">
<div className="pure-u-1-1">
<h1>Good to Go!</h1>
<p>Your Truffle Box is installed and ready.</p>
<h2>Smart Contract Example</h2>
<p>If your contracts compiled and migrated
successfully, below will show a stored value of
5 (by default).</p>
<p>Try changing the value stored on <strong>line
59</strong> of App.js.</p>
<p>The stored value is:
{this.state.storageValue}</p>
<p>deployed contract address:
{this.state.address}</p>
</div>
<div>
<input type="number" onChange=
{this.changeValueHandle}/>
<button onClick={this.setHandle}>set</button>
15/16
</div>
</div>
</main>
</div>
);
}
}
export default App
新增了合约set⽅法的调⽤。并展示了合约的address。
5. 新打开⼀个控制台,执⾏ npm run start
6. 浏览器打开 http://lcoalhost:3000,可看到合约的结果。
7. 通过set和输⼊框设置合约storedData的值。
8. 在trufle develop⾥输⼊
//将xxx替换为address
SimpleStorage.at('xxxx').then(res => {return
res.get()})
// 得到BigNUmber类型的返回值,c数组⾥的值即为设置的
storedData的值。
使⽤浏览器插件 metamask 与区块链交互
参考http://truffleframework.com/tutorials/pet-shop
参赛者提交⽂件说明
⼤赛指定使⽤truffle 开发智能合约,truffle 版本为 v4.1.5,对应的solcjs版本
为 v0.4.21。 开发者需要提交truffle⼯程压缩包和相关项⽬介绍⽂档,⾄少包含
以下内容:
16/16
1. truffle ⼯程基本⽂件结构: build contracts migrations test
package.json truffle.js truffle-config.js README.md // ⼯程⽂档说明
不需要node_modules
2. 需要提供整个项⽬产品的PPT或PDF讲解,内含产品背景介绍,产品意义,
App下载地址(可选),产品使⽤流程介绍。
后续第三⽅开发者可根据即将开放的迅雷链指引⽂档,实现合约应⽤与链克⼝袋
交互。
⽂档与⼯具
solidity API
truffle⽂档
ganache 提供本地区块链环境的图形化界⾯
zeppelin-solidty 致⼒于安全的标准化的合约框架
MetaMask 通过RPC连接为浏览器提供区块链环境的浏览器插件
web3.js 以太坊封装的与区块链交互的js
最后,pdf文档下载:

Dev_Guide_zh.pdf (373.55 KB, 下载次数: 6)
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2018-5-3 16:01:58 | 显示全部楼层
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-5-8 14:25:10 | 显示全部楼层
学习了,谢谢
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-26 16:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表