---
# System prepended metadata

title: Note Konstantin Biskub
tags: [Hiring]

---

---
# https://hackmd.io/yaml-metadata#tags
tags: Hiring
---
# Note Konstantin Biskub

## Summary

- Repo: https://github.com/vscode1111/indexer
- Voto: 3/5

## Tecnologie usate

- fastify / TypeORM
- postgres

## Note

### Generali
- :question: Perchè Postgres?

### Write a process in TypeScript that keeps updated in an appropriate database the transactions injected in the last 10,000 c-chain blocks:
- :+1: Uso di  object.freeze per la configurazione
- :-1: Validazione manuale della configurazione, solo required praticamente.
- :-1: Nome `syncBlock` non è molto adatto.
- :-1: `syncBlock` non viene await-ato
- :-1: `syncBlock` che si chiama ricorsivamente non è proprio buono
- :+1: Codice pare ne sappia scrivere, un po' confusionario e con pochi commenti però.
- :thinking_face: Che fa Multiset? Praticamente è un modo per creare una "coda" dove ogni blocco può essere inserito una volta sola.
- :thinking_face: Perchè transaction index null? 
- :question: Come potresti migliorare design del pezzo `syncBlock`?
    - Aspettative: Forkare o comunque usare qualche altro metodo più chiaro come funzionamento
- :question: Abbiamo visto MultiSet, ti viene in mente un modo più "pulito" per ottenere lo stesso risultato?

### list transactions made or received from a certain address sorted by blockNumber and transactionIndex:
- :-1: Design API meh (`/transactions/0x...` e `/transactions/top-values`)
- :-1: Manca paginazione
- :-1: Manca indice composto address,block_number,transactions_index
- :-1: Perchè un file per rotta?
- :-1: Paginazione assente, la rotta ritorna tutte le tx
- :question: Assumendo di aver salvato milioni di transazioni, ti possiamo già dire che questo endpoint è lento. Perchè? Come lo miglioreresti?
- :question: Questo endpoint è privo di paginazione, come potresti paginare i risultati?

### number of transactions made or received from a certain address
- :-1: Endpoint ritorna il numero in plain text, mentre gli altri endpoint sono JSON
- :question: Ipotizziamo di avere un billion di transazioni nel db; le count risultano quindi inefficienti. Ti viene in mente un modo per velocizzare le count?

### list of transactions sorted by value (amount of $AVAX moved)
- :+1: Indice su value ok
- :-1: Paginazione assente, la rotta ritorna solo le top 1000 tx.
- :question: Perchè filtro value > 0?
- :question: Questo endpoint è privo di paginazione, come potresti paginare i risultati?

### list of 100 addresses with largest balance that made or received a transaction
- :-1: Indice su value inutile in quanto si sta salvando per ogni address il balance ad ogni blocco e quindi deve fare una sottoquery.
- :-1: Memorizza balance storico
- :question: Perché ti salvi i balance di ogni indirizzo a ogni blocco?
- :question: Ti viene in mente un modo per evitare il sort della tabella di tutti gli indirizzi / per ottimizzare ulteriormente la query?


## Colloquio 2023-02-22

### Summary
Non siamo sicuri che abbia scritto lui il codice, o se lo ha fatto ha copiato pezzi da altri progetti su cui ha lavorato senza entrare bene nel dettaglio e comprenderli.

### Bitcoin utxo model vs wallet model
Bitcoin does not support smart contracts, Ethereum does.

:question: Ok ma qual è la differenza fra UTXO e Wallet model?

Parla di validatori e proof of work vs proof of stake.

### Purpose of gas on Ethereum
Amount of liquidity to pay validators/miners for transactions. Meh

### Tell me about some Ethereum standards for fungible/non fungible tokens

Parla del concetto di fungible tokens in generale, ma non dello standard. Poi cita ERC721 e ERC1155, ma dice cose strane tipo "with erc721 you can sell entire collections"

### Assuming you wanted to store ERC20 transfers on a database, how would you do that?

Dopo un paio di aiutini, dice che estrarrebbe gli eventi via RPC tramite provider tipo Alchemy.

### Why Postgres? 
Because I just needed to retrieve information for sorting/grouping data. I like mongo, but in some cases for analytics it's so difficult. It's hard to write SQL-like queries with aggregation framework.

### Why did you do manual config validation?
Copy pasted previous templates. There are many validators on npm.

:question: Do you know any?

Don't remember the name.

### Indexer process
In previous companies we split our code in multiple npm packages (common, indexer, api). I did not do it here because it was simpler.

:question: Why the indexer is not a separate project? 

Over engineering.

:question: How would you turn that into a production system?

Separate npm packages. One dockerfile for each project, CI/CD.

### syncBlock is weird, how would improve that?
Mi spiega un pochino cosa fa il codice, dice solo qualcosa di generico sull'avere più processi.

> Gli faccio presente che recursion non va benissimo, e che lanciare funzioni async senza await pure non è bellissimo, ma non sembra tirare fuori alternative sensate.

Cita un po' di buzzword, event listener, etc... 
Some part of code produces tasks, other parts of code consume them, for example using rabbitmq.
Un po' troppo vago però.

### Why multiSet? Simpler alternatives to multiSet
Because I had issues with synchronization between 2 data storages.
Si mette a parlare di creare classi Algorithm e Data Storages.

Non capisce la domanda, l'impressione è che non abbia scritto il codice lui.

Quando gli dico che potrebbe aver usato una queue semplice capisce un pelo meglio cosa gli voglio chiedere, ma comunque non risponde in maniera sufficiente. Dice che se hai una coda semplice devi sincronizzare l'accesso e tracciare cosa viene processato e cosa no.


### Other ways to structure routes

> /transactions/0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7 is a bit weird because we have an address after /transactions

For transactions I could use the tx hash as identifier. I would then use filters to identify transactions for a certain address.

`/transactions/?account=0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7`

:question: How about the count endpoint?

`/transactions/account=0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7&anlize=count`

