dao-governance-framework/forum-network/src/classes/expert.js

116 lines
4.4 KiB
JavaScript
Raw Normal View History

2022-12-31 16:08:42 -06:00
import { Actor } from './actor.js';
import { Action } from './action.js';
import { PostMessage } from './message.js';
import { CryptoUtil } from './crypto.js';
2023-01-03 12:00:12 -06:00
export class Expert extends Actor {
constructor(name, scene) {
super(name, scene);
this.actions = {
submitPostViaNetwork: new Action('submit post via network', scene),
2022-12-31 16:08:42 -06:00
submitPost: new Action('submit post', scene),
initiateValidationPool: new Action('initiate validation pool', scene),
2023-01-12 16:41:55 -06:00
stake: new Action('stake on post', scene),
2022-12-31 16:08:42 -06:00
revealIdentity: new Action('reveal identity', scene),
2023-01-02 13:14:32 -06:00
registerAvailability: new Action('register availability', scene),
getAssignedWork: new Action('get assigned work', scene),
submitWork: new Action('submit work evidence', scene),
};
2022-11-13 12:23:30 -06:00
this.validationPools = new Map();
}
async initialize() {
2022-11-12 16:20:42 -06:00
this.reputationKey = await CryptoUtil.generateAsymmetricKey();
2022-11-17 08:30:06 -06:00
// this.reputationPublicKey = await CryptoUtil.exportKey(this.reputationKey.publicKey);
this.reputationPublicKey = this.name;
2022-12-31 16:08:42 -06:00
this.status.set('Initialized');
return this;
}
async submitPostViaNetwork(forumNode, post, stake) {
2022-11-12 16:20:42 -06:00
// TODO: Include fee
const postMessage = new PostMessage({ post, stake });
2022-11-12 16:20:42 -06:00
await postMessage.sign(this.reputationKey);
await this.actions.submitPostViaNetwork.log(this, forumNode, null, { id: post.id });
// For now, directly call forumNode.receiveMessage();
await forumNode.receiveMessage(JSON.stringify(postMessage.toJSON()));
}
2022-11-11 16:52:57 -06:00
async submitPost(forum, postContent) {
// TODO: Include fee
await this.actions.submitPost.log(this, forum);
return forum.addPost(this.reputationPublicKey, postContent);
}
async submitPostWithFee(bench, forum, postContent, poolOptions) {
await this.actions.submitPost.log(this, forum);
const postId = await forum.addPost(this.reputationPublicKey, postContent);
const pool = await this.initiateValidationPool(bench, { ...poolOptions, postId, anonymous: false });
return { postId, pool };
}
async initiateValidationPool(bench, poolOptions) {
// For now, directly call bench.initiateValidationPool();
if (poolOptions.anonymous) {
const signingKey = await CryptoUtil.generateAsymmetricKey();
poolOptions.signingPublicKey = await CryptoUtil.exportKey(signingKey.publicKey);
} else {
poolOptions.signingPublicKey = this.reputationPublicKey;
}
await this.actions.initiateValidationPool.log(
2022-11-30 09:13:52 -06:00
this,
bench,
2023-01-08 20:19:33 -06:00
`(fee: ${poolOptions.fee}, stake: ${poolOptions.authorStake ?? 0})`,
2022-11-30 09:13:52 -06:00
);
const pool = await bench.initiateValidationPool(poolOptions);
this.validationPools.set(pool.id, poolOptions);
2022-11-17 08:30:06 -06:00
return pool;
2022-11-12 16:20:42 -06:00
}
2023-01-12 16:41:55 -06:00
async stake(validationPool, {
position, amount, lockingTime, anonymous = false,
2023-01-02 13:14:32 -06:00
}) {
let signingPublicKey;
if (anonymous) {
const signingKey = await CryptoUtil.generateAsymmetricKey();
signingPublicKey = await CryptoUtil.exportKey(signingKey.publicKey);
this.validationPools.set(validationPool.id, { signingPublicKey });
} else {
signingPublicKey = this.reputationPublicKey;
}
2023-01-12 16:41:55 -06:00
// TODO: encrypt stake
2022-11-12 16:20:42 -06:00
// TODO: sign message
2023-01-12 16:41:55 -06:00
await this.actions.stake.log(
2022-11-30 09:13:52 -06:00
this,
validationPool,
2023-01-12 16:41:55 -06:00
`(${position ? 'for' : 'against'}, stake: ${amount}, anonymous: ${anonymous})`,
2022-11-30 09:13:52 -06:00
);
2023-01-12 16:41:55 -06:00
return validationPool.stake(signingPublicKey, {
position, amount, lockingTime, anonymous,
2023-01-02 13:14:32 -06:00
});
2022-11-11 16:52:57 -06:00
}
2023-01-02 13:14:32 -06:00
async revealIdentity(validationPool) {
const { signingPublicKey } = this.validationPools.get(validationPool.id);
2022-11-12 16:20:42 -06:00
// TODO: sign message
await this.actions.revealIdentity.log(this, validationPool);
2022-11-13 12:23:30 -06:00
validationPool.revealIdentity(signingPublicKey, this.reputationPublicKey);
2022-11-11 16:52:57 -06:00
}
2023-01-01 21:09:02 -06:00
2023-01-02 13:14:32 -06:00
async registerAvailability(availability, stake) {
await this.actions.registerAvailability.log(this, availability, `(stake: ${stake})`);
2023-01-02 13:14:32 -06:00
await availability.register(this.reputationPublicKey, stake);
}
async getAssignedWork(availability, business) {
const requestId = await availability.getAssignedWork(this.reputationPublicKey);
const request = await business.getRequest(requestId);
return request;
}
async submitWork(business, requestId, evidence, { tokenLossRatio, duration }) {
await this.actions.submitWork.log(this, business);
2023-01-02 13:14:32 -06:00
return business.submitWork(this.reputationPublicKey, requestId, evidence, { tokenLossRatio, duration });
2023-01-01 21:09:02 -06:00
}
}