Thanks for your questions! Allow me to answer all questions in a single post:
Getting the exchange rate on the IC: You can query the current rate from the NNS registry (using the key
It may look that way but the exchange rate does not come from a single exchange. There are multiple price oracles running in different places and each price oracle obtains current ICP/USD (or ICP/USDT) and USD/XDR rates from multiple exchanges and market data providers. The reason why you see a single source for the ICP/USD rate is that the median rate is chosen after collecting all rates (to protect against outliers). So, this process is decentralized.
The rate is based on the opening price of the current 1-minute window. As the opening price does not change once it is set, each exchange should return exactly the same price for every requesting oracle within the same minute.
As mentioned in the Medium article, one instance will create a proposal based on the locally computed exchange rate. The other instances will support this proposal (only) if the proposed rate is close their local exchange rate.
It is a good question whether updating every 10 minutes is fast enough. In short, I don’t know. But yes, the frequency could definitely be increased if there is a need.
The decentralized oracles all run outside of the IC by necessity as canisters currently cannot pull data from the outside world.