Как составить транзакцию с OP_RETURN в Python?

В настоящее время пытается выяснить, как использовать Python для создания транзакции с OP_RETURN. Я попытался сам кодировать сообщение и не повезло. Я нашел функцию OPReturn () в Интернете, но когда я пытаюсь ее использовать, я получаю сообщение об ошибке (из API Broadcast): Exception: None Standard Script Output OP_RETURN 594f4c4f53574147

код:

# coding: utf-8

from bitcoin import *
import binascii
from test import *


priv = sha256('brain wallet')

pub = privtopub(priv)

addr = pubtoaddr(pub)

inputs = unspent(addr)

message = "YOLOSWAG"
FullLen = format(len(message)+2,'x').rjust(2,'0')
MessageLen = format(len(message),'x').rjust(2,'0')
ID = binascii.hexlify(str(message))
snd = "6a"+MessageLen+ID

outputs = [{'value': 50000, 'address': addr}, {'value': 0, 'script': snd}]

fee = 10000

tx = mksend(inputs, outputs, addr, fee)

dt = deserialize(tx)
ins = dt['ins']

#print addr
#print ins


for ind, elm in enumerate(ins):
    print elm
    tx = sign(tx, ind, priv)

#print tx



print(pushtx(tx))
4 голоса | спросил rsmoz 9 FebruaryEurope/MoscowbMon, 09 Feb 2015 09:41:39 +0300000000amMon, 09 Feb 2015 09:41:39 +030015 2015, 09:41:39

3 ответа


2

Я отклонил библиотеку pybitcointools , чтобы вернуть правильно отформатированный OP_RETURN, или вставьте OP_RETURN в исходное hex транзакция.

Моей вилкой можно найти здесь . Код выглядит следующим образом:

from bitcoin.pyspecials import safe_hexlify, from_string_to_bytes, from_int_to_byte, from_string_to_bytes

def mk_opreturn(msg, rawtx=None, json=0):
    def op_push(data):
        import struct
        if len(data) < 0x4c:
            return from_int_to_byte(len(data)) + from_string_to_bytes(data)
        elif len(data) < 0xff:
            return from_int_to_byte(76) + struct.pack('<B', len(data)) + from_string_to_bytes(data)
        elif len(data) < 0xffff:
            return from_int_to_byte(77) + struct.pack('<H', len(data)) + from_string_to_bytes(data)
        elif len(data) < 0xffffffff:
            return from_int_to_byte(78) + struct.pack('<I', len(data)) + from_string_to_bytes(data)
        else: raise Exception("Input data error. Rawtx must be hex chars" \
                            + "0xffffffff > len(data) > 0")

    orhex = safe_hexlify(b'\x6a' + op_push(msg))
    orjson = {'script' : orhex, 'value' : 0}
    if rawtx is not None:
        try:
            txo = deserialize(rawtx)
            if not 'outs' in txo.keys(): raise Exception("OP_Return cannot be the sole output!")
            txo['outs'].append(orjson)
            newrawtx = serialize(txo)
            return newrawtx
        except:
            raise Exception("Raw Tx Error!")
    return orhex if not json else orjson

Обратите внимание, что имя модуля было изменено на btc (from bitcoin) в моей вилке.

Чтобы запустить это, вы будете использовать os.chdir("c:/python/pybitcointools") (или любой другой каталог, на который он был загружен. Затем from bitcoin import *. Теперь давайте использовать msg = 'The enemy of my enemy is my friend' и rawtx = "01000000016e3cd2b24fcf49259db29888ec5fe6521070041cb8c7bb2017537046f9e00f2b0000000000ffffffff0168d61100000000001976a91469bbbb16301e40b9fb67130e1aa53a2281d60af088ac00000000"

mk_opreturn(msg, rawtx) возвращает:

01000000016e3cd2b24fcf49259db29888ec5fe6521070041cb8c7bb2017537046f9e00f2b0000000000ffffffff0268d61100000000001976a91469bbbb16301e40b9fb67130e1aa53a2281d60af088ac0000000000000000246a2254686520656e656d79206f66206d7920656e656d79206973206d7920667269656e6400000000

Это необработанный Tx с правильной установкой OP_RETURN. Запустите функцию без параметра rawtx и он вернет строку 6a2254686520656e656d79206f66206d7920656e656d79206973206d7920667269656e64

ответил Wizard Of Ozzie 18 Mayam15 2015, 05:45:50
1

Сценарий просто (так сказать) принимает необработанную транзакцию и сплайсинг в шестнадцатеричном числе, которое представляет дополнительный вывод Tx. Поэтому он ищет ffffffff ( sequence ) и добавляет 6a hex encoding of your msg (до 20 байтов)

Сообщение нуждается в преобразовании в hex (что делает код).

Код работает отлично для меня, хотя мне еще предстоит попробовать трансляцию. Исходя из вашей котируемой ошибки

  

Я получаю сообщение об ошибке (из API-интерфейса Blockchain.info): Исключение: Нет Стандартный вывод сценария OP_RETURN 594f4c4f53574147

Я бы сказал, что BCI реагирует на часть кода MessageLen. Должен быть OP_PUSHDATA1 (0x4c) между OP_RETURN (0x6a) и 1 byte msg length, 0x08.

Попробуйте: 6a4c08594f4c4f53574147

В качестве альтернативы попробуйте другую услугу, чтобы нажать raw Tx, например:

ответил Wizard Of Ozzie 9 FebruaryEurope/MoscowbMon, 09 Feb 2015 13:04:21 +0300000000pmMon, 09 Feb 2015 13:04:21 +030015 2015, 13:04:21
0

Вы можете найти нашу библиотеку python-OP_RETURN полезной, либо использовать готовые, либо заглянуть внутрь, чтобы посмотреть, как мы строим транзакции OP_RETURN.

https://github.com/coinspark/python-OP_RETURN

Он также имеет аккуратную функцию для хранения данных произвольного размера в блок-цепочке с использованием транзакций с несколькими цепями с OP_RETURNs и для извлечения этих данных с использованием одного 12-значного ссылочного номера.

ответил Gideon Greenspan 1 J000000Wednesday15 2015, 11:05:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132