Blockchain Notes
密码学
密码介绍
为什么加密
保证数据的安全。
常见加密算法
- 编码解码
- 哈希加密
- 对称加密
- 非对称加密
- 数值签名
加密三要素
- 明文/密文
- 密钥
- 加密算法/解密算法
编码解码
常见编码
- base64:使用的字符包括大小写拉丁字母各26个、数字10个、加号+和斜杠/,共64个字符,等号=用来作为后缀用途。(base64是网络上最常见的用于传输 8Bit字节码的编码方式之一,base64就是一种基于64个可打印字符来表示二进制数据的方法。)
- base58:不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/“符号。(base58是Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。)
哈希算法
特点
- 不可逆:无法从一个哈希值恢复原始数据,哈希并不加密。
- 唯一性:对于特定的数据,只能有一个哈希,并且这个哈希是唯一的。
- 防篡改:改变输入数据中的一个字节,导致输出一个完全不同的哈希值。
常用的哈希算法
- MD4
- MD5
- hash1
- sha224
- sha256
- sha384
- sha512
性能:md4 > md5 > sha224 > sha256 > sha384 > sha512
内存消耗:md5 > md4 > sha512 > sha384 > sha256 = sha224
建议平常使用sha256即可,安全性可靠且消耗资源不高。
对称加密
特点
- 加密和解密使用的是同一个密钥。
- 数据私密性双向保证,也就是加密和解密都不能泄露密码。
优点:加密效率高,适合大些的数据加密。
缺点:安全性相对非对称低。
加密方式
- AES
- AES-128:key长度16 字节
- AES-192:key长度24 字节
- AES-256:key长度32 字节
- DES:支持字节长度是8
- 3DES(CBC模式):key长度必须为24
非对称加密
特点
- 加密和解密的密钥不同,有两个密钥(公钥和私钥)。
- 公钥:可以公开的密钥;公钥加密,私钥解密。
- 私钥:私密的密钥;私钥加密,公钥解密。
- 私密单方向保证,只要有一方不泄露就没问题。
优点:安全性相对对称加密高。
缺点:加密效率低,适合小数据加密。
场景分析
对哪一方更重要,哪一方就拿私钥。
- 登录认证
- 私钥在客户端,个人信息在客户端保存。
- 公钥在服务器,获取个人数据。
- A和B两个人,信息只允许B阅读
- 公钥在A
- 私钥在B
加密方式
- RSA:三位作者的首字母
- 消息发送方利用对方的公钥进行加密,消息接受方收到密文时使用自己的私钥进行解密。
- 公钥和密钥生成的时候要有一种关联。
- 要把密钥和公钥保存起来。
数字签名
数字签名相当于纸质合同的签字章盖。防篡改、防伪装、防否认。
RSA
- 公钥加密
- 私钥解密
RSA数字签名
- 生成消息签名:消息发送方完成,使用私钥进行签名。
- 验证消息签名:消息接收方完成,使用公钥解密。
比特币和区块链
比特币
货币发展
- 物物交换
- 实物货币
- 稀有物品交换(贝壳)
- 人工货币:
- 秦始皇统一货币: 上币:黄金,下币:铜
- 金属货币 -> 纸币
- 电子货币
- 银行卡(数字交易)
- 数字货币
- 虚拟的。交易的用户地址,交易密码。
- 比特币、以太币
诞生背景
- 纸币的风险(政府印发)
- 政府倒台、战乱、经济危机、通货膨胀等都会导致纸币贬值。
- 比特币
- 2008年金融危机,让人们开始思考,能不能不依赖政府。
- 2008年11月1日,中本聪写了一篇论文《比特币:一种点对点的电子现金系统》。
- 2009年1月3日发布了第一个版本的比特币客户端,标志着比特币金融体系的诞生。
- 比特币是什么
- 是一个货币交易系统(电子支付系统)。
- 解决了货币被政府随意超发的问题以及通货膨胀。
去中心化
中心化
国家 -> 央行 -> 银行 -> 账户
去中心化
- 定义
- 平等互联
- 账户 -> 账户
- 优势:防篡改,更可靠(账本)
- 如何实现去中心化:每个人都有个账本,自己管理。
- 比特币和去中心化的关系:比特币就是一个去中心化的转账支付系统。
区块链
定义
A blockchain is a growing list of records, called blocks, that are securely linked together using cryptography. Each block contains a cryptographic hash of the previous block, a timestamp, and transaction data (generally represented as a Merkle tree, where data nodes are represented by leafs). The timestamp proves that the transaction data existed when the block was published to get into its hash. As blocks each contain information about the block previous to it, they form a chain, with each additional block reinforcing the ones before it. Therefore, blockchains are resistant to modification of their data because once recorded, the data in any given block cannot be altered retroactively without altering all subsequent blocks.
Types: Currently, there are at least four types of blockchain networks — public blockchains, private blockchains, consortium blockchains and hybrid blockchains.
https://en.wikipedia.org/wiki/Blockchain
记账
- 把交易记录写入数据库的过程。
- 比特币记账过程:所有节点人手一个账本,不关心数据多少,十分钟左右翻页,使用的hash值,比如区块2中存区块1的hash值,区块3存区块2的hash值。
账本
所有交易记录的集合,使用的是levelDB数据库,每个节点都同步一个账本。
挖矿
钱包(wallet)
- 私钥:每个银行卡有自己的密码
- 公钥
- 地址:账户
节点
一个账户就是一个节点。
- 轻节点:只下载跟自己相关的交易数据。
- 全节点:所有的交易数据。
挖矿
什么是挖矿?
- 提供数据计算,计算机提供计算,相当于一个记账的过程。
- 节点间竞争记账权力的工程叫挖矿,竞争成功着获得记账的权利,记账的过程会得到系统的奖励,即挖到矿。
- 挖矿过程就是比特币货币发行过程。
- 挖矿的机器就是矿工(矿机)。
特点
- 保证了公平,安全,不确定性。
算力(计算机性能)
- 挖矿的能力
本质
- 对区块链数据做哈希运算,寻找一个满足条件的随机数。
总结
- 所有节点都可以负责记账,获取记账的权利的过程叫挖矿。
- 记账过程会获得系统的奖励,这个时候会发行新的货币。
- 账本一致性,安全,避免人为修改。
比特币依赖技术
算力、矿机、矿场
- 算力:挖矿的能力
- 矿机:CPU -> GPU -> FPGA -> ASIC(专业矿机)
- 矿场:多个矿机
比特币参数
- 出块时间
- 每2016块调整一次,时间两周,所以每块的时间在十分钟左右,安全性和适用性的平衡。
- 太快会出现同时出块的现象,太慢影响用户体验。
- 出块奖励
- 每21万个块奖励减半,最初是50BTC,基本四年左右减半一次。
- 09年(21万 x 50)-> 12年(21万 x 25)-> 16年(21万 x 12.5)-> 20年(21万 x 6.25)(有手续费,可能会略高)
- 比特币总量
- 2100万,2140年挖完。
- 区块容量
- 1M大约4000条交易记录
- 单位
- 1BTC = $10^8$聪(1亿聪)
技术
- 加密
- P2P网络(广播交易,同步账本)
- 挖矿
- base58
比特币地址生产规则
对随机字符串进行哈希运算,生产32字节的私钥,使用的是base58。
比特币结构
区块头
- 版本号:标识该区块遵守的验证规则。
- 父区块头哈希值:前一区块的哈希值。
- Merkle根:该区块中交易的Merkle树根的哈希值。
- 时间戳:精确到秒的时间戳。
- 难度目标:该区块工作量证明算法的难度目标,已经使用特定算法编码。
- Nonce:为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展Nonce的位数。
区块体(交易数据)
- 挖矿交易:记账奖励
- 普通交易:付款方,收款方,转账金额,手续费等
数字签名
作用
- 放篡改
- 确认发送者的身份
签名需要什么?
- 想要签名的数据
- 私钥
验证需要什么?
- 想要签名的数据
- 数字签名
- 公钥
对哪些数据签名?
- 金额
- 公钥
- 新生成的公钥
需要遍历所有的交易,按个签名。
共识机制
指所有节点对某一状态达成一致的方式。有了共识机制,去中心化才有意义,才有可信度,否则只是数据的共享。
工作量证明(POW:proof of work)
- 特点
- 记账,系统会给与奖励
- 多劳多得
- 优点
- 去中心化,记账权公平的分派到每个节点
- 多劳多得
- 安全性高
- 缺点
- 浪费资源严重(耗电)
- 持币人没有话语权,算力决定
- 应用
- 比特币
- 以太坊
股权证明(POS:proof of stake)
会根据你持有货币的量和时间,给你相应的利息。
每个币每天产生一个币龄,如果某一天获得了记账权利,你之前累加的币龄就会被清空,每365币领奖励0.05个币。
- 特点
- 钱生钱
- 不挖矿,币龄越大,获得记账权的概率越大,记账后币龄清空
- 优点
- 在一定程度上缩短了达成共识的时间
- 节约资源
- 防作弊
- 缺点
- 有钱人越来越有钱,货币过于集中化
- 应用
- ADA
委托股权证明(DPOS:delegated proof of stake)
让每一个持币人投票产生n多个代表,矿机的出现导致的。
- 特点
- 不挖矿,每年按比例增发币,奖励超级节点
- 优点
- 高效
- 扩展性强
- 缺点
- 节点太少(21个),非去中心化,是多中心化
- 应用
- EOS
以太坊
智能合约
数字化合约,可以理解为合同。代码代替人仲裁和执行合同,同时能够触发支付。
- 普通合约:租户和房东签属的租房纸质合同,法院是仲裁者。
- 智能合约:代码化的合同,合约约定好以后,不可再被修改,无条件执行。
步骤
- 构建
- 存储
- 执行
应用
- DAPP
- 合约调用
以太坊
介绍
对比特币的区块链进行了扩展。
- 是一个有智能合约功能的公共区块链平台。允许任何人在平台上建立通过区块链技术运行的去中心化应用。就像比特币一样不受任何人控制的开放源项目,但与比特币不同的是,它解决了扩展性不足的问题,它十分灵巧简便,极具适应性。
- 由很多节点组成,每一个节点就是运行以太坊客户端的计算机,每个节点都可以同步全部的账本。
- 可以转账和数据存储。
- 以太坊是公有链,所有人都可以随意加入和退出。
- 全世界计算器联网,每个节点运行一个以太坊客户端,就组成了以太坊网络。
官网地址:https://ethereum.org/en/
浏览器交易地址:https://etherscan.io/(访问不了可以看:http://blog.hubwiz.com/2019/10/16/etherscan-alt-solutions/)
公有链、私有链、联盟链
公有链
- 特点:所有节点都可以随时加入和退出,都有权记账和转账,公开式。
- 应用:比特币、以太坊、EOS等。
私有链
- 特点:公司内部使用,权限控制,封闭式。
- 应用:以太坊可以定制私有链,商用区块链等。
联盟链
- 特点:加入和退出需要授权,选定指定的节点记账,其他节点只能交易,无权记账,半封闭式。
- 应用:R3CEV、fabric等。
比特币与以太坊区别
- 比特币只能转账,程序写死;以太坊可以通过自定义逻辑来转账,还可以编写 其他非转账功能。
- 比特币是区块链1.0;以太坊是区块链2.0。
- 出块时间比特币10分钟左右,以太坊15~30秒。
- 比特币容量是1M,以太坊
gas
数量决定(七百九十万左右)。 - 比特币奖励是每四年衰减,以太坊目前是2个。
以太坊虚拟机
以太坊虚拟机EVM是智能合约的运行环境。它不仅是沙盒封装的,而且是完全隔离的,也就是说在EVM中运行代码是无法访问网络、文件系统和其他进程的。甚至智能合约之间的访问也是受限的。
以太坊中有两类账户(它们共用同一个地址空间):外部账户由公钥-私钥对(也就是人)控制;合约账户由和账户一起存储的代码控制。
gas
一经创建,每笔交易都收取一定数量的gas ,目的是限制执行交易所需要的工作量和为交易支付手续费。EVM执行交易时,gas将按特定规则逐渐耗尽。
gas price
是交易发送者设置的一个值,发送者账户需要预付的手续费=gas_price * gas
。如果交易执行后还有剩余, gas会原路返还。
无论执行到什么位置,一旦gas被耗尽(比如降为负值),将会触发一个out-of-gas
异常。当前调用帧(call frame)所做的所有状态修改都将被回滚。
MetaMask钱包的使用
交易结构
- nonce:交易数量。
- gasPrice:价格,为交易所需要的计算资源付的价格,Wei为单位。
- gasLimit:上限,在交易前设置,设置后不能修改。
- to:目标。
- value:交易额。
- v,r,s:和交易签名相关的变量,用于确定交易的发送者。
- data:附带的消息,可选。
UTXO和Account模型
在当前区块链世界中,主要有两种记录保存方式,UTXO模式(Unspent Transaction Output)和Account模式。Bitcoin采用的是UTXO模型,Ethereum采用的Account模型,同样CITA也采用了Account模型。
Bitcoin的设计初衷是点对点的电子现金系统,在比特币中,每个交易消耗之前交易生成的UTXO然后生成新的UTXO,账户的余额即所有属于该地址的未花费UTXO集合,Bitcoin的全局状态即当前所有未花费的UTXO集合。Ethereum意图创建一个更为通用的协议,该协议支持图灵完备的编程语言,在此协议上用户可以编写智能合约,创建各种去中心化的应用。由于UTXO模型在状态保存以及可编程性方面的缺陷,Ethereum引入了Account模型。
https://www.ucloud.cn/yun/24726.html
Remix的使用
Remix docs: https://remix-ide.readthedocs.io/en/latest/index.html
Environment
- JavaScript VM: All the transactions will be executed in a sandbox blockchain in the browser. This means nothing will be persisted when you reload the page. The JsVM is its own blockchain and on each reload it will start a new blockchain, the old one will not be saved.
- Injected Provider: Remix will connect to an injected web3 provider. Metamask is an example of a provider that inject web3.
- Web3 Provider: Remix will connect to a remote node. You will need to provide the URL to the selected provider: geth, parity or any Ethereum client.
Solidity
介绍
Solidity文档:https://solidity-cn.readthedocs.io/zh/develop/index.html
pragma solidity ^0.4.0;
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
对于以太坊来说,上述的合约就是拥有合约(owning contract)。在这种情况下,函数set
和get
可以用来变更或取出变量的值。
该合约能完成的事情并不多(由于以太坊构建的基础架构的原因):它能允许任何人在合约中存储一个单独的数字,并且这个数字可以被世界上任何人访问,且没有可行的办法阻止你发布这个数字。当然,任何人都可以再次调用set
,传入不同的值,覆盖你的数字,但是这个数字仍会被存储在区块链的历史记录中。随后,我们会看到怎样施加访问限制,以确保只有你才能改变这个数字。
- 所有的标识符(合约名称,函数名称和变量名称)都只能使用ASCII字符集。UTF-8编码的数据可以用字符串变量的形式存储。
- 小心使用Unicode文本,因为有些字符虽然长得相像(甚至一样),但其字符码是不同的,其编码后的字符数组也会不一样。
版本杂注
pragma solidity ^0.4.0;
为了避免未来被可能引入不兼容变更的编译器所编译,源文件可以(也应该)被版本杂注pragma
所注解。 源文件将既不允许低于0.4.0
版本的编译器编译, 也不允许高于(包含)0.5.0
版本的编译器编译(第二个条件因使用^
被添加)。
导入其他源文件
import "filename";
import * as symbolName from "filename";
import {symbol1 as alias, symbol2} from "filename";
// 等同于import * as symbolName from "filename";
import "filename" as symbolName;
此语句将从“filename”
中导入所有的全局符号到当前全局作用域中(不同于ES6,Solidity是向后兼容的)。
注释
可以使用单行注释(//
)和多行注释(/*...*/
)。
此外,有另一种注释称为natspec注释,其文档还尚未编写。 它们是用三个反斜杠(///
)或双星号开头的块(/** ... */
)书写,它们应该直接在函数声明或语句上使用。
合约结构
变量
状态变量
pragma solidity ^0.4.0;
contract SimpleStorage {
uint storedData; // 状态变量
// ...
}
定义在合约之内,但是在函数之外的变量,叫做状态变量。这些变量会上传到区块链保存。可以使用public和private修饰,默认是private。
局部变量
定义在合约之内,在函数之内的变量,叫做局部变量。不能使用public修饰。
函数
函数是合约中代码的可执行单元。
function 函数名称(可选参数) 修饰符 返回值{
函数体
}
// 多个返回值使用元组:使用括号括起来()
pragma solidity ^0.4.0;
contract SimpleAuction {
function bid() public payable { // 函数
// ...
}
}
修饰符
- public:共有,拥有以太坊的账户都可以调用,可以修饰状态变量。默认是public。
- private:私有,只有合约内部可以调用,可以修饰状态变量。
- view/constant:函数会读取但是不会修改任何合约的状态变量。
- pure:函数不适用任何合约的状态变量。
- payable:调用函数需要付钱,钱付给了智能合约的账户。
- returns:返回值函数声明中使用。
- external:仅合约外部可以调用,合约内部需要使用this调用。
- internal:仅合约内部和继承的合约可以调用。
修饰符在returns声明的前面,可以有多个修饰符。
view、constant、pure的区别
- 都是针对状态变量的。
- 函数中访问了状态变量,但是没有修改,使用view或者constant。
- 如果没有使用状态变量,则使用pure修饰。
- 如果即访问了状态变量,又修改了,则不要修饰即可。
- 注意:constant修饰的函数中,修改了状态变量,编译器不会报错,但是运行是修改不成功的。
payable
想要转钱,修饰符必须是payable,转的钱到合约中。
构造函数
进入合约就执行,一般设置一些初始化后不变的数据。
constractor() public {
owner = msg.sender;
}
函数修饰器
函数修饰器可以用来以声明的方式改良函数语义。
pragma solidity ^0.4.22;
contract Purchase {
address public seller;
modifier onlySeller() { // 修饰器
require(
msg.sender == seller,
"Only seller can call this."
);
_;
}
function abort() public onlySeller { // Modifier usage
// ...
}
}
事件
事件是能方便地调用以太坊虚拟机日志功能的接口。
pragma solidity ^0.4.21;
contract SimpleAuction {
event HighestBidIncreased(address bidder, uint amount); // 事件
function bid() public payable {
// ...
emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
}
}
结构类型
结构是可以将几个变量分组的自定义类型。
pragma solidity ^0.4.0;
contract Ballot {
struct Voter { // 结构
uint weight;
bool voted;
address delegate;
uint vote;
}
}
枚举类型
枚举可用来创建由一定数量的“常量值”构成的自定义类型。
pragma solidity ^0.4.0;
contract Purchase {
enum State { Created, Locked, Inactive } // 枚举
}
类型
bool
bool:可能的取值为字面常数值true
和false
。
运算符:
!
(逻辑非)&&
(逻辑与, “and” )||
(逻辑或, “or” )==
(等于)!=
(不等于)
整型
int / uint
:分别表示有符号和无符号的不同位数的整型变量。 支持关键字uint8
到uint256
(无符号,从8位到256位)以及int8
到int256,以8位为步长递增。uint
和int
分别是uint256
和int256
的别名。
运算符:
- 比较运算符: <= , < , == , != , >= , > (返回布尔值)
- 位运算符: & , | , ^ (异或), ~ (位取反)
- 算数运算符: + , - , 一元运算 - , 一元运算 + , * , / , % (取余) , ** (幂), « (左移位) , » (右移位)
定长浮点型
- Solidity还没有完全支持定长浮点型。可以声明定长浮点型的变量,但不能给它们赋值或把它们赋值给其他变量。
fixed / ufixed
:表示各种大小的有符号和无符号的定长浮点型。在关键字 ufixedMxN
和fixedMxN
中,M
表示该类型占用的位数,N
表示可用的小数位数。M
必须能整除8,即8到256位。N
则可以是从0到80之间的任意数。ufixed
和fixed
分别是ufixed128x19
和fixed128x19
的别名。
地址类型
address
:地址类型存储一个20字节的值(以太坊地址的大小)。地址类型也有成员变量,并作为所有合约的基础。
地址类型成员变量
-
balance和transfer
-
send
-
call, callcode 和 delegatecall
-
可以使用
balance
属性来查询一个地址的余额, 也可以使用transfer
函数向一个地址发送以太币Ether(以wei为单位):address x = 0x123; address myAddress = this; if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);
-
send
是transfer
的低级版本。如果执行失败,当前的合约不会因为异常而终止,但send
会返回false
。 -
这三个函数
call
,delegatecall
和callcode
都是非常低级的函数,应该只把它们当作最后一招来使用,因为它们破坏了Solidity的类型安全性。
定长字节数组
关键字有:bytes1
, bytes2
, bytes3
, …, bytes32
。byte
是bytes1
的别名。
成员变量:
.length
表示这个字节数组的长度(只读)。
变长字节数组
bytes
:变长字节数组。它并不是值类型。
string
:变长UTF-8编码字符串类型。并不是值类型。
映射
映射类型在声明时的形式为mapping(_KeyType => _ValueType)
。其中_KeyType
可以是除了映射、变长数组、合约、枚举以及结构体以外的几乎所有类型。_ValueType
可以是包括映射类型在内的任何类型。
只有状态变量(或者在internal
函数中的对于存储变量的引用)可以使用映射类型。
pragma solidity ^0.4.0;
contract MappingExample {
mapping(address => uint) public balances;
function update(uint newBalance) public {
balances[msg.sender] = newBalance;
}
}
contract MappingUser {
function f() public returns (uint) {
MappingExample m = new MappingExample();
m.update(100);
return m.balances(this);
}
}
单位
以太币单位
以太币Ether
单位之间的换算就是在数字后边加上wei
、finney
、szabo
或ether
来实现的,如果后面没有单位,缺省为Wei
。例如2 ether == 2000 finney
的逻辑判断值为true
。
时间单位
秒是缺省时间单位,在时间单位之间,数字后面带有seconds
、minutes
、 hours
、days
、weeks
和years
的可以进行换算,基本换算关系如下:
1 == 1 seconds
1 minutes == 60 seconds
1 hours == 60 minutes
1 days == 24 hours
1 weeks == 7 days
1 years == 365 days
错误处理
throw
:if(判断条件){throw;}
(已废弃)require(条件);
:如果满足条件则继续往下执行,如果不满足则报错,不扣除gas,推荐使用。assert(条件);
:assert扣除gas,不推荐使用。revert()
:负责逻辑中使用,if(条件){revert();}else{...}
。
参考链接
参考或摘抄自:https://solidity-cn.readthedocs.io/zh/develop/index.html
Geth
Geth (go-ethereum) is an Ethereum client implemented in Go.
启用RPC端口:geth --http --http.port 8545 --datadir "geth-demo" --http.corsdomain "*" --http.api personal,eth,net,web3 --allow-insecure-unlock console
Go调用以太坊
Demo: https://github.com/moluuser/geth-demo
合约接口
Application Binary Interface
.abi
-> .go
abigen --abi test.abi --pkg <packagename> --type <structname> --out test.go
Remix连接私有链
Geth启动私链,选择Web3 Provider方式,默认连接私有链8545端口。
部署合约,可能出现的错误:
- Error: authentication needed: password or unlock:这种报错解锁下账户即可,账户解锁:personal.unlockAccount(“账户地址”)。
- Returned error: exceeds block gas limit:出现这种错误就看块号的gaslimit。
- 获取块号:eth.blockNumber
- 根据块号获取详细信息:eth.getBlock(0)会看到gasLimit的值,在部署时的gaslimit不能大于这个。
- Returned error: insufficient funds for gas * price + value:部署合约需要手续费,需要通过挖矿赚取。
- 开启指定线程数挖矿:miner.start(2)
- 停止挖矿:miner.stop()
- 检查是否在挖矿:eth.mining(true:在挖矿;false:不在挖矿)
- 获取账户地址数组:eth.accounts
- 获取挖矿地址:eth.coinbase(默认第一个创建的账户)
- 查看第一个账户余额:eth.getBalance(eth.accounts[0])
- 获取指定账户的余额:eth.getBalance(“账户地址”)
初始化私有链节点创世块
新建一个genesis.json
文件,内容如下:
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5e4a53b2",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x80000",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"0000000000000000000000000000000000000088": {
"balance": "0x200000000000000000000000000000000000000000000000000000000000000"
}
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
- coinbase: 挖矿账户地址,随便填,后面可以设置,一般默认第一个创建的用户
- difficulty: 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
- gasLimit: 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,填最大即可。
- nonce: nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper
- mixhash: 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。
- parentHash: 上一个区块的hash值,因为是创世块,所以这个值是0extraData
- timestamp: 设置创世块的时间戳
- alloc: 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
geth -datadir "geth-demo" init genesis.json
合约部署
部署时候需要支付手续费。
选择本地连接,搜索已部署的合约。