以太坊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单位转成以太:

 

 创建账户:

 

 

 

 查看余额:

 

 解锁账户后转账:

 

posted @ 2020-05-26 16:55  Jary霸  阅读(260)  评论(0编辑  收藏  举报