【区块链基础01】-区块链引子 智能合约 Solidity
一、区块链简介
1.区块链到底是什么?
区块链是一种分布式数据库,起源自比特币,区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了若干次比特币网络交易信息,用于验证其信息的有效性(防伪)和生成下一个区块。
2.区块链技术的定义
区块链是一个分布式账本,一种通过去中心化、去信任的方式集体维护一个可靠数据库的技术方案。
3.从数据的角度看
区块链是一种几乎不可能被更改的分布式数据库,“分布式”有两个含义,一个是分布式存储,一个是所有参与者共同维护
4.区块链技术的特性
匿名、不可篡改和加密安全性、无须信任系统、分布式去中心化、交易透明
基于以上优点,比特币实现了一个自我运行的,成交量数十亿的交易系统,全球化7*24小时稳定的运行了多年。任何两个账户之间的比特币买卖都被忠实的记录在大量冗余的账本上。
在比特币网络中,任何账号都是匿名的,任何账号之间的交易都不可篡改,且会被记录在每一个节点上。然后通过对挖矿的比特币激励机制,实现了这个网络的自运行,无需任何中心化的交易系统。
二、以太坊
1.以太坊是什么?
以太坊是一个开源的有智能合约功能的公共区块链平台,通过其专用加密货币以太币提供去中心化的虚拟机(EVM)来处理点对点合约。简而言之,以太坊就是区块链技术+智能合约
在以太坊的网络中,智能合约也被看做一个特俗的账户,从而使得用户可以通过和该账户进行交易,实现对该账户中的属性和方法的调用。从而从底层技术上支持了智能合约的实现。

2.智能合约是什么?
之前说过区块链技术的五个特性。以太坊继承了上面所有的区块链技术的基础上,提供了智能合约的支持。从而使区块链技术从原来的账户与账户之间的交易功能,扩展为一个可以实现智能合约的平台。这个智能合约可以是一个众筹合约,也可以是一个数学公式,或者是一个完全的随机数。
只要智能合约被部署到以太坊的网络上,他就天生带有了区块链技术的5个特征,同时因为他是由类JavaScript的语言撰写,因此可以实现很多复杂的业务逻辑。
3.简单的智能合约实例
pragma solidity 0.4.9;
contract DemoTypes{
function f(unit a) returns (unit b){
unit result = a*8;
return result;
}
}
说明:以上就是一个简单的智能合约,该智能合约实现了基本的功能,就是输入N,返回8*N。
执行代码的工具:browser-solidity
官方地址:https://ethereum.github.io/browser-solidity/#version=soljson-v0.4.9+commit.364da425.js
操作流程
1.粘贴代码

2.点击红色CREATE

说明:点击create,就可以把这份简单合约部署到区块链网络上(内存上)

说明:
1.Transaction/Execution Cost:这个代表create 一个合约所消耗的成本,单位为Gas.Gas和Ether币有一个兑换关系,兑换比例由Oracle决定
2.这里可以看到我们的合约名称DemoTypes,注册在了一个地址上边。这个代表该合约已经被挖矿出来了。
3.第三个就是我们上方的合约代码,f(n){return 8*n}
输入100,然后点击f按钮,我们可以看到结果

说明:
1.结果是800,符合预期
2.执行f()这个function消耗的Gas Cost 是21698+800
三、Solidity
solidity是以太坊智能合约的核心语言
1.solidity是什么?
solidity是以太坊智能合约的编程语言,通过编译&部署智能合约,可以实现智能合约的CREATE、执行和查看,从而实现某些商用价值。
2.solidity实例
1.实现1+2+3+4+...+n的求和功能
pragma solidity 0.4.9;
contract Demo1 {
/*计算从1到N的求和*/
function f(unit n) returns (unit sum){
if(n == 0) throw; unit result = 0;
for(unit i = 0;i <= n;i++){
result += i;
}
return result;
}
}
2.实现一个代币功能,并自带挖矿和转移代币的功能
pragma solidity ^0.4.0;
contract Coin{
//The keyword "public" makes those variables readable from outside
address public minter;
mapping (address => unit) public balance;
//Events allow light clients to react on changes efficiently.
event Sent(address from,address to,unit amount);
//This is the constructor whose code is run only when the constructor is create.
function Coin(){
minter = msg.sender;
}
function mint(address receiver,unit amount){
if(msg.sender != minter) return;
balances[receiver] += amount;
}
function send(address receiver,unit amount){
if(balances[msg.sender] < amount) return;
balances[msg.sender] -= amount;
balances[receiver] += amount;
Sent(msg.sender,receiver,amount);
}
}
3.实现一个众筹的智能合约,各个用户可以筹款,筹款成功可以将所得转让给受益人,每个参与众筹者可以获得代币。
pragma solidity ^0.4.2;
contract token{
function transfer(address receiver,unit amount){
}
}
contract Crowdsale4{
/*data structure to hold information about campaign contributors*/
/*数据结构来保存有关竞选捐款的信息*/
address public beneficiary;
unit public fundingGoal;
unit public amountRaised;
unit public deadline;
unit public price;
token public tokenReward;
mapping(address => unit256) public balanceOf;
bool public funingGoalReached = false;
event GoalReached(address beneficiary,unit amountRaised);
event FundTransfer(address backer,unit amount,bool isContribution);
bool public crowdsaleClosed = false;
/* at initialization, setup the owner*/
/*初始化*/
function Crowdsale4(
address ifSuccessfulSendTo,
unit fundingGoalInEthers,
unit durationInMinutes,
unit etherCostOfEachToken,
token addressOfTokenUsedAsReward
){
beneficiary = ifSuccessfulSendTo;
fundingGoal = fundingGoalInEthers * 1 ether;
deadline = now + durationInMinutes * 1 minutes;
price = etherCostOfEachToken * 1 ether;
tokenReward = token(addressOfTokenUsedAsReward)
}
/* The function without name is the default function that is called whenever anyone sends funds to a contract*/
/*没有名称的函数是默认函数,每当有人向契约发送资金时就会调用该函数。*/
function () payable {
if(crowdsaleClosed) throw;
unit amount = msg.value;
balanceOf[msg.sender] += amount;
amountRaised += amount;
tokenReward.transfer(msg.sender,amount/price)
FundTransfer(msg.sender,amount,true);
}
modifier afterDeadline(){
if(now >= deadline) _;
}
/*checks if the goal or time limit has been reached and ends the campaign*/
/*检查是否达到了目标或时间限制,结束了活动*/
function checkGoalReached() afterDeadline {
if(amountRaised >= fundingGoal){
fundingGoalReached = true;
GoalReached(beneficiary,amountRaised);
}
crowdsaleClosed = true;
}
function safeWithdrawl() afterDeadline{
if(!fundingGoalReached){
balanceOf[msg.sender] = 0;
if(amount > 0){
if(msg.sender.send(amount)){
FunddTransfer(msg.sender,amount,false);
}else{
balanceOf[msg.sender] = amount;
}
}
}
if(fundingGoalRechead && beneficiary == msg.sender){
if(beneficiary.send(amountRaised)){
FundTransfer(beneficiary,amountRaised,false);
}else{
/*If we fail to send the funds to beneficiary, unlock funders balance*/
fundingGoalReached = false;
}
}
}
}