Make it a proper Go contract, opcodes are fun until you want to change something in them. Part of #2412.