备注
以上导图最上面是说的区块链发生的背景
左边是开发一个demo,会在文章最后面附一个基于以太坊的投票智能合约
下面是他的一些主要原理之类的,描述加密算法和p2p网络,还有科普。
右边是实战喽,主要是基于以太坊的,采用web3.js和轻钱包一起整合使用
科普
51% Attack(51%攻击)
当一个单一个体或者一个组超过一半的计算能力时,这个个体或组就可以控制整个加密货币网络,如果他们有一些恶意的想法,他们就有可能发出一些冲突的交易来损坏整个网络。
Address(地址)
加密货币地址用于在网络上发送或接收交易。 地址通常表示为个数字字字符。
Bitcoin(比特币)
Bitcoin是在全球对等网络上运行的第一个去中心化开放源代码的加密货币,不需要中间商和集中式发行商。
Blockchain(区块链)
区块链是一个共享的分布式账本,其中交易通过附加块永久记录。 区块链作为所有交易的历史记录,从发生块到最新的块,因此命名为blockchain(区块链)。
Cryptographic Hash Function(加密哈希函数)
密码哈希产生从可变大小交易输入固定大小和唯一哈希值。 SHA-256计算算法是加密散列的一个例子。
Ethereum(以太坊)
Ethereum是一个基于blockchain的去中心化运行智能合约的平台,旨在解决与审查,欺诈和第三方干扰相关的问题。
Hash(哈希)
对输出数据执行散列函数的行为。 这是用于确认货币交易。
Mining(挖矿)
挖矿是验证区块链交易的行为。 验证的必要性通常以货币的形式奖励给矿工。 在这个密码安全的繁荣期间,当正确完成计算,采矿可以是一个有利可图的业务。 通过选择最有效和最适合的硬件和采矿目标,采矿可以产生稳定的被动收入形式。
Peer to Peer(点对点)
对等(P2P)是指在高度互联的网络中,双方之间的去中心化互动或更多的互动。 P2P网络的参与者通过单个调解点直接相互协商。
Public Address(公用地址)
公共地址是公钥的密码哈希值。 它们作为可以在任何地方发布的电子邮件地址,与私钥不同。
Private Key(私钥)
私钥是一串数据,它是允许您访问特定钱包中的令牌。 它们作为密码,除了地址的所有者之外,都被隐藏。
Proof of Work(工作证明)
POW(Proof of Work,工作证明)是指获得多少货币,取决于你挖矿贡献的工作量,电脑性能越好,分给你的矿就会越多。
Proof of Stake(股权证明)
POS(Proof of Stake,股权证明)根据你持有货币的量和时间进行利息分配的制度,在POS模式下,你的“挖矿”收益正比于你的币龄,而与电脑的计算性能无关。
SHA-256
SHA-256是比特币一些列数字货币使用的加密算法。 然而,它使用了大量的计算能力和处理时间,迫使矿工组建采矿池以获取收益。
Smart Contracts(智能合约)
智能合约将可编程语言的业务规则编码到区块上,并由网络的参与者实施。
Solidity
Solidity是Ethereum用于开发智能合约的编程语言。
Transaction Block(交易区块)
聚集到一个块中的交易的集合,然后可以将其散列并添加到区块链中。
Transaction Fee(手续费)
所有的加密货币交易都会涉及到一笔很小的手续费。这些手续费用加起来给矿工在成功处理区块时收到的区块奖励。
Wallet(钱包)
一个包含私钥的文件。 它通常包含一个软件客户端,允许访问查看和创建钱包所设计的特定块链的交易。
RSA算法
投票合约
pragma solidity ^0.4.0;
contract voteDemo {
//定义投票人的结构
struct Voter{
uint weight; //投票人的权重
bool voted ;// 是否已经投票
address delegate; //委托代理人投票
uint vote; // 投票主题的序号
}
//定义投票主题的结构
struct Posposal{
bytes8 name ; //投票主题的名字
uint voteCount; //主题的得到的票数
}
//定义投票的发起者
address public chairperson;
//所有人的投票人
mapping(address=>Voter) public voters;
//具体的投票主题
Posposal[] public posposals;
//构造函数
function voteDemo(bytes8[] peposposalName){
//初始化投票的发起人,就是当前合约的部署者
chairperson = msg.sender;
//给发起人投票权
voters[chairperson].weight = 1;
//初始化投票的主题
for(uint i = 0; i <peposposalName.length ;i++ ){
posposals.push(Posposal({name:peposposalName[i],voteCount:0}));
}
}
//添加投票者
function giveRightToVote(address _voter){
//只有投票的发起人才能够添加投票者
//添加的投票者不能是已经参加过投票了
if(msg.sender !=chairperson ||voters[_voter].voted ){
throw ;
}
//赋予合格的投票者投票权重
voters[_voter].weight = 1;
}
//将自己的票委托给to来投
function delegate(address to){
//检查当前交易的发起者是不是已经投过票了
Voter sender = voters[msg.sender];
//如果是的话,则程序终止
if(sender.voted){
throw ;
}
//检查委托人是不是也委托人其他人来投票
while(voters[to].delegate != address(0)){
//如果是的话,则把委托人设置成委托人的委托人
to = voters[to].delegate;
//如果发现最终的委托人是自己,则终止程序
if(to == msg.sender){
throw;
}
}
//交易的发起者不能再投票了
sender.voted = true;
//设置交易的发起者的投票代理人
sender.delegate = to;
//找到代理人
Voter delegate = voters[to];
//检测代理人是否已经投票
if(delegate.voted){
//如果是:则把票直接投给代理人投的那个主题
posposals[delegate.vote].voteCount +=sender.weight;
}else{
//如果不是:则把投票的权重给予代理人
delegate.weight +=sender.weight;
}
}
//投票
function vote(uint pid){
//找到投票者
Voter sender = voters[msg.sender];
//检查是不是已经投过票
if(sender.voted){
//如果是:则程序终止
throw;
}else{
//如果否:则投票
sender.voted = true; //设置当前用户已投票
sender.vote = pid; //设置当前用户的投的主题的编号
posposals[pid].voteCount +=sender.weight; //把当前用户的投票权重给予对应的主题
}
}
//计算票数最多的主题
function winid() constant returns(uint winningid){
//声明一个临时变量,用来比大小
uint winningCount = 0;
//编列主题,找到投票数最大的主题
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;
}
}