Как мне реализовать разные виды в Angular? - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь реализовать симуляцию для блокчейна.Блокчейн состоит из сети с майнерами.В моем примере у меня 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 узлами:

enter image description here

В верхнем блоке должна отображаться информация отблок узла.В нижнем блоке должен отображаться пул с транзакциями, которые в данном случае принадлежат узлу 1.

enter image description here

...