Contratos implementados sin código Solidity [cerrado]

Revisé muchos contratos en etherscan y noté que muchos de ellos no tienen el código Solidity publicado. En mi opinión, no tiene sentido usar/publicar un contrato sin el código de Solidity, rompe todo el concepto de Smart Contracts. Si uno no puede verificar el código Solidity de Smart Contract, está interactuando con él, ¿cuál es el punto de usar Ethereum entonces? ¿Crees que debería ser obligatorio de alguna manera publicar el código asociado? Sé que uno puede descompilar el código de bytes en ensamblador como comandos, pero uhhh debería ser más transparente, ¿verdad? Creo que en etherscan.io el código de solidez publicado no está almacenado en la cadena de bloques de ethereum, sino solo en alguna base de datos interlan etherscan.io. Sé que se necesitaría mucho espacio en la cadena de bloques de ethereum para almacenar el código de Solidity....

Los estándares son muy importantes por esta razón, pero también por la que a muchas personas les disgustan los contratos inteligentes; pueden ensuciarse. En teoría, un programador podría ir y cambiar alguna parte del código del contrato y el usuario no lo sabría (suponiendo que el contrato sea modificable). Los usuarios necesitan incentivos para interactuar con el contrato en primer lugar y una asociación establecida y confiable. Espero que la parte que interactúa al menos tenga acceso a abi. Entonces, esa parte debe, como mínimo, comprender cada interacción. Una cadena de bloques de contrato suena pesada.

Respuestas (4)

Bueno... conceptualmente, al igual que en la vida real, no debe aceptar ni interactuar con un contrato que no puede leer.

Dicho esto, hay muchos contratos que no están destinados a ser leídos por el público en general. Por ejemplo, si quisiera escribir un contrato específicamente entre usted y yo, no debería existir la obligación de publicar el código asociado al público en general. Le enviaría el código directamente para que lo revisara y dependería de usted usar algún tipo de herramienta de verificación para revisar el código.

El único propósito del contrato inteligente es garantizar que se respete cada interacción/transacción con él... no verificar los parámetros establecidos en el contrato.

Estoy de acuerdo con @reyHaynes.

Además, me opondría a la idea de que no tiene sentido a menos que haya un código fuente.

La dura realidad es que el EVM ejecutará el código de bytes de acuerdo con su idea lógica de máquina de cómo se ve "correcto". El propio compilador puede ser una fuente de errores. Independientemente de su origen, el código de bytes es lo que importa. No todos los contratos están destinados a todos los observadores.

Es cierto que si alguien desea ganarse la confianza de los demás, una forma de hacerlo es publicar el código fuente para que podamos entenderlo más fácilmente.

Si no estamos destinados a ver y entender, ocultar la fuente no es efectivo. Simplemente incomoda a un adversario determinado.

Espero eso ayude.

Si bien las otras respuestas son correctas en que, en general, no existe necesariamente la obligación de publicar el código fuente para un contrato que no está destinado a ser utilizado por el público en general, la razón más fundamental por la que no existe un requisito a nivel de protocolo para publicar el código fuente es que esto requeriría una especificación de nivel de protocolo para el lenguaje de alto nivel.

El EVM es una máquina independiente del lenguaje. Puedo escribir código en Solidity, Serpent, LLL, ensamblaje puro, etc. y todo funcionará bien. Requerir el código fuente significa requerir que todos usen no solo el mismo lenguaje sino también la misma versión del compilador, lo que dificulta mucho las actualizaciones del lenguaje de alto nivel.

Esencialmente, Solidity como lenguaje cambia con mucha frecuencia, EVM cambia con muy poca frecuencia, por lo que tiene mucho más sentido simplemente publicar el código de la máquina y dejar que el desarrollador publique el código fuente fuera de banda.

Hay muchas aplicaciones de contratos inteligentes cuyo código definitivamente NO debería estar disponible para el público (es decir, aquellos que no están asociados con el contrato). Por ejemplo, imagine un contrato donde puede enviar sus tokens ERC20 y la única forma en que puede retirar esos tokens es con una contraseña, pero se puede hacer desde cualquier dirección. De esta manera, no tendría que preocuparse por perder su clave privada ni nada porque sus tokens están bloqueados en un contrato. ¿Le gustaría que el código sea público para que los piratas informáticos puedan intentar explotar posibles vulnerabilidades en el código para robar sus tokens? No es necesario responder a esa pregunta, ya que es retórica y estoy seguro de que entiende el punto de esta respuesta a su pregunta.

Habiendo dicho eso, creo que es importante que los contratos inteligentes en los que participan comunidades de personas, como ICO, tokens ERC20, aplicaciones de apuestas y juegos, se hagan públicos.

Si un pirata informático realmente quiere robar algo de éter del contrato, podría descompilar el contrato, analizarlo y aún así robar sus fondos. Sin el código de Solidity, llevaría más tiempo, pero aún así es factible. Sería cuestión de tiempo atacarlo, esto no es un escudo de seguridad cualquiera. Es como usar http en lugar de https, pero uno encriptaría el tráfico, por ejemplo, con base64... No publicar ningún código de Solidity con un contrato desplegado dado NO es un escudo de seguridad adicional, solo hace que este contrato sea más largo de romper...