bincode_output.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import struct
  2. def varuint(value):
  3. if value <= 0xfc:
  4. return struct.pack("<B", value)
  5. elif value <= 0xffff:
  6. return struct.pack("<BH", 0xfd, value)
  7. elif value <= 0xffffffff:
  8. return struct.pack("<BI", 0xfe, value)
  9. else:
  10. return struct.pack("<BQ", 0xff, value)
  11. def write_len(output, objects):
  12. output.write(varuint(len(objects)))
  13. def write_value(fmt, output, value):
  14. value_bytes = struct.pack("<" + fmt, value)
  15. output.write(value_bytes)
  16. def write_u8(output, value):
  17. write_value("B", output, value)
  18. def write_u32(output, value):
  19. write_value("I", output, value)
  20. def output_contract(output, contract):
  21. write_len(output, contract.name)
  22. output.write(contract.name.encode())
  23. write_len(output, contract.witness)
  24. for type_id, variable, _ in contract.witness:
  25. write_len(output, variable)
  26. output.write(variable.encode())
  27. write_u8(output, type_id)
  28. write_len(output, contract.code)
  29. for code in contract.code:
  30. func_id = code.func_format.func_id
  31. write_u8(output, func_id)
  32. for arg_idx in code.arg_idxs:
  33. write_u32(output, arg_idx)
  34. def output(output, contracts, constants):
  35. write_len(output, constants.variables())
  36. for variable in constants.variables():
  37. write_len(output, variable)
  38. output.write(variable.encode())
  39. type_id = constants.lookup(variable)
  40. write_u8(output, type_id)
  41. write_len(output, contracts)
  42. for contract in contracts:
  43. output_contract(output, contract)