
備注
以上導(dǎo)圖最上面是說的區(qū)塊鏈發(fā)生的背景
左邊是開發(fā)一個(gè)demo,會(huì)在文章最后面附一個(gè)基于以太坊的投票智能合約
下面是他的一些主要原理之類的,描述加密算法和p2p網(wǎng)絡(luò),還有科普。
右邊是實(shí)戰(zhàn)嘍,主要是基于以太坊的,采用web3.js和輕錢包一起整合使用
科普
51% Attack(51%攻擊)
當(dāng)一個(gè)單一個(gè)體或者一個(gè)組超過一半的計(jì)算能力時(shí),這個(gè)個(gè)體或組就可以控制整個(gè)加密貨幣網(wǎng)絡(luò),如果他們有一些惡意的想法,他們就有可能發(fā)出一些沖突的交易來損壞整個(gè)網(wǎng)絡(luò)。
Address(地址)
加密貨幣地址用于在網(wǎng)絡(luò)上發(fā)送或接收交易。 地址通常表示為個(gè)數(shù)字字字符。
Bitcoin(比特幣)
Bitcoin是在全球?qū)Φ染W(wǎng)絡(luò)上運(yùn)行的第一個(gè)去中心化開放源代碼的加密貨幣,不需要中間商和集中式發(fā)行商。
Blockchain(區(qū)塊鏈)
區(qū)塊鏈?zhǔn)且粋€(gè)共享的分布式賬本,其中交易通過附加塊永久記錄。 區(qū)塊鏈作為所有交易的歷史記錄,從發(fā)生塊到最新的塊,因此命名為blockchain(區(qū)塊鏈)。
Cryptographic Hash Function(加密哈希函數(shù))
密碼哈希產(chǎn)生從可變大小交易輸入固定大小和唯一哈希值。 SHA-256計(jì)算算法是加密散列的一個(gè)例子。
Ethereum(以太坊)
Ethereum是一個(gè)基于blockchain的去中心化運(yùn)行智能合約的平臺(tái),旨在解決與審查,欺詐和第三方干擾相關(guān)的問題。
Hash(哈希)
對(duì)輸出數(shù)據(jù)執(zhí)行散列函數(shù)的行為。 這是用于確認(rèn)貨幣交易。
Mining(挖礦)
挖礦是驗(yàn)證區(qū)塊鏈交易的行為。 驗(yàn)證的必要性通常以貨幣的形式獎(jiǎng)勵(lì)給礦工。 在這個(gè)密碼安全的繁榮期間,當(dāng)正確完成計(jì)算,采礦可以是一個(gè)有利可圖的業(yè)務(wù)。 通過選擇最有效和最適合的硬件和采礦目標(biāo),采礦可以產(chǎn)生穩(wěn)定的被動(dòng)收入形式。
Peer to Peer(點(diǎn)對(duì)點(diǎn))
對(duì)等(P2P)是指在高度互聯(lián)的網(wǎng)絡(luò)中,雙方之間的去中心化互動(dòng)或更多的互動(dòng)。 P2P網(wǎng)絡(luò)的參與者通過單個(gè)調(diào)解點(diǎn)直接相互協(xié)商。
Public Address(公用地址)
公共地址是公鑰的密碼哈希值。 它們作為可以在任何地方發(fā)布的電子郵件地址,與私鑰不同。
Private Key(私鑰)
私鑰是一串?dāng)?shù)據(jù),它是允許您訪問特定錢包中的令牌。 它們作為密碼,除了地址的所有者之外,都被隱藏。
Proof of Work(工作證明)
POW(Proof of Work,工作證明)是指獲得多少貨幣,取決于你挖礦貢獻(xiàn)的工作量,電腦性能越好,分給你的礦就會(huì)越多。
Proof of Stake(股權(quán)證明)
POS(Proof of Stake,股權(quán)證明)根據(jù)你持有貨幣的量和時(shí)間進(jìn)行利息分配的制度,在POS模式下,你的“挖礦”收益正比于你的幣齡,而與電腦的計(jì)算性能無關(guān)。
SHA-256
SHA-256是比特幣一些列數(shù)字貨幣使用的加密算法。 然而,它使用了大量的計(jì)算能力和處理時(shí)間,迫使礦工組建采礦池以獲取收益。
Smart Contracts(智能合約)
智能合約將可編程語言的業(yè)務(wù)規(guī)則編碼到區(qū)塊上,并由網(wǎng)絡(luò)的參與者實(shí)施。
Solidity
Solidity是Ethereum用于開發(fā)智能合約的編程語言。
Transaction Block(交易區(qū)塊)
聚集到一個(gè)塊中的交易的集合,然后可以將其散列并添加到區(qū)塊鏈中。
Transaction Fee(手續(xù)費(fèi))
所有的加密貨幣交易都會(huì)涉及到一筆很小的手續(xù)費(fèi)。這些手續(xù)費(fèi)用加起來給礦工在成功處理區(qū)塊時(shí)收到的區(qū)塊獎(jiǎng)勵(lì)。
Wallet(錢包)
一個(gè)包含私鑰的文件。 它通常包含一個(gè)軟件客戶端,允許訪問查看和創(chuàng)建錢包所設(shè)計(jì)的特定塊鏈的交易。
RSA算法


投票合約
pragma solidity ^0.4.0;
contract voteDemo {
//定義投票人的結(jié)構(gòu)
struct Voter{
uint weight; //投票人的權(quán)重
bool voted ;// 是否已經(jīng)投票
address delegate; //委托代理人投票
uint vote; // 投票主題的序號(hào)
}
//定義投票主題的結(jié)構(gòu)
struct Posposal{
bytes8 name ; //投票主題的名字
uint voteCount; //主題的得到的票數(shù)
}
//定義投票的發(fā)起者
address public chairperson;
//所有人的投票人
mapping(address=>Voter) public voters;
//具體的投票主題
Posposal[] public posposals;
//構(gòu)造函數(shù)
function voteDemo(bytes8[] peposposalName){
//初始化投票的發(fā)起人,就是當(dāng)前合約的部署者
chairperson = msg.sender;
//給發(fā)起人投票權(quán)
voters[chairperson].weight = 1;
//初始化投票的主題
for(uint i = 0; i <peposposalName.length ;i++ ){
posposals.push(Posposal({name:peposposalName[i],voteCount:0}));
}
}
//添加投票者
function giveRightToVote(address _voter){
//只有投票的發(fā)起人才能夠添加投票者
//添加的投票者不能是已經(jīng)參加過投票了
if(msg.sender !=chairperson ||voters[_voter].voted ){
throw ;
}
//賦予合格的投票者投票權(quán)重
voters[_voter].weight = 1;
}
//將自己的票委托給to來投
function delegate(address to){
//檢查當(dāng)前交易的發(fā)起者是不是已經(jīng)投過票了
Voter sender = voters[msg.sender];
//如果是的話,則程序終止
if(sender.voted){
throw ;
}
//檢查委托人是不是也委托人其他人來投票
while(voters[to].delegate != address(0)){
//如果是的話,則把委托人設(shè)置成委托人的委托人
to = voters[to].delegate;
//如果發(fā)現(xiàn)最終的委托人是自己,則終止程序
if(to == msg.sender){
throw;
}
}
//交易的發(fā)起者不能再投票了
sender.voted = true;
//設(shè)置交易的發(fā)起者的投票代理人
sender.delegate = to;
//找到代理人
Voter delegate = voters[to];
//檢測(cè)代理人是否已經(jīng)投票
if(delegate.voted){
//如果是:則把票直接投給代理人投的那個(gè)主題
posposals[delegate.vote].voteCount +=sender.weight;
}else{
//如果不是:則把投票的權(quán)重給予代理人
delegate.weight +=sender.weight;
}
}
//投票
function vote(uint pid){
//找到投票者
Voter sender = voters[msg.sender];
//檢查是不是已經(jīng)投過票
if(sender.voted){
//如果是:則程序終止
throw;
}else{
//如果否:則投票
sender.voted = true; //設(shè)置當(dāng)前用戶已投票
sender.vote = pid; //設(shè)置當(dāng)前用戶的投的主題的編號(hào)
posposals[pid].voteCount +=sender.weight; //把當(dāng)前用戶的投票權(quán)重給予對(duì)應(yīng)的主題
}
}
//計(jì)算票數(shù)最多的主題
function winid() constant returns(uint winningid){
//聲明一個(gè)臨時(shí)變量,用來比大小
uint winningCount = 0;
//編列主題,找到投票數(shù)最大的主題
for(uint i = 0; i<posposals.length; i++ ){
if(posposals[i].voteCount > winningCount ){
winningCount = posposals[i].voteCount;
winningid = i;
}
}
}
function winname() constant returns(bytes8 winnername){
winnername = posposals[winid()].name;
}
}