Finalmente ho una versione compilabile del codice.
pragma solidity ^0.4.0;
contract DeathStar
{
function DeathLoop() public
{
assembly
{
loop000:
loop001:
loop002:
loop003:
loop004:
loop005:
....
....
loop992:
loop993:
loop994:
loop995:
loop996:
loop997:
loop998:
loop999:
jump(loop001)
}
}
}
Binary:
6060604052341561000c57fe5b5b6104688061001c6000396000f30060606040526000357c01000 00000000000000000000000000000000000000000000000000000900463ffffffff1680634b489b 321461003b575bfe5b341561004357fe5b61004b61004d565b005b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b 61004f565b5600a165627a7a72305820ee78c2a05eeec0067f21c039d9876e47f4397627e2469cd f45407ae4e91422090029
Dai compilatori moderni (dalla 0.5 in poi, adesso siamo al 0.8.8 ) hanno tolto la possibilita' di fare molte di queste cose,
ad esempio una tag per il jump (guarda caso....) comunque ho trovato un vecchio compilatore solc
che mi ha macinato il codice!
Questo e' il codice binario di uno smart contract eseguibile in rete!
Alcune considerazioni:
Inizilamente mi ero focalizzato sullo scrivere un codice che si auto-replicava...
ma poi mi sono reso conto che
qualsiasi programma scritto per ethereum e' un Virus by-design!
Pensateci: qualsiasi programma (o smart contract come lo chiamano loro), proprio per architettura, viene eseguito su tutti i nodi!
unico anticorpo: il costo dell'esecuzione.
quindi non mi serviva nessuna logica di auto replicazione, ma solo una logica per essere il piu' "competitivo"
tra i possibili programmi (virus) in esecuzione, ossia quello piu' resistente all'unico anticorpo.
E nessuno puo' essere piu' competitivo di questo, che ha un costo medio di un solo gas per istruzione!
Altra nota tecnica: in realta' il codice di "wrap" fisso attorno ad una funzione, in questo caso la funzione DeathLoop,
(quello segnato in grassetto qui sotto) tende ad appesantire il rapporto gas per istruzione,
ma lo fa solo per il primo ciclo, poi il rapporto comincia a calare e ad arrivare prossimo a 1 gas per istruzione
sub_0: assembly {
/* "death":26:16255 contract DeathStar... */
mstore(0x40, 0x60)
calldataload(0x0)
0x100000000000000000000000000000000000000000000000000000000
swap1
div
0xffffffff
and
dup1
0x4b489b32
eq
tag_2
jumpi
tag_1:
invalid
/* "death":53:16250 function DeathLoop() public... */
tag_2:
jumpi(tag_3, iszero(callvalue))
invalid
tag_3:
tag_4
jump(tag_5)
tag_4:
stop
tag_5:
/* "death":172:179 loop000 */
tag_7:
/* "death":188:195 loop001 */