BTC学习知识点总结1 -- new_tx

1.ICO 和IPO 区别
ico 发币,ICO(是Initial Coin Offering缩写),首次币发行,源自股票市场的首次公开发行(IPO)概念,是区块链项目首次发行代币,募集比特币、以太坊等通用数字货币的行为
ipo 发行股票
2.幂律分布:
这种分布是自然界中的一种常见现象。譬如地震的大小,通常震级越小发生的频率越大,震级越大发生的频率就越小。以震级为自变量,以其发生的频率(或概率)为因变量,符合(负)幂函数。

  1. redis实现的简单令牌桶

这个参数防止redis存的过多导致内存溢出
为啥有的是600000,有的链是300000?
这个是因为有点链地址比较多,比如btc,有的比较少,比如ltc
如果地址少的话,实体就少,redis就不需要那么多的桶,因为桶越多,占用空间也越多

4.索引、分区和分桶的区别https://blog.csdn.net/android_xue/article/details/80398809
5.以太坊黄皮书详解(一)
https://www.jianshu.com/p/10a7b6a67232


6.稳定币 (Stable Coin)
參考:https://ryan-wu.blog.csdn.net/article/details/103828671
7.redis 启动报错:

# 强制把redis快照关闭了导致不能持久化的问题
(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.
 Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

方案1
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
OK

方案2
修改redis.conf文件:vi打开redis-server配置的redis.conf文件,
然后使用快捷匹配模式:/stop-writes-on-bgsave-error定位到stop-writes-on-bgsave-error字符串所在位置,
接着把后面的yes设置为no即可。

8. 在linux下安装requirements.txt文件.来完成项目的依赖:

参考:https://www.runoob.com/w3cnote/python-pip-install-usage.html

image.png

如果你还未安装,则可以使用以下方法来安装:
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py   # 下载安装脚本
$ sudo python get-pip.py    # 运行安装脚本
注意:用哪个版本的 Python 运行安装脚本,pip 就被关联到哪个版本,如果是 Python3 则执行以下命令:
$ sudo python3 get-pip.py    # 运行安装脚本。
一般情况 pip 对应的是 Python 2.7,pip3 对应的是 Python 3.x。
部分 Linux 发行版可直接用包管理器安装 pip,如 Debian 和 Ubuntu:
sudo apt-get install python-pip

注意事项
如果 Python2 和 Python3 同时有 pip,则使用方法如下:
Python2:
python2 -m pip install XXX
Python3:
python3 -m pip install XXX

安装依赖:

pip freeze >requirements.txt     将依赖写入requirements.txt文件
pip3 --version                              
pip3 install -r requirements.txt        安装依赖

9.加权加权的Quick-Union实现

https://www.cnblogs.com/current/p/3981658.html


10.循环冗余校验(CRC)算法入门引导

# 返回一个32位的整数
def crc32_address(address, cnt):
   return binascii.crc32(address.encode('utf-8')) % cnt

https://blog.csdn.net/liyuanbhu/article/details/7882789?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase


11.运行simple_handler时报错:

pymongo.errors.ServerSelectionTimeoutError: 127.0.0.1:27017: [Errno 111] Connection refused

原因:在PyCharm中调用MongoDB数据库时,由于没有启动本地的MongoDB服务引起。
解决:
在本地mongo软件文件中,找到bin目录,shift+右键,打开powershell,启动本地mongo服务,

Path:D:\sotfwares\mongodb-4.0.18\bin
----
1.  win + R
2.  d:
3.  cd  D:\sotfwares\mongodb-4.0.18\bin
4.   .\mongod --dbpath D:\MongoDB\mongodb\data
注意dbpath 后的路径文件夹data一定要存在,不然也会启动失败的!

出现:
这时命令行窗口会打印一些启动信息,最后一行显示为如下信息时表示启动成功了.

2014-04-23T10:38:48.391+0800 [initandlisten] waiting for connections on port 27017

这时在浏览器输入http://localhost:27017/可以看到显示信息为:
!(https://upload-images.jianshu.io/upload_images/16627003-57191958c94fce90.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


  1. 将mongo设置为win10 服务自启动:

    要注意命令要和mongo.conf的路径一致
  • 打开黑屏终端,切记是用管理员身份打开,笔者之前没用管理员打开,设置Windows服务总是不成功,在搜索框输入cmd,右键“命令提示符”,以管理员身份打开

  • 进入到安装mongodb目录的bin目录下

D:\sotfwares\mongodb-4.0.18
  • 在黑屏终端输入
mongod.exe --logpath D:\MongoDB\mongodb\logs\mongo.log --logappend --dbpath D:\MongoDB\mongodb\data --directoryperdb --bind_ip 0.0.0.0 --serviceName MongoDB --install
      – logpath后面的路径为步骤3创建的mongodb.log的路径
      – dbpath后面的路径为步骤2创建的db目录的路径
      – bind_ip为绑定id,不绑定IP默认只能本机127.0.0.1访问,绑定IP为0.0.0.0之后,整个局域网的人都可以访问
  • 手动进入data\db目录,选中mongod.lock和storage.bson两个文件进行删除

这两个文件不删除,Windows服务启动会报100的错误,很关键!

原文链接:https://blog.csdn.net/fzeyu/article/details/94156103


  1. [kafka 以windows服务的方式在windows下安装并自启动]

参考:https://www.cnblogs.com/mrluo735/p/5844470.html
下载instsrv.exe /srvany.exe地址:
https://www.cr173.com/soft/64394.html


14.#### asyncio模块中的Future和Task

task是可以理解为单个coroutine,经过ensure_future方法处理而形成,而众多task所组成的集合经过asyncio.gather处理而形成一个future。

再不精确的粗略的说,future就是存放着众多task或future的容器。

而task又是future的子类,所以不管是task还是future还是coreture都可以看成是一个广义的携程,future无非是一个内部包含众多携程的大携程而已,await后面,task,coroture,future都可以接。
ensure_future 可以将 coroutine 封装成 Task。
asyncio.ensure_future(coro_or_future, *, loop=None)

15.Python中下划线---完全解读

Python 用下划线作为变量前缀和后缀指定特殊变量

_xxx 不能用’from module import *’导入

__xxx__ 系统定义名字

__xxx 类中的私有变量名
  1. python_变量前加或者*
    当函数要接受元组或者字典参数时,它分别使用 * 和 ** 前缀。
    在变量前加*,则多余的函数参数会作为一个元组存在args中,如:
def func(*ages):
func(1,2,3) #args表示(1,2,3)这个元组
如果使用**前缀,多余的参数会被认为是字典
def func(**args):
func(a='1',b='2',c ='3')#args表示{‘a’:'1','b':'2','c':'3'}
  1. mongodb批量操作, bulk_write,

需要批量操作时候,节省网络连接交互次数,可以使用 bulk_write。
设置ordered=False,因为批量操作中没有互相依赖关系,如果有前后顺序的互相依赖,需要设置为True。


  1. Bitcoin Cash的新地址格式CashAddr

from cashaddress import convert

https://www.jianshu.com/p/6bccab8b0bd5
此处对应 cash_address_convert.py模块的知识:
Bitcoin Cash,老的比特币格式的地址被称为Legacy(遗产)地址,升级节点至0.16.2后,所有的RPC地址展示都用了CashAddr格式,包括listunspent,listtransactions,validateaddress等常用的RPC命令。

BCH新老地址的对比:
1. 新地址是和老地址一一对应的,它们对应了同一个私钥,只是换了种写法
2. 新地址可以发送余额给老地址,老地址可以发送余额到新地址
3. 新地址是大小写不敏感的,可以全部转成大写,也可以全部转成小写,优先小写格式,同一地址不能大小写混用
4. 新地址的前缀可写可不写,老地址没有前缀,通过首字符来标识类型
5. 新地址用base32编码,老地址用base58编码


19.@staticmethod 静态方法(@staticmethod装饰器)
只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包
放在函数前(该函数不传入self或者cls),所以不能访问类属性和实例属性
那么@staticmethod起到了一个什么样的作用呢?

  • 一般在写一个方法的时候, 默认会接受一个self的形参, 但是在调用这个方法的使用可能并没有传递任何一个参数,
    这个self就是你使用对象调用方法的那个对象本身,
  • 要是将这个方法改为一个静态的方法, 就不会有self
  • 总结

当某个方法不需要用到对象中的任何资源,将这个方法改为一个静态方法, 加一个@staticmethod
加上之后, 这个方法就和普通的函数没有什么区别了, 只不过写在了一个类中, 可以使用这个类的对象调用,
也可以使用类直接调用, 简而言之, 写在类中的函数, 我是这么认为的..


20.VM中运行tasker时报错


解决:python3.5以前不支持 f"xxx{yyy}" f-Strings这种方式
增强版字符串格式化方式 f-Strings
f-Strings可以解决上述问题,而且容易使用且十分有效。2015年8月在Python3.6版中提供。
参考:https://www.jb51.net/article/181856.htm

f-Strings可以解决上述问题,而且容易使用且十分有效。2015年8月在Python3.6版中提供。
也称为格式化字符串自变量,f开头的字符串中花括号括起来的变量会被替换。该表达式在运行时被评估并使用__format__方法进行格式化。下面看一些示例:
`>>> name` `=` `"Eric"`
`>>> age` `=` `74`
`>>> f``"Hello, {name}. You are {age}."`
`'Hello, Eric. You are 74.'`

与str.format()方法类似但更简洁。使用大写字符F也行:
`>>> F``"Hello, {name}. You are {age}."`
`'Hello, Eric. You are 74.'`

### 2.1\. 格式化任意表达式
因为f-string是在运行时评估,因此可以放入任何有效Python表达式,这可以实现漂亮的任务。
`>>> f``"{2 * 37}"`
`'74'`
直接调用函数:
`>>>` `def` `to_lowercase(``input``):`
`...` `return` `input``.lower()`
`>>> name` `=` `"Eric Idle"`
`>>> f``"{to_lowercase(name)} is funny."`
`'eric idle is funny.'`
干脆直接调用方法:
`>> f``"{name.lower()} is funny."`
`'eric idle is funny.'`

当然也可以是自定义类。假设我们定义下面类:

`class` `Comedian:`
`def` `__init__(``self``, first_name, last_name, age):`
`self``.first_name` `=` `first_name`
`self``.last_name` `=` `last_name`
`self``.age` `=` `age`
`def` `__str__(``self``):`
`return` `f``"{self.first_name} {self.last_name} is {self.age}."`
`def` `__repr__(``self``):`
`return` `f``"{self.first_name} {self.last_name} is {self.age}. Surprise!"`

调用方法代码:
`>>> new_comedian` `=` `Comedian(``"Eric"``,` `"Idle"``,` `"74"``)`
`>>> f``"{new_comedian}"`
`'Eric Idle is 74.'`

在解读 entity_base 库 和 entity info库的时候



entity_base数据库字段:


entity_base数据库(这里用到了加权quick-uion算法也称Union-Find并查集)

用于构建实体树,已知任意地址,可以通过反复查询该库,得到该地址所属的顶级实体,权重(weight)参数用于控制实体树的深度,每次融合,将权重小的挂载到权重大的实体上,从而使得树的生长尽可能是横向的而不是纵向的。


  1. 数据的存储情况:
    只有entity_base存入了redis
    entity_info是存的mongo
    entity_base没有存mongo
    23.在运行程序前,reset_topic.sh 不能轻易运行,在创建新链的时候,可以通过此脚本创建topic
vin拼接

transaction:


transaction

vin and vout:


image.png

block:


block

tx 和 vin_txns:


tx 和 vin_txns

block 原始数据结构:


block 原始数据结构:

24.
  1. hanler_new_tx.py中,利用生成器找到一个区块中所有的vin列表:
 while True:
            # 解析一个区块中的所有vin
            vin_txns=[f"{vi['txid']}_{vi['vout']}"
                      for tx in self.block_data['tx']
                      for vi in tx['vin'] if 'coinbase' not in vi]

  1. split的返回值

27.python中函数的序列传参,列表拆解传参、字典拆解传参
https://cloud.tencent.com/developer/article/1475472

  1. hanler_new_tx.py 函数结构图


    NewTxWorker.png

你可能感兴趣的:(BTC学习知识点总结1 -- new_tx)