Happy election season, everyone! Isolation drove me to spend a week just reading the Constitution and surrounding case law. My favorite is the 27th amendment, ratified 202 years after it was proposed because a TA gave 19 year old Gregory Watson a bad grade. Civics is delightfully odd.
Has it really been three months since my last post? Pandemic malaise has weighed me down, but also my work hasn’t been terribly sexy…
Honestly since Shari’s departure I haven’t felt excited by anything at Tor. I should poke around some other communities to see what’s around.
Dear diary, pandemic day 7,114. Placed a fancy hat on the fish. Questioned sanity, but voices reassure me I’m still sane. Treasonous cucumber sentenced to food processor, but asparagus now conspires too? Pez dispenser is all I can trust.
Vegetable coups aside, Illia and I migrated Stem to asyncio! Txtorcon was previously the only asynchronous game in town, but now Stem supports both synchronous and asynchronous usage.
from stem.control import Controller
async def print_version_async():
async with Controller.from_port() as controller:
print('[with asyncio] tor is version %s' % await controller.get_version())
with Controller.from_port() as controller:
print('[without asyncio] tor is version %s' % controller.get_version())
% python demo.py
[without asyncio] tor is version 0.4.5.0-alpha-dev (git-9d922b8eaae54242)
[with asyncio] tor is version 0.4.5.0-alpha-dev (git-9d922b8eaae54242)
Internally Stem is now asynchronous from the bottom up. This provides deeper control over our execution, for example asyncio.wait_for() can apply a timeout to any of our methods.
Usually asyncio doesn’t play well with conventional usage, but Stem transparently applies a compatibility layer so synchronous users likely won’t even notice this change.
Hi all. After vanishing the last few months I’m delighted to announce a major new Stem feature: type hints!
Python 3’s type information provide benefits familiar to statically typed languages like Java:
Fresh off the press, this has many rough edges. In particular our library’s internal metaprogramming is incompatible with type data. However, as we refactor our APIs for Stem’s 2.0 release this will only improve.
Aloha! COVID-19 reached Seattle so I’m hunkering down, but prior to that I visited my family in Kona, Hawaii.
Lazy turtles and cute geckos aside, I particularly loved Kona Joe’s roastery tour and Pu`uhonua O Hōnaunau. If you travel to the big island check ’em out!
This month we dropped Python 2 support, and with it 1,200 lines of compatibility hacks. Stem’s next release will require Python 3.6 or greater.
This month I also culled another 2,900 lines of deprecated code. Like any sophisticated library Stem grew organically over the last eight years. Some features are a hit, others clutter our API. Stem 2.x is our opportunity to streamline so expect more rearchitecture going forward.
Winter is such a snoozy season. Eggnog and Stem’s holiday release fading to memory, January I got back to work.
Port BridgeDB to Python 3
Python 2’s discontinuation makes it porting season! Stem and Nyx are ahead of the curve, so this month I migrated BridgeDB for Philipp.
This was a lot of work, but only possible thanks to Isis’ great test coverage. My compliments to our former maintainer!
Rather than move to GitLab I joined Ooni and part of the Network Team on GitHub. For tickets and pull requests please visit Stem and Nyx on their new home!
Georg asked to subsume responsibility for DocTor so he can move it according to his platform preference instead.
Happy turkey day everyone! George and I were busy with Stem’s HSv3 descriptor branch so I skipped last month’s report, but now have spiffy things to share.
Oh, and wrote a little guide for a mobile game I enjoy and finished unpacking my homely nest!
HSv3 Descriptor Support
Stem can now create, parse, and decrypt hidden service v3 descriptors. For example…
from stem.descriptor.hidden_service import (
inner_layer = InnerLayer.create(
introduction_points = [
% python demo.py
-----BEGIN ED25519 CERT-----
-----END ED25519 CERT-----
This branch took quite a lot of work. Many thanks to George and Paul for all the cryptography help!
Other things include…
Behold, my glorious domain! Weep at its splendor!!1!
This month returned to the island I love, and having a blast volunteering locally. Both non-profits are amazing.
Granny’s is a second hand store that fundraises for our community. Volunteering there is a fun mixture of serendipity with the preeminent form of recycling. I really love matching excess stuff with homes that can make good use of it.
As for our food bank, it feeds fully a seventh of our island’s population. That’s ~150 people! Twice a week I’m unloading trucks and re-bagging groceries. After a decade at Amazon I gotta admit – there’s something deliciously cathartic in non-technical work.
Tor is taking a back seat right now, but I have a feature branch for CollecTor that should be ready to announce soon.
Aside from that lots of runs, plays, and other fun stuff. This is kicking off to be a very fun summer!
Greetings wonderful tor community! This month I pretended to be a web development again for kicks and giggles.
Tor People Page
Hiro’s putting together a new website for Tor. As the maintainer of our people page I ported it over. Personally I think the new page looks a lot better.
Hrio declined my patch, and that’s fine. Learning Lektor was fun. The new site will launch with Hiro’s version of the page with her as its maintainer.
Beside the Tor website I also put the finishing touches on my own! For comparison my old site is available here.
Happy January, onion enthusiasts! Made it through another spin of the globe. January I wrapped up a couple projects that were in flight…
Nyx 2.1 Release
My biggest news for users this month is Nyx 2.1! No features, but this release includes a full year’s worth of fixes that smooths Nyx’s rough edges.
If you run into any issues please let me know!
Bandwidth File Support
Bandwidth files are weighting heuristics used by Tor for relay selection. Stem can now read these documents. For example…
# Bandwidth files are not yet available, but soon will be...
with open('/home/atagar/Desktop/bandwidth_file_v1.2') as bandwidth_file:
desc = next(stem.descriptor.parse_file(bandwidth_file, 'bandwidth-file 1.2'))
print('Median relay bandwidth measurements are...\n')
for fingerprint, measurement in desc.measurements.items():
# Not quite sure what the units are. The spec seems to indicate KB/s?
bandwidth = '%s/s' % stem.util.str_tools.size_label(1024 * int(measurement.get('bw_mean', '0')))
print(' * %s (%s) averaged %s' % (measurement.get('nick', ''), fingerprint, bandwidth))
% python demo.py
Median relay bandwidth measurements are...
* PompoRelay (319AC0126125DA6A557A416C1BB643E52E272AD0) averaged 187 MB/s
* oberon (B4486871EA062BAF2354F070FECC344CF3C20880) averaged 196 MB/s
* ICSIL1xDEDISx1 (7CBBAB7867F939763D94FC6C2819E129971CB0E4) averaged 54 MB/s
* pollypurebred (EF37D150F3A851B32D9E843605D0EA8A1B938117) averaged 86 MB/s
* Dementor (46D79CCB83639718177B4BDB8AED6BE9378B1D0F) averaged 158 MB/s
* wormhole (8B863F5CE8676EFE5BB070CE3CAF54A76AE74D1A) averaged 90 MB/s
Hope everyone had a fun for the holidays! Like many of us December I glugged eggnog with family so this will be short.
- Stem 1.7.1 hotfix release. Tor adjusted its bootstrap log format in a way that broke Stem, requiring a hotfix release for continued compatibility.
- Nyx 2.1 incoming! No sexy features, but many long overdue stability fixes. January will be going toward this.
- Stem failed to read large payloads from Tor’s ORPorts.
- Writing a new homepage for myself. My current site dates back to my college days and it looks the part. Still in progress but this month I finished drafting its content, passed W3C validation, and made its github repo.