tahoe-lafs/allmydata/encode.py
2006-12-03 03:01:43 -07:00

51 lines
1.5 KiB
Python

from twisted.internet import defer
import sha
from allmydata.util import idlib
def netstring(s):
return "%d:%s," % (len(s), s)
class Encoder(object):
def __init__(self, infile, m):
self.infile = infile
self.k = 2
self.m = m
def do_upload(self, landlords):
dl = []
data = self.infile.read()
for (peerid, bucket_num, remotebucket) in landlords:
dl.append(remotebucket.callRemote('write', data))
dl.append(remotebucket.callRemote('close'))
return defer.DeferredList(dl)
class Decoder(object):
def __init__(self, outfile, k, m, verifierid):
self.outfile = outfile
self.k = 2
self.m = m
self._verifierid = verifierid
def start(self, buckets):
assert len(buckets) >= self.k
dl = []
for bucketnum, bucket in buckets[:self.k]:
d = bucket.callRemote("read")
dl.append(d)
d2 = defer.DeferredList(dl)
d2.addCallback(self._got_all_data)
return d2
def _got_all_data(self, resultslist):
shares = [results for success,results in resultslist if success]
assert len(shares) >= self.k
# here's where the Reed-Solomon magic takes place
self.outfile.write(shares[0])
hasher = sha.new(netstring("allmydata_v1_verifierid"))
hasher.update(shares[0])
vid = hasher.digest()
if self._verifierid:
assert self._verifierid == vid, "%s != %s" % (idlib.b2a(self._verifierid), idlib.b2a(vid))