物联网节点的纯python实现

iotap的Python项目详细描述


这个项目的目标是创建一个纯python实现 物联网节点。

当前开发状态

  • rocksdb可读性

开始

依赖性

  • RockSDB

您可以从facebook/rocksdb - INSTALL.md中看到rocksdb安装指南。

对于Arch Linux用户,只需键入:

$ yaourt -S rocksdb

Iota Python的安装

$pipenv安装iotapy

要安装iota python,只需在终端中运行这个简单的命令 选择:

$ pipenv install iotapy

获取源代码

iota python是在github上开发的,代码是always available

您可以从存储库中克隆源代码:

$ git clone https://github.com/mlouielu/iota-python

一旦您有了源代码的副本,就可以轻松地安装该软件包:

$ cd iota-python
$ pip install -r requirements.txt
$ python setup.py install

教程-关于RocksDBProvider

这是iota python从java iri读取数据库的教程, 这就是Python现在所能做的。

打开IRI RockSDB

记住,确保db_pathdb_log_path指向您的 数据库路径。此时,iota python不支持编写数据 回到数据库(如果你想写 所以read_only也应该是True

>>>importiota>>>importiotapy>>>r=iotapy.storage.providers.rocksdb.RocksDBProvider(db_path='/var/db/iota/mainnetdb',db_log_path='/var/db/iota/mainnetdb.log',read_only=True)>>>r.init()# Absolute remember to init database>>>

访问IRI RockSDB

现在你打开数据库,你可以得到里面的数据!IRI使用 rocksdb column family来分隔存储的数据。对于柱族 列表,请访问此blog post

现在,我们可以尝试打开一个事务,这里有一个例子 事务哈希: GTXDTJVUTVSNHYFPJUOWFKTGQTCMNKZPJDJXSWVQWTXYRDZAVZTX9KFBRIMRQEQLMCMVAUKMZWMHA9999

你可以在这里查看这个发送信息 page

>>>txh=iota.TransactionHash('GTXDTJVUTVSNHYFPJUOWFKTGQTCMNKZPJDJXSWVQWTXYRDZAVZTX9KFBRIMRQEQLMCMVAUKMZWMHA9999')>>>column_family='transaction'>>>tx=r.get(txh,column_family)>>>tx.tagTag(b'EXAMPLEPYTHONLIB99999999999')>>>tx.bundle_hashBundleHash(b'CRNTWYOGTYKPAHYHNESJOKLRFYQQGCXXUZIZQFTCCLSTZODTRBPZWTX9TVHNDNNIWTULV9GFLAPPSTCC9')>>>tx.signature_message_fragmentFragment(b'RBTC9D9DCDFAEACCWCXCGDEAXCGDEAPCEAHDTCGDHDEAUCFDCDADEAZBMDHDWCCDBD999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999')>>>tx.signature_message_fragment.as_string()'Hello! This is a test from Python'>>>tx.as_json_compatible(){'hash_':...,'signature_message_fragment':...,'address':Address(b'9TPHVCFLAZTZSDUWFBLCJOZICJKKPVDMAASWJZNFFBKRDDTEOUJHR9JVGTJNI9IYNVISZVXARWJFKUZWC'),'value':0,'legacy_tag':...,'timestamp':1508993435,'current_index':0,'last_index':0,'bundle_hash':...,'trunk_transaction_hash':...,'branch_transaction_hash':...,'tag':Tag(b'EXAMPLEPYTHONLIB99999999999'),'attachment_timestamp':1508993445508,'attachment_timestamp_lower_bound':0,'attachment_timestamp_upper_bound':12,'nonce':Nonce(b'HYNAKUFLKW9UZXXIDJFGUMUDDVX')}>>>

如果您使用的方法是RocksDBProvider.getRocksDBProvider.latest,请使用以下列名:

address
approvee
bundle
milestone
state_diff
tag
transaction
transaction_metadata

列名的完整列表可以在 RocksDBProvider.column_family_names,但此列表用于 级别数据库访问,仅在RocksDBProvider.db使用。

b'default'
b'transaction'
b'transaction-metadata'
b'milestone'
b'stateDiff'
b'address'
b'approvee'
b'bundle'
b'tag'

RocksDBProvider方法的示例:

# Get address' transaction record>>>adr=iota.Address('9TPHVCFLAZTZSDUWFBLCJOZICJKKPVDMAASWJZNFFBKRDDTEOUJHR9JVGTJNI9IYNVISZVXARWJFKUZWC')>>>r.get(adr,'address')<generatorobjectgetat0x7eff2b341518># Get next address (in database)>>>r.next(adr,'address')(Address(b'9BPQJPGAMDVKAQ9FDPQSVINPMHSIUUXKYMIZQGPBDGGEUZGLEVFIWUYO9MEIPOYUBYVQGJCFYRWTQENCZ'),<generatorobjectgetat0x7eff2b3415c8>)# Get first milestone>>>r.first('milestone')(243001,(243001,TransactionHash(b'9PPVIKDMKUDXTYJFF9YNWUPPMOYZTYKRBFGLGDCNNNIMWAMGVJGEHOCOUDYRVYPPSDKDKDQXUBMYA9999')))# Get latest milestone>>>r.latest('milestone')(265486,(265486,TransactionHash(b'TFWZVEQZGQGBUBKMFA9YKBVDGBWWMXWCGGYYAGPZKGXWKJQRUNSMXJBSVVGYRJKCS9GNWULQSMAGZ9999')))# Get next milestone>>>key,value=r.first('milestone')>>>r.next(key,'milestone')(243002,(243002,TransactionHash(b'XHIOO9EJ9H9ULPJM9MIJSTPHNPIUAAJ9NLYHZLHDBCSECCJVRGDWHTRUEUIQXWVLBYOCBNHFWWWPA9999')))

低级数据库访问(此时不需要触摸的内容):

>>>column_handler=r.db.column_family_handles[b'transaction-metadata']>>>txh=iota.TransactionHash('GTXDTJVUTVSNHYFPJUOWFKTGQTCMNKZPJDJXSWVQWTXYRDZAVZTX9KFBRIMRQEQLMCMVAUKMZWMHA9999')>>>key=iotapy.storage.converter.from_trits_to_binary(txh.as_trits())>>>value=r.db.get(key,column_handler)b"6\x8d\xd6\xb2v\xf7\xde9\xcb\xab\x07\x1f\xb9\xfc\x1e@s\xcfpU\xb8\x17\xad2<!!:\x0e\xc6\xef\xe6Z\xc5=\x8e\tl\x8a\xfb\x98\xd3\x18\x94Y<\x9e\xdc\x03\x03\x87\xda\xad\xc3\xec\xd5\xb1\xf1\x9c_W*%3\xe32\x1d\xac\x9dQ\xe4\xc0\x19T\x98\xf5`\xeb\x0f\xda\xa3\xe36\x9f\x8e\x98\xd8\xdfJt\xfe\xb6v\x9d\x10\xea\x1c\x00\xdc\xf6>3Wf\xd52\xb5\xe0\xc4\xb7\xd5\xb6\xcb\xb7\xc1\xdb$\xad%\xd4\xa2\xf3\xefI'\xd5\xa7Y\xe2\xa5]G\x9e\xb82\xd7\x1f&\x9cR4\xa7\x13\xff\x00\x00\x00!\x0c;\xa2\x1b\xc6-\xa0\xd5\xbe\xaa*\xb1\x95\xbcUI\xb5l\x89\xa1\xe3\xacn\x90@\x10\xdf\xf9Un\xb7\xb1\x93\x9b\xc7\x017:o\xba\xd8\xfdq\xff\xe2\x00\x00\x00\xb4T\xa1\xa01\xc0\xb7\xd8U\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xf1i\x9b\xb4T\xa1\xa01\xc0\xb7\xd8U\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01_W\x04\xae\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x01\xff\xff\xff\xff\x00\x00\x00\x00Y\xf1i\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x03\xd6\xe0local">>>

爆炸!一个探索IRI数据库的例子!

爆炸!

很高兴你在这里,现在你获得了IRI的完全访问权限 数据库。

我们都知道物联网是一个数据仓库,也就是说,从理论上讲,我们可以 从事务开始,转到其父级、其父级和 父节点…我们将最终到达Genesis地址/节点/块 无论什么。

这里有一个小脚本,我试图找到这个答案:

importtimeimportiotaimportiotapy# Initialize the databaser=iotapy.storage.providers.rocksdb.RocksDBProvider(db_path='/var/db/iota/mainnetdb',db_log_path='/var/db/iota/mainnetdb.log',read_only=True)r.init()# We will start from this transactiontxh=iota.TransactionHash('UNUK99RCIWLUQ9WMUT9MPQSZCHTUMGN9IWOCOXWMNPICCCQKLLNIIE9UIFGKZLHRI9QAOEQXQJLL99999')tx=r.get(txh,'transaction')# Stop at hereEMPTY=iota.TransactionHash('9'*81)# Go to find the genesis!i=0whileTrue:i+=1ifi%100==0:print(txh,time.ctime(tx.timestamp))# Branch is outside the bundle and trunk is in the bundle# So we choose branch at hereiftx.branch_transaction_hash!=EMPTY:txh=tx.branch_transaction_hashtx=r.get(tx.branch_transaction_hash,'transaction')else:# This is the end of the journeyprint("\nProbably the genesis?")print(txh)break

它的运行方式如下:

NQRZKAE9CDFGJUPOMTHCVPOQE9LENTSHNJYDXCWZJ9IRXKLWTGRIHYZCZWSEIOKQFVBBEBNTXHNBA9999 Thu Oct 26 11:23:31 2017
KMRPH9BVZVFRCEGDEROQBMZTNOQECYRKIJJ9MWGNOUMWVPLFIJ9PRANLDXSTZCVJGHTXTYCWYGJFZ9999 Thu Oct 26 08:40:52 2017
JQLXELCKS9QSNWZNHJJICAQMGZRTGFPGNRRNJWTBEPZWKEHLJINXVLPOMMQCMQSOEUZGRHSKBNWEA9999 Thu Oct 26 06:40:31 2017
IOKLUAGDGKSU9RGHZXCQJIBRTFPCNVCIVG9TQNIGE9DVIYIUDCEVTMPYBZQXHNYLNSNFTXDWNH9BA9999 Thu Oct 26 05:41:28 2017
AUEDLXAJZPW9URCQZABSRNJGYOOSDG9OFHUMXINMVULHOIVWOBDLSSS9DPNTSXHTDKG9MGKMUESD99999 Thu Oct 26 04:38:37 2017
DZRYEISPEUXXVQMGBSPVMOFFTWPDYQ9EWVYZUQTNX9NPSEWRGNMSZMY9BOTABSLPCTKMIGWAAIPJA9999 Thu Oct 26 03:45:03 2017
UPAIBMKZEOTUEHHLEYZEEKZFLDGWHWJ9UZLGLRV9NGZPWSGWY9DPITWSDZPQQZDBOYFJDLJYTDKXZ9999 Thu Oct 26 02:51:53 2017
MZPRET9XVFBK9LQZLFNN9UGQLLBYAVGAKJGODQIKVZWHPDLZQLOTFMMGEAGSGWGPEYBLJLLJJXOEZ9999 Thu Oct 26 02:08:16 2017
XPMVSHVFNKYSTKPSHLPHDQCKEGWTERKEHTDRUKIQRE9KDDQVAQHUOQHYOPTRZGIIQHLYGYCPTLAEA9999 Thu Oct 26 01:17:58 2017
MHDQIXDMBOFHCOMLGNHPSJGNIXIDAQQNW9CJKSXPYIOIITQES99KNYTPNPOQBTVZQXYOKBVEIZB999999 Thu Oct 26 00:37:14 2017
...
GXWKBVNFPFX99PGDCH9EQZMLHITMBFAPDQRNNGNGOOXYXEEYYDDDFWJRDQINOEJFSITMEUY9VMVO99999 Tue Oct 24 06:37:13 2017
UAPTGGCKCGCPWGVQEKBCPKNQUWOPVRBAFAQYHSDU9AJMVINJFVZSM9URBYUAIHCPKOJRBWSOOSHLZ9999 Tue Oct 24 06:16:17 2017
FPPJWECLHTF9HGGEMNH9FUIAVYJWDOIOXYFRRJ9S9HENTSESTGJYLYOSNNJGKDOUOGXOWFURNDNEZ9999 Tue Oct 24 05:56:10 2017
HSDV9SKUYCBWNXFIHKLNAXEVPDTGLSPMTMTXCYISS9M9SPL9DERO9GCQLNWY9KBIHOLPYBCTCYECA9999 Tue Oct 24 05:35:44 2017
LQPVJDHGQPILXVUPCCZGJMCAQHROJLHQKBILEUDBKQAEHMHEOEK9GMRDWEKVRXRB99TOYQQLTZDGZ9999 Tue Oct 24 05:14:13 2017
FOCMONRMEOBQEBDOJOQPOOPLRIYCI9PMSJXXNEWAZPBRCDGZTZB9KI9SSMKKFBGBDONMILXWOBEFA9999 Tue Oct 24 04:53:03 2017
BEFSRMKVEWXXHERTONXCQLOAVQYVRPFFZCQIDGUOLLZCFLTRPRHEVYNAPQFKGJOCDAJYNVUJDQIRZ9999 Tue Oct 24 04:32:48 2017
QVHPAOWGDFTTLYQERDRNBBNCJJCWTJSDBIKBLDYZOLJ9PWFWFWUXP9DGPKTLRZDFZNLFRYXSZF9O99999 Tue Oct 24 04:12:07 2017

Probably the genesis?
9PPVIKDMKUDXTYJFF9YNWUPPMOYZTYKRBFGLGDCNNNIMWAMGVJGEHOCOUDYRVYPPSDKDKDQXUBMYA9999

检查此事务 thetangle

文档

[删除:源代码是您最好的朋友]

文档仍在构建中。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
调试Java toString()是否在toString中包含类名?   java多路复用程序   java Google map群集不适用于少量Cordinate   java如何在Android中设置和自定义不同的字体样式   Java版本比较   Spring引导升级后的java“未找到提供程序com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule”   java如何重新定位小程序查看器窗口?   java在适配器处于同一活动时在回收器视图中添加搜索视图   在Java中使用COM程序集   java在ListView中选择了什么操作?   java Hangman屏蔽字符串,取消隐藏字符   java为什么检查多个条件会返回不正确的结果   spring由:java引起。lang.ClassCastException:$ProxyX不能强制转换为my。包裹DefaultCustomerProviderImpl   java想要一些建议来清理一系列if语句   Java使用多个参数对对象进行排序