Compare commits

...

8 commits

8 changed files with 255 additions and 68 deletions

View file

@ -1,7 +1,8 @@
# Paper: Decentralised Hashtag Search and Subscription for Federated Social Networks
This paper has been written during my Computer Science studies at [TU Dresden](https://inf.tu-dresden.de/) as a *Großer Beleg*.
A pre-compiled PDF of the paper can be found in [paper_hashtag_federation.pdf](paper_hashtag_federation.pdf).
A pre-compiled PDF of the paper can be found in [paper_hashtag_federation.pdf](paper_hashtag_federation.pdf).
The slides of my talk at [ActivityPub Conf](https://redaktor.me/apconf/) can be found in [talk-slides.pdf](talk-slides.pdf).
## Building

BIN
figures/fediverse_logo.pdf (Stored with Git LFS) Normal file

Binary file not shown.

170
figures/fediverse_logo.svg Normal file
View file

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="196.52mm"
height="196.52mm"
viewBox="0 0 196.52 196.52"
version="1.1"
id="svg8"
inkscape:version="0.92.2 2405546, 2018-03-11"
sodipodi:docname="Logo_penta_connectat-imbrincat_retallats-color.svg"
inkscape:export-filename="/home/nestor/Pictures/Fediversal/Logo_penta_connectat-imbrincat_retallats-color-512x.png"
inkscape:export-xdpi="66.175453"
inkscape:export-ydpi="66.175453">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.50411932"
inkscape:cx="-209.83484"
inkscape:cy="399.15332"
inkscape:document-units="mm"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-global="false"
inkscape:window-width="1366"
inkscape:window-height="736"
inkscape:window-x="0"
inkscape:window-y="32"
inkscape:window-maximized="1"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Linies"
style="display:inline"
transform="translate(6.6789703,-32.495842)">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#a730b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 181.13086,275.13672 a 68.892408,68.892408 0 0 1 -29.46484,29.32812 l 161.75781,162.38868 38.99805,-19.76368 z m 213.36328,214.1875 -38.99805,19.76367 81.96289,82.2832 a 68.892409,68.892409 0 0 1 29.47071,-29.33203 z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path9722"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#5496be;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 581.64648,339.39062 -91.57617,46.41016 6.75196,43.18945 103.61523,-52.51367 A 68.892409,68.892409 0 0 1 581.64648,339.39062 Z M 436.9082,412.74219 220.38281,522.47656 a 68.892408,68.892408 0 0 1 18.79492,37.08985 L 443.66016,455.93359 Z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path9729"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ce3d1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 367.27539,142.4375 262.79492,346.4082 293.64258,377.375 404.26562,161.41797 A 68.892408,68.892408 0 0 1 367.27539,142.4375 Z m -131.6543,257.02148 -52.92187,103.31446 a 68.892409,68.892409 0 0 1 36.98633,18.97851 l 46.78125,-91.32812 z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path9713"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#d0188f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 150.76758,304.91797 a 68.892408,68.892408 0 0 1 -34.41602,7.19531 68.892408,68.892408 0 0 1 -6.65039,-0.69531 l 30.90235,197.66211 a 68.892409,68.892409 0 0 1 34.41601,-7.19531 68.892409,68.892409 0 0 1 6.64649,0.69531 z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path1015"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#5b36e9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 239.3418,560.54492 a 68.892408,68.892408 0 0 1 0.7207,13.87696 68.892408,68.892408 0 0 1 -7.26758,27.17968 l 197.62891,31.71289 a 68.892409,68.892409 0 0 1 -0.72266,-13.8789 68.892409,68.892409 0 0 1 7.26953,-27.17774 z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path1674"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#30b873;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 601.13281,377.19922 -91.21875,178.08203 a 68.892408,68.892408 0 0 1 36.99414,18.98242 L 638.125,396.18359 a 68.892409,68.892409 0 0 1 -36.99219,-18.98437 z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path1676"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ebe305;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 476.72266,125.33008 a 68.892408,68.892408 0 0 1 -29.47071,29.33203 l 141.26563,141.81055 a 68.892409,68.892409 0 0 1 29.46875,-29.33204 z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path1678"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#f47601;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 347.78711,104.63086 -178.57617,90.49805 a 68.892409,68.892409 0 0 1 18.79297,37.08593 l 178.57421,-90.50195 a 68.892408,68.892408 0 0 1 -18.79101,-37.08203 z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path1680"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#57c115;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 446.92578,154.82617 a 68.892408,68.892408 0 0 1 -34.98242,7.48242 68.892408,68.892408 0 0 1 -6.0293,-0.63281 l 15.81836,101.29102 43.16211,6.92578 z m -16,167.02735 37.40039,239.48242 a 68.892409,68.892409 0 0 1 33.91406,-6.94336 68.892409,68.892409 0 0 1 7.20704,0.79101 L 474.08984,328.77734 Z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path9758"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#dbb210;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 188.13086,232.97461 a 68.892408,68.892408 0 0 1 0.75781,14.0957 68.892408,68.892408 0 0 1 -7.16015,26.98242 l 101.36914,16.28125 19.92382,-38.9082 z m 173.73633,27.90039 -19.92578,38.91211 239.51367,38.4668 a 68.892409,68.892409 0 0 1 -0.69531,-13.71875 68.892409,68.892409 0 0 1 7.34961,-27.32422 z"
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
id="path9760"
inkscape:connector-curvature="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Nodes"
style="display:inline;opacity:1"
transform="translate(6.6789703,-32.495842)">
<circle
style="fill:#ffca00;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
id="path817"
cx="106.26596"
cy="51.535553"
r="16.570711"
transform="rotate(3.1178174)" />
<circle
id="path819"
style="fill:#64ff00;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
cx="171.42836"
cy="110.19328"
r="16.570711"
transform="rotate(3.1178174)" />
<circle
id="path823"
style="fill:#00a3ff;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
cx="135.76379"
cy="190.27704"
r="16.570711"
transform="rotate(3.1178174)" />
<circle
style="fill:#9500ff;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
id="path825"
cx="48.559471"
cy="181.1138"
r="16.570711"
transform="rotate(3.1178174)" />
<circle
id="path827"
style="fill:#ff0000;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
cx="30.328812"
cy="95.366837"
r="16.570711"
transform="rotate(3.1178174)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

BIN
paper_hashtag_federation.pdf (Stored with Git LFS)

Binary file not shown.

View file

@ -219,7 +219,7 @@ While the view onto the post history of a hashtag shall be consistent no matter
\item \textbf{size of posts}:\label{ass:post_size}
As posts are text-only objects of the content, often having a size limit of 500--1000 characters, and some additional metadata, we assume the size of each post to be \(\leq 10\) KiB.
\item \textbf{size of post URIs}:\label{ass:url_size}
Each post is identifiable by dereferenceable \ac{URI} and can be retrieved from there. Given the \acp{URI} in existing network server implementations, we assume them to have a size \(\leq 1\) KiB.
Each post is identified by dereferenceable \ac{URI} and can be retrieved from there. Given the \acp{URI} in existing network server implementations, we assume them to have a size \(\leq 1\) KiB.
\end{itemize}
\subsection{Security}
@ -678,7 +678,7 @@ For each node, the mismatch between the actual workload of the node \(n\) and it
\caption[]{Average and median (absolute) mismatches between node work load and capacity for simulated DHT, with and without load balancing. \\
total size of all posts: 34332.27 GiB \\
total number of nodes: 1306
total number of nodes: 1036
}\label{tab:lb_stats}
\end{table}
@ -697,10 +697,10 @@ The large difference in overloaded nodes clearly shows that the k-choices load b
Adding hashtag federation to federated social network using this proposed system in most cases does not raise any serious privacy concerns: Only public posts are handled by the system, and as only the URI from where a post can be fetched is relayed to subscribers the originating instance can choose to stop providing that post at any time.
Instances subscribe to tags on behalf of their users, they hide the interests of particular users unless the set of active users on the particular instance is too small.
While \ac{DHT} networks provide an efficient way of structuring a \ac{P2P} lookup network with only knowing a small subset of its nodes and no central authority, exactly these missing global view and lack of central trust anchor pose several security challenges.
While \ac{DHT} networks provide an efficient way of structuring a \ac{P2P} lookup network with only knowing a small subset of its nodes and no central authority, exactly this missing global view and lack of central trust anchor poses several security challenges.
Urdaneta et al. \cite{urdanetaSurveyDHTSecurity2011} provide a broad survey of common security threats in \ac{DHT} security and attempts of solving them. \\
\textbf{Routing attacks} try to alter or disrupt the routing process within a \ac{DHT} to prevent the resolution of keys, let them point to invalid nodes or even to relay the combined lookup requests on a popular ID to a third party server as a Distributed \ac{DoS}. Storage attacks attempt to alter or forge the stored payload data returned under a key by impersonating the responsible node or taking over the relevant key space.
\textbf{Routing attacks} try to alter or disrupt the routing process within a \ac{DHT} to prevent the resolution of keys, let them point to invalid nodes or even to relay the combined lookup requests on a popular ID to a third party server as a Distributed \ac{DoS}. \textbf{Storage attacks} attempt to alter or forge the stored payload data returned under a key by impersonating the responsible node or taking over the relevant key space.
In this system, controlling the data returned from a key allows taking over responsibility for the storage or relaying of certain hashtags. Such attackers can then deliberately drop or insert posts for a hashtag. \\
An important mean or precondition for many of these targeted manipulations are \textbf{Sybil attacks}: By enabling a single attacker to join the \ac{DHT} with a large number of identities, posing as independent nodes, it can subvert mechanisms based on the assumption of one entity only controlling a low fraction of nodes, like majority voting systems. Additionally, introducing a large number of node identities increases the number of keys handled by the attacker and the likelihood of controlling a certain key or being included into a finger table, especially if node IDs are equally distributed. \\
A similar attack scenario are the \textbf{node ID attacks} (also called \textit{node squatting}), where attackers try to control a certain keyspace or disrupt the routing by deliberately positioning a node close to or even directly at a certain ID. \\

View file

@ -6,7 +6,6 @@
#####################
HISTFILE="./twitter_hashtag_history.csv"
DISTFILE="./twitter_hashtag_numbers.txt"
# extract hashtags and time stamp in parallel
@ -15,7 +14,3 @@ echo "$@" | parallel -d ' ' -j+0 --eta "echo \"parsing {}\"; zcat {} |jq -r 'if
# merge all temporary history files to one
cat tmp_twitter_history_* > ${HISTFILE}
# rm "tmp_twitter_history_*"
# count hashtag occurence
awk -F, '{print tolower($2)}' "${HISTFILE}" | sort | uniq -c > ${DISTFILE}
# let's hope that sort can manage such huge files in memory

BIN
talk-slides.pdf (Stored with Git LFS) Normal file

Binary file not shown.

View file

@ -42,6 +42,7 @@
% or whatever
\usepackage[backend=biber, sorting=none]{biblatex}
\addbibresource{literature.bib}
\usepackage{ccicons}
\usepackage{wrapfig}
@ -124,10 +125,10 @@ for Federated Social Networks}
\maketitle
\note{introduce myself:\\
known as schmittlauch on the Internet\\
usually go by schmittlauch on the Internet\\
student of Computer Science @ TU Dresden\\
interest in federated systems and unusual social networks\\
presenting my work on a study paper from this year}
presenting my work on a student research paper from this year}
\begin{frame}{Outline}
@ -174,7 +175,7 @@ presenting my work on a study paper from this year}
\begin{frame}{Importance of \#Hashtags}{}
Hashtags are used for marking posts about certain topics or events:
\note{mark topics of posts, make them discoverable by content. No full text search in fediverse}
\note{mark topics of posts, make them discoverable by content. No decentralised full text search in Fediverse (centralised search engines)}
\begin{columns}
\begin{column}{0.47\textwidth}
@ -200,7 +201,8 @@ Hashtags are used for marking posts about certain topics or events:
\includegraphics[height=0.6\paperheight]{figures/Elephant_Friend_(Greeting).png}
}
\only<4>{
\includegraphics[width=\textwidth]{figures/hashtag_gezipark.jpg}
\includegraphics[width=\textwidth]{figures/hashtag_gezipark.jpg}\\
\tiny{\ccby \href{https://creativecommons.org/licenses/by/4.0/}{CC BY 4.0 International} by \href{https://metronaut.de}{Metronaut}}
}
\only<5>{
\includegraphics[height=0.6\paperheight]{figures/hashtag_metoo.jpg}\\
@ -215,7 +217,7 @@ Hashtags are used for marking posts about certain topics or events:
\subsection{State of Hashtags in the Fediverse}
\begin{frame}{State of Hashtags on the Fediverse}{}
{\center \Large Hashtags are used in the fediverse}
{\center \Large Hashtags are used in the Fediverse}
\pause
\vspace{2em}
@ -243,9 +245,9 @@ Hashtags are used for marking posts about certain topics or events:
\begin{frame}{State of Hashtags on the Fediverse}{Fragmentation}
\begin{itemize}
\item fragmented view on hashtag posts depending on user's instance
\item hashtag search only on locally known posts
\item Result: incentive to cluster on large nodes \(\Leftarrow\) centralisation
\item fragmented view on hashtag posts depending on user's instance\note[item]{view depends on users instance}
\item hashtag search only on locally known posts\note[item]{local posts}
\item Result: incentive to cluster on large nodes \(\Leftarrow\) centralisation\note[item]{cluster incentive}
\end{itemize}
\end{frame}
@ -255,13 +257,14 @@ Hashtags are used for marking posts about certain topics or events:
\begin{column}{0.55\textwidth}
\includegraphics[height=0.6\paperheight]{figures/push_federation.pdf}
\end{column}
\note{example scenario with 4 instances}
\begin{column}{0.45\textwidth}
\begin{itemize}
\only<1>{\item subscription to \texttt{@alice@cyber.space} by contacting instance \texttt{cyber.space}}
\only<2>{\item all future posts by alice are delivered to instances of subscribers, but \textit{not} instances without any subscriber}
\only<3>{\item other ways for posts to reach an instance:\\ boosts, thread resolution}
\only<2>{\item all future posts by Alice are delivered to instances of subscribers, but \textit{not} instances without any subscriber\note[item]{cyber.space may not even be aware of existence of other instances}}
\only<3>{\item other ways for posts to reach an instance:\\ boosts, thread resolution\note[item]{posts can disseminate through other means}}
\end{itemize}
\end{column}
\end{columns}
@ -274,13 +277,17 @@ Hashtags are used for marking posts about certain topics or events:
\item centralised actor relaying all incoming posts
\item single point of failure, which relay to choose?
\item relaying all incoming posts \(\Rightarrow\) huge load on small instances
\item only access to posts sent after initial subscribtion
\item only access to posts sent after initial subscription
\end{itemize}
\item Diaspora* SocialRelay
\begin{itemize}
\item similar, but allows subscribing to certain tags only
\end{itemize}
\note{relays\\
centralised actors, single point\\
which one to choose?\\
all posts -> overload\\
after subscription}
\end{itemize}
@ -297,16 +304,19 @@ Hashtags are used for marking posts about certain topics or events:
\item \textbf{store \& query}: instances can retrieve 1 year of history for a hashtag without subscription
\item fully decentralised, no single point of authority for all tags
\end{itemize}
\note{2 goals: relay \& subscribe; store \& query; fully decentralised}
\end{frame}
\begin{frame}{System Architecture}{adding a DHT backend to the fediverse}
\begin{frame}{System Architecture}{adding a DHT backend to the Fediverse}
core idea: distribute responsibility for tags among instances using a \textbf{D}istributed \textbf{H}ash \textbf{T}able, \note{distribute responsibility for posts of a hashtag = relaying \& storage}
\note[item]{subscription to all posts of a user possible because there is a single responsible instance}
core idea: distribute responsibility for tags among instances using a \textbf{D}istributed \textbf{H}ash \textbf{T}able, \note[item]{distribute responsibility for posts of a hashtag = relaying \& storage}
based on Chord
based on Chord \cite{stoicaChordScalablePeertopeer2003}
%ToDo for Kolloquium: reason for Chord
\note[item]{DHT: structured P2P networks providing efficient (log N) key-value storage and lookup}
\note[item]{self-organising, no central authority}
\note[item]{DHT: structured P2P networks, self-organising, no central authority}
\note[item]{provides efficient (log N) key-value storage and lookup}
\end{frame}
@ -314,9 +324,10 @@ based on Chord
\begin{columns}
\begin{column}{0.4\textwidth}
\begin{itemize}
\item calculate hash value of keys and node IDs
\item place these hashes onto the same circular name space
\item each node keeps routing table of \(\log \#number\_nodes\) entries\note[item]{joining and leaving covered in paper}
\note[item]{common namespace for nodes and lookup keys}
\item calculate hash value of hashtags and node IDs
\item place these hashes onto the same circular name space
\item each node keeps routing table of \(\log \#number\_nodes\) entries\note[item]{routing table entries to distances of powers of 2}
\end{itemize}
\end{column}
@ -330,8 +341,11 @@ based on Chord
\begin{columns}
\begin{column}{0.55\textwidth}
\begin{itemize}
\item next nodeID \(\geq\) \texttt{hash(hashtag)} (mod keyspace size) is responsible for handling posts containing \texttt{hashtag}
\item responsible node for a key \(k\) is node \(successor(k) = \min_i(k+i) \mod\) keyspace\_size
\item DHT used for iterative lookup of responsible relay/ storage node
\note[item]{iterative lookup of responsible successor node of key}
\item my architecture: keyspace = \(2^{256}\) with 256bit-long IDs
\note[item]{i use keyspace of \(2^{256}\)}
\end{itemize}
\end{column}
@ -343,7 +357,7 @@ based on Chord
\begin{frame}{Publishing, Relaying and Storage}{lifecycle of posts}
\begin{enumerate}
\item publishing instance looks up responsible relay instance on DHT for each included hashtag
\item publishing instance looks up responsible relay instance on DHT for each included hashtag\note[item]{calculate hashum of hashtag -> lookup key for DHT}
\item publishing instance sends post to responsible relay instance
\item relay instance looks up responsible storage node on DHT
\item relay instance verifies incoming post's signature, then relays post URI (ID) to all subscribers + storage node\note[item]{only post ID relayed, but not full post content. Reasons: LDSignatures not supported everywhere, deniability \& revocation}
@ -353,17 +367,10 @@ based on Chord
\end{frame}
\begin{frame}{Publishing, Relaying and Storage}
\begin{itemize}
\item separate DHTs for relay and storage instances
\item all actions after DHT lookup supposed to be done using ActivityPub via HTTPS
\item subscription to hashtags/ querying posts is done at the responsible instance
\end{itemize}
\end{frame}
\begin{frame}
\note{so far so easy. But load distribution issues}
\note{so far so easy.\\
what hashtags does a certain instance handle? determined by node ID\\
can it bear the load?}
\begin{itemize}
\item node ID determines set of hashtags handled by instance
\item problem: for security reasons, node \textbf{must not} choose their IDs freely
@ -377,7 +384,7 @@ based on Chord
\includegraphics[width=0.49\textwidth]{statistics/geraspora_hashtags_total.png}
\note{analysis of a 1 month dump of Twitter, Geraspora (Diaspora) and Friendica posts\\
Twitter: 70\% of posts used just once\\
Twitter: 70\% of hashtags used just once\\
note the logarithmic axis!}
distribution of posts per hashtag follows a steep power law
@ -387,11 +394,13 @@ distribution of posts per hashtag follows a steep power law
\begin{frame}{Load Balancing}{of hashtags between nodes}
\begin{itemize}
\item \textit{k-choices} algorithm by Ledlie and Seltzer
\item each node can choose from \(\kappa\) possible IDs
%ToDo for Kolloquium: reasonf or choosing that algorithm
\item \textit{k-choices} algorithm by Ledlie and Seltzer \cite{ledlieHarvardTechnicalReport2004}
\item a node can represent several \textit{virtual nodes} on the DHT
\item \(\kappa\) possible virtual node IDs: \(ID =\) hash(\(ID' ++ i\))\(, i \in \{0, 1, \dots, \kappa-1\}\)
\item nodes have a \textbf{capacity} and choose set of active IDs according to lowest mismatch of own and neighbour node capacity
\item querying load of potential IDs before joining, periodic re-balancing
\item independent load balancing of relay and storage nodes due to independent DHTs
\item independent load balancing of relay and storage nodes due to independent DHTs\note[item]{enable different roles ``relay'', ``storage'' to balance independently: 2 DHTs}
\note[item]{a simple simulation on the effectivity of the balancing algorithm can be found in the paper}
\end{itemize}
% for Kolloquium, add simulation result
@ -401,7 +410,7 @@ distribution of posts per hashtag follows a steep power law
\begin{columns}
\begin{column}{0.55\textwidth}
\begin{itemize}
\item store redundant copies of hashtag data at equal distances on Chord ring\note{resilience against node failure, allows data validation through cross-checking}
\item redundant assignment of responsibility for hashtag at equal distances on Chord ring, inspired by Harvesf and Blough \cite{harvesfEffectReplicaPlacement2006}\note{resilience against node failure, allows data validation through cross-checking}
\item default redundancy: \(2^2 = 4\), scalable in powers of 2
\item \textbf{relay nodes}: hot standby nodes take over in overload situations (load spikes)
\item \textbf{storage nodes}: overloaded nodes can split stored posts by content hash and double redundancy set
@ -420,6 +429,8 @@ distribution of posts per hashtag follows a steep power law
\begin{frame}{Discussion}{I need YOUR feedback}
I want feedback from all of you, no matter whether it's from a \textit{\LARGE technical} or from a \textit{\LARGE social perspective}.
\note{architecture just a concept so far\\
before implementations: several open questions}
\end{frame}
@ -429,10 +440,12 @@ I want feedback from all of you, no matter whether it's from a \textit{\LARGE te
Do we even want global hashtags in the Fediverse?
\begin{itemize}
\item positive potential (conversation, coordination) vs. negative potential (spam, harrasment)
\item positive potential (conversation, coordination) vs. negative potential (spam, harrassment)
\note[item]{positive vs negative potential}
\item visibility level: public posts only, unlisted, new level necessary?
\item relaying post URI only should provide plausible deniability
\item Does this circumvent instance-blocks and is this bad?
\note[item]{visibility levels}
\item relaying post URI only should provide plausible deniability and retractability
\note[item]{retractability should be given}
\end{itemize}
\end{frame}
@ -443,8 +456,11 @@ Do we even want global hashtags in the Fediverse?
\begin{itemize}
\item intended as opt-in, domain-based push federation still better for user subscriptions
\item assumption: instances offer \(5.5\times\) the storage \& \(2.5\times\) the bandwith of own posts
\note[item]{optional mechanism, let's keep C2S communication for mobile friendliness and PushFed for simplicity}
\item assumption: instances offer \(5.5\times\) the storage \& \(2.5\times\) the bandwidth of own posts
\note[item]{assumptions: 5.5x storage, 2.5x bandwidth}
\item performance: Can this be implemented efficiently enough to not DDoS popular hashtag nodes?
\note[item]{performance: fetch DDoS of popular tags}
\begin{itemize}
\item batched retrieval of posts from same source
\item exponential backoff retries
@ -459,7 +475,7 @@ Do we even want global hashtags in the Fediverse?
\begin{itemize}
\item hashtags may be represented as relay actors with own in- \& outbox, addressed in cc
\item relaying to subscribers via SharedInbox
\item idea for addressing: new URI scheme that gets transparently resolved to responsible node's domain via DHT\note[item]{application proxy for transparent URI scheme resolving?}
\item idea for addressing: new URI scheme that gets transparently resolved to responsible node's domain via DHT by application proxy\note[item]{application proxy for transparent URI scheme resolving?}
\item signalling of error codes and redundancy factors is needed
\end{itemize}
\item DHT routing communication does not use ActivityPub
@ -473,7 +489,9 @@ Do we even want global hashtags in the Fediverse?
\includegraphics<1>[height=0.59\paperheight]{figures/Elephant_Friend_(Greeting).png}
\includegraphics<2,4>[height=0.59\paperheight]{figures/hist_num_single_vs.png}
\note[item]{common DHT attack: Sybil-… = 1 attacker introduces large number of nodes}
\note[item]{sorry to all instance admins, but: CloudFlare behaves like a MITM/ Sybil attacker}
\note[item]{node ID derivation: first 64 bits of IPv6}
\only<2,4>{1st peak: Masto.host, 2nd peak: Cloudflare}
@ -500,6 +518,7 @@ node ID derivation}
\begin{itemize}
\item valid domain required for node ID derivation, assumption: domains cost money
\end{itemize}
\note{not perfectly secure, but the best I could think of. Better ideas welcome}
\end{itemize}
\end{frame}
@ -533,14 +552,6 @@ node ID derivation}
\section<presentation>*{\appendixname}
\subsection<presentation>*{For Further Reading}
\begin{frame}[allowframebreaks]
\frametitle{References}
%\bibliography{literature}
\end{frame}
\begin{frame}
@ -548,16 +559,20 @@ node ID derivation}
\includegraphics[height=0.4\paperheight]{figures/qr_paper.png}\\
\large\url{https://git.orlives.de/schmittlauch/paper_hashtag_federation/src/branch/master/paper_hashtag_federation.pdf}
\vspace{2em}
\Large\includegraphics[height=1em]{figures/fediverse_logo.pdf} @schmittlauch@toot.matereal.eu
\end{frame}
\begin{frame}[allowframebreaks]
\frametitle{References}
\printbibliography
\end{frame}
\begin{frame}
%\includegraphics[height=0.5\textheight]{figures/nomnompingu.png}\tiny\footnote{CC-BY-SA 3.0 by Elektroll}
\end{frame}
\end{document}