diff --git a/forum-network/src/classes/forum-network/forum-node.js b/forum-network/src/classes/forum-network/forum-node.js deleted file mode 100644 index ff76ed7..0000000 --- a/forum-network/src/classes/forum-network/forum-node.js +++ /dev/null @@ -1,67 +0,0 @@ -import { Action } from '../display/action.js'; -import { - Message, PostMessage, PeerMessage, messageFromJSON, -} from './message.js'; -import { NetworkNode } from './network-node.js'; -import { randomID } from '../../util/helpers.js'; - -export class ForumNode extends NetworkNode { - constructor(name, scene) { - super(name, scene); - this.actions = { - ...this.actions, - storePost: new Action('store post', scene), - }; - } - - // Process a message from the queue - async processMessage(messageJson) { - try { - await Message.verify(messageJson); - } catch (e) { - await this.actions.processMessage.log(this, this, 'invalid signature', null, '-x'); - console.log(`${this.name}: received message with invalid signature`); - return; - } - - const { publicKey } = messageJson; - const message = messageFromJSON(messageJson); - - if (message instanceof PostMessage) { - await this.processPostMessage(publicKey, message.content); - } else if (message instanceof PeerMessage) { - await this.processPeerMessage(publicKey, message.content); - } else { - // Unknown message type - // Penalize sender for wasting our time - } - } - - // Process an incoming post, received by whatever means - async processPost(authorId, post) { - if (!post.id) { - post.id = randomID(); - } - await this.actions.storePost.log(this, this); - // this.forumView.addPost(authorId, post.id, post, stake); - } - - // Process a post we received in a message - async processPostMessage(authorId, { post, stake }) { - this.processPost(authorId, post, stake); - await this.broadcast( - new PeerMessage({ - posts: [{ authorId, post, stake }], - }), - ); - } - - // Process a message we receive from a peer - async processPeerMessage(peerId, { posts }) { - // We are trusting that the peer verified the signatures of the posts they're forwarding. - // We could instead have the peer forward the signed messages and re-verify them. - for (const { authorId, post, stake } of posts) { - this.processPost(authorId, post, stake); - } - } -} diff --git a/forum-network/src/classes/forum-network/message.js b/forum-network/src/classes/forum-network/message.js deleted file mode 100644 index c0cb1be..0000000 --- a/forum-network/src/classes/forum-network/message.js +++ /dev/null @@ -1,65 +0,0 @@ -import { CryptoUtil } from '../supporting/crypto.js'; -import { PostContent } from '../supporting/post-content.js'; - -export class Message { - constructor(content) { - this.content = content; - } - - async sign({ publicKey, privateKey }) { - this.publicKey = await CryptoUtil.exportKey(publicKey); - // Call toJSON before signing, to match what we'll later send - this.signature = await CryptoUtil.sign(this.contentToJSON(), privateKey); - return this; - } - - static async verify({ content, publicKey, signature }) { - return CryptoUtil.verify(content, publicKey, signature); - } - - contentToJSON() { - return this.content; - } - - toJSON() { - return { - type: this.type, - content: this.contentToJSON(), - publicKey: this.publicKey, - signature: this.signature, - }; - } -} - -export class PostMessage extends Message { - type = 'post'; - - constructor({ post, stake }) { - super({ - post: PostContent.fromJSON(post), - stake, - }); - } - - contentToJSON() { - return { - post: this.content.post.toJSON(), - stakeAmount: this.content.stake, - }; - } -} - -export class PeerMessage extends Message { - type = 'peer'; -} - -const messageTypes = new Map([ - ['post', PostMessage], - ['peer', PeerMessage], -]); - -export const messageFromJSON = ({ type, content }) => { - const MessageType = messageTypes.get(type) || Message; - // const messageContent = MessageType.contentFromJSON(content); - return new MessageType(content); -}; diff --git a/forum-network/src/classes/forum-network/network-node.js b/forum-network/src/classes/forum-network/network-node.js deleted file mode 100644 index 345e3ad..0000000 --- a/forum-network/src/classes/forum-network/network-node.js +++ /dev/null @@ -1,58 +0,0 @@ -import { Actor } from '../display/actor.js'; -import { Action } from '../display/action.js'; -import { CryptoUtil } from '../util/crypto.js'; -import { PrioritizedQueue } from '../util/prioritized-queue.js'; - -export class NetworkNode extends Actor { - constructor(name, scene) { - super(name, scene); - this.queue = new PrioritizedQueue(); - this.actions = { - peerMessage: new Action('peer message', scene), - }; - } - - // Generate a signing key pair and connect to the network - async initialize(forumNetwork) { - this.keyPair = await CryptoUtil.generateAsymmetricKey(); - this.forumNetwork = forumNetwork.addNode(this); - this.status.set('Initialized'); - return this; - } - - // Send a message to all other nodes in the network - async broadcast(message) { - await message.sign(this.keyPair); - const otherForumNodes = this.forumNetwork - .listNodes() - .filter((forumNode) => forumNode.keyPair.publicKey !== this.keyPair.publicKey); - for (const forumNode of otherForumNodes) { - // For now just call receiveMessage on the target node - // await this.actions.peerMessage.log(this, forumNode, null, message.content); - await this.actions.peerMessage.log(this, forumNode); - await forumNode.receiveMessage(JSON.stringify(message.toJSON())); - } - } - - // Perform minimal processing to ingest a message. - // Enqueue it for further processing. - async receiveMessage(messageStr) { - const messageJson = JSON.parse(messageStr); - // const senderReputation = this.forumView.getReputation(messageJson.publicKey) || 0; - const senderReputation = 0; - this.queue.add(messageJson, senderReputation); - } - - // Process next highest priority message in the queue - async processNextMessage() { - const messageJson = this.queue.pop(); - if (!messageJson) { - return null; - } - return this.processMessage(messageJson); - } - - // Process a message from the queue - // async processMessage(messageJson) { - // } -} diff --git a/forum-network/src/classes/forum-network/network.js b/forum-network/src/classes/forum-network/network.js deleted file mode 100644 index 6e7e4cd..0000000 --- a/forum-network/src/classes/forum-network/network.js +++ /dev/null @@ -1,14 +0,0 @@ -export class Network { - constructor() { - this.nodes = new Map(); - } - - addNode(node) { - this.nodes.set(node.keyPair.publicKey, node); - return this; - } - - listNodes() { - return Array.from(this.nodes.values()); - } -} diff --git a/forum-network/src/index.html b/forum-network/src/index.html index c0d4a65..86d1514 100644 --- a/forum-network/src/index.html +++ b/forum-network/src/index.html @@ -29,7 +29,6 @@