DApp是Decentralized Application的缩写,中文直译为去中心化应用,也可以理解为分布式应用。去中心化应用是基于区块链底层开发平台建立的。比如以太坊和EOS,DApp与底层平台的关系就好比APP与ios和安卓系统。
一个真正的DApp应用需要同时满足以下几个条件:应用必须完全开源自治,且只有一个实体控制着该应用超51%token,该应用必须能够根据用户的反馈及技术要求进行升级,且应用升级必须由大部分用户意见达成一致之后方可进行;应用的数据必须加密后存储在公开的区块链上,应用必须拥有token机制,可用基于相同底层区块链平台的通用代币或自行发行新币,矿工对应用维护节点需要得到代币奖励;应用代币的产生必须依据标准的加密算法,有价值的节点可以根据该算法获取应用的代币奖励。
pragma solidity ^0.4.16;
interface token {
function transfer(address receiver, uint amount);
}
contract Crowdsale {
address public beneficiary; // 募资成功后的收款方
uint public fundingGoal; // 募资额度
uint public amountRaised; // 参与数量
uint public deadline; // 募资截止期
uint public price; // token 与以太坊的汇率 , token卖多少钱
token public tokenReward; // 要卖的token
mapping(address => uint256) public balanceOf;
bool public fundingGoalReached = false; // 众筹是否达到目标
bool public crowdsaleClosed = false; // 众筹是否结束
/**
* 事件可以用来跟踪信息
**/
event GoalReached(address recipient, uint totalAmountRaised);
event FundTransfer(address backer, uint amount, bool isContribution);
event LogAmount(uint amount);
/**
* 构造函数, 设置相关属性
*/
function Crowdsale(
address ifSuccessfulSendTo,
uint fundingGoalInEthers,
uint durationInMinutes,
uint weiCostOfEachToken,
address addressOfTokenUsedAsReward) {
beneficiary = ifSuccessfulSendTo;
fundingGoal = fundingGoalInEthers * 1 ether;
deadline = now + durationInMinutes * 1 minutes;
/*一个TOKEN等同于1个以太坊ETH太贵了,修改官网代码,变为一个TOKEN等同于1个wei*/
/*price = etherCostOfEachToken * 1 ether;*/
price = weiCostOfEachToken * 1 wei;
tokenReward = token(addressOfTokenUsedAsReward); // 传入已发布的 token 合约的地址来创建实例
}
/**
* 无函数名的Fallback函数,
* 在向合约转账时,这个函数会被调用
*/
function () payable {
require(!crowdsaleClosed);
uint amount = msg.value;
balanceOf[msg.sender] += amount;
amountRaised += amount;
LogAmount(amount);/*打款3个ETH,判断此处是3还是3*10^18*/
/*官网这个代码有问题,导致打回的币的数量会非常小,此处*1000倍,表示
1个ETH等于1000个TOKEN/
/*tokenReward.transfer(msg.sender, amount / price);*/
tokenReward.transfer(msg.sender, 1000 * (amount / price));
/*msg.sender对应的是当前运行的外部账号的地址*/
FundTransfer(msg.sender, amount, true);
}