Changeset 270
- Timestamp:
- 04/21/09 21:42:46 (3 years ago)
- Location:
- trunk/sandbox/jhb/oc2
- Files:
-
- 5 modified
-
documentation.py (modified) (2 diffs)
-
messages.py (modified) (5 diffs)
-
protocols.py (modified) (2 diffs)
-
transports.py (modified) (1 diff)
-
wallet.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/sandbox/jhb/oc2/documentation.py
r269 r270 608 608 >>> bobwallet = Wallet({}) 609 609 610 >>> a clicetid = wallet.makeSerial()610 >>> alicetid = wallet.makeSerial() 611 611 >>> bob = protocols.SumAnnounceListen(bobwallet) 612 >>> alice = protocols.SumAnnounce(bob.run, wallet, 5, 'foobar')612 >>> alice = protocols.SumAnnounce(bob.run, wallet, alicetid, 5, 'foobar') 613 613 >>> bobwallet.approval = "I don't like odd sums" 614 614 >>> alice.run() … … 647 647 tokens. 648 648 649 ############################################################################### 650 651 >>> bob = protocols.SpendListen(bobwallet) 652 >>> transport = transports.YieldTransport(bob.run,[]) 653 >>> alice = protocols.SpendRequest(transport, wallet, 'foobar', [coin]) 654 >>> alice.run() 655 Traceback (most recent call last): 656 .... 657 SpendReject: unknown transactionId 658 659 >>> alice = protocols.SpendRequest(transport, wallet, alicetid, []) 660 >>> alice.run() 661 Traceback (most recent call last): 662 .... 663 SpendReject: amount of coins does not match announced one 664 665 >>> alice = protocols.SpendRequest(transport, wallet, alicetid, [coin]) 666 >>> alice.run() 667 True 668 669 ############################################################################### 649 670 650 671 3.7 Redeeming tokens -
trunk/sandbox/jhb/oc2/messages.py
r269 r270 11 11 Container.fromData(self,data) 12 12 self.header = self.__class__.__name__ 13 14 class MessageException(Message,Exception): 15 16 def __str__(self): 17 return str(self.reason) 13 18 14 19 class AskLatestCDD(Message): … … 36 41 Field('target'), 37 42 Field('blinds'), 38 SubitemsField('coins' ),43 SubitemsField('coins',klass=container.Coin), 39 44 Field('options'), 40 45 ] … … 86 91 fields = Message.fields + [ 87 92 Field('transactionId'), 88 Field(' sum'),93 Field('amount'), 89 94 Field('target'), 90 95 ] … … 96 101 97 102 98 class SumReject(Message ):103 class SumReject(Message,Exception): 99 104 fields = Message.fields + [ 100 105 Field('transactionId'), … … 102 107 ] 103 108 109 class SpendRequest(Message): 110 fields = Message.fields + [ 111 Field('transactionId'), 112 SubitemsField('coins',klass=container.Coin), 113 ] 114 115 class SpendAccept(Message): 116 fields = Message.fields + [ 117 Field('transactionId'), 118 ] 104 119 105 120 121 class 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 180 180 class SumAnnounce(Protocol): 181 181 182 def __init__(self,transport,wallet, sum,target):183 self.transport = transport 184 self. sum = sum182 def __init__(self,transport,wallet,tid,amount,target): 183 self.transport = transport 184 self.amount = amount 185 185 self.target = target 186 self. wallet = wallet187 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): 190 190 message = messages.SumAnnounce() 191 message.transactionId = tid192 message. sum = self.sum191 message.transactionId = self.tid 192 message.amount = self.amount 193 193 message.target = self.target 194 194 self.wallet.addOutgoing(message) 195 195 response = self.transport(message) 196 if response.header == 'SumAccept': 196 if response.header == 'SumReject': 197 return response.reason 198 else: 197 199 return True 198 else:199 return response.reason200 200 201 201 … … 215 215 return answer 216 216 217 218 class 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 236 class 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 217 265 class CoinsSpendSender(Protocol): 218 266 -
trunk/sandbox/jhb/oc2/transports.py
r256 r270 23 23 return createMessage(response.read()) 24 24 25 class YieldTransport(object): 25 26 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 21 21 self.storage.setdefault('outgoing',{})[message.transactionId] = message 22 22 23 def getOutgoing(self,tid): 24 return self.storage.setdefault('outgoing',{})[tid] 25 23 26 def addIncoming(self,message): 24 27 self.storage.setdefault('incoming',{})[message.transactionId] = message 28 29 def getIncoming(self,tid): 30 return self.storage.setdefault('incoming',{}).get(tid,None) 25 31 26 32 def getApproval(self,message): 27 sum = message.sum28 target = message. sum33 amount = message.amount 34 target = message.target 29 35 approval = getattr(self,'approval',True) #get that from ui 30 36 if approval == True:
