区块链知识点汇总
术语
以太坊
以太坊
一个基于区块链的去中心化应用平台。
以太币(Ether)
以太币是以太坊中货币的名称。以太币是用来支付交易和以太坊交易的计算费用。 ether也认为是以太币的单位,另一个常用的单位是wei。 1ether=1e18wei (1,000,000,000,000,000,000wei)
智能合约
一套以数字形式定义的承诺(promises),包括合约参与方可以在上面执行这些承诺的协议。
以太坊虚拟机 EVM
是以太坊中智能合约的运行环境。
Solidity
是以太坊中用于开发智能合约的编程语言,目前开发智能合约用的最多的是Solidity。开发智能合约入门可参考智能合约开发环境搭建及Hello World合约。
Serpent
一门智能合约的编程语言,语法类似Python,不再建议使用,建议转换到Viper。
Viper
一门智能合约的编程语言,Vitalik最推崇的语言。取代Solidity的地位也是有可能的。 官方文档
Transaction 交易
包含一系列价值的转移,从一个地址转到另一个。
消息
合约能够向其他合约发送“消息”。消息是虚拟的,不能序列化,存在于以太坊执行环境中。可以被理解为函数调用。
以太坊客户端
也称钱包,提供账户管理、挖矿、转账、智能合约的部署和执行等等功能,以太坊节点利用以太坊客户端接入到以太坊网络。 现在以太坊客户端主要有:Wallent/Mist , Geth, Parity, Harmony,pyethapp等
Geth 开发中使用最广泛的客户端,使用Go语言实现。
Parity 另一个较为常用的客户端,用Rust实现。
web3.js web3.js是一个实现与以太坊节点JSON-RPC通信的JavaScript库。类似还有Java库web3j。 geth提供的JavaScript控制台中,就包含的web3.js库事例web3。
Gas
以太坊上用Gas机制来计费,Gas也可以认为是一个工作量单位,智能合约越复杂(计算步骤的数量和类型,占用的内存等),用来完成运行就需要越多Gas。
etherbase
在你的节点上的主账户默认名字,如果你在挖矿,那么挖矿的回报会被放到这个账户中。
coinbase
Coinbase是一个和etherbase类似的概念,但是对于众多的加密货币平台而言coinbase是一个更通用的术语。
balance(余额)
账户余额
GHOST协议
Greedy Heaviest Observed Subtree, GHOST协议就是让我们必须选择一个在其上完成计算最多的路径。一个方法确定路径就是使用最近一个区块(叶子区块)的区块号,区块号代表着当前路径上总的区块数(不包含创世纪区块)。区块号越大,路径就会越长,就说明越多的挖矿算力被消耗在此路径上以达到叶子区块。使用这种推理就可以允许我们赞同当前状态的权威版本。
梅克尔帕特里夏树(MPT:Merkle Patricia Tree)
一种数据结构,它会存储每个账户的状态(存储键值对关系)。这个树的建立是通过从每个节点开始,然后将节点分成多达16个组,然后散列每个组,然后对散列结果继续散列,直到整个树有一个最后的“根散列”。
Frontier(前沿) 以太坊(路线图)的第一阶段,在2015年7月30日发布。
Homestead(家园) 以太坊(路线图)的第二阶段,在2016年3月14日发布。
Metropolis(大都会) 以太坊(路线图)的第三阶段,引入四大特性:zk-Snarks(基于"零知识证明"),PoS(Proof of Stake,即权益证明)早期实施,智能合约跟灵活和稳定, 抽象账户。 大都会又拆分为两个阶段实施(两个硬分叉):拜占庭(Byzantium)及君士坦丁堡(Constantinople)
拜占庭
拜占庭硬分叉在第437万个区块高度发生,时间是2017年10月16日,引入了zk-Snarks 及 抽象账户等。
君士坦丁堡 预计在2018年实施, 主要的特性就是平滑处理掉所有由于"拜占庭"所引发的问题,并引入 PoW 和 PoS 的混合链模式。
Serenity(宁静) 以太坊(路线图)的第四阶段,
零知识证明 指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。 "零知识证明"实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。
PoS
一种共识协议:作为验证节点,首先你必须拥有一定数量的以太币,根据以太币的数量和时间会产生用于下注验证区块的权益。只有拥有权益的节点才能有效验证区块,当你验证的区块被打包进链,你将获得和你权益成正比的区块奖励。如果你验证恶意或错误的区块,那么你所下注的权益将被扣除。
Casper 的共识算法
以太坊中PoS协议的实现, 刚开始每100个区块将有一个采用PoS协议挖出
抽象账户
在的以太坊有两类账户:即外部账户和合约账户,以太坊正在试图模糊二者的界限,即你可以同时拥有合约账户和外部账户,这种做法本质上就是让用户按照合约账户的格式来定义外部账户。
难度炸弹
为了确保以太坊的矿工能加入到新链条中来,开发团队引入了"难度炸弹"机制。它会使难度系数呈指数增加以至于让挖矿变得几乎不可能的。
以太坊硬分叉
硬分叉是对以太坊底层协议的改变,创建新的规则,提高整个系统。协议改变在某个特定区块上被激活。所有的以太坊客户端都需要升级,否则将停留在遵循旧规则的老链上。
ERC-20
代币合约标准,一系列通过以太坊智能合约发布的代币制定了代币发放的通用规则。该标准是目前通过ICO发行代币的基础准则。 该标准能够确保基于以太坊的代币在整个生态系统中以一种可预测的方式进行,使去中心化应用程序和智能合约可以在整个平台上彼此协作,所有代币都遵循一个固定的安全标准。
EIPs
Ethereum Improvement Proposals - 以太坊改进协议
Ommer
是一个区块的父区块与当前区块父区块的父区块是相同的。 由于以太坊区块生产时间(大概15秒左右)比比特币(大概10分钟左右)要快很多。更短的区块生产时间的一个缺点就是:更多的竞争区块会被矿工发现。 这些竞争区块同样也被称为“孤区块”(也就是被挖出来但是不会被添加到主链上的区块) Ommers的目的就是为了帮助奖励矿工纳入这些孤区块,Ommer区块会收到比全区块少一点的奖励。
预言机
通过向智能合约提供数据,它现实世界和区块链之间的桥梁。
公有链
是任何节点都是向任何人开放的,每个人都可以参与到这个区块链中参与计算,而且任何人都可以下载获得完整区块链数据(全部账本)。
联盟链
是指参与每个节点的权限都完全对等,大家在不需要完全互信的情况下就可以实现数据的可信交换,联盟链的各个节点通常有与之对应的实体机构组织,通过授权后才能加入与退出网络。通常是公司与公司、组织与组织之间达成的联盟模式。
私有链
有些区块链的应用场景下,并不希望这个系统任何人都可以参与,不对外公开。 适用于特定机构的内部数据管理与审计或开发测试等。
测试网络
以太坊用来测试功能的网络,比如拜占庭分叉之前先在测试网络(Ropsten)上运行一段时间,稳定后再发布到公有链(正式网络)。 以太坊测试网络有:
Olympic测试网络 - 早期的一个(预发布版本)测试网络,已不再使用 Morden测试网络 - 以太坊第一个测试网络,已不再使用 Ropsten测试网络 - 使用Pow,和当前的公有链环境一致,2016/11发布。 Kovan测试网络 - 仅parity钱包支持,使用PoA共识 Rinkeby测试网络 - 仅geth钱包支持,使用PoA共识 DAO(decentralized autonomous organization)去中心自治组织 DAO是建立在区块链之上的合约(或一系列合约),旨在制定规则、强制执行或使组织工作自动化,包括治理、筹资、运营、支出和扩张。
比特币
比特币
一种基于分布式网络的数字货币,也指用来构建这种数字货币的网络系统。
地址
比特币地址由一串字符和数字组成,常见地址以1开头,常见的交易是比特币从一个地址转移到另一个地址。
私钥
用来解锁对应地址的一串字符。
签名
一个让人可以证明所有权的数学机制。
挖矿
挖矿是反复尝试不同的随机数对未打包交易进行哈希,直到找到一个随机数可以符合工作证明的条件的随机数,以构建区块。如果一个矿工走运并产生一个有效的区块的话,会被授予的一定数量的币作为奖励。参考阅读比特币如何挖矿(挖矿原理)-工作量证明
哈希
也叫散列,把任意长度的数据映射为较短的固定长度的二进制值的算法。因为它是不可逆的运算过程,无法解密
哈希值
通过哈希运算,从而映射成的二进制的值称为哈希值。
交易
简单来说就是比特币转账。参考阅读交易分析
共识机制
区块链事务达成分布式共识的算法,由于P2P网络下存在延迟,各个节点所观察到的数据不可能完全一致。因此区块链系统需要设计一种机制对最终数据进行共识。这种对一个时间窗口内的数据的先后顺序达成共识的算法被称为“共识机制”。
工作量证明(POW)
一种共识机制,该机制是证明人出示一个很难计算的但却很容易验证的结果。通过验证这个结果,任何人都能够确认证明人执行了一定量的计算工作量来产生这个结果。参考阅读比特币如何挖矿(挖矿原理)-工作量证明
难度
整个网络会通过调整“难度”这个变量来控制生成工作量证明所需要的计算力。
难度目标
使整个网络的计算力大致每10分钟产生一个区块所需要的难度数值即为难度目标。
难度调整
整个网络每产生2,106个区块后会根据之前2,106个区块的算力进行难度调整。
矿工
矿工指通过不断重复哈希运算来产生工作量证明的各网络节点。
矿池
矿工的集合,由于单一矿机想挖到一个块的几率是非常小的,矿工联合挖矿以提高几率。一个矿池的算力是很多矿工算力的集合,矿池每挖到一个块,便会根据你矿机的算力占矿池总算力的百分比,发相应的奖励给到个体,也不会存在不公平的情况。
矿工费
也叫交易费,交易的发起者通常会向网络缴纳一笔费用,用以处理这笔交易。参考阅读交易分析。
挖矿奖励
通过工作量证明验证交易打包区块的过程,过程中有以货币的形式的奖励。
区块
在区块链网络上承载交易数据的数据包。它会被标记上时间戳和之前一个区块的独特标记。区块头经过哈希运算后会生成一份工作量证明,从而验证区块中的交易。有效的区块经过全网络的共识后会被追加到主区块链中。参考阅读比特币区块结构。
区块链
狭义来讲,一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本。广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。
交易
比特币中的转账行为,把比特币从一个地址转到另一个地址。
创世区块
创世区块指区块链上的第一个区块,用来初始化相应的加密货币。
交易确认
当一项交易被区块收录时,我们可以说它有一次确认。矿工们在此区块之后每再产生一个区块,此项交易的确认数就再加一。当确认数达到六及以上时,通常认为这笔交易比较安全并难以逆转。
P2P网络
通过允许单个节点与其他节点直接交互,从而实现整个系统像有组织的集体一样运作的系统。参考阅读分析比特币网络。
分叉
指向同一个父块的2个区块被同时生成的情况,某些部分的矿工看到其中一个区块,其他的矿工则看到另外一个区块。这导致2种区块链同时增长。
Merkel树
Merkle树是一种哈希二叉树, 比特币中用它来校验交易。
SPV客户端(或轻客户端)
一个只下载一小部分区块链的客户端,使拥有像智能手机和笔记本电脑之类的低功率或低存储硬件的用户能够保持几乎相同的安全保证,这是通过有时选择性的下载的小部分的状态,而在区块链验证和维护时,不需要花费兆字节的带宽或者千兆字节的存储空间。
双重花费
是一个故意的分叉,当一个有着大量挖矿能力的用户发送一个交易来购买产品,在收到产品后又做出另外一个交易把相同量的币发给自己。攻击者创造一个区块,这个区块和包含原始交易的区块在同一个层次上,但是包含并非原始交易而是第二个交易,并且开始在这个分叉上开始挖矿。如果攻击者有超过50%的挖矿能力的话,双重花费最终可以在保证在任何区块深度上成功。低于50%的话,有部分可能性成功。但是它经常在深度2-5上有唯一显著的可能。因此在大多数交易所,在接受支付之前需要6次确认。
区块链钱包
区块链钱包
在日常生活中,大家都会买个钱包用于存放政府机构发行的纸币,那么什么是数字资产世界的钱包呢?
-
比特币钱包
-
以太坊钱包:Mist、Parity、MyEhterWallet、ImToken、MetaTask、Ledger(硬件钱包)
-
助记词等价于私钥
-
Keystore + 密码 等价于私钥
-
EOS钱包
-
NEO钱包
-
量子钱包
-
On-chain
给一个钱包地址发送数字货币, 这笔交易在全网广播、被确认、被打包进区块。这是发生在链上的,被称为on-chain交易。on-chain钱包需要自己保管私钥。
相对于on-chain交易是off-chain交易。通常,通过交易所进行的交易是off-chain的,本人并没有私钥。私钥在交易所,由交易所托管。所以交易所的钱包也是中心化的钱包。
冷即离线、断网,也就是说私钥存储的位置不能被网络所访问。例如纸钱包、脑钱包、硬件钱包等等。
热即联网,也就是私钥存储在能被网络访问的位置。 例如存放在交易所的、在线钱包网站、手机App钱包都属于热钱包。通常而言,冷钱包更加安全,热钱包使用更加方便。
钱包随机生成
同一个种子,能够派生一样的密钥对集合
除了保存私钥外,全节点钱包还有保存了所有区块的数据,最为著名的是bitcoin-core。
它不必保存所有区块的数据,只保存跟自己相关的数据。基本可以实现去中心化。
在交易所中的钱包,以及类似 OKLink 提供的保险柜服务。
计量
以太坊计量
常用单位计量
Ether、Gwei、wei
Unit | Wei Value | Wei | 位数 |
---|---|---|---|
wei | 1 | 1 wei | 1位 10的0次方 |
Kwei | 1e3 wei | 1,000 | 4位 10的3次方 |
Mwei | 1e6 wei | 1,000,000 | 7位 10的6次方 |
Gwei | 1e9 wei | 1,000,000,000 | 10位 10的9次方 |
microether | 1e12 wei | 1,000,000,000,000 | 13位 10的12次方 |
milliether | 1e15 wei | 1,000,000,000,000,000 | 16位 10的15次方 |
ether | 1e18 wei | 1,000,000,000,000,000,000 | 19位 10的18次方 |
gasPrice、gasLimit、gasUsed 简介
gasPrice是以太坊内计算消耗1个gas对应多少Gwei的标准量,单位是Gwei
gasLimit是消耗gas的上限单位。在完成交易中最多使用多少个gas,默认标准的ETH转账是21000个单位的Gas。但是更复杂的代码写入需要消耗更多的gas limit,比如当你参与某个ICO需要把你的ETH写入他们的智能合约中,或者你希望提取ICO的代币到交易所的时候,就会比预定的21000 gas limit高很多,这是因为参与ICO的智能合约执行交易比普通的转账需要更复杂的计算和写入。gasLimit范围虽然可以调整,但是如果填写太少,会导致交易失败,就好比油价很高,但是你拿一个可乐瓶做油箱要跑100公里的路,还没有上高速车就没有油了,所以gasLimit不够矿工消耗会导致代码执行中断。尽管如此矿工还是会把劳务费gas收走的~
gasUsed 是实际交易执行中使用的gas单位,一般也是21000。
交易费用 = gasUsed * gasPrice
计算得出:
方式一:
- gasUsed=Gas Limit=21000
- ether 10e18 与 Gwei 10e9 方数相减 等于 10e9
- 手续费 = gasUsed* gasPrice= 21000 * 1 Gwei / 10e9 = 0.000021 Ether
方式二:
- gasPrice: 1 Gwei = 0.000000001 Ether
- gasUsed : 21000 Gwei
- 手续费 = 0.000000001 Ether * 21000 Gwei = 0.000021 Ether
常见问题
交易类
以太坊nonce
钱包开发过程中遇到nonce值的问题,目前钱包交易只支持一笔交易确认之后,才会发送第二笔交易,否则发送的时候会提示nonce值太低了。
-
造成这种现象的原因很简单,直接使用了eth_getTransactionCount接口,对于txpool的处理也不是很完美,几乎就是忽略了,所以发送第二笔交易的时候,导致nonce值和第一笔相同,提示了nonce值太低了。
-
这里多说一下,parity节点,提供了一个parity_nextNonce接口,可以同时返回已经确认和pending交易的nonce值,相比上一个接口好一些,其实一个样,为什么这么说呢?咱们接着分析。
-
像区块链这种分布式系统,要做到nonce值精确维护几乎是不可能的,最主要的一个原因就是——分布式。你可以想象一下,如果某个用户,他把自己的以太坊地址倒入了多个钱包,然后在多个钱包里同时发送交易,怎么办?首先这几笔交易肯定nonce有相同的,相同的nonce就只有一笔交易会成功;这个时候,如果你使用的接口是直接从链上获取的还好,(但是这由决定了你发送交易只能等上一笔交易确定之后,才发送第二笔)。如果你是自己维护的,估计问题可能就会严重很多,好一点的情况nonce太低,交易发送失败,更甚之,nonce值太高,让用户发再发送一笔交易填充遗漏的nonce吗?