以太坊1
比特币:加密货币
哈希指针保存区块地址和区块头的哈希值
比特币的结点分为全结点(保存所有信息)和轻节点(保存块头的信息)
最上面一行是小型的区块链,最左边叫创世区块,区块都采用merkle tree数据结构,最下面一行是交易
1个区块平均包含2000多交易信息,和一个这些交易对应的merkle树
区块包括块头和块身(包含交易链表)
块头包括:协议,指向前一个的指针,merkle tree的根哈希值,挖矿的难度目标阈值,随机数nonce
merkle tree中,若根哈希值保持不变,则说明整个树中的哈希值都没有被改过
若一个轻结点没有保存交易列表,但是有根哈希值,而且想知道黄色的交易是否在merkle tree中,则:
1.轻结点向全结点请求merkle proof以证明黄色tx在merkle tree中
2.全结点把图中红色的哈希值发送给轻结点 ,组成到merkle proof里面
3.轻结点先算出黄tx的哈希值,得到绿色的哈希值。然后和旁边的红色哈希值拼接后再计算出上面的绿色哈希值,逐步网上算出根哈希值,再跟自己保存的根哈希值对比就可以知道结果
比特币的另一个数据结构是区块链,该链中的指针是哈希指针。
zzz
P2P:去中心化
若某个节点找到nonce使得:
则它获得将交易写入下一区块的记账权。
接受的区块应当扩展最长合法链
全节点内有UTXO数据结构:所有没有被花掉的交易的输出组成的集合,其中每个元素给出:产生该输出的交易的哈希值以及该输出是交易中的第几个输出
下图A的交易有2个输出,若B花掉了,则不在UTXO里面,C存着,则在
工作过程:用户把交易发布到网络上,节点收到交易后把它们打包到区块中,在把区块发布到比特币网络上。当节点第一次收到一个交易,则把它转发到其他节点,第二次收到就不转发了。
出块时间越短,越可能出现分叉,从而造成分叉攻击
挖矿难度:
硬分叉:比特币协议内容更改后,一些结点未更新,(如添加一些新功能)结果新结点兼容旧节点,导致出现分叉,但是分叉永久
软分叉:比特币协议内容更改后,一些结点未更新,(如限制功能)结果旧结点兼容新节点,导致出现分叉,但是分叉暂时
矿工挖矿后,将所有交易打包到一个区块中并广播给其他节点,其他节点确认后将该区块加入到上一个区块的后面
以太坊:
每一个账户一一对应一个地址
TPS:每秒发生的交易数
Last Block :最新出的块
Hash Rate :全网算力
network difficulty:全网难度
私钥导出公钥,公钥做个哈希,再取最后20B得到地址
下载插件metamask
deposit:存钱,send:转钱
Solidity:类似JavaScript,这是以太坊官方推荐语言,也是最流行的智能合约语言
remix-ide 是一个浏览器版的solidity开发 IDE
pragam solidity ^0.4.17:定义编译器版本要在0.4.17以上
contract 合约名字{}
function withdraw(uint amout) public:外部可以调用该方法withdraw,可定义参数
require(amount<100):()里面必须成立才会往下走
msg.sender.transfer(100):msg.sender是合约调用者的地址,即水龙头向合约调用者发送100wei
下图点击deploy将编译好的合约字节码部署到Rinkeby的区块链上
上图Faucet at ...后面的数字是合约地址,可以通过下图查出来,第一个交易是部署合约的交易,From是自己的地址,Code选项卡的内容是合约编译后的结果:
下图是我方向合约发送1个以太,To的内容是合约地址
下图的1是我方发出的数额:
随后该交易被广播给其他节点了,下图pending表示未确认,如果ok则过一会儿变成确认了confirm了
下图,回退函数没有函数名,且至多1个,当它为可支付(payload)时,可以向合约发币。修改后需要重新编译和部署:
部署后,只需要交手续费:
随后给合约转账,To是合约地址:
接着从水龙头取币,点击withdraw:
根据合约地址查询,该交易是由与调用了合约内部的方法,所以只会显示在internal Transaction里面
安装geth:
修改文件格式为unix:
运行并同步区块,且指定存储位置:
chainID:网络ID
alloc:一进来,对应地址就有balance那么多钱
初始化私链:
启动geth节点并打开控制台:
keystone文件夹中的账户:
查询账户的钱,传入账户的地址:
将wei单位转成以太:
创建账户:
查看余额:
解锁账户后转账: