¿Cuáles son algunos ejemplos de cómo el ensamblaje en línea beneficia el desarrollo de contratos inteligentes?

Mucha gente ha expresado su entusiasmo por el potencial del uso del ensamblaje en línea en los contratos inteligentes. Después de ver este comentario en reddit, tengo curiosidad por ver algunos ejemplos básicos (y más avanzados, si lo desea) de cómo se puede usar el ensamblaje en línea para ahorrar gasolina o aumentar la eficiencia.

Respuestas (3)

Como autor de ese módulo, surgieron algunas cosas:

  • El ensamblaje en línea le permite leer palabras completas (256 bits) de tipos de datos como stringy bytesen una sola operación. Solidity-stringutils usa eso para hacer comparaciones de cadenas muy rápidas restando fragmentos de 32 bytes de las dos cadenas que se comparan. Sin ensamblaje, debe hacer esto byte por byte.
  • Algunas operaciones no están expuestas en Solidity. Por ejemplo, el sha3código de operación toma un rango de bytes en la memoria para hacer hash, mientras que la función Solidity del mismo nombre toma una cadena. Por lo tanto, hacer hash de parte de una cadena requeriría costosas operaciones de copia de cadenas. Con el ensamblaje en línea, puede pasar una cadena y hacer hash solo en la parte que le interesa.
  • Algunas cosas son completamente imposibles sin el ensamblaje en línea. Solidity no admite la obtención de valores devueltos de funciones externas que devuelven tipos de longitud variable como matrices dinámicas byteso string, pero si sabe la longitud esperada, puede llamarlos usando el ensamblado en línea.
aún de la opinión de que muchas de las "bibliotecas" que está creando pueden implementarse completamente en el compilador normal. Strcat por ejemplo.
@ VoR0220 No creo que nadie haya dicho que no podían, aunque no estoy seguro de por qué estás poniendo comillas sobre "bibliotecas". Sin embargo, si observa otros lenguajes comparables como C, notará que estas cosas son principalmente responsabilidad de una biblioteca estándar. Mantener la complejidad innecesaria fuera del compilador suele ser una buena idea.
Y si se pueden implementar o no en otro lugar es irrelevante si necesita la función y aún no existe.
lo siento... las comillas de susto fueron una mala idea :) mala comunicación. Era tarde. Creo que la concatenación de cadenas, por ejemplo, debería funcionar en el compilador como ya lo hacen en javascript... hace que el lenguaje de secuencias de comandos sea más fácil, ¿sabes?
@ VoR0220 Eso es difícil. Con el asignador de memoria actual, la concatenación de cadenas ingenua tomaría O(n^2) memoria y tiempo. Dados los costos de gasolina de las operaciones de cadena, ¡no podrías hacer muchas antes de quedarte sin gasolina!
2-3 como mucho es todo lo que busco.
"Algunas cosas son completamente imposibles sin el ensamblaje en línea" -> Creo que esto no es tan cierto hoy como solía ser en 2016. Ahora tenemos los códigos de operación RETURNDATASIZEy RETURNDATACOPY, podemos consultar el código de un contrato a través de <address>code, y mucho más .

Sé que este es un tema antiguo, pero aquí hay un par de tutoriales que preparé para cubrir el ensamblaje con solidez:

Montaje funcional - https://www.youtube.com/watch?v=nkGN6GwkMzU

Montaje instructivo: https://www.youtube.com/watch?v=axZJ2NFMH5Q

Entro en los beneficios, desventajas, ejemplos y ensamblaje de depuración.

Bueno, por un lado, puede hacer cosas que no puede hacer con el ensamblaje tradicional... un ejemplo perfecto es la nueva configuración de utilidades de cadena de Nick Johnson. https://github.com/Arachnid/solidity-stringutils

La función es bastante nueva, pero lo que sea que le lleve su imaginación y lo que considere útil, puede hacerlo en el ensamblaje en línea según los requisitos de EVM. Incluso hay algo en los documentos al respecto.

http://solidity.readthedocs.org/en/latest/control-structures.html#inline-assembly