Fermat-ORG / fermat-framework

This is the Fermat Framework described on the first Fermat whitepaper. The Java Framework, Android Framework, Linux Framework, and all platforms are here. This project is currently paused until we put the network infraestructure in place. Later this work will be resumed to put this client-side infraestructure to work with the new set of networks.
https://drive.google.com/file/d/0B02V15ufCwR3UDNER3l2WGVmcE0/view
Other
2 stars 2 forks source link

Definir las interfaces del plugin Crypto Index de la capa World #1067

Closed EzequielPostan closed 9 years ago

EzequielPostan commented 9 years ago

Crypto Index - Capa World

Este plugin tiene como función obtener la relación de conversión de las monedas fiat soportadas por la plataforma con respecto a las cryptomonedas. Debe poder consultarse esta relación tanto sobre el momento actual como sobre un punto particular en el tiempo.

Feature

Consultar el valor de la relación crypto con respecto a una moneda fiat en un momento de tiempo.

Una api usada por ejemplo por coinDesk que ofrece en parte este servicio es:

https://openexchangerates.org/documentation

Se debe analizar su uso, licencia y aplicabilidad en nuestra plataforma.

Flujo

https://openexchangerates.org/documentation#how-to-use

laderuner commented 9 years ago

Proveedores de información sobre las tasas actuales y registros históricos.

A continuación se listan una serie de sitio web que provee información, cotizaciones y registros histórico de diferente Crypto Currensies.

https://openexchangerates.org/ Publicado en a documentación. Ofrece tasa de cambios actualizado por hora relacionado con dolares y se publican en formato JSON que también se actualiza cada hora. El Lapso de actualización es un poco amplio, ya que en una hora las cotizaciones varían considerablemente.
Por ultimo no ofrece ninguna opción gratuita. https://www.cryptocoincharts.info/tools/api Provee web service RestFull y también url JSON para acceder a las diferentes cotizaciones. Además posee una una buena cantidad de Tipos de Crypto Currensies y Fiat Currensies. Por lo que se ve a simple vista parece ser gratuito aunque también se ve un importante retardo a la hora de actualizar. https://bter.com/api En esta API parece ofrecer un extenso listado de Crypto Currensies y sus cotizaciones, también un grupo de amplio de walletes. Al igual que las anteriores publica los datos en formato JSON. La API parece ser gratuita, aunque un poco confusa con los datos que provee. https://es.cryptonator.com/api Ofrece datos en formato JSON, probé con diferente Crypto Currensies en la url ofrecida de la API y muestra la cotizaciones sin problemas. No se sabe con exactitud cuantas Crypto Currensies muestra esta API pero parece ser tener un buen y amplio listado. Parece gratuita y es en castellano. http://www.coinwarz.com/v1/api/documentation API paga con una opción limitada gratuita, no posee un demo para verificar su funcionamiento y parece tener un abanico reducido de Crypto Currencies. Al igual que las anteriores provee datos en formato JSON.

Todas las URL antes mencionadas ofrecen un amplio historial de cotizaciones. Para dar una solución rápida es conveniente acceder a uno o mas de los servicios de API antes publicados. Todos utilizan formato JSON. JSON es un formato de texto plano y liviano que permite una carga rápida, puede ser guardado en el dispositivo y ser consultado sin necesidad de que haya una conexión a internet activa. Además permite un mejor registro sobre los historiales de cotizaciones. Otro punto importante es que no se necesita una lógica muy compleja para deserializar un JSON lo que da aun más rapidez para desarrollar.

Luis-Fernando-Molina commented 9 years ago

Yo me imagino que este plugin va a ir evolucionando en el tiempo respecto a de donde se alimenta de información. Es como que va a tener distintos proveedores, que incluso, en un futuro, el usuario final pudiera cambiar uno por otro.

El tema de que sean varios mitiga la posibilidad de un ataque a nuestro sistema basado en atacar al proveedor, manipulando su información.

La pregunta que me surge aquí @EzequielPostan es si estos proveedores debieran estar encapsulados cada uno en una clase que implemente una interfaz común dentro de cada plugin, o , ser en si mismo cada uno un plugin del cual nuestro plugin se alimente.

Consultar un proveedor pareciera ser una cantidad de código bastante chica y limitada, un par de lineas para hacer la consulta HTTP y algunas mas para decodificar la respuesta y ponerla en un formato común consumible por el crypto index. Sin embargo, si nos vamos por el modelo de que cada proveedor sea un plugin independiente, uno pudiera dejar que ese plugin luego evolucione, exponiendo mas servicios de la misma fuente. Por ejemplo:

Un pligin de Coindesk pudiera dar inicialmente el servicio de indice de precios, para luego evolucionar y dar servicio de noticias adicional al anterior.

Que sean plugins independiente puede ayudar también a que en algún futuro esos mismos actores de la industria creen el suyo propio, si ya ven al resto.

Finalmente quiero enfatizar que la elección de los proveedores no debe ser algo hecho a la ligera. Hay que entender de donde saca los datos cada uno, que tan cuidadosos son para filtrarlos cuando alguno de sus propios proveedores les manda fruta, quienes están atras de esos índices, etc. Yo no descartaría consultar la API de algúnos de los exchanges mas importantes directamente, de manera complementaria.

Otra cosa que quiero agregar, es que el histórico del crypto index nuestro, debira guardar lo que el, con su propia lógica determine que es el precio en cada momento. Supongamos que tiene 3 fuentes de datos y saca un promedio, entonces guarda ya ese promedio calculado. Si en algun momento ingnora una de las fuentes, guarda el promedio de las otras dos.

Lo que realmente haría falta en el mundo es una blockchain con las tasas de cambio. No se le habrá ocurrido eso a alguien ya?

leonacostaok commented 9 years ago

@Luis-Fernando-Molina Estuvimos hablando con @EzequielPostan y definimos que para el MVP el plugin debiera tener el siguiente comportamiento:

En una base de datos propia, almacenar, en un principio, sólo la última cotización de cada relación (CryptoCurrency, FiatCurrency).

Para obtener esta información, debiera conectarse a más de un proveedor y tener una lógica para sacar cuál es el precio más "real". Tener en cuenta que una de las fuentes puede ser falseada (como indicás), y tendría que tener alguna lógica para discriminarla comparándola con las demás.

El plugin debe tener un agente, que se despierte cada 10/15 minutos y actualice las últimas cotizaciones.

Las cotizaciones que necesitamos manejar en un principio son: BTC - VEF BTC - ARS BTC - USD

ExchangeRate getLastExchangeRate(CryptoCurrency c, FiatCurrency f)

ExchangeRate getHistoricalExchangeRate(CryptoCurrency c, FiatCurrency f , long time)

ExchangeRate: CryptoCurrency | FiatCurrency | rate | time

Qué te parece?

EzequielPostan commented 9 years ago

Me parece bien @lnacosta

En cuanto a lo que mencionás @Luis-Fernando-Molina sobre la idea de separar los plugins en función al proveedor es interesante. Pero quizás aún es muy temprano para ello. Debemos analizar cómo resolver algunas cuestiones sobre cómo manejar el crypto index y quizás en función a detalles que salgan durante el desarrollo la lógica de consulta cambie. Yo optaría porque se mantenga todo en un plugin hasta poder probar una lógica funcionando. Quizás sí separaría en una clase a cada proveedor que podrían heredar de una clase CryptoIndexProvider abstracta. En el futuro, quizás se podría hacer algo como lo que hacen sitios que conectan vendedores con compradores donde muestran las tasas en función a las transacciones que realizan. Lo del blockchain de tasas de cambio suena raro, cada broaker tiene su tasa por lo que no hay consenso. Por ahora debemos basarnos en las fuentes más confiables y en la mayor cantidad posible.

Luis-Fernando-Molina commented 9 years ago

Me parece bien. En el caso de la cotización de AR$ y bolivares como van a manejar el tema del dolar blue o el bolivar negro?

Luis-Fernando-Molina commented 9 years ago

separaría en una clase a cada proveedor que podrían heredar de una clase CryptoIndexProvider abstracta.

No sería que implemente una interfaz privada del plugin?