Я пытаюсь реализовать симуляцию для блокчейна.Блокчейн состоит из сети с майнерами.В моем примере у меня 10 майнеров.У каждого из этих майнеров есть блок-кандидат, в который они помещают транзакции из пула транзакций.Транзакции приходят из сети и помещаются в пул транзакций.Пример: если майнер 1 помещает транзакцию A в свой блок-кандидат, транзакция A все еще должна быть доступна в пуле транзакций майнеров 2-10.Это все еще доступно, потому что транзакция еще не была добыта.Если блок Miner 1 добывается, то транзакция A должна быть удалена из каждого пула транзакций.
Проблема состоит в том, как реализовать различные представления для каждого узла.Как мне переключаться между узлами и поддерживать пул транзакций подключенным к каждому узлу?
Я использую сетку в своем проекте.Одна сетка отображает сеть со всеми узлами.Одна сетка отображает блоки каждого узла.Одна сетка отображает глобальные транзакции, которые хранятся в пуле.Но каждый узел должен хранить транзакции локально, что означает, что если узел 1 принимает одну транзакцию, транзакция все равно должна выполняться для узла 2 и других.
Miner-View.ts:
export class MinerViewComponent implements OnDestroy, OnInit {
transaction: Transaction;
displayedColumns: string[] = ['sender', 'recipient', 'amount', 'fee'];
dataSource = new MatTableDataSource<Transaction>(ELEMENT_DATA);
temp: Transaction[] = [];
blockNumber = 1;
previousHash = '00000000000000000000000000000000';
blockHash: string = this.generateFirstHash();
blockHashList: string[] = [];
panelOpenState = false;
message: any;
subscription: Subscription;
constructor(private ref: ChangeDetectorRef, private emitTransactionService: EmitTransactionService,
private messageService: MessageService) {
this.subscription = this.messageService.getMessage().subscribe(message => {
this.message = message;
this.sendBlockToBC();
this.clearBlock();
});
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
ngOnInit() {
this.emitTransactionService.row$.subscribe(transaction => {
this.transaction = transaction;
this.temp = this.dataSource.data.slice();
this.temp.push(this.transaction);
this.dataSource.data = this.temp;
this.ref.detectChanges();
}
);
this.temp = this.dataSource.data.slice();
this.temp.pop();
this.dataSource.data = this.temp;
this.ref.detectChanges();
}
/** This method clears the current block of the miner (transactions only), when a new block has been added to the
* blockchain. **/
clearBlock() {
this.ref.detectChanges();
console.log('Transactions none.');
}
sendMessage(): void {
this.messageService.sendMessage2('Message from miner view component to block-card component!');
}
/** This method puts the block from the active miner in the blockchain (when he got the proof-of-...). **/
sendBlockToBC() {
const block = new Block(this.blockNumber, this.temp, this.previousHash, this.blockHash);
this.emitTransactionService.emitBlock(block);
setTimeout(() => {
console.log(block);
this.temp = null;
this.dataSource = undefined; // to empty the table in the miner view component
this.dataSource = new MatTableDataSource<Transaction>(ELEMENT_DATA); // create new datasource to fill the table,
// since the old one gives an error
this.generateBlockHash();
this.raiseBlockNumber();
this.sendMessage();
},
100);
}
Transaction-pool-component.ts:
export class TransactionPoolComponent implements OnInit {
displayedColumns: string[] = ['select', 'sender', 'recipient', 'amount', 'fee'];
dataSource = new MatTableDataSource<Transaction>(ELEMENT_DATA);
selection = new SelectionModel<Transaction>(true, []);
transaction: Transaction;
temp: Transaction[];
constructor(private ref: ChangeDetectorRef, private emitTransactionService: EmitTransactionService) {
}
/** This method gets the selected row as input. The selected row then gets deleted from the transaction
* pool and appears in the block of the miner. **/
putTXInBlock(row) {
this.temp = this.dataSource.data.slice();
for (let i = 0; i < this.temp.length; i++) {
if (JSON.stringify(row) === JSON.stringify(this.temp[i]) ) {
this.temp.splice(i, 1);
break;
}
}
this.dataSource.data = this.temp;
this.ref.detectChanges();
this.emitTransactionService.emitRow(row);
}
ngOnInit() {
this.emitTransactionService.transaction$.subscribe(transaction => {
this.transaction = transaction;
this.temp = this.dataSource.data.slice();
this.temp.push(this.transaction);
this.dataSource.data = this.temp;
this.ref.detectChanges();
}
);
this.temp = this.dataSource.data.slice();
this.temp.pop();
this.dataSource.data = this.temp;
this.ref.detectChanges();
}
}
На данный момент я только что реализовал его для узла 1. Я думаю, что мне нужно изменить всю концепцию моего кода, или он может работать с небольшимменять?Я хочу, чтобы это работало для всех узлов.
Проблема: на данный момент я не знаю, как управлять источниками данных отдельно для всех 10 узлов.Потому что каждый узел должен иметь свой собственный источник данных со всеми глобальными транзакциями.Другое дело, как подключить все 10 узлов к интерфейсу.Моя идея заключалась в том, чтобы реализовать кнопку < >
, где я могу переключаться между 1-10.Но какой самый простой способ сделать это?Под представлениями для каждого узла я имею в виду, что у каждого узла есть собственный пул транзакций, в который помещаются все глобальные транзакции. И тогда каждый узел может поместить эти транзакции в свой собственный блок.НО эти транзакции не удаляются для других узлов.Моя проблема связана с UX и моделью данных.
Если вам нужна дополнительная информация или что-то неясно, пожалуйста, сообщите мне.Тогда я попытаюсь улучшить вопрос.
Сеть с 10 узлами:
В верхнем блоке должна отображаться информация отблок узла.В нижнем блоке должен отображаться пул с транзакциями, которые в данном случае принадлежат узлу 1.