2021-09-27

Setupeando hardhat para binance network

Estoy entrando a un laburo nuevo, y como primera tarea tengo que hacer unos POCs de contratos en solidity y testearlos en la red de test de Binance. 

Para hacer esto tengo que hacerlos con hardhat. Por lo tanto empecé a seguir las instrucciones que dan en Binance para setupear hardhat, pero no están del todo bien.

Los problemas que me llevé puestos son:

  • Hay que usar una versión LTS de nodejs. Para eso instalé nvm como dice acá e instalé el LTS usando nvm. La versión que trae ubuntu 20.04 haciendo apt install nodejs es muy vieja.
  • En el archivo hardhat.config.js que ponen ahí, hay que cambiar la versión de solidity a "0.8.4". Sino el contrato de ejemplo que genera cuando corrés npx hardhat no compila.
  • Hay que crear un archivo secrets.json donde poner los mnemonicos que usa metamask. El contenido del archivo es algo así: {"mnemonic": "a ante bajo cabe con contra de desde hacia hasta para por"}

Si el contenido de secrets.json no tiene el formato correcto, o el archivo no existe da un error bastante críptico (Expected a value of type HttpNetworkConfig)

Pero cuando está todo bien configurado pasa esto:

$ npx hardhat compile
Compiling 2 files with 0.8.4
Compilation finished successfully

Espero que les sirva,

Aureliano.

 


2021-08-25

Sistemas egoístas y bienes registrables



Seguramente esto sea un retroplagio, pero estuve notando que muchos sistemas suelen andar con incentivos opuestos, que hacen que llegue a un equilibrio.

Los mercados se basan en que haya compradores y vendedores, con intereses opuestos. El sistema judicial se basa en tener acusación y defensa. Yo creo que esa cualidad de que actores actuando de forma egoísta hacen que salga un resultado bueno es una propiedad deseable de los sistemas.

En particular, hay una aplicación de esto que creo que sería buenísimo hacer y no veo que la hagan. Uno de los problemas que hay con el cobro de impuestos es valuar correctamente los activos sobre los que se aplican. Por ejemplo, el precio de mercado de una propiedad. En Argentina (y creo que en el resto del mundo también) esta valuación se hace con una declaración, por lo que aún cuando se haga bien originalmente, esta valuación se vuelve incorrecta al toque (sobre todo cuando hay mucha inflación o una burbuja inmobiliaria).

Pero esto no tiene porqué ser así. Mi propuesta es usar un "sistema egoísta" para valuar bienes registrables, como por ejemplo terrenos o campos. En este sistema cada dueño declararía el precio de su propiedad, como hasta ahora, y se cobraría un impuesto como porcentaje del valor declarado, como hasta ahora. Lo nuevo es que puede venir cualquier otra persona o empresa y comprar dicha propiedad al doble del valor declarado. Si así lo hiciera, el dueño original se quedaría con el 150% del valor declarado y el 50% restante iría para el estado, en concepto de multa por no declarar correctamente el precio de la propiedad. Esto incentivaría a no sub-declarar el precio de las propiedades.

Algunas cosas que harían andar el sistema, evitando posibles abusos son:

  1. En caso de deber más del 20% del valor declarado de la propiedad en impuestos, la propiedad se subasta, se cobran los impuestos y lo que queda va al propietario.
  2. Para hacer una transferencia hay que llevar a 0 la deuda impositiva de la propiedad.
  3. Para cambiar la valuación de la propiedad hay que llevar a 0 la deuda impositiva de la propiedad.
  4. Para propiedades, no se puede declarar un valor que sea 3 veces superior al valor por metro cuadrado de propiedades similares. Esto es para evitar que declaren un valor muy grande que haga que el 20% del valor declarado sea más que el precio de mercado de la propiedad, haciendo que sea más barato no pagar los impuestos y dejar que la subasten cuando la deuda llegue al límite de subasta.
  5. Hay que poner algún mecanismo sensato de indexación del precio declarado, para evitar que la inflación lo deje muy bajo y haya gente que se aproveche de eso. Quizás ajustar por CER o RIPTE o indice minorista del INDEC por defecto. Este ajuste no requiere llevar la deuda impositiva a 0, y la deuda debería ajustarse por el mismo índice (y quizás aparte algún punitorio para desincentivar tomar la deuda).

 
Creo que si se usara esto para cobrar impuestos a los latifundios de la pampa húmeda, podrían darse las condiciones para que no haya más dólares paralelos ni retenciones a las exportaciones. Y si funciona bien, aplicarla después al resto de las propiedades también.

Espero que alguien tome esta idea y la lleve a cabo.


2021-07-23

Desarrollar con rust en una VM

 En estos días empecé a jugar un poco con rust. Para esto, armé un entorno de desarrollo razonable para mi, en una VM. A mi me gusta armar entornos en VMs para desarrollar así no contamino mi compu con todas las cosas que voy instalando para probar cosas. En particular, prefiero armar VMs de lubuntu (ubuntu con lxde) y laburar conectandome via ssh como si fuera otra compu.

Para esto, armé la VM y le puse 2 placas de red virtuales (una NAT y otra host-only), le instalé lubuntu, le apliqué los últimos paquetes (apt update y apt upgrade) openssh-server (apt install openssh-server), git (apt install git), vscode (snap install --classic code), curl (apt install curl) y rust via rustup (curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh) que incluye cargo.

Para laburar más cómodo le informé mi clave de ssh a la VM usando ssh-copy-id. Después de eso, puedo sshearme a la vm (ssh -X -A aure@192.168.56.101) y operar sin poner passwords y abrir ventanas remotas para usar el vscode (y firefox) de la VM en el escritorio del host.

Para usar firefox hay que correrlo como firefox -no-remote. Para que anden los comandos de cargo y rustup que abren el browser agregué export BROWSER="$HOME/bin/firefox-remote.sh" en el final de mi .profile de la VM. y en $HOME/bin/firefox-remote.sh puse

#!/usr/bin/env bash

firefox -no-remote "$@"

y lo puse como ejecutable con chmod.

En vscode instalé 3 plugins:

  • GitLens para tener mejor soporte para git
  • Rust para tener soporte de la sintaxis de rust
  • CodeLLDB para poder debuggear código de rust dentro de vscode

Con esto creo que estoy listo para empezar a programar dentro de mi VM.

¿Creen que me faltó algo?

2021-04-14

Evitando freezes de la memoria de estado sólido

Tengo una notebook nueva con una ssd kingston de 1 tera, modelo SA2000M81000G según smartctl. Cuando uso la notebook, en forma bastante aleatoria, se pega unos cuelgues de novela. Después de estar como un mes tratando de entender que &&*$#$#&$@#* pasa, creo que encontré la respuesta :D.

Parece que algunas memorias kinsgton tienen un bug que se manifiesta cuando cambian de estado para ahorrar energía. El manejo de energía está en el kernel

La forma de evitarlo es pasarle un parámetro a grub como explican acá.

En mi ubuntu, edité el archivo /etc/default/grub. Cambié la línea GRUB_CMDLINE_LINUX="" para que diga GRUB_CMDLINE_LINUX="nvme_core.default_ps_max_latency_us=0". Después de eso corrí sudo update-grub y reinicié la compu. 

Después de eso, parece que anda todo bien 🤞.


PD: Están trackeando este bug acá

2021-03-05

Memtest Ubuntu booteando desde EFI

Lamentablemente, la opción para correr memtest cuando booteamos no está disponible cuando booteamos de una compu que usa EFI en vez de BIOS.

Por suerte, hay workarround. Casi todos los pasos están documentados acá. La única diferencia para la compu en la que tuve que hacer esto es que, como bootea de memoria de estado sólido, en vez de bootear de /dev/sda4 (o parecido) bootea de /dev/nvme0n1p1, por lo que las instrucciones sobre cómo armar el script para que grub tenga la entrada son un poquitín distintas.

En mi caso el archivo /etc/grub.d/40_memtest es así (en rojo lo que cambié)

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
 
menuentry 'memtest86' {
    insmod part_gpt
    insmod fat
    set root='hd1,gpt1'
    chainloader /EFI/memtest86/BOOTX64.efi
}

No tengo muy claro porqué funciona (fue un SWAG).

Espero que les sirva,

Aureliano.

2021-03-03

pingmon en python3

Hace un tiempo hice un scriptcito en python para monitorear la conexión de red usando ping. Hoy quise usarlo de nuevo y descubrí que no anda en python3, así que lo adapté. Solo necesitaba 2 pequeños cambios:

  • print es python3 es una función, así que tuve que agregar unos paréntesis.
  • sys.stdout.readline() en python 3 devuelve un montón de bytes (en vez de un string) así que agregué .encode() para transformarlo en string

Dejo acá abajo la versión nueva:

#!/usr/bin/env python3

import subprocess
import sys
import re

SEQ_NUMBER_RE = re.compile(".*icmp_seq=(\d+) ttl.*")

def report(probes, count):
  if len(probes) < count:
    return "N/A"
  return str ( count - sum(probes[-count:]) )

def monitor(ip):
  probes = []
  ping = subprocess.Popen(["ping", ip], stdout=subprocess.PIPE)
  stdout = ping.stdout

  stdout.readline() # Ignore first line
  line_count = 0
  last_seq_number = 0
  while True:
    line_count +=1
    seq_number = int( SEQ_NUMBER_RE.match(stdout.readline().decode()).group(1))
    probes.extend([0] * (seq_number - last_seq_number - 1))
    probes.append(1)
    print( "(%s) 10:%s 100:%s 1000:%s" % (
      line_count, report(probes, 10), report(probes, 100), report(probes, 1000)
    ) )

    probes = probes[-1000:] # Keep memory usage bounded
    last_seq_number = seq_number

def main(argv):
  monitor(argv[1])

if __name__ == '__main__':
  main(sys.argv)

 

Happy hacking,
Aureliano

2021-03-02

Deshabilitando touchpad

Mi vieja técnica para deshabilitar el touchpad no anda en lubuntu 20.04. Así que tuve que googlear de nuevo cómo se hace.

Para ver todos los devices de entrada de X-Windows hay que correr 

$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Telink 2.4G Mouse                         id=11   [slave  pointer  (2)]
⎜   ↳ Telink 2.4G Mouse Consumer Control        id=12   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=16   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Logitech Logitech G430 Gaming Headset     id=9    [slave  keyboard (3)]
    ↳ Telink 2.4G Mouse System Control          id=10   [slave  keyboard (3)]
    ↳ CHICONY HP Basic USB Keyboard             id=13   [slave  keyboard (3)]
    ↳ HP TrueVision HD Camera: HP Tru           id=14   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=15   [slave  keyboard (3)]
    ↳ HP Wireless hotkeys                       id=17   [slave  keyboard (3)]
    ↳ HP WMI hotkeys                            id=18   [slave  keyboard (3)]
    ↳ Telink 2.4G Mouse Consumer Control        id=19   [slave  keyboard (3)]

En mi compu el touchpad tiene el id 16, así que para apagarlo hay que correr xinput --disable "SynPS/2 Synaptics TouchPad" y para prenderlo xinput --enable "SynPS/2 Synaptics TouchPad"

2021-02-16

Porqué no quiero programar en go

Desde que me enteré de su existencia evito programar en go por su manejo de errores, porque te fuerza a implementar a mano el movimiento de los errores por el stack.

Hoy revisé la documentación. Es peor. En el documento que linkié en la oración anterior proponen, para evitar poner ifs por todos lados, seguir ejecutando código después de que los errores suceden. Eso es terrible, lamentable,  parte de la documentación oficial del lenguaje y está incorporado en la biblioteca estándar. 

Eviten go si pueden.