http://www.7klian.com

以太坊源码进修:正本清源

生意业务

transaction.go 界说了生意业务的布局,尚有用度和收益变量。一笔生意业务包罗提倡者,接管者,生意业务的数量,生意业务的用度,编译后的剧本源码, 运行需要内存,生意业务签名 和 地点。

可以看出这是操纵指令到虚拟机内部指令码的映射。

大部门指令码的成果没有实现,只实现了以下指令码的成果
oSTOP
vm.go

更多出色内容,存眷7kLian.com ChainNews 公家号(id:chainnewscom),可能来微博 @ 7kLian.com ChainNews与我们互动!转载请注明版权和原文链接!

oLD

操纵指令和操纵数之间用空格分隔,操纵数与操纵数之间也用空格分隔。

parsing.go
项目布局

去掉单位测试文件,整个项目只有
总结

总体来说,这个版本的代码较量简朴,是 geth 的初始设计和验证,没有实现太多的成果,比喻账号,P2P 网络,共鸣算法等都没有实现,区块链,编译器和虚拟机也设计较量简朴,与正式宣布版差别较量大,不外对付初次进修 geth 源码,整体认识 geth 照旧有必然的意义。

总共 36 个指令码,细心的读者大概会发明指令码界说的值不是持续的,是跳跃的,通过通读代码阐明,原因是指令码值的高位是记录指令范例。

oJMP
3. 假如是其他范例需要转换成字符串可能字符串数组。
数学计较

big.go 封装了大整数的指数运输。

虚拟机内部界说的指令码有:

RLP 编码的纪律是以数据范例开始,字符串是”\x00”, 字符串数组是”\x01, 然后是数据长度,最后是数据内容。
oSET
以太坊进口

ethereum.go 是 demo 措施进口, mock 两笔生意业务,打印 vm 执行的日志,最后打印了个中一笔生意业务的序列化功效。

虚拟机

vm.go 界说了虚拟机操纵码 , 操纵码范例 , 虚拟机布局和虚拟机的实现。

8 个文件。这 8 个文件都较量小,成果较量简朴,也很好领略。

用度和收益变量只有初始化赋值,没有详细利用。

vm 运行时,按照编译法则的逆法则,,理会出指令码和操纵数,按照指令码的成果,举办下一步处理惩罚。

geth 源码一直在不绝增加,优化,成长到此刻已经很是复杂,对付初次进修 geth 源码,整体认识 geth 照旧有必然的意义。而阅读代码可以加深领略以太坊的模块构成,臆测设计的想法和思路。本篇文章带你进修 geth 源码。

3. 将步调 2 的乘积依次相加,最后加上步调 1 获得的指令, 最终的和作为编译功效。

395843 // 67 + 10 * 256 + 6 * 256^2 133698 // 66 + 10 * 256 + 10 * 256^2

oDIV
oLT
2. 每一个操纵数(第 i 个操纵数,i 记作位置序数, 从 1 开始)别离乘以 256 的 i 次方,
作者 | kari_zhang

transaction.go

地点是对 transaction 布局序列化后的字节数组取 sha256 的前 20 位。

"STOP": "0", "ADD": "16", // 0x10 "SUB": "17", // 0x11 "MUL": "18", // 0x12 "DIV": "19", // 0x13 "SDIV": "20", // 0x14 "MOD": "21", // 0x15 "SMOD": "22", // 0x16 "EXP": "23", // 0x17 "NEG": "24", // 0x18 "LT": "32", // 0x20 "LE": "33", // 0x21 "GT": "34", // 0x22 "GE": "35", // 0x23 "EQ": "36", // 0x24 "NOT": "37", // 0x25 "SHA256": "48", // 0x30 "RIPEMD160": "49", // 0x31 "ECMUL": "50", // 0x32 "ECADD": "51", // 0x33 "SIGN": "52", // 0x34 "RECOVER": "53", // 0x35 "COPY": "64", // 0x40 "ST": "65", // 0x41 "LD": "66", // 0x42 "SET": "67", // 0x43 "JMP": "80", // 0x50 "JMPI": "81", // 0x51 "IND": "82", // 0x52 "EXTRO": "96", // 0x60 "BALANCE": "97", // 0x61 "MKTX": "112", // 0x70 "DATA": "128", // 0x80 "DATAN": "129", // 0x81 "MYADDRESS": "144", // 0x90 "BLKHASH": "145", // 0x91 "COINBASE": "146", // 0x92 "SUICIDE": "255", // 0xff

编译法则很简朴:

凭据编译法则,代码片断 1 最终的编译功效是这样的

区块

block.go 用来界说块布局,很是简朴,仅包括一个 transaction 数组 .

oADD
生意业务序列化

serialization.go 实现序列化成果,回收的是 RLP 编码,只能对字符串编码。编码法则是

区块打点器

block_manager.go 是界说块打点器,用来处理惩罚块,持有一个 vm 指针,依次执行块内里的每一个生意业务的智能合约。

oMUL
block.go

"SET 10 6", "LD 10 10",

block_manager.go

一个正当的智能合约源码片断大概是这样(记作 代码片断 1)

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读