Beispiel #1
0
def go(G, s):
    try:
        while 1:
            # what are the per-txn size limits?
            pktlen = s.recv_exact(4)
            if not pktlen:
                break
            else:
                pktlen, = struct.unpack('>I', pktlen)
                packet = s.recv_exact(pktlen)
                data, size = decode(packet)
                assert size == pktlen
                [index, block_timestamp, raw_tx, lock_scripts] = data
                tx = TX()
                tx.unpack(raw_tx)
                result = True
                for i in range(len(tx.inputs)):
                    lock_script = lock_scripts[i]
                    try:
                        tx.verify(i, lock_script, block_timestamp)
                    except SystemError:
                        result = False
                pkt = encode((result, index))
                s.writev([struct.pack('>I', len(pkt)), pkt])
    except EOFError:
        pass
    coro.set_exit()
Beispiel #2
0
def go (G, s):
    try:
        while 1:
            # what are the per-txn size limits?
            pktlen = s.recv_exact (4)
            if not pktlen:
                break
            else:
                pktlen, = struct.unpack ('>I', pktlen)
                packet = s.recv_exact (pktlen)
                data, size = decode (packet)
                assert size == pktlen
                [index, block_timestamp, raw_tx, lock_scripts] = data
                tx = TX()
                tx.unpack (raw_tx)
                result = True
                for i in range (len (tx.inputs)):
                    lock_script = lock_scripts[i]
                    try:
                        tx.verify (i, lock_script, block_timestamp)
                    except SystemError:
                        result = False
                pkt = encode ((result, index))
                s.writev ([struct.pack ('>I', len(pkt)), pkt])
    except EOFError:
        pass
    coro.set_exit()
Beispiel #3
0
 def go (self):
     while 1:
         job_id, tx, timestamp, locks = self.fifo.pop()
         pkt = encode ([job_id, timestamp, tx.raw, locks])
         self.sock.writev ([struct.pack ('>I', len(pkt)), pkt])
         pktlen = self.sock.recv_exact (4)
         if not pktlen:
             break
         else:
             pktlen, = struct.unpack ('>I', pktlen)
             pkt = self.sock.recv_exact (pktlen)
             (result, index), size = decode (pkt)
             assert (pktlen == size)
             G.pool.retire (index, result)
Beispiel #4
0
 def handle_request (self, qid, path, params):
     o = self.root
     e = None
     if self.debug:
         LOG ('<-', self.conn.fd, qid, path, params)
     try:
         for p in path:
             o = getattr (o, p)
         result = o (*params)
     except Exception:
         e = (sys.exc_info()[1].__class__.__name__, coro.traceback_data())
         LOG ('exc', e)
         result = None
     if self.debug:
         LOG ('->', self.conn.fd, qid, e, result)
     self.push (encode ([KIND_REPLY, qid, e, result]))
Beispiel #5
0
 def handle_request(self, qid, path, params):
     o = self.root
     e = None
     if self.debug:
         LOG('<-', self.conn.fd, qid, path, params)
     try:
         for p in path:
             o = getattr(o, p)
         result = o(*params)
     except Exception:
         e = (sys.exc_info()[1].__class__.__name__, coro.traceback_data())
         LOG('exc', e)
         result = None
     if self.debug:
         LOG('->', self.conn.fd, qid, e, result)
     self.push(encode([KIND_REPLY, qid, e, result]))
Beispiel #6
0
 def request (self, path, params):
     me = coro.current()
     qid = self.qid_counter
     self.qid_counter += 1
     if self.debug:
         LOG ('=>', self.conn.fd, qid, path, params)
     packet = encode ([KIND_REQUEST, qid, path, params])
     self.push (packet)
     try:
         self.pending_requests[qid] = me
         result = me._yield()
     finally:
         if qid in self.pending_requests:
             del self.pending_requests[qid]
     error, result = result
     if error:
         raise RPC_Remote_Exception (*error)
     else:
         return result
Beispiel #7
0
 def request(self, path, params):
     me = coro.current()
     qid = self.qid_counter
     self.qid_counter += 1
     if self.debug:
         LOG('=>', self.conn.fd, qid, path, params)
     packet = encode([KIND_REQUEST, qid, path, params])
     self.push(packet)
     try:
         self.pending_requests[qid] = me
         result = me._yield()
     finally:
         if qid in self.pending_requests:
             del self.pending_requests[qid]
     error, result = result
     if error:
         raise RPC_Remote_Exception(*error)
     else:
         return result