Changeset 270

Show
Ignore:
Timestamp:
04/21/09 21:42:46 (3 years ago)
Author:
ocjhb
Message:

yielding

Location:
trunk/sandbox/jhb/oc2
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/sandbox/jhb/oc2/documentation.py

    r269 r270  
    608608>>> bobwallet = Wallet({}) 
    609609 
    610 >>> aclicetid = wallet.makeSerial() 
     610>>> alicetid = wallet.makeSerial() 
    611611>>> bob = protocols.SumAnnounceListen(bobwallet) 
    612 >>> alice = protocols.SumAnnounce(bob.run, wallet, 5, 'foobar')  
     612>>> alice = protocols.SumAnnounce(bob.run, wallet, alicetid, 5, 'foobar')  
    613613>>> bobwallet.approval = "I don't like odd sums" 
    614614>>> alice.run() 
     
    647647  tokens. 
    648648 
     649############################################################################### 
     650 
     651>>> bob = protocols.SpendListen(bobwallet) 
     652>>> transport = transports.YieldTransport(bob.run,[]) 
     653>>> alice = protocols.SpendRequest(transport, wallet, 'foobar', [coin])  
     654>>> alice.run() 
     655Traceback (most recent call last): 
     656    .... 
     657SpendReject: unknown transactionId 
     658 
     659>>> alice = protocols.SpendRequest(transport, wallet, alicetid, [])  
     660>>> alice.run() 
     661Traceback (most recent call last): 
     662    .... 
     663SpendReject: amount of coins does not match announced one 
     664 
     665>>> alice = protocols.SpendRequest(transport, wallet, alicetid, [coin])  
     666>>> alice.run() 
     667True 
     668 
     669############################################################################### 
    649670 
    6506713.7 Redeeming tokens  
  • trunk/sandbox/jhb/oc2/messages.py

    r269 r270  
    1111        Container.fromData(self,data) 
    1212        self.header = self.__class__.__name__ 
     13 
     14class MessageException(Message,Exception): 
     15 
     16    def __str__(self): 
     17                return str(self.reason) 
    1318 
    1419class AskLatestCDD(Message): 
     
    3641        Field('target'), 
    3742        Field('blinds'), 
    38         SubitemsField('coins'), 
     43        SubitemsField('coins',klass=container.Coin), 
    3944        Field('options'), 
    4045    ] 
     
    8691     fields = Message.fields + [ 
    8792        Field('transactionId'), 
    88         Field('sum'), 
     93        Field('amount'), 
    8994        Field('target'), 
    9095    ] 
     
    96101 
    97102    
    98 class SumReject(Message): 
     103class SumReject(Message,Exception): 
    99104     fields = Message.fields + [ 
    100105        Field('transactionId'), 
     
    102107    ] 
    103108 
     109class SpendRequest(Message): 
     110     fields = Message.fields + [ 
     111        Field('transactionId'), 
     112        SubitemsField('coins',klass=container.Coin), 
     113    ] 
     114 
     115class SpendAccept(Message): 
     116     fields = Message.fields + [ 
     117        Field('transactionId'), 
     118    ] 
    104119 
    105120 
     121class SpendReject(MessageException): 
     122     fields = Message.fields + [ 
     123        Field('transactionId'), 
     124        Field('problems'), 
     125        Field('reason'), 
     126    ] 
     127 
     128 
     129 
  • trunk/sandbox/jhb/oc2/protocols.py

    r269 r270  
    180180class SumAnnounce(Protocol): 
    181181 
    182     def __init__(self,transport,wallet,sum,target): 
    183         self.transport = transport 
    184         self.sum = sum 
     182    def __init__(self,transport,wallet,tid,amount,target): 
     183        self.transport = transport 
     184        self.amount = amount 
    185185        self.target = target 
    186         self.wallet = wallet 
    187      
    188     def run(self,message=None): 
    189         tid = self.wallet.makeSerial() 
     186        self.tid = tid 
     187        self.wallet = wallet 
     188     
     189    def run(self,message=None): 
    190190        message = messages.SumAnnounce() 
    191         message.transactionId = tid 
    192         message.sum = self.sum 
     191        message.transactionId = self.tid 
     192        message.amount = self.amount     
    193193        message.target = self.target 
    194194        self.wallet.addOutgoing(message) 
    195195        response = self.transport(message) 
    196         if response.header == 'SumAccept': 
     196        if response.header == 'SumReject': 
     197            return response.reason 
     198        else: 
    197199            return True 
    198         else: 
    199             return response.reason 
    200200 
    201201 
     
    215215        return answer 
    216216 
     217 
     218class SpendRequest(Protocol): 
     219 
     220    def __init__(self,transport,wallet,tid,coins): 
     221        self.transport = transport 
     222        self.wallet = wallet 
     223        self.tid = tid 
     224        self.coins = coins 
     225     
     226    def run(self,message=None): 
     227        message = messages.SpendRequest()  
     228        message.transactionId = self.tid 
     229        message.coins = self.coins 
     230        response = self.transport(message) 
     231        if response.header == 'SpendReject': 
     232            raise response 
     233        else: 
     234            return True 
     235 
     236class SpendListen(Protocol): 
     237     
     238    def __init__(self,wallet): 
     239        self.wallet = wallet 
     240     
     241    def run(self,message=None): 
     242        tid = message.transactionId 
     243        amount = sum([int(m.denomination) for m in message.coins]) 
     244        #check transactionid 
     245        orig = self.wallet.getIncoming(tid) 
     246        if not orig: 
     247            answer = messages.SpendReject() 
     248            answer.reason = 'unknown transactionId' 
     249            yield answer 
     250            return 
     251        #check sum 
     252        if amount != int(orig.amount): 
     253            answer = messages.SpendReject() 
     254            answer.reason = 'amount of coins does not match announced one' 
     255            yield answer 
     256            return 
     257        yield 'trying to exchange'  
     258        #try to exchange. To yield or not to yield? 
     259        import pdb; pdb.set_trace() 
     260        #return answer 
     261        answer = messages.SpendAccept() 
     262        answer.transactionId = tid 
     263        yield answer 
     264 
    217265class CoinsSpendSender(Protocol): 
    218266 
  • trunk/sandbox/jhb/oc2/transports.py

    r256 r270  
    2323        return createMessage(response.read()) 
    2424         
     25class YieldTransport(object): 
    2526 
     27    def __init__(self,targetmethod,args): 
     28        self.args = args 
     29        self.targetmethod = targetmethod 
     30        self.nextarg = None 
     31 
     32    def __call__(self,message): 
     33        gen = self.targetmethod(message) 
     34        response = None 
     35        for result in gen: 
     36            if result != None: 
     37                response = result 
     38        return response             
     39                     
     40 
  • trunk/sandbox/jhb/oc2/wallet.py

    r269 r270  
    2121        self.storage.setdefault('outgoing',{})[message.transactionId] = message 
    2222 
     23    def getOutgoing(self,tid): 
     24        return self.storage.setdefault('outgoing',{})[tid] 
     25 
    2326    def addIncoming(self,message): 
    2427        self.storage.setdefault('incoming',{})[message.transactionId] = message 
     28         
     29    def getIncoming(self,tid): 
     30        return self.storage.setdefault('incoming',{}).get(tid,None) 
    2531 
    2632    def getApproval(self,message): 
    27         sum = message.sum 
    28         target = message.sum 
     33        amount = message.amount 
     34        target = message.target 
    2935        approval = getattr(self,'approval',True) #get that from ui 
    3036        if approval == True: