[Ethereum] Why does solidity compiled bytecode not match data for creating transaction

compilationremixsolidity

I'm trying to independently verify the source code of solidity contracts, and stumbled across a case where the compiled bytecode for the source code of the contract does not match the data of the transaction which created the contract. According to https://etherchain.org/account_verify/info and other things I've read, the bytecode received from compiling the contract with the correct solidity version and optimized flag should match the input field of the creating transaction.

The contract can be found here: https://etherscan.io/address/0x9ffa45c5943a0203ee462c48c8b97064abbe28f3#code

Using web3.eth.getTransaction through parity, I see the data of the transaction (0xf991503a9e798e2c8e53c865b09e985f59100a1561f9a5fad546f59e8a4096db) to be:

606060405234610000575b60008054600160a060020a031916730807a2d6a675e7196a3d9b1910700cae9795b72a1790555b5b6104fb806100416000396000f300606060405236156100675763ffffffff60e060020a6000350416633ccfd60b81146101115780633feb5f2b146101205780635d4522011461014c57806370a082311461017557806372ea4b8c146101a05780637975ce28146101bf578063cee2a9cf146101d4575b61010f5b61007433610201565b15156100ee57600180548060010182818154818355818115116100bc576000838152602090206100bc9181019083015b808211156100b857600081556001016100a4565b5090565b5b505050916000526020600020900160005b8154600160a060020a033381166101009390930a92830292021916179055505b600160a060020a03331660009081526002602052604090208054340190555b565b005b346100005761010f610271565b005b34610000576101306004356102a3565b60408051600160a060020a039092168252519081900360200190f35b34610000576101306102d3565b60408051600160a060020a039092168252519081900360200190f35b346100005761018e600160a060020a03600435166102e2565b60408051918252519081900360200190f35b346100005761018e6102f4565b60408051918252519081900360200190f35b346100005761010f6004356024356102fb565b005b34610000576101ed600160a060020a0360043516610201565b604080519115158252519081900360200190f35b6000805b6001548110156102665782600160a060020a0316600182815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316141561025d576001915061026b565b5b600101610205565b600091505b50919050565b600160a060020a03331660008181526002602052604080822054905181156108fc0292818181858888f150505050505b565b600181815481101561000057906000526020600020900160005b915054906101000a9004600160a060020a031681565b600054600160a060020a031681565b60026020526000908152604090205481565b6001545b90565b60015460009081908311156103105760015492505b50825b828110156104c857600060026000600184815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000205411156104bf5760026000600183815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002054915060026000600183815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002060009055600060009054906101000a9004600160a060020a0316600160a060020a03166303f9c79383600184815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a03166040518363ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a031681526020019150506000604051808303818588803b156100005761235a5a03f11561000057505050505b5b600101610313565b5b505050505600a165627a7a72305820e7c797ee36d8a2e4c28e3fa53150f5fac2d95456b0610d4b7e2a312b5249c2480029

I'm using the solc-js compiler (with the same solidity version, v0.4.8+commit.60cc1668, optimized), and compiling the same source code shown in the etherscan link gives:

606060405234610000575b60008054600160a060020a031916730807a2d6a675e7196a3d9b1910700cae9795b72a1790555b5b6104fb806100416000396000f300606060405236156100675763ffffffff60e060020a6000350416633ccfd60b81146101115780633feb5f2b146101205780635d4522011461014c57806370a082311461017557806372ea4b8c146101a05780637975ce28146101bf578063cee2a9cf146101d4575b61010f5b61007433610201565b15156100ee57600180548060010182818154818355818115116100bc576000838152602090206100bc9181019083015b808211156100b857600081556001016100a4565b5090565b5b505050916000526020600020900160005b8154600160a060020a033381166101009390930a92830292021916179055505b600160a060020a03331660009081526002602052604090208054340190555b565b005b346100005761010f610271565b005b34610000576101306004356102a3565b60408051600160a060020a039092168252519081900360200190f35b34610000576101306102d3565b60408051600160a060020a039092168252519081900360200190f35b346100005761018e600160a060020a03600435166102e2565b60408051918252519081900360200190f35b346100005761018e6102f4565b60408051918252519081900360200190f35b346100005761010f6004356024356102fb565b005b34610000576101ed600160a060020a0360043516610201565b604080519115158252519081900360200190f35b6000805b6001548110156102665782600160a060020a0316600182815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316141561025d576001915061026b565b5b600101610205565b600091505b50919050565b600160a060020a03331660008181526002602052604080822054905181156108fc0292818181858888f150505050505b565b600181815481101561000057906000526020600020900160005b915054906101000a9004600160a060020a031681565b600054600160a060020a031681565b60026020526000908152604090205481565b6001545b90565b60015460009081908311156103105760015492505b50825b828110156104c857600060026000600184815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000205411156104bf5760026000600183815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002054915060026000600183815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002060009055600060009054906101000a9004600160a060020a0316600160a060020a03166303f9c79383600184815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a03166040518363ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a031681526020019150506000604051808303818588803b156100005761235a5a03f11561000057505050505b5b600101610313565b5b505050505600a165627a7a723058202529b66753f69883ab5e76eebe3048611454a5662624196e7cac88f862841a990029

Additionally when I try to compile with the remix online compiler it gives me:

606060405234610000575b60008054600160a060020a031916730807a2d6a675e7196a3d9b1910700cae9795b72a1790555b5b6104fb806100416000396000f300606060405236156100675763ffffffff60e060020a6000350416633ccfd60b81146101115780633feb5f2b146101205780635d4522011461014c57806370a082311461017557806372ea4b8c146101a05780637975ce28146101bf578063cee2a9cf146101d4575b61010f5b61007433610201565b15156100ee57600180548060010182818154818355818115116100bc576000838152602090206100bc9181019083015b808211156100b857600081556001016100a4565b5090565b5b505050916000526020600020900160005b8154600160a060020a033381166101009390930a92830292021916179055505b600160a060020a03331660009081526002602052604090208054340190555b565b005b346100005761010f610271565b005b34610000576101306004356102a3565b60408051600160a060020a039092168252519081900360200190f35b34610000576101306102d3565b60408051600160a060020a039092168252519081900360200190f35b346100005761018e600160a060020a03600435166102e2565b60408051918252519081900360200190f35b346100005761018e6102f4565b60408051918252519081900360200190f35b346100005761010f6004356024356102fb565b005b34610000576101ed600160a060020a0360043516610201565b604080519115158252519081900360200190f35b6000805b6001548110156102665782600160a060020a0316600182815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316141561025d576001915061026b565b5b600101610205565b600091505b50919050565b600160a060020a03331660008181526002602052604080822054905181156108fc0292818181858888f150505050505b565b600181815481101561000057906000526020600020900160005b915054906101000a9004600160a060020a031681565b600054600160a060020a031681565b60026020526000908152604090205481565b6001545b90565b60015460009081908311156103105760015492505b50825b828110156104c857600060026000600184815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000205411156104bf5760026000600183815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002054915060026000600183815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002060009055600060009054906101000a9004600160a060020a0316600160a060020a03166303f9c79383600184815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a03166040518363ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a031681526020019150506000604051808303818588803b156100005761235a5a03f11561000057505050505b5b600101610313565b5b505050505600a165627a7a723058209af8a6ef7fce5c06c5d80234a6a37e819ab91c3c3950d09db1c3ab478cbff2670029

What's strange is that the compiled bytecode for solc-js and remix do not match each other, and also neither matches the on chain contract initialization data. Looking closer at the compiled bytecodes I noticed all start with:

606060405234610000575b60008054600160a060020a031916730807a2d6a675e7196a3d9b1910700cae9795b72a1790555b5b6104fb806100416000396000f300606060405236156100675763ffffffff60e060020a6000350416633ccfd60b81146101115780633feb5f2b146101205780635d4522011461014c57806370a082311461017557806372ea4b8c146101a05780637975ce28146101bf578063cee2a9cf146101d4575b61010f5b61007433610201565b15156100ee57600180548060010182818154818355818115116100bc576000838152602090206100bc9181019083015b808211156100b857600081556001016100a4565b5090565b5b505050916000526020600020900160005b8154600160a060020a033381166101009390930a92830292021916179055505b600160a060020a03331660009081526002602052604090208054340190555b565b005b346100005761010f610271565b005b34610000576101306004356102a3565b60408051600160a060020a039092168252519081900360200190f35b34610000576101306102d3565b60408051600160a060020a039092168252519081900360200190f35b346100005761018e600160a060020a03600435166102e2565b60408051918252519081900360200190f35b346100005761018e6102f4565b60408051918252519081900360200190f35b346100005761010f6004356024356102fb565b005b34610000576101ed600160a060020a0360043516610201565b604080519115158252519081900360200190f35b6000805b6001548110156102665782600160a060020a0316600182815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316141561025d576001915061026b565b5b600101610205565b600091505b50919050565b600160a060020a03331660008181526002602052604080822054905181156108fc0292818181858888f150505050505b565b600181815481101561000057906000526020600020900160005b915054906101000a9004600160a060020a031681565b600054600160a060020a031681565b60026020526000908152604090205481565b6001545b90565b60015460009081908311156103105760015492505b50825b828110156104c857600060026000600184815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000205411156104bf5760026000600183815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002054915060026000600183815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002060009055600060009054906101000a9004600160a060020a0316600160a060020a03166303f9c79383600184815481101561000057906000526020600020900160005b9054906101000a9004600160a060020a03166040518363ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a031681526020019150506000604051808303818588803b156100005761235a5a03f11561000057505050505b5b600101610313565b5b505050505600a165627a7a72305820

but have different endings after that. Does anyone know why this might be the case?

Best Answer

Verifying the Source code is not easy. You require "exact same compiler version".

See: https://ethereum.stackexchange.com/a/221/852

If you just want to know if a contract exists at the address, the easiest to include a simple function.

function contractExists () constant returns (bool result){
  return true;
}
Related Topic