下面用记账的例子来介绍区块链。
方案一:
老王负责记账,负责村里的每一笔账目,很稳,没人怀疑。
惨了,老王被老绿发现修改了里面的账目,老绿告诉了全村人,因此要修改方案。使用下面方案二。
方案二:
村里的人决定选出一帮可信任的人,轮流来记账,这帮人有老A,老B,老C,老等等(反正字母就是了)。
各位老字母好像找到了套路,老A先修改里面的账目,然后故意把修改的那一页损坏,其它人照样学样。村里人肯定不同意,因此出现了下面的方案三。
方案三:
使用了一个方法,如果账目有改动,每一本账本都要修改。
似乎一切都很稳,但是每个账房的先生都很累,不想干了。
考虑到这样,村里人有提出了其它方案,出现了方案四。
方案四:
每次账目有变动,都会掷骰子,选出一个账房先生去记账,并给予该账房先生奖励,这样大家就争相去抢着记录了。
嗯这种方式很好,没错,这就是区块链的雏形了。
1、 每个账房先生对应的是每个网络节点,如果一个节点有改变,会广播通知其他的节点(这种互相通信的功能叫做“网络路由”)
2、 前一章的“掷骰子”成为“共识算法”(一种大家都认同的遵守的筛选方案),选出一个节点之后,数据在一段时间内以这个节点为准。此节点如果发生改变,会广播通知其它节点,其它的节点验证没问题后,就存储到各自的账本中。
3、 被选中的节点肯定是要处理很多事情的,于是设计了一个激励机制,像论坛积分一样增加,这样很多的节点都会去抢着干,这种竞争的过程,称之为“挖矿”。
技术细节:
那么每个节点怎么去证明自己的身份呢?
这里用到了公开密钥算法的机制去处理。每个节点都要两种密钥,公钥(提供给其它节点),私钥(作为自己的节点唯一标志)。举个例子,如老A寄信给老B,那么老A给使用老B的公钥和自己的私钥加密,发送给老B。这样老B可以解开自己的钥,也能知道是谁发过数据过来了。
geth创建私链流程
geth --dev console 2>>geth1 //这种情况下(开发者模式),创建后会有一个已知账户存在,且账户中有以太币
geth --datadir "./" --networkid 1108 console 2>>geth.log //非开发者模式,带路径
命令的主体是geth console
,表示启动节点并进入交互式控制台,--datadir
选项指定使用data0
作为数据目录,--networkid
选项后面跟一个数字,这里是1108,表示指定这个私有链的网络id为1108。网络id在连接到其他节点的时候会用到,以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id。
–dev 启用开发者网络(模式),开发者网络会使用POA共识,默认预分配一个开发者账户并且会自动开启挖矿。ie:测试网络
–datadir 后面的参数是区块数据及秘钥存放目录。
第一次输入命令后,它会放在当前目录下新建一个testNet目录来存放数据。
console 进入控制台
创建账户
bei = personal.newAccount('password')
获取账户余额
eth.getBalance(bei)
获取当前账户地址
eth.accounts
获取某个账户
eth.accounts[0]
发送交易
eth.sendTransaction({from: usr,to: bei,value: 10})
当前区块数
eth.blockNumber
开始挖矿
miner.start()
结束挖矿
miner.stop()
解锁账户
personal.unlockAccount(eth.accounts[0],"password") //password为创建账户时输入的密码
在部署合约前需要先解锁账户(就像银行转账要输入密码一样)
列出当前账户
personal.listAccounts
查看区块具体信息
eth.getBlock(7)
查看交易
eth.getTransaction("0x7ce0faae69bc502936dbd0b27de5e1eae4b9cb40f9812f0571b6e970bce933a6")