涉及到代码部分(以1.4版本为准)的回答,均可使用notepad++查找对应数字及其变量
16、 当前比原链有几个网络可供选择 ?
A:2个
B:3个
C:4个
答案:B,分别是主网mainnet、测试网testnet、单机网solonet,readme.md里面有提到
17、 在比原链上BTM的资产ID是什么?
A:ffffffffffff...ff
B:gggggggggg...gg
C:lllllllllllllllllll...ll
答案:C,只有A选项有意义,bytom-mastercmdytomclicommands emplate.go这里有多处搜索结果,asset_id是多个f,对应的asset_alias是BTM
18、 比原链的挖矿算法叫什么名称?
A:Bensority
B:Densority
C:Tensority
答案:C
19、 比原链官方全节点是拿什么编程语言开发的?
A:C语言
B:Java语言
C:Go语言
答案:C,去全球最大同性程序员交流社区github查看代码:https://github.com/Bytom/bytom,看文件名,不是.h格式也不是.java格式,是.go格式
20、 想要创建一个比原链资产需要使用下列哪个指令?
A:Create
B:Issue
C:Begin
答案:B,比原板块有贴子 如何在Bytom上发布资产?:http://8btc.com/thread-221007-1-1.html提到可以用Issue指令创建一定数量的资产
21、 比原链挖矿算法多长时间调整一次难度值?
A: 1024
B: 2048
C: 2016
答案:C,第4题的题解有一个变量,BlocksPerRetarget=2016,结合函数用途可知道,挖矿难度会在每2016个块调一次,其他选项搜索不出实质结果,题干有问题?
22、 比原链单次挖矿过程矩阵乘运算要运算多少次?
A: 64
B: 128
C: 256
答案:C,以256这个关键词搜索,找到了好多与tensority和ed25519有关的函数。
其中一个搜索结果在bytom-mastermining ensoritycgo_algorithmlibBytomPoW.h里面,这个C语言头文件定义大小为256*256的矩阵,相乘函数叫mul(),以这个函数为线索搜索,发现本文件下有函数iter_mineBytom,k循环下执行4次,j循环下执行2次,循环下执行16次(每次i自增2),运行2次矩阵乘,总共256次。函数执行层次如下:
bytom-mastermining ensorityai_hash.go:54
->bytom-mastermining ensoritycgo_algorithmalgorithm_simd.go:24
->bytom-mastermining ensoritycgo_algorithmlibcSimdTs.cpp:37
->bytom-mastermining ensoritycgo_algorithmlibBytomPoW.h:348
前3层均没有循环,矩阵乘要执行256次
另一个关于mul的搜索结果在bytom-readmining ensoritygo_algorithmmatrix.go:20,也是对256*256的矩阵乘,循环套3层,4*32*2次mc.Mul(ma, mb.T())。函数执行层次如下:
bytom-mastermining ensorityai_hash.go:56->
bytom-mastermining ensoritygo_algorithmalgorithm.go:7->
bytom-mastermining ensoritygo_algorithmmatrix.go:20
前2层均没有循环,矩阵乘要执行256次
值得注意的是,bytom-mastermining ensorityai_hash.go:52的algorithm函数是根据SIMD能否使用来决定调用哪个算法,无论通过go函数(相对偏慢)还是c函数,矩阵乘都要执行256次。所以挖矿用结点必须用SIMD,否则会因为运算速度过慢无法竞争记账权。
23、 比原链智能合约版本叫什么名称
A 智
B 正
C 晓
答案:B,比原链官博https://weibo.com/5966947038/GrJcemHXf?filter=hot&root_comment_id=0&type=comment,合约版本名为正,顺带一提上线时间是7月26日
24、 比原链的数据库使用的是 ?
A:MySQL
B: levelDB
C:sqlite
答案:B,搜整个项目,可以发现比原存储数据主要用levelDB,这点可以看Derek的教程
25、 比原链启动离线节点的flag是 ?
A:--solo_mode
B: --isolate_mode
C: --vault_mode
答案:C,vault_mode这个关键词在bytom-readconfigconfig.go:94能看到,命令是否含vault_mode决定VaultMode这个变量的值,bytom-read etsynchandle.go:97可以看到,如果设置这个变量为否,则这个结点会在p2p网络找其他地址
26、 比原链测试网地址开头是什么?
A: bm
B: cm
C: tm
答案:C,测试网就是testnet,用这个词在搜索,可以看到bytom-readconsensusgeneral.go:124里面的前缀是tm
27、 比原链浏览器允许的最短密码是几位
A: 4
B: 6
C: 8
答案:B?
28 、Coinbase中的留言信息的最大长度是 ?
A: 32 byte
B: 64 byte
C: 128 byte
答案:C,第8题中,coinbase的input被限制了留言长度,长度为128B
29、 UTXO最少需要几个块的确认才可以被花费?
A: 0
B: 1
C :6
答案:B?估计是因为程序没有规定必须确定6个。。。反正代码也找不到实质性的线索
30 、比原链创世区块挖出时间?
A :2018年4月24日
B :2018年4月25日
C :2018年4月26日
答案:A,bytom-masterconfiggenesis.go:31是主网的创世区块,timestamp是1524549600,在站长工具http://tool.chinaz.com/Tools/unixtime.aspx转换下就知道,这个区块是2018-4-24 14:00生成的
31、 下面 哪个算法没有在 tensority 中被使用?
A :SHA3-256
B :FNV
C: Secp256k1
答案:C,查看tensority论文可知道,前2种算法的名称在论文中多次出现。此外,secp256k1作为比特币的公私钥算法,在比原主代码没搜到
32 、一个区块最多可承载多少GAS的交易?
A:625000
B:1250000
C:10000000
答案:C.做这道题之前,要先理清BTMtoken和BTMgas的关系。需要与37题联动。
只有10000000这个数值有意义,对应变量MaxBlockGas,在bytom-masterminingmining.go:70的NewBlockTemplate(c *protocol.Chain, txPool *protocol.TxPool, accountManager *account.Manager) (b *types.Block, err error)函数里面用到2次。freewind教程第14篇:剥开比原看代码-比原的挖矿流程是什么样的 就有讲到,挖矿过程首先要在这个函数里面生成模板(把未打包交易拿到),再计算哈希值争夺记账权,这个函数的作用是把未打包的交易记录至链,但是一次只能打包gas总值不超10000000GAS的所有交易。
关于token和gas的关系,下列有MaxGasAmount这个变量,关联到bytom-masterprotocolvalidation x.go:47的函数(g *GasState) setGas(BTMValue int64, txSize int64) error(这个函数只在测试函数里出现过,哪位仁兄能说清楚这个函数以后要用在哪),推测BTMValue就是BTMtoken的聪数,1gas=1BTMsatoshi
33 、全节点验证区块时间合法性的下限是?
A:大于前6个块的平均值
B: 大于前6个块的中位数
C:大于前11个块的中位数
答案:C
34、 全节点验证区块时间合法性的上限是
A:大于前一个区块时间
B: 大于服务器当前时间
C:大于服务器当前时间 + 1小时
答案:C
这2题要放一块看
bytom-masterconsensusgeneral.go:31和32可找到跟着2道题相关的变量(这个1小时的指代时间3600秒找不到,结果找11的时候找到了不同的表示法60*60.。。)3600是MaxTimeOffsetSeconds,11是MedianTimeBlocks,在bytom-masterprotocolvalidationlock.go:25可找到函数checkBlockTime(b *bc.Block, parent *state.BlockNode) error
第1个判断b.Timestamp > uint64(time.Now().Unix())+consensus.MaxTimeOffsetSeconds,很明显就是说俩区块的间隔时间不能超过3600秒
第2个判断b.Timestamp <= parent.CalcPastMedianTime(),追踪函数至bytom-masterprotocolstatelockindex.go:84的(node *BlockNode) CalcPastMedianTime() uint64,可以看出是计算前11个块时间戳的中位数
35、 tensority 中 将哪两个数值进行 运算 和 bits 比较?
A:block_header & seed
B: block_header & bits
C: block_header_hash & seed
答案:C,答案比较难找。。。
同样还是找这篇教程:剥开比原看代码-比原的挖矿流程是什么样的 里面有讲到计算哈希值争夺记账权。这之中,其中重要的一个函数是bytom-masterconsensusdifficulty difficulty.go:120的CheckProofOfWork(hash, seed *bc.Hash, bits uint64) bool,里面有一个执行的函数tensority.AIHash.Hash(hash, seed),第1个参数在使用CheckProofOfWork的地方到处找,确认是block_header计算之后的hash值