def test_adding_messages_links_them_correctly(self): msg1 = Message("first") msg2 = Message("second") block = Block() block.add_message(msg1) block.add_message(msg2) self.assertEqual(msg2.prev_hash, msg1.hash)
def get_blocks(self, *args): L = [] for arg in args: b = Block() b.add_message(Message(arg)) L.append(b) for i, block in enumerate(L): block.link(L[i-1]) if i > 0 else None block.seal() return L
from blockchain import Message, Block, Blockchain import pickle B1 = Block() B1.add_message(Message("This is the 1st message")) B1.add_message(Message("2nd message", "Alice", "Bob")) B1.add_message(Message("3rd message", "Bob", "Alice")) B1.seal() B2 = Block() B2.add_message(Message("4th message")) B2.add_message(Message("5th message", "Eve", "Steve")) B2.seal() B3 = Block() B3.add_message(Message("6th message")) B3.add_message(Message("7th message", "Me", "Everyone")) B3.seal() chain = Blockchain() chain.add_block(B1) chain.add_block(B2) chain.add_block(B3) print("Validating blockchain...") chain.validate() print("Serializing...") pickle.dump(chain, open('chain.p', 'wb')) print("Deserializing and validating...")
from blockchain import Message, Block, Blockchain import pickle B1 = Block() B1.add_message(Message("This is the first message")) B1.add_message(Message("Second message", "Alice", "Bob")) B1.add_message(Message("Third message", "Bob", "Alice")) B1.seal() B2 = Block() B2.add_message(Message("Fourth message")) B2.add_message(Message("Fifth message", "Eve", "Steve")) B2.seal() B3 = Block() B3.add_message(Message("Sixth message")) B3.add_message( Message("Seventh Son of a Seventh Son is Iron Maiden's best album", "Me", "Everyone")) B3.seal() B4 = Block() B4.add_message(Message("Eighth message", "Bob", "Charlie")) B4.add_message(Message("Ninth message", "Charlie", "Daniels")) B4.add_message(Message("Tenth message", "Charlie", "Brown")) chain = Blockchain() chain.add_block(B1) chain.add_block(B2) chain.add_block(B3) chain.add_block(B4)
class Boid(Physics_object): def __init__(self, game, position): super().__init__(game, position) self.image = pg.Surface((20, 20)) self.image.fill(WHITE) self.rect = self.image.get_rect() self.speed = randint(2, 3) self.max_force = 0.3 self.friction = 0.75 self.target = vec(0, 0) self.extent = vec(0, 0) self.theta = 0 self.id = random.random() self.b = Block() msg = str(self.id) self.b.add_message(Message(msg)) chain.add_block(self.b) print(self.id) def update(self): # seek a target self.acc += self.wander() # flocking behavior (see youtube video for explanation) alignment = self.alignment() separation = self.separation() cohesion = self.cohesion() # adjust the vectors according to the chosen slider values alignment *= self.game.slider1.get_val() separation *= self.game.slider2.get_val() cohesion *= self.game.slider3.get_val() # add flocking to the acceleration vector self.acc += alignment self.acc += separation self.acc += cohesion super().update() def alignment(self): perception_radius = 40 steering = vec(0, 0) total = 0 for other in self.game.all_sprites: if other != self: dist = other.pos.distance_to(self.pos) if dist < perception_radius: steering += other.vel total += 1 if total > 0: steering *= 1 / total steering -= self.vel limit(steering, self.max_force) return steering def separation(self): perception_radius = 40 steering = vec(0, 0) total = 0 for other in self.game.all_sprites: if other != self: d = self.pos - other.pos dist = d.length() if dist < perception_radius: d /= (dist * dist) steering += d total += 1 if total > 0: steering /= total steering.scale_to_length(self.speed) steering -= self.vel limit(steering, self.max_force) return steering def cohesion(self): perception_radius = 80 steering = vec(0, 0) total = 0 for other in self.game.all_sprites: if other != self: dist = other.pos.distance_to(self.pos) if dist < perception_radius: steering += other.pos total += 1 if total > 0: steering *= 1 / total steering -= self.pos steering.scale_to_length(self.speed) steering -= self.vel limit(steering, self.max_force) return steering def arrive(self, target): # make the boid move to a target position desired = target - self.pos d = desired.length() desired = desired.normalize() radius = 100 if d < radius: m = remap(d, 0, radius, 0, self.speed) desired *= m else: desired *= self.speed # calculate steering force steering = desired - self.vel limit(steering, self.max_force) return steering def wander(self): # calculate a target that changes slightly each frame by a random angle if self.vel.length_squared() != 0: # extent vector as a multiple of the velocity self.extent = self.vel.normalize() * 80 # radius r = 30 # change the angle by a small random amount each frame self.theta += uniform(-1, 1) / 16 self.target = self.pos + self.extent + vec(r * cos(self.theta), r * sin(self.theta)) return self.arrive(self.target)
from blockchain import Message, Block, Blockchain import pickle B1 = Block() B1.add_message(Message("This is the first message")) B1.add_message(Message("Second message", "Alice", "Bob")) B1.add_message(Message("Third message", "Bob", "Alice")) B1.seal() B2 = Block() B2.add_message(Message("Fourth message")) B2.add_message(Message("Fifth message", "Eve", "Steve")) B2.seal() B3 = Block() B3.add_message(Message("Sixth message")) B3.add_message(Message("Seventh Son of a Seventh Son is Iron Maiden's best album", "Me", "Everyone")) B3.seal() B4 = Block() B4.add_message(Message("Eighth message", "Bob", "Charlie")) B4.add_message(Message("Ninth message", "Charlie", "Daniels")) B4.add_message(Message("Tenth message", "Charlie", "Brown")) chain = Blockchain() chain.add_block(B1) chain.add_block(B2) chain.add_block(B3) chain.add_block(B4) print("Validating blockchain...")
def test_add_message_appends_and_links_message(self): msg = Message("test") block = Block() block.add_message(msg) self.assertEqual(1, len(block.messages)) self.assertEqual(msg, block.messages[0])
def get_block(self, msg): B = Block() B.add_message(Message(msg)) return B