gRPC
简介RPC(Remote Procedure Call, 远程过程调用).是一种协议,用来屏蔽分布式计算当中的各种调用细节,使得可以像是本地调用一样直接调用一个远程函数.
gRPC是一个高性能的开源的RPC框架.
通过某种方式描述一个服务,这种描述方式是语言无关的.在这个”服务定义”的过程中,我们描述了我们提供的服务名是什么,有哪些方法可以被调用,这些方法以什么样的方式入参,有什么的回参.
定义好服务之后,gRPC会屏蔽底层的细节,client只需要直接调用定义好的方法,就能拿到预期的结果.server端还需要实现定义的方法.
Protocol Buffss
这是谷歌开源的一套成熟的数据结构序列化机制
这个工具可以把我们定义的方法,转换成特定语言的代码.在发送请求和接收响应时,这个工具还会完成对应的编码和解码工作.
proto文件
message
需要传输的数据格式的定义
字段规则
required:
optional:
repeated:
消息号
每个字段都必须要有一个唯一的标识号[1, 2^29-1]
服务
1234service SearchService ...
Ethereum
概述新一代比特币,实现了去中心化的合约.
术语EVM以太坊虚拟机是一个全局虚拟计算机,以太坊网络中的每个参与者都会存储并一致同意其状态。 任何参与者都可以请求在以太坊虚拟机上执行任意代码;代码执行会改变以太坊虚拟机的状态。
Nodes存储以太坊虚拟机状态的实体计算机。节点间相互通信,传播关于以太坊状态的信息及其新的状态变化。 任何用户还可以通过广播来自节点的代码执行请求来请求代码执行。 以太坊网络本身就是所有以太坊节点及其通信的集合。
帐户帐户是存储以太币之处。 用户可以初始化帐户,将以太币存入帐户,并将自己帐户中的以太币转账给其他用户。 帐户和帐户余额存储在以太坊虚拟机中的一个大表格中,是以太坊虚拟机总体状态的一部分。
交易“交易请求”是表示以太坊虚拟机上的代码执行请求的正式术语。“交易”是指已完成的交易请求和相关的以太坊虚拟机状态变化。 任何用户都可以从节点向网络广播交易请求。 为了使交易请求影响一致同意的以太坊虚拟机状态,就必须由其他节点对其进行验证、执行并“提交到网络”。 执行任何代码都会导致以太坊虚拟机状态变化;一旦提交后,该状态变化将广播到网络中的所有节点。
区块交易量巨大 ...
BTC-挖矿
网络结构
比特币调整挖矿难度H(block header) <= target
比特币使用SHA-256算法,输出值有256位,结果共有2^256中可能。
挖矿难度与目标阈值成反比。
挖矿全节点
轻节点
比特币脚本
交易结构12345678910111213"result" : { "txid": "021a...dd24", "hash": "021a...dd24", "version": "1", "size": 226, "locktime": 0, "vin": [...], "vout": [...], "blockhash": "000000000000002c510d...", "confirmations": 23, "time":1530846 ...
BTC-协议与实现
虚拟货币需要解决的两个问题:
谁有权发行货币。
如何验证交易的合法性。
Double-Spending区块链的交易存储方案如下图所示:
Consensus in BitCoin假设:只有少部分节点是恶意节点接受的合法区块必须在最长合法链上。
分叉攻击:通过在区块链中间插入节点,达到回滚的效果。
等长分叉系统中两个矿工同时发布一个区块,分叉会存在一段时间,直至某条分叉胜出。
失败的节点被称为orphan block。
Bitcoin的实现比特币中的全节点要维护UTXO的数据结构
UTXO:Unspent Transaction Output避免Double-Spending问题。
Block headers
Bernoulli trial: a random experiment with binary outcomeBernoulli process: a sequence of independent Bernoulli trials memorylessPoisson precess(矿工挖到矿的概率)exponential distribution(系统挖到矿的概 ...
go标准库-os
os包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,虽然错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。例如,如果某个使用一个文件名的调用(如Open、Stat)失败了,打印错误时会包含该文件名,错误类型将为*PathError,其内部可以解包获得更多信息。
Constants12345678910const ( O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件 O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件 O_RDWR int = syscall.O_RDWR // 读写模式打开文件 O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部 O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件 O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在 O_SYNC ...