This release includes improvements around Pubsub message deduplication, libp2p resource management, and more.
A new optional Pubsub.SeenMessagesStrategy
configuration option has been added.
This option allows you to choose between two different strategies for
deduplicating messages: first-seen
and last-seen
.
When unset, the default strategy is last-seen
, which calculates the
time-to-live (TTL) countdown based on the last time a message is seen. This
means that if a message is received and then seen again within the specified
TTL window based on the last time it was seen, it won't be emitted.
If you prefer the old behavior, which calculates the TTL countdown based on the
first time a message is seen, you can set Pubsub.SeenMessagesStrategy
to
first-seen
.
TL;DR: limit autoscaling improved, most users should start with default settings. If you have old configuration, switch to implicit defaults:
ipfs config --json -- Swarm.ResourceMgr '{}'
ipfs config --json -- Swarm.ConnMgr '{}'
IF you run a server and want to utilize more than half of memory and file descriptors to p2p work, adjust Swarm.ResourceMgr.MaxMemory
and Swarm.ResourceMgr.MaxFileDescriptors
.
The 0.18.1 builds on the default protection nodes get against DoS (resource exhaustion) and eclipse attacks with the go-libp2p Network Resource Manager/Accountant that was fine-tuned in Kubo 0.18.
Adding default hard-limits from the Resource Manager/Accountant after the fact is tricky, and some additional improvements have been made to improve the computed defaults.
As much as possible, the aim is for a user to only think about how much memory they want to bound libp2p to, and not need to think about translating that to hard numbers for connections, streams, etc. More updates are likely in future Kubo releases, but with this release:
System.StreamsInbound
is no longer bounded directlySystem.ConnsInbound
,Transient.Memory
,Transiet.ConnsInbound
have higher default computed values.
Full Changelog
- github.com/ipfs/kubo:
- Add overview section
- Adjust inbound connection limits depending on memory.
- feat: Pubsub.SeenMessagesStrategy (#9543) (ipfs/kubo#9543)
- chore: update version
- github.com/libp2p/go-libp2p-pubsub (v0.8.2 -> v0.8.3):
- feat: expire messages from the cache based on last seen time (#513) (libp2p/go-libp2p-pubsub#513)
Contributor | Commits | Lines ± | Files Changed |
---|---|---|---|
Mohsin Zaidi | 2 | +511/-55 | 12 |
Antonio Navarro Perez | 2 | +57/-57 | 5 |
galargh | 1 | +1/-1 | 1 |
Below is an outline of all that is in this release, so you get a sense of all that's included.
- Overview
- 🔦 Highlights
- 📝 Changelog
- 👨👩👧👦 Contributors
Content routing is the process of discovering which peers provide a piece of content. Kubo has traditionally only supported libp2p's implementation of Kademlia DHT for content routing.
Kubo can now bridge networks by including support for the delegated routing HTTP API. Users can compose content routers using the Routing.Routers
config to pick content routers with different tradeoffs than a Kademlia DHT (e.g., high-performance and high-capacity centralized endpoints, dedicated Kademlia DHT nodes, routers with unique provider records, privacy-focused content routers).
One example is InterPlanetary Network Indexers, which are HTTP endpoints that cache records from both the IPFS network and other sources such as web3.storage and Filecoin. This improves not only content availability by enabling Kubo to transparently fetch content directly from Filecoin storage providers, but also improves IPFS content routing latency by an order of magnitude and decreases resource consumption.
Note: it's possible to retrieve content stored by Filecoin Storage Providers (SPs) from Kubo if the SPs service Bitswap requests. As of this release, some SPs are advertising Bitswap. You can follow the roadmap progress for IPNIs and Bitswap in SPs here.
In this release, the default content router is changed from dht
to auto
. The auto
router includes the IPFS DHT in addition to the cid.contact IPNI instance. In future releases, we plan to expand the functionality of auto
to encompass automatic discovery of content routers, which will improve performance and content availability (for example, see IPIP-342).
Previous behavior can be restored by setting Routing.Type
to dht
.
Alternative routing rules, including alternative IPNI endpoints, can be configured in Routing.Routers
after setting Routing.Type
to custom
.
Learn more in the Routing
docs.
Default Reprovider.Interval
changed from 12h to 22h to match new defaults for the Provider Record Expiration (48h) in go-libp2p-kad-dht v0.20.0.
The rationale for increasing this can be found in RFM 17: Provider Record Liveness Report, kubo#9326, and the upstream DHT specifications at libp2p/specs#451.
Learn more in the Reprovider
config.
The IPFS project has reserved the corresponding media types at IANA:
This release implements them as part of IPIP-328
and adds Gateway support for CIDs with json
(0x0200), cbor
(0x51),
dag-json
(0x0129)
and dag-cbor
(0x71) codecs.
To specify the response Content-Type
explicitly, the HTTP client can override
the codec present in the CID by using the format
parameter
or setting the Accept
HTTP header:
- Plain JSON:
?format=json
orAccept: application/json
- Plain CBOR:
?format=cbor
orAccept: application/cbor
- DAG-JSON:
?format=dag-json
orAccept: application/vnd.ipld.dag-json
- DAG-CBOR:
?format=dag-cbor
orAccept: application/vnd.ipld.dag-cbor
In addition, when DAG-JSON or DAG-CBOR is requested with the Accept
header
set to text/html
, the Gateway will return a basic HTML page with download
options, improving the user experience in web browsers.
The Gateway supports conversion between DAG-CBOR and DAG-JSON for efficient end-to-end data structure management: author in CBOR or JSON, store as binary CBOR and retrieve as JSON via HTTP:
$ echo '{"test": "json"}' | ipfs dag put # implicit --input-codec dag-json --store-codec dag-cbor
bafyreico7mjtqtqhvawro3yud5uqn6sc33nzqb7b5j2d7pdmzer5nab4t4
$ ipfs block get bafyreico7mjtqtqhvawro3yud5uqn6sc33nzqb7b5j2d7pdmzer5nab4t4 | xxd
00000000: a164 7465 7374 646a 736f 6e .dtestdjson
$ ipfs dag get bafyreico7mjtqtqhvawro3yud5uqn6sc33nzqb7b5j2d7pdmzer5nab4t4 # implicit --output-codec dag-json
{"test":"json"}
$ curl "http://127.0.0.1:8080/ipfs/bafyreico7mjtqtqhvawro3yud5uqn6sc33nzqb7b5j2d7pdmzer5nab4t4?format=dag-json"
{"test":"json"}
Placing a CID in CBOR Tag 42 enables the
creation of arbitrary DAGs. The equivalent DAG-JSON notation for linking
to different blocks is represented by { "/": "cid" }
.
The Gateway supports traversing these links, enabling access to data referenced by structures other than regular UnixFS directories:
$ echo '{"test.jpg": {"/": "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi"}}' | ipfs dag put
bafyreihspwy3zlkzgphmec5d3xb5g5njrqwotd46lyubnelbzktnmsxkq4 # dag-cbor document linking to unixfs file
$ ipfs resolve /ipfs/bafyreihspwy3zlkzgphmec5d3xb5g5njrqwotd46lyubnelbzktnmsxkq4/test.jpg
/ipfs/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
$ ipfs dag stat bafyreihspwy3zlkzgphmec5d3xb5g5njrqwotd46lyubnelbzktnmsxkq4
Size: 119827, NumBlocks: 2
$ curl "http://127.0.0.1:8080/ipfs/bafyreihspwy3zlkzgphmec5d3xb5g5njrqwotd46lyubnelbzktnmsxkq4/test.jpg" > test.jpg
Finally, Gateway now supports the same logical format projection from
DAG-PB to DAG-JSON as the ipfs dag get
command, enabling the retrieval of directory listings as JSON instead of HTML:
$ export DIR_CID=bafybeigccimv3zqm5g4jt363faybagywkvqbrismoquogimy7kvz2sj7sq
$ curl -H "Accept: application/vnd.ipld.dag-json" "http://127.0.0.1:8080/ipfs/$DIR_CID" | jq
$ curl "http://127.0.0.1:8080/ipfs/$DIR_CID?format=dag-json" | jq
{
"Data": {
"/": {
"bytes": "CAE"
}
},
"Links": [
{
"Hash": {
"/": "Qmc3zqKcwzbbvw3MQm3hXdg8BQoFjGdZiGdAfXAyAGGdLi"
},
"Name": "1 - Barrel - Part 1 - alt.txt",
"Tsize": 21
},
{
"Hash": {
"/": "QmdMxMx29KVYhHnaCc1icWYxQqXwUNCae6t1wS2NqruiHd"
},
"Name": "1 - Barrel - Part 1 - transcript.txt",
"Tsize": 195
},
{
"Hash": {
"/": "QmawceGscqN4o8Y8Fv26UUmB454kn2bnkXV5tEQYc4jBd6"
},
"Name": "1 - Barrel - Part 1.png",
"Tsize": 24862
}
]
}
$ ipfs dag get $DIR_CID
{"Data":{"/":{"bytes":"CAE"}},"Links":[{"Hash":{"/":"Qmc3zqKcwzbbvw3MQm3hXdg8BQoFjGdZiGdAfXAyAGGdLi"},"Name":"1 - Barrel - Part 1 - alt.txt","Tsize":21},{"Hash":{"/":"QmdMxMx29KVYhHnaCc1icWYxQqXwUNCae6t1wS2NqruiHd"},"Name":"1 - Barrel - Part 1 - transcript.txt","Tsize":195},{"Hash":{"/":"QmawceGscqN4o8Y8Fv26UUmB454kn2bnkXV5tEQYc4jBd6"},"Name":"1 - Barrel - Part 1.png","Tsize":24862}]}
Fast listings are now enabled for all UnixFS directories: big and small. There is no linear slowdown caused by reading size metadata from child nodes, and the size of DAG representing child items is always present.
As an example, the CID
bafybeiggvykl7skb2ndlmacg2k5modvudocffxjesexlod2pfvg5yhwrqm
represents a UnixFS
directory with over 10k files. Listing big directories was fast
since Kubo 0.13, but in this release it will also include the size column.
WebTransport is a new libp2p transport that was introduced in v0.16 that is based on top of QUIC and HTTP3.
This allows browser-based nodes to contact Kubo nodes, so now instead of just serving requests for other system-level application nodes, you can also serve requests directly to a node running inside a browser page.
For the full story see connectivity.libp2p.io.
WebTransport is enabled by default in part because go-libp2p now supports running WebTransport and QUIC transports on the same QUIC listener. No additional port needs to be opened.
To use this feature, register two listen addresses on the same /ipX/.../udp/XXX
prefix.
go-libp2p now differentiates the first version of QUIC that was originally implemented, Draft-29
, from the ratified protocol in RFC9000, QUICv1
.
This was done for performance (time to first byte) reasons as outlined here.
This manifests as two different multiaddr components /quic
(old Draft-29) and /quic-v1
.
go-libp2p do supports listening with both QUIC versions on one single listener.
WebTransport has only supported QUICv1.
/webtransport
now needs to be prefixed by a /quic-v1
component instead of a /quic
component.
Support for QUIC Draft-29 will be removed at some point in 2023 (tracking issue). As a result, new deployments should use /quic-v1
instead of /quic
.
To support QUICv1 and WebTransport by default a new config migration (v13
) is run which automatically adds entries in addresses-related fields:
- Replace all
/quic/webtransport
to/quic-v1/webtransport
. - For all
/quic
listeners, keep the Draft-29 listener, and on the same ip and port, add/quic-v1
and/quic-v1/webtransport
listeners.
To help protect nodes from DoS (resource exhaustion) and eclipse attacks, Kubo enabled the go-libp2p Network Resource Manager by default in Kubo 0.17.
Introducing limits like this by default after the fact is tricky, and various improvements have been made to improve the UX including:
- Dedicated docs concerning the resource manager integration. This is a great place to go to learn more or get your FAQs answered.
- Increasing the default limits for the resource manager.
- Enabling the
Swarm.ConnMgr
by default and reducing it thresholds so it can intelligently prune connections in many cases before the indiscriminate resource manager kicks in. - Adjusted log messages and levels to make clear that the resource manager is likely doing your node a favor by bounding resources.
- Other miscellaneous config and command bugs reported by users.
Full Changelog
- github.com/ipfs/kubo:
- fix: clarity: no user supplied rcmgr limits of 0 (#9563) (ipfs/kubo#9563)
- fix(gateway): undesired conversions to dag-json and friends (#9566) (ipfs/kubo#9566)
- fix: ensure connmgr is smaller then autoscalled ressource limits
- fix: typo in ensureConnMgrMakeSenseVsResourcesMgr
- docs: clarify browser descriptions for webtransport
- fix: update saxon download path
- fix: refuse to start if connmgr is smaller than ressource limits and not using none connmgr
- fix: User-Agent sent to HTTP routers
- test: port gateway sharness tests to Go tests
- fix: do not download saxon in parallel
- docs: improve docs/README (#9539) (ipfs/kubo#9539)
- test: port CircleCI to GH Actions and improve sharness reporting (#9355) (ipfs/kubo#9355)
- chore: migrate from go-ipfs-files to go-libipfs/files (#9535) (ipfs/kubo#9535)
- fix: stats dht command when Routing.Type=auto (#9538) (ipfs/kubo#9538)
- fix: hint people to changing from RSA peer ids
- fix(gateway): JSON when Accept is a list
- fix(test): retry flaky t0125-twonode.sh
- docs: fix Router config Godoc (#9528) (ipfs/kubo#9528)
- fix(ci): flaky sharness test
- docs(config): ProviderSearchDelay (#9526) (ipfs/kubo#9526)
- docs: clarify debug environment variables
- chore: update version.go
- fix(test): stabilize flaky provider tests
- feat: port pins CLI test
- Removing QRI from early tester (ipfs/kubo#9503)
- fix: disable provide over HTTP with Routing.Type=auto (#9511) (ipfs/kubo#9511)
- Update version.go
- 'chore: update version.go'
- Clened up 0.18 changelog for release (ipfs/kubo#9497)
- feat: turn on WebTransport by default (ipfs/kubo#9492)
- feat: fast directory listings with DAG Size column (#9481) (ipfs/kubo#9481)
- feat: add basic CLI tests using Go Test
- Changelog: v0.18.0 (ipfs/kubo#9485)
- feat: go-libp2p-kad-dht with expiration 48h
- chore: update go-libp2p to v0.24.1
- fix: remove the imports work-around
- fix: replace quic to quic-v1 for webtransport sharness
- fix: silence staticcheck warning for fx.Extract usage
- update go-libp2p to v0.24.0
- stop using the deprecated go-libp2p-loggables package
- docs(readme): update package managers section (#9488) (ipfs/kubo#9488)
- fix: support /quic-v1 in webui v0.21
- feat: Routing.Type=auto (DHT+IPNI) (#9475) (ipfs/kubo#9475)
- feat: adjust ConnMgr target to 32-96 (#9483) (ipfs/kubo#9483)
- feat: increase default Reprovider.Interval (#9326) (ipfs/kubo#9326)
- feat: add response body limiter to routing HTTP client (#9478) (ipfs/kubo#9478)
- docs: libp2p resource management (#9468) (ipfs/kubo#9468)
- chore: upgrade libipfs for routing HTTP API schema changes (#9477) (ipfs/kubo#9477)
- feat: lower connection pool
- Add missing &&
- Fix sharness test
- Added a message when RM is disabled.
- Requested changes.
- Fix sharness checking daemon output
- Update test/sharness/t0060-daemon.sh
- Try to fix sharness test.
- Fix: RM: Improve init RM message and fix final memory value.
- Fix: Resource Manager: Filter stats correctly by %
- Apply suggestions from code review
- Increase MaxMemory param to use half of total memory.
- Update libipfs dependency.
- Add sharness tests and documentation
- Fix variable name
- feature: delegated-routing: Add HTTP delegated routing.
- Fix: Change RM log output to WARN level
- Fix: RM: Set no-limit value to 1e9 (1000000000).
- Partial Revert "Revert "fix: ensure hasher is registered when using a hashing function""
- Add logs to the routing system
- fix: apply agent-version-suffix to libp2p identify
- chore: migrate ipfs/tar-utils to libipfs
- feat(gateway): JSON and CBOR response formats (IPIP-328) (#9335) (ipfs/kubo#9335)
- (ipfs/kubo#9318)
- docs: release process updates from v0.17.0 (ipfs/kubo#9391)
- fix(rcmgr): improve error phrasing
- docs: Update CHANGELOG.md adding 0.17 link
- feat(config): Pubsub.SeenMessagesTTL (#9372) (ipfs/kubo#9372)
- docs: remove snap and chocolatey packages
- Merge release v0.17.0 (ipfs/kubo#9431)
- docs: ipfs-http-client -> kubo-rpc-client (#9331) (ipfs/kubo#9331)
- docs(readme): improve tldr
- Update config.md for resource management limits (#9421) (ipfs/kubo#9421)
- Doc improvements and changelog for resource manager (#9413) (ipfs/kubo#9413)
- Revert "Doc improvements for rcmgr"
- Doc improvements for rcmgr
- docs: document /wss fixes in 0.17
- refactor(config): remove Swarm.ConnMgr defaults
- fix(config): skip nulls in ResourceMgr
- docs: replace tabcat with aphelionz in EARLY_TESTERS.md (#9404) (ipfs/kubo#9404)
- docs: fix spoiler for 0.13.1 changelog
- fix(docs): typo
- chore: bump version to v0.18.0-dev (ipfs/kubo#9393)
- github.com/ipfs/go-bitswap (v0.10.2 -> v0.11.0):
- chore: release v0.11.0
- github.com/ipfs/go-blockservice (v0.4.0 -> v0.5.0):
- chore: release v0.5.0
- github.com/ipfs/go-graphsync (v0.13.1 -> v0.14.1):
- chore: version 0.14.1 (#400) (ipfs/go-graphsync#400)
- chore: migrate files (#399) (ipfs/go-graphsync#399)
- docs(CHANGELOG): update for v0.14.0 release
- updates for libp2p v0.22 (#392) (ipfs/go-graphsync#392)
- feat(ipld): use bindnode/registry (#386) (ipfs/go-graphsync#386)
- Accept/Reject requests up front (#384) (ipfs/go-graphsync#384)
- Remove protobuf protocol (#385) (ipfs/go-graphsync#385)
- docs(CHANGELOG): update for v0.13.2
- chore(deps): upgrade libp2p & ipld-prime (#389) (ipfs/go-graphsync#389)
- chore(ipld): switch to using top-level ipld-prime codec helpers (#383) (ipfs/go-graphsync#383)
- feat(requestmanager): read request from context (#381) (ipfs/go-graphsync#381)
- fix: minor typo in error msg
- fix(panics): lift panic recovery up to top of network handling
- feat: expand use of panic handler to cover network and codec interaction
- feat(panics): capture panics from selector execution
- github.com/ipfs/go-ipfs-cmds (v0.8.1 -> v0.8.2):
- chore: version v0.8.2 (#235) (ipfs/go-ipfs-cmds#235)
- chore: migrate files (#233) (ipfs/go-ipfs-cmds#233)
- sync: update CI config files (#229) (ipfs/go-ipfs-cmds#229)
- github.com/ipfs/go-ipfs-keystore (v0.0.2 -> v0.1.0):
- chore: release v0.1.0
- chore: update go-libp2p
- sync: update CI config files (ipfs/go-ipfs-keystore#10)
- sync: update CI config files (ipfs/go-ipfs-keystore#8)
- Add link to pkg.go.dev
- README: this module does not use Gx
- github.com/ipfs/go-ipfs-provider (v0.7.1 -> v0.8.1):
- chore: release v0.8.1
- fix: make queue 64bits on 32bits platforms too
- sync: update CI config files (ipfs/go-ipfs-provider#36)
- chore: update go-lib2p, avoid depending on go-libp2p-core, bump go.mod version
- github.com/ipfs/go-ipfs-routing (v0.2.1 -> v0.3.0):
- release v0.3.0 (ipfs/go-ipfs-routing#36)
- chore: update go-libp2p to v0.22.0 (ipfs/go-ipfs-routing#35)
- sync: update CI config files (#34) (ipfs/go-ipfs-routing#34)
- github.com/ipfs/go-ipld-cbor (v0.0.5 -> v0.0.6):
- Add contexts to IpldBlockstore (ipfs/go-ipld-cbor#82)
- sync: update CI config files (#81) (ipfs/go-ipld-cbor#81)
- sync: update CI config files (ipfs/go-ipld-cbor#79)
- Fix lint errors (ipfs/go-ipld-cbor#78)
- Add notice directing new projects to codec/dagcbor (ipfs/go-ipld-cbor#77)
- github.com/ipfs/go-merkledag (v0.6.0 -> v0.9.0):
- chore: bump version to 0.9.0
- chore: bump version to 0.8.1
- feat: remove panic() from non-error methods
- feat: improve broken cid.Builder testing for CidBuilder
- chore: bump version to 0.8.0
- doc: document potential panics and how to avoid them
- fix: simplify Cid generation cache & usage
- feat: check links on setting and sanitise on encoding
- feat: check that the CidBuilder hasher is usable
- chore: bump version to 0.7.0
- fix: remove use of ioutil
- run gofmt -s
- fix!: keep deserialised state stable until explicit mutation
- sync: update CI config files (ipfs/go-merkledag#84)
- github.com/ipfs/go-namesys (v0.5.0 -> v0.6.0):
- chore: release v0.6.0
- chore: update go-libp2p to v0.23.4, update go.mod version to 1.18
- stop using the deprecated io/ioutil package
- github.com/ipfs/go-peertaskqueue (v0.7.1 -> v0.8.0):
- Release v0.8.0 (ipfs/go-peertaskqueue#25)
- chore: update go-libp2p to v0.22.0 (ipfs/go-peertaskqueue#24)
- sync: update CI config files (#23) (ipfs/go-peertaskqueue#23)
- sync: update CI config files (#21) (ipfs/go-peertaskqueue#21)
- github.com/ipfs/go-unixfs (v0.4.1 -> v0.4.2):
- chore: version 0.4.2 (#136) (ipfs/go-unixfs#136)
- chore: migrate files (#134) (ipfs/go-unixfs#134)
- (ipfs/go-unixfs#128)
- github.com/ipfs/go-unixfsnode (v1.4.0 -> v1.5.1):
- v1.5.1
- fix a possible
index out of range
crash (ipfs/go-unixfsnode#39) - add an ADL to preload hamt loading (ipfs/go-unixfsnode#38)
- chore: bump version to 1.5.0
- fix: remove use of ioutil
- run gofmt -s
- bump go.mod to Go 1.18 and run go fix
- test for reader / sizing behavior on large files (ipfs/go-unixfsnode#34)
- add helper to approximate test creation patter from ipfs-files (ipfs/go-unixfsnode#32)
- chore: remove Stebalien/go-bitfield in favour of ipfs/go-bitfield
- github.com/ipfs/interface-go-ipfs-core (v0.7.0 -> v0.8.2):
- chore: version 0.8.2 (#100) (ipfs/interface-go-ipfs-core#100)
- chore: migrate files (#97) (ipfs/interface-go-ipfs-core#97)
- chore: release v0.8.1
- feat: add UseCumulativeSize UnixfsLs option (#95) (ipfs/interface-go-ipfs-core#95)
- chore: release v0.8.0
- chore: update go-libp2p to v0.23.4
- sync: update CI config files (#87) (ipfs/interface-go-ipfs-core#87)
- github.com/ipld/go-car/v2 (v2.4.0 -> v2.5.1):
- add a
SkipNext
method on block reader (#338) (ipld/go-car#338) - feat: Has() and Get() will respect StoreIdentityCIDs option
- chore: bump version to 0.5.0
- fix: remove use of ioutil
- run gofmt -s
- bump go.mod to Go 1.18 and run go fix
- bump go.mod to Go 1.18 and run go fix
- OpenReadWriteFile: add test
- blockstore: allow to pass a file to write in (#323) (ipld/go-car#323)
- feat: add
car inspect
command to cmd pkg (#320) (ipld/go-car#320) - Separate
index.ReadFrom
tests - Only read index codec during inspection
- Upgrade to the latest
go-car/v2
- Empty identity CID should be indexed when options are set
- add a
- github.com/ipld/go-codec-dagpb (v1.4.1 -> v1.5.0):
- chore: version bump to 1.5.0
- fix: replace io/ioutil with io
- bump go.mod to Go 1.18 and run go fix
- v1.4.2 bump
- github.com/libp2p/go-libp2p (v0.23.4 -> v0.24.2):
- release v0.24.2 (#1969) (libp2p/go-libp2p#1969)
- webtransport: initialize a NullResourceManager if none is provided (#1962) (libp2p/go-libp2p#1962)
- release v0.24.1 (#1945) (libp2p/go-libp2p#1945)
- routed host: return Connect error if FindPeer doesn't yield new addresses (#1946) (libp2p/go-libp2p#1946)
- chore: update examples to v0.24.0 (#1936) (libp2p/go-libp2p#1936)
- webtransport: fix flaky accept queue test (#1938) (libp2p/go-libp2p#1938)
- quic: fix race condition in TestClientCanDialDifferentQUICVersions (#1937) (libp2p/go-libp2p#1937)
- quic: update quic-go to v0.31.1 (#1942) (libp2p/go-libp2p#1942)
- release v0.24.0 (#1934) (libp2p/go-libp2p#1934)
- Disable support for signed/static TLS certificates in WebTransport (#1927) (libp2p/go-libp2p#1927)
- webtransport: add PSK to constructor, and fail if it is used (#1929) (libp2p/go-libp2p#1929)
- use a different set of default transports when PSK is enabled (#1921) (libp2p/go-libp2p#1921)
- transport.Listener,quic: Support multiple QUIC versions with the same Listener. Only return a single multiaddr per listener. (#1923) (libp2p/go-libp2p#1923)
- quic / webtransport: make it possible to listen on the same address / port (#1905) (libp2p/go-libp2p#1905)
- autorelay: fix flaky TestReconnectToStaticRelays (#1903) (libp2p/go-libp2p#1903)
- swarm / rcmgr: synchronize the concurrent outbound dials with limits (#1898) (libp2p/go-libp2p#1898)
- add QUIC v1 addresses to the default listen addresses (#1914) (libp2p/go-libp2p#1914)
- webtransport: update webtransport-go to v0.3.0 (#1895) (libp2p/go-libp2p#1895)
- tls: fix flaky TestHandshakeConnectionCancellations test (#1896) (libp2p/go-libp2p#1896)
- holepunch: disable the resource manager in tests (#1897) (libp2p/go-libp2p#1897)
- transports: expose the name of the transport in the ConnectionState (#1911) (libp2p/go-libp2p#1911)
- respect the user's security protocol preference order (libp2p/go-libp2p#1912)
- circuitv2: disable the resource manager in tests (#1899) (libp2p/go-libp2p#1899)
- expose the security protocol on the ConnectionState (libp2p/go-libp2p#1907)
- fix: autorelay: treat static relays as just another peer source (#1875) (libp2p/go-libp2p#1875)
- feat: quic,webtransport: enable both quic-draft29 and quic-v1 addrs on quic. only quic-v1 on webtransport (#1881) (libp2p/go-libp2p#1881)
- holepunch: add multiaddress filter (#1839) (libp2p/go-libp2p#1839)
- README: remove broken links from table of contents (#1893) (libp2p/go-libp2p#1893)
- quic: update quic-go to v0.31.0 (#1882) (libp2p/go-libp2p#1882)
- add an integration test for muxer selection (libp2p/go-libp2p#1887)
- core/network: fix typo
- tls / noise: prefer the client's muxer preferences (libp2p/go-libp2p#1888)
- upgrader: absorb the muxer_multistream.Transport into the upgrader (#1885) (libp2p/go-libp2p#1885)
- Apply service peer default (#1878) (libp2p/go-libp2p#1878)
- webtransport: use deterministic TLS certificates (#1833) (libp2p/go-libp2p#1833)
- remove deprecated StaticRelays option (#1868) (libp2p/go-libp2p#1868)
- autorelay: remove the default static relay option (#1867) (libp2p/go-libp2p#1867)
- core/protocol: remove deprecated Negotiator.NegotiateLazy (#1869) (libp2p/go-libp2p#1869)
- config: use fx dependency injection to construct transports (libp2p/go-libp2p#1858)
- noise: add an option to allow unknown peer ID in SecureOutbound (#1823) (libp2p/go-libp2p#1823)
- Add some guard rails and docs (#1863) (libp2p/go-libp2p#1863)
- Fix concurrent map access in connmgr (#1860) (libp2p/go-libp2p#1860)
- fix: return filtered addrs (#1855) (libp2p/go-libp2p#1855)
- chore: preallocate slices (#1842) (libp2p/go-libp2p#1842)
- Close ping stream when we exit the loop (#1853) (libp2p/go-libp2p#1853)
- tls: don't set the deprecated tls.Config.PreferServerCipherSuites field (#1845) (libp2p/go-libp2p#1845)
- routed host: search for new multi addresses upon connect failure (#1835) (libp2p/go-libp2p#1835)
- core/peerstore: removed unused provider addr ttl constant (#1848) (libp2p/go-libp2p#1848)
- basichost: improve protocol negotiation debug message (#1846) (libp2p/go-libp2p#1846)
- noise: use Noise Extension to negotiate the muxer during the handshake (#1813) (libp2p/go-libp2p#1813)
- webtransport: use the rcmgr to control flow control window increases (libp2p/go-libp2p#1832)
- chore: update quic-go to v0.30.0 (#1838) (libp2p/go-libp2p#1838)
- roadmap: reorder priority, reorganize sections (#1831) (libp2p/go-libp2p#1831)
- websocket: set the HTTP host header in WSS(#1834) (libp2p/go-libp2p#1834)
- webtransport: make it possible to record qlogs (controlled by QLOGDIR env) (libp2p/go-libp2p#1828)
- ipfs /api/v0/id is post (#1819) (libp2p/go-libp2p#1819)
- examples: connect to all peers in example mdns chat app (#1798) (libp2p/go-libp2p#1798)
- roadmap: fix header level on "Mid Q4" (#1818) (libp2p/go-libp2p#1818)
- examples: use circuitv2 in relay example (#1795) (libp2p/go-libp2p#1795)
- add a roadmap for the next 6 months (#1784) (libp2p/go-libp2p#1784)
- tls: use ALPN to negotiate the stream multiplexer (#1772) (libp2p/go-libp2p#1772)
- tls: add tests for test vector from the spec (#1788) (libp2p/go-libp2p#1788)
- examples: update go-libp2p to v0.23.x (#1803) (libp2p/go-libp2p#1803)
- Try increasing timeouts if we're in CI for this test (#1796) (libp2p/go-libp2p#1796)
- Don't use rcmgr in this test (#1799) (libp2p/go-libp2p#1799)
- Bump timeout in CI for flaky test (#1800) (libp2p/go-libp2p#1800)
- Bump timeout in CI for flaky test (#1801) (libp2p/go-libp2p#1801)
- Fix comment in webtransport client auth handshake (#1793) (libp2p/go-libp2p#1793)
- examples: add basic pubsub-with-rendezvous example (#1738) (libp2p/go-libp2p#1738)
- quic: speed up the stateless reset test case (#1778) (libp2p/go-libp2p#1778)
- tls: fix flaky handshake cancellation test (#1779) (libp2p/go-libp2p#1779)
- github.com/libp2p/go-libp2p-gostream (v0.3.0 -> v0.5.0):
- release v0.5.0 (#74) (libp2p/go-libp2p-gostream#74)
- update go-libp2p to v0.22.0 (#73) (libp2p/go-libp2p-gostream#73)
- Expose some read-only methods on the underlying Stream interface (#67) (libp2p/go-libp2p-gostream#67)
- Update libp2p (libp2p/go-libp2p-gostream#69)
- sync: update CI config files (#65) (libp2p/go-libp2p-gostream#65)
- sync: update CI config files (libp2p/go-libp2p-gostream#62)
- fix staticcheck (libp2p/go-libp2p-gostream#61)
- github.com/libp2p/go-libp2p-http (v0.2.1 -> v0.4.0):
- release v0.4.0 (libp2p/go-libp2p-http#81)
- sync: update CI config files (libp2p/go-libp2p-http#79)
- Update to latest go-libp2p (libp2p/go-libp2p-http#80)
- Update to latest go-libp2p (libp2p/go-libp2p-http#78)
- sync: update CI config files (#73) (libp2p/go-libp2p-http#73)
- github.com/libp2p/go-libp2p-kad-dht (v0.18.0 -> v0.20.0):
- release v0.20.0 (#803) (libp2p/go-libp2p-kad-dht#803)
- feat: increase the max record age to 48h (PUT_VALUE, RFM17) (#794) (libp2p/go-libp2p-kad-dht#794)
- feat: increase expiration time for Provider Records to 48h (RFM17)
- release v0.19.0 (#801) (libp2p/go-libp2p-kad-dht#801)
- define the ProviderAddrTTL in this repo (#797) (libp2p/go-libp2p-kad-dht#797)
- github.com/libp2p/go-libp2p-kbucket (v0.4.7 -> v0.5.0):
- chore: release 0.5.0 (#111) (libp2p/go-libp2p-kbucket#111)
- deprecate go-libp2p-core and use go-libp2p instead (#109) (libp2p/go-libp2p-kbucket#109)
- sync: update CI config files (#108) (libp2p/go-libp2p-kbucket#108)
- sync: update CI config files (libp2p/go-libp2p-kbucket#107)
- sync: update CI config files (#104) (libp2p/go-libp2p-kbucket#104)
- sync: update CI config files (libp2p/go-libp2p-kbucket#101)
- sync: update CI config files (libp2p/go-libp2p-kbucket#99)
- fix staticcheck (libp2p/go-libp2p-kbucket#98)
- github.com/libp2p/go-libp2p-pubsub (v0.6.1 -> v0.8.2):
- Add docstring for WithAppSpecificRPCInspector (#510) (libp2p/go-libp2p-pubsub#510)
- Adds Application Specific RPC Inspector (#509) (libp2p/go-libp2p-pubsub#509)
- chore: ignore signing keys during WithLocalPublication publishing (#497) (libp2p/go-libp2p-pubsub#497)
- improve handling of dead peers (#508) (libp2p/go-libp2p-pubsub#508)
- perf: use pooled buffers for message writes (#507) (libp2p/go-libp2p-pubsub#507)
- perf: use msgio pooled buffers for received msgs (#500) (libp2p/go-libp2p-pubsub#500)
- Enables injectable GossipSub router (#503) (libp2p/go-libp2p-pubsub#503)
- Enables non-atomic validation for peer scoring parameters (#499) (libp2p/go-libp2p-pubsub#499)
- update go-libp2p to v0.22.0 (#498) (libp2p/go-libp2p-pubsub#498)
- fix handling of dead peers (#492) (libp2p/go-libp2p-pubsub#492)
- feat: WithLocalPublication option to enable local only publishing on a topic (#481) (libp2p/go-libp2p-pubsub#481)
- update pubsub deps (#491) (libp2p/go-libp2p-pubsub#491)
- Gossipsub: Unsubscribe backoff (#488) (libp2p/go-libp2p-pubsub#488)
- Adds exponential backoff to re-spawing new streams for supposedly dead peers (#483) (libp2p/go-libp2p-pubsub#483)
- Publishing option for signing a message with a custom private key (#486) (libp2p/go-libp2p-pubsub#486)
- fix unused GossipSubHistoryGossip, make seenMessages ttl configurable, make score params SeenMsgTTL configurable
- Update README.md
- Add in Backoff Check
- Modify comment
- Add Backoff For Pruned Peers
- tests: new test for WithTopicMsgIdFunction
- chore: better name
- feat: detach WithMsgIdFunction
- fix: use RawID in traceRPCMeta to avoid allocations
- feat: extract RawID from ID
- chore: hello mister mutex hat
- chore: go fmt and return timecache named import
- feat: new WithMsgIdFunction topic option to enable topics to have own msg id generation rules
- feat: integrate msgIdGenerator
- feat: introduce msgIdGenerator and add ID field to Message wrapper
- github.com/libp2p/go-libp2p-pubsub-router (v0.5.0 -> v0.6.0):
- release v0.6.0 (#99) (libp2p/go-libp2p-pubsub-router#99)
- sync: update CI config files (#93) (libp2p/go-libp2p-pubsub-router#93)
- github.com/libp2p/go-libp2p-routing-helpers (v0.4.0 -> v0.6.0):
- Update version.json
- Change interface name
- Add tests
- Feat: retrieve routers from composable routers
- Update version.json
- Update version.json
- chore: add regression test for compparallel deadlock
- Add logs to composable parallel
- Bump version to v0.4.1
- (libp2p/go-libp2p-routing-helpers#64)
- github.com/lucas-clemente/quic-go (v0.29.1 -> v0.31.1):
- qerr: include role (remote / local) in error string representations (#3629) (lucas-clemente/quic-go#3629)
- introduce a type for the stateless reset key (#3621) (lucas-clemente/quic-go#3621)
- limit the exponential PTO backoff to 60s (#3595) (lucas-clemente/quic-go#3595)
- expose the QUIC version of a connection (#3620) (lucas-clemente/quic-go#3620)
- expose function to convert byte slice to a connection ID (#3614) (lucas-clemente/quic-go#3614)
- use
go run
for mockgen, goimports and ginkgo (#3616) (lucas-clemente/quic-go#3616) - fix client SNI handling (#3613) (lucas-clemente/quic-go#3613)
- chore: fix multiple typos in comments (#3612) (lucas-clemente/quic-go#3612)
- use the new zero-allocation control message parsing function from x/sys (#3609) (lucas-clemente/quic-go#3609)
- http3: add support for parsing and writing HTTP/3 capsules (#3607) (lucas-clemente/quic-go#3607)
- http3: add request to response (#3608) (lucas-clemente/quic-go#3608)
- fix availability signaling of the send queue (#3597) (lucas-clemente/quic-go#3597)
- http3: add a ConnectionState method to the StreamCreator interface (#3600) (lucas-clemente/quic-go#3600)
- http3: add a Context method to the StreamCreator interface (#3601) (lucas-clemente/quic-go#3601)
- rename the variable in quic.Config.AllowConnectionWindowIncrease (#3602) (lucas-clemente/quic-go#3602)
- migrate to Ginkgo v2, remove benchmark test (lucas-clemente/quic-go#3589)
- don't drop more than 10 consecutive packets in drop test (#3584) (lucas-clemente/quic-go#3584)
- use a monotonous timer for the connection (#3570) (lucas-clemente/quic-go#3570)
- http3: add http3.Server.ServeQUICConn to serve a single QUIC connection (#3587) (lucas-clemente/quic-go#3587)
- http3: expose ALPN values (#3580) (lucas-clemente/quic-go#3580)
- log the size of buffered packets (#3571) (lucas-clemente/quic-go#3571)
- ackhandler: reject duplicate packets in ReceivedPacket (#3568) (lucas-clemente/quic-go#3568)
- reduce max DATAGRAM frame size, so that DATAGRAMs fit in IPv6 packets (#3581) (lucas-clemente/quic-go#3581)
- use a Peek / Pop API for the datagram queue (#3582) (lucas-clemente/quic-go#3582)
- http3: handle ErrAbortHandler when the handler panics (#3575) (lucas-clemente/quic-go#3575)
- http3: fix double close of chan when using DontCloseRequestStream (#3561) (lucas-clemente/quic-go#3561)
- qlog: rename key_retired to key_discarded (#3463) (lucas-clemente/quic-go#3463)
- simplify packing of ACK-only packets (lucas-clemente/quic-go#3545)
- use a sync.Pool for ACK frames (lucas-clemente/quic-go#3547)
- prioritize sending ACKs over sending new DATAGRAM frames (#3544) (lucas-clemente/quic-go#3544)
- http3: reduce usage of bytes.Buffer (#3539) (lucas-clemente/quic-go#3539)
- use a single bytes.Reader for frame parsing (#3536) (lucas-clemente/quic-go#3536)
- split code paths for packing 0-RTT and 1-RTT packets in packet packer (#3540) (lucas-clemente/quic-go#3540)
- remove the wire.ShortHeader in favor of more return values (#3535) (lucas-clemente/quic-go#3535)
- preallocate the message buffers of the ipv4.Message passed to ReadBatch (#3541) (lucas-clemente/quic-go#3541)
- introduce a separate code paths for Short Header packet handling (lucas-clemente/quic-go#3534)
- fix usage of ackhandler.Packet pool for non-ack-eliciting packets (#3538) (lucas-clemente/quic-go#3538)
- return an error when parsing a too long connection ID from a header (#3533) (lucas-clemente/quic-go#3533)
- speed up marshaling of transport parameters (#3531) (lucas-clemente/quic-go#3531)
- use a struct containing an array to represent Connection IDs (lucas-clemente/quic-go#3529)
- reduce allocations of ackhandler.Packet (lucas-clemente/quic-go#3525)
- serialize frames by appending to a byte slice, not to a bytes.Buffer (lucas-clemente/quic-go#3530)
- fix datagram RFC number in documentation for quic.Config (#3523) (lucas-clemente/quic-go#3523)
- add DPLPMTUD (RFC 8899) to list of supported RFCs in README (#3520) (lucas-clemente/quic-go#3520)
- use the null tracers in the tracer integration tests (#3528) (lucas-clemente/quic-go#3528)
- github.com/marten-seemann/webtransport-go (v0.1.1 -> v0.4.3):
- release v0.4.3 (#57) (marten-seemann/webtransport-go#57)
- return the correct error from OpenStreamSync when context is canceled (#55) (marten-seemann/webtransport-go#55)
- release v0.4.2 (#54) (marten-seemann/webtransport-go#54)
- use a buffered channel in the acceptQueue (#53) (marten-seemann/webtransport-go#53)
- add a comment why using (a blocking) Read in the StreamHijacker is fine
- release v0.4.1 (#52) (marten-seemann/webtransport-go#52)
- release session mutex when an error occurs when closing (#51) (marten-seemann/webtransport-go#51)
- release v0.4.0 (#48) (marten-seemann/webtransport-go#48)
- add a Server.ServeQUICConn method (#47) (marten-seemann/webtransport-go#47)
- release v0.3.0 (#46) (marten-seemann/webtransport-go#46)
- read and write CLOSE_WEBTRANSPORT_SESSION capsules (marten-seemann/webtransport-go#40)
- implement the SetDeadline method on the stream (#44) (marten-seemann/webtransport-go#44)
- expose the QUIC stream ID on the stream interfaces (#43) (marten-seemann/webtransport-go#43)
- release v0.2.0 (#38) (marten-seemann/webtransport-go#38)
- expose quic-go's connection tracing ID on the Session.Context (#35) (marten-seemann/webtransport-go#35)
- add a ConnectionState method to the Session (#33) (marten-seemann/webtransport-go#33)
- chore: update quic-go to v0.30.0 (#36) (marten-seemann/webtransport-go#36)
- fix interop build (#37) (marten-seemann/webtransport-go#37)
- rename session receiver variable (#34) (marten-seemann/webtransport-go#34)
- fix double close of chan when using DontCloseRequestStream (#30) (marten-seemann/webtransport-go#30)
- add a simple integration test using Selenium and a headless Chrome (#28) (marten-seemann/webtransport-go#28)
- use a generic accept queue for uni- and bidirectional streams (#26) (marten-seemann/webtransport-go#26)
- github.com/multiformats/go-base36 (v0.1.0 -> v0.2.0):
- v0.2.0
- sync: update CI config files (#11) (multiformats/go-base36#11)
- fix link to documentation (#9) (multiformats/go-base36#9)
- sync: update CI config files (#8) (multiformats/go-base36#8)
- Address
staticcheck
issue (multiformats/go-base36#5) - Feat/fasterer (multiformats/go-base36#4)
- github.com/multiformats/go-multiaddr (v0.7.0 -> v0.8.0):
- release v0.8.0 (multiformats/go-multiaddr#187)
- Add quic-v1 component (multiformats/go-multiaddr#186)
- github.com/multiformats/go-varint (v0.0.6 -> v0.0.7):
- v0.0.7 (multiformats/go-varint#18)
- feat: optimize decoding (#15) (multiformats/go-varint#15)
- sync: update CI config files (#13) (multiformats/go-varint#13)
- fix staticcheck (multiformats/go-varint#9)
- tests for unbounded uvarint streams. (multiformats/go-varint#7)
- github.com/whyrusleeping/cbor-gen (v0.0.0-20210219115102-f37d292932f2 -> v0.0.0-20221220214510-0333c149dec0):
- fix bug in consts code
- Allow 'const' fields to be declared (whyrusleeping/cbor-gen#78)
- support omitting empty fields on map encoders (whyrusleeping/cbor-gen#77)
- support string pointers
- feat: add the ability to encode a byte array (#76) (whyrusleeping/cbor-gen#76)
- support string slices (#73) (whyrusleeping/cbor-gen#73)
- Feat/size types (whyrusleeping/cbor-gen#69)
- Add CborReader and CborWriter (#67) (whyrusleeping/cbor-gen#67)
- Fix broken TestTimeIsh (#66) (whyrusleeping/cbor-gen#66)
- Return EOF and ErrUnexpectedEOF correctly (#64) (whyrusleeping/cbor-gen#64)
- fix: don't fail if we try to discard nothing at the end of an object (whyrusleeping/cbor-gen#63)
- Make peeker.ReadByte follow buffer.ReadByte semantics (whyrusleeping/cbor-gen#61)
- Fix read bug in readByteBuf (whyrusleeping/cbor-gen#60)
- support for cborgen struct field tags (whyrusleeping/cbor-gen#58)
- feat: take cbor adapters by-value when encoding (whyrusleeping/cbor-gen#55)
- fix: import "math" in generated code for uint8 unmarshalling (whyrusleeping/cbor-gen#53)
- doc: document Write*EncodersToFile functions (whyrusleeping/cbor-gen#52)
Contributor | Commits | Lines ± | Files Changed |
---|---|---|---|
Marten Seemann | 154 | +8826/-6369 | 911 |
Gus Eggert | 7 | +2792/-1444 | 40 |
Marco Munizaga | 26 | +2324/-752 | 101 |
hannahhoward | 7 | +695/-1587 | 50 |
Rod Vagg | 30 | +1508/-668 | 106 |
Henrique Dias | 13 | +1321/-431 | 85 |
Yahya Hassanzadeh | 4 | +984/-158 | 9 |
galargh | 17 | +519/-520 | 20 |
Steve Loeppky | 11 | +612/-418 | 25 |
Antonio Navarro Perez | 30 | +742/-88 | 47 |
Marcin Rataj | 19 | +377/-407 | 52 |
Ian Davis | 2 | +419/-307 | 7 |
whyrusleeping | 5 | +670/-28 | 17 |
Piotr Galar | 8 | +211/-417 | 25 |
web3-bot | 28 | +282/-264 | 75 |
Will Scott | 10 | +428/-103 | 19 |
julian88110 | 2 | +367/-55 | 27 |
Will | 5 | +282/-131 | 65 |
Jorropo | 25 | +263/-94 | 38 |
Wondertan | 10 | +203/-87 | 24 |
Mohsin Zaidi | 1 | +269/-0 | 4 |
Dennis Trautwein | 3 | +230/-21 | 7 |
Prithvi Shahi | 1 | +116/-77 | 1 |
Masih H. Derkani | 5 | +130/-37 | 11 |
Iulian Pascalau | 1 | +151/-16 | 2 |
Scott Martin | 1 | +166/-0 | 3 |
Daniel Vernall | 1 | +92/-45 | 2 |
Steven Allen | 7 | +114/-15 | 11 |
Hlib Kanunnikov | 4 | +100/-28 | 6 |
Peter Rabbitson | 4 | +59/-65 | 5 |
Lucas Molas | 1 | +60/-57 | 7 |
nisdas | 3 | +107/-6 | 5 |
why | 2 | +80/-20 | 5 |
ShengTao | 2 | +46/-45 | 16 |
nisainan | 2 | +40/-50 | 12 |
Mikel Cortes | 3 | +44/-36 | 10 |
Chinmay Kousik | 1 | +64/-14 | 6 |
ZenGround0 | 2 | +62/-15 | 6 |
Antonio Navarro | 3 | +58/-3 | 8 |
Michael Muré | 2 | +49/-2 | 2 |
Dirk McCormick | 1 | +3/-42 | 1 |
kixelated | 1 | +20/-20 | 4 |
Russell Dempsey | 1 | +19/-17 | 3 |
Karthik Nallabolu | 1 | +17/-17 | 1 |
protolambda | 1 | +26/-4 | 4 |
cliffc-spirent | 1 | +25/-5 | 2 |
Raúl Kripalani | 1 | +29/-0 | 1 |
Håvard Anda Estensen | 1 | +9/-19 | 6 |
vyzo | 1 | +11/-12 | 1 |
anorth | 1 | +15/-8 | 3 |
shade34321 | 1 | +21/-1 | 2 |
Toby | 2 | +9/-13 | 6 |
Nishant Das | 1 | +9/-9 | 5 |
Jeromy Johnson | 1 | +17/-0 | 3 |
Oleg | 1 | +14/-1 | 1 |
Hector Sanjuan | 6 | +4/-11 | 6 |
Łukasz Magiera | 2 | +10/-4 | 2 |
Aayush Rajasekaran | 1 | +7/-7 | 1 |
Adin Schmahmann | 1 | +4/-3 | 1 |
Stojan Dimitrovski | 1 | +6/-0 | 1 |
Mathew Jacob | 1 | +3/-3 | 1 |
Vladimir Ivanov | 1 | +2/-2 | 1 |
Nex Zhu | 1 | +4/-0 | 2 |
Michele Mastrogiovanni | 1 | +2/-2 | 1 |
Louis Thibault | 1 | +4/-0 | 1 |
Eric Myhre | 1 | +3/-1 | 1 |
Kubo Mage | 2 | +2/-1 | 2 |
tabcat | 1 | +1/-1 | 1 |
Viacheslav | 1 | +1/-1 | 1 |
Max Inden | 1 | +1/-1 | 1 |
Manic Security | 1 | +1/-1 | 1 |
Jc0803kevin | 1 | +1/-1 | 1 |
David Brouwer | 1 | +2/-0 | 2 |
Rong Zhou | 1 | +1/-0 | 1 |
Neel Virdy | 1 | +1/-0 | 1 |