DApp( Decentralized Application )即分布式应用或去中心化应用。DApp就是智能合约+App。
一个真正的DApp应用,需要同时满足以下几个条件:
应用必须完全开源、自治,且没有一个实体控制该应用超过51%的- Token。该应用必须能够根据用户的反馈及技术要求进行升级,且应用升级必须由大部分用户达成共识之后方可进行;
应用的数据必须加密后存储在公开的区块链上;
应用必须拥有Token机制,矿工或应用维护节点需得到代币奖励;
应用代币的产生必须依据标准的加密算法,有价值的节点可以根据该算法获取应用的代币奖励。
DApp原理
一个DApp被调用之前需要先部署到以太坊上,不管是私链,公链还是联盟链。故本章节分为两部分,DApp部署原理和调用原理。
部署
一个DApp由多个智能合约组成,部署一个DApp也就是同时部署多个智能合约,这里讲述一下部署一个智能合约的流程。
以太坊Web3.js提供调用合约的方法一共有四种:
call: 这是最简单的调用方式,适用于调用只读的方法,也就是调用过程不会修改区块链上的数据,因为它只读取本地数据即可,因此不会消耗gas,而且可以立刻获得返回值,适用于前端调用,具体例子如下。
1
//合约声明
2
3
contract test {
4
5
function multiply(uint a) returns(uint d) {
6
7
return a * 7;
8
9
}
10
11
}
12
13
//合约调用【更全面的开发源码搭建可看我昵称】
14
15
var Multiply7 = eth.contract(contract.info.abiDefinition);
16
17
var myMultiply7 = Multiply7.at(address);
18
19
myMultiply7.multiply.call(3)
20
21
sendTransaction: 可调用读或写方法,调用过程会创建一个交易,调用之后会返回一个交易hash值,它会广播到网络,等待矿工打包, 它会消耗gas,而且该调用不能立刻获得返回值,只能从event log中获取,也是适用于前端调用,代码如下。
22
23
wheelOfFortune.makeBet.sendTransaction(num – 1, betCount, tips, { from: web3.eth.accounts[0], value: betUnit \* betCount + tips }).then(function (result) {
24
25
if (result.logs.length > 0) {
26
27
var eventobj = result.logs[0].args;
28
29
$.ajax({
30
31
url: /Wheel/makeBet/ + eventobj.pieceIdx + / + betCount + / + tips + / + web3.eth.accounts[0],
32
33
success: function (data) {
34
35
var nextRound = JSON.parse(data);
36
37
$(“#currentTotal”).text(nextRound.betPool.toLocaleString());
38
39
playersNumberOfPiece = nextRound.playersNumberOfPiece;
40
41
alert(成功);
42
43
}
44
45
});
46
47
}
48
49
});
50
51
直接调用: 这是一种特殊调用,可以说是前两种调用的结合,因为当合约方法有constant修饰时,直接调用会等同于call,否则等同于sendTransaction。
52
53
var winIdx = (Math.random() \* wheel.config.pieceCount) >> 0;
54
55
// 后台调用infura部署的合约必须用sendRawTransaction
56
57
var coder = require(web3/lib/solidity/coder);
58
59
var CryptoJS = require(crypto-js);
60
61
var Tx = require(ethereumjs-tx);
62
63
var privateKey = new Buffer(“71112e795325d5cbf14d665091ce4626f26c8342b8038f1adcdfff26be04a220”, hex);
64
65
var functionName = finishRound;
66
67
var types = [uint];
68
69
var args = [winIdx];
70