【精解】开发一个智能合约 (2)

这是存储结点私钥的位置,文件名为时间戳加上本地账户拼成的字符串。打开文件,内容为一个json,格式化以后为:

{ "address": "740b9c48d67cf333c8b1c0e609b6b90b40d3cdea", "comment":"本地账户地址", "crypto": { "cipher": "aes-128-ctr", "comment":"加密协议采用的是AES-128", "ciphertext": "b331a3dbdde9abd14991116ac0bb1b742f22edda162b567974f8fbf1d694daef", "comment":"密文", "cipherparams": { "iv": "06d0df7a5b7160da852fbb01339149ae", "comment":"加密参数" }, "kdf": "scrypt", "comment":"Key Derivation Function, 将短密码加盐hash成长密码,防彩虹表、防暴力破解", "kdfparams": { "dklen": 32, "comment":"KDF加密参数", "n": 262144, "p": 1, "r": 8, "salt": "6ffbd23fac4ed386aac703bc180f50be02690bef5239057a34dde4dd4de2416b", "comment":"盐值,加盐加密" }, "mac": "06b7d92b98a3b732dc1e63e7e09b8e3d79a9e8e1d43ee7a1b40482db295ea367", "comment":"message authentication code,消息认证码" }, "id": "ff7e243a-150e-45f6-ac64-06b0ed2e68ec", "comment":"文件主键", "version": 3 }

这部分范畴属于密码学方面了,可以参考《应用密码学初探》

③ transactions.rlp

RLP(Recursive Length Prefix),递归长度前缀。是以太坊中用于序列号对象的主要编码方法。根据文件名可以猜出,这是所有交易的序列化对象文件。

④ chaindata

数据库采用leveldb,存储了区块数据以及状态数据。该目录下打包存储以.ldb为扩展名的每个区块的数据文件。每个块文件有容量的最大值,目前我本机默认的是2.1M,我们设想一下目前以太坊的区块高度为5039768,如果一个块是2.1M的话,那么整个区块链的数据大小为10TB。

⑤ leveldb

Google出品的另一利器,使用C++编写,基于LSM(Log-Structured-Merge Tree)日志结构化合并树,是一个高效的键值对存储系统,是没有Sql语句的非关系型数据库。键值对均采用字符串类型,按照key排序。

特点包括:

键和值都是当作简单的字节数组,所以内容可以从ASCII字符串到二进制文件。

数据按照key排序存储。

调用者可以自定义一个比较方法来复写排序。

基本操作有插入、获取和删除:Put(key,value), Get(key), Delete(key).

一次原子批量操作可以执行多重变更操作。

用户能够创建一个瞬时快照来获取一个统一的数据视图。

数据可以向前亦或是向后迭代。

数据采用Snappy(也是Google的一个压缩库)自动被压缩。

用户可以通过一个虚拟接口自定义操作交互系统来实现一些额外的操作。

局限性包括:

无SQL,无索引,非关系型数据库

同时只允许一个进程访问(但支持多线程)

无客户端-服务端内置库支持,一个应用程序必须要包装自己的服务器到库才能获得这样的支持。

console

console命令在EVM启动的同时开启了一个交互控制台,后面的一串命令是将输出的log转存到文件testGeth.log中去,启动时的日志文件:

WARN [02-06|11:46:35] No etherbase set and no accounts found as default INFO [02-06|11:46:37] Using developer account address=0x740b9C48D67Cf333C8b1c0E609b6b90b40D3CdeA INFO [02-06|11:46:37] Starting peer-to-peer node instance=Geth/v1.7.3-stable-4706005b/linux-amd64/go1.9.2 INFO [02-06|11:46:37] Allocated cache and file handles database=http://www.likecs.com/home/liuwenbin/testNet/geth/chaindata cache=128 handles=1024 INFO [02-06|11:46:37] Writing custom genesis block INFO [02-06|11:46:37] Initialised chain configuration config="{ChainID: 1337 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: 0 EIP155: 0 EIP158: 0 Byzantium: 0 Engine: clique}" INFO [02-06|11:46:37] Initialising Ethereum protocol versions="[63 62]" network=1 INFO [02-06|11:46:37] Loaded most recent local header number=0 hash=593c0e…256b90 td=1 INFO [02-06|11:46:37] Loaded most recent local full block number=0 hash=593c0e…256b90 td=1 INFO [02-06|11:46:37] Loaded most recent local fast block number=0 hash=593c0e…256b90 td=1 INFO [02-06|11:46:37] Regenerated local transaction journal transactions=0 accounts=0 INFO [02-06|11:46:37] Starting P2P networking INFO [02-06|11:46:37] started whisper v.5.0 INFO [02-06|11:46:37] RLPx listener up self="enode://ede08b763001ed3642e0b3860d57e694489bcc1f47dde8563f2577bdec48e6949748826d9b88f55f456af2ae1e75ce2ea04a59eb0ef1c2c53330be92e44e6515@[::]:46591?discport=0" INFO [02-06|11:46:37] Transaction pool price threshold updated price=18000000000 INFO [02-06|11:46:37] IPC endpoint opened: /home/liuwenbin/testNet/geth.ipc INFO [02-06|11:46:37] Starting mining operation INFO [02-06|11:46:37] Commit new mining work number=1 txs=0 uncles=0 elapsed=53.048µs

我们逐行分析,

启动时第一行并未找到以太坊base的设置以及默认账户。

说明使用了开发者账户,后面给出了账户地址。

开始p2p网络结点,实例采用的是基于go1.9.2版本的geth实例。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywsjf.html