BigBang
BigBang copied to clipboard
BigBang Core
Support compilation with MSVC
## 当前的实现 - 向钱包导入地址后,对于每个分支,从创世块开始向下遍历长链。 - 将每个块从block.dat读取出来,再序列化 - 从交易集合中选择与导入地址相关的放入到wallet中 ### 优点 - 当地址相关的交易非常多时,效率高 - 使用`resyncwallet`时,如果wallet中地址较多、关联的交易较多,效率高 ### 缺点 - 当地址相关的交易较少时,效率很低 - 实际情况下,单个地址导入的平均效率低 ## 改进方案 - 扩展block.dat的结构在CBlockEx基础上增加一个相关地址前序交易位置的数组 - block.dat中每个交易对应数组中的一项,每项数据包含两个二元组,第一个二元组是from地址的,第二个二元组是to地址的。每个二元组有两个数据(PrevDiskPos, txDiskPos),PrevDiskPos表示该地址上一个交易索引的位置,txDiskPos表示当前交易内容的位置 - 对于每一条分支创建一个leveldb数据库AddrTxIndex,key是上链的地址,value是最后一个交易索引的位置 -...
分支名字唯一功能,只是在添加起源块时,判断本地是否有该名字的分支,判断是否成功,没有影响区块及交易的有效性,当以下情况发生时,会在不同节点存在同名分支的情况。 1)当两个节点(A节点、B节点)在同一时间(不完全一个时间点,只要在一个区块时间内就可以),分别创建名字相同的分支,将产生两条创建分支的交易,这两条交易分别在两个节点上打包,并且产生分叉,两个块中,两条交易的顺序相反,即A节点的块是AB顺序,B节点的块是BA顺序; 2)其它节点接收到A节点的块时,会生成A分支,而排斥B分支,接收到B节点的块时,会生成B分支,而排斥A分支; 3)当分叉回滚时,也不能将改变这个情况,分支创建后,没有删除功能,并且也不能删除,由于分支上产生的价值,无法删除。
This is for feature of supernode.
高级模板实现方案
这周和 @sunhantao 查阅了解释器,编译器等相关资料和工具,书籍, 这次可能是更加细化些,需要组内讨论下(讨论的时候,要拉上 @woondroo ,让一休来决定)。 方案一: 修改BTC的脚本,加入到BBC中,但是开发部不友好,连开发人员都不方便表示复杂的模板逻辑,必须把大脑当作栈来用,甚至有时候根本表达不出来一些需求,也不好修改,对不同体系的代码移植过来,不好做减法。 方案二:不采用Lua,Python等成熟完备的语言体系和虚拟机,而是团队自己实现一个内核比较小的脚本模板语言(非图灵完备),手写递归下降分析,或者用ANTLR之类的工具,生成分析树,然后遍历树生成字节码,这套字节码是方便在vchData中存储的,通过链上的字节码解释器执行。这套模板语言对用户开发友好,也符合高级模板的高级意图,团队自己在自己的基础上做加法。 *注*: 最开始组内第一次讨论的方案,是比较高层的可行性方案,并没有涉及到模板语言长什么样子,具体执行的工作原理,用什么技术或工具。 另外, @sunhantao 可以补充这个issue,如果有不完善的地方。
有2个问题: 1,性能问题,查询主链分支时,即使仅有7条交易记录,数个地址,耗时恒定10秒多,与其相对应,其余的分支至少超千条记录,几乎瞬间出结果; 2,功能问题,反向查询输出数据慢且不正确,表现在:查询分支链时仅输出2条记录,而查询主链时输出为空;
[supernode-verify-certtx-fail-log.tar.gz](https://github.com/bigbangcore/BigBang/files/4993404/supernode-verify-certtx-fail-log.tar.gz) 3个节点组成一个测试网络: - bbcnode节点:配置成关注所有分支链,作为pow挖矿节点,与另外2个dposnode节点p2p连接; - dposnode1节点:配置成pow/dpos双挖,与另外2个节点连通; - dposnode2节点:配置成pow/dpos双挖,与另外2个节点连通; 从创世块启动后在高度为3时停滞,区块高度保持约有1个小时,强制手工退出; 附日志,可看出3个节点全部在高度4出cached pow块时卡住,出错信息均为: ``` 2020-07-29 12:59:59.427957 : [CTxPool] {7fe760ffb700:powmaker} - ArrangeBlockTx: hashPrev is last block, target height: 4, new vtx size: 8,...
当前子链块权重计算是根据主链块之间的权重差而得,主链块权重根据难度系数计算而得,所以子链块权重也会因难度系数变化而变化,并成倍数变化,可能导致子链上难度系数低的多个块的权重,比难度系数高的一个块权重低。 表现的问题:由于难度系数降低,后面出的子链块可能被前面高度的子链块回滚。 可以考虑将DPOS块的权重计算改为固定难度系数,如:固定200或50,或者一段时间的最高难度值。
超级节点正常运行一段时间后出现不出块仅空块填充的问题,用gdb跟踪,其中一个分支节点(其它3个分支节点与此同)信息如下: (gdb) #0 pthread_cond_wait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185 #1 0x00007fe57f48591c in std::condition_variable::wait(std::unique_lock&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #2 0x0000000001702e58 in leveldb::port::CondVar::Wait (this=0x2175710 ) at /home/oijen/codeforge/git/BigBang/src/leveldb/port/port_stdcxx.h:93 #3 0x000000000172b83e in leveldb::(anonymous namespace)::PosixEnv::BackgroundThreadMain ( this=0x21756e0 )...
- 创建fork需要抵押10w token - 赎回抵押的token,从创建fork的交易上链块高度H0开始,以`60 * 24 * 90 = 129600`个高度为衰减周期T(三个月),每次剩余锁定token衰减50%。 - 计算高度为H1时的剩余锁定token公式: