Как создать транзакцию с помощью пользовательского скрипта?

Есть ли пошаговое руководство или какая-либо документация, описывающая, как создать нестандартную транзакцию OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG?

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

Может быть, будет полезна ссылка на какое-нибудь программное обеспечение с открытым исходным кодом, которое создает пользовательские транзакции сценариев. Я не знаю ни одного, который существует под рукой, хотя.

Пока нет "; drop table wallet;"возможности.
Маленькие столы Бобби, ты ли это?!
Разве большинство узлов не отвергают пользовательские сценарии? Вот что такое «странные транзакции» Blockchain.info , верно?
Насколько мне известно, нодами отклоняются только транзакции, содержащие найденные здесь «отключенные» опкоды: en.bitcoin.it/wiki/Script
Возможно, этот инструмент Node.js может помочь github.com/jgarzik/txtool
взгляните на биткор-lib

Ответы (2)

Я бы предложил использовать Python для достижения этой цели. У pybitcointools есть все, что вам нужно, чтобы иметь возможность десериализовать шестнадцатеричную транзакцию в JSON и манипулировать ею, а затем снова сериализовать , чтобы иметь возможность подписывать и транслировать через поддержку blockchain.info.

Этот пример перестроит стандартный скрипт с нуля:

>>> opdup = 0x76
>>> ophash160 = 0xA9
>>> push20 = 0x14
>>> opeqver = 0x88
>>> opchecksig = 0xAC
>>> pubkeyhash = 0x2dbde30815faee5bf221d6688ebad7e12f7b2b1a

Мы собираемся добавить шестнадцатеричные значения , перемещая их побитно.

  • OP_DUP OP_HASH160 2dbde30815faee5bf221d6688ebad7e12f7b2b1a OP_EQUALVERIFY OP_CHECKSIG
  • Это гекс , который нам нужен : 76a9142dbde30815faee5bf221d6688ebad7e12f7b2b1a88ac.

Это один из способов сделать это

>>> quickfix = 0xff
>>> asm = quickfix
>>> asm = asm << 8 | opdup
>>> asm = asm << 8 | ophash160
>>> asm = asm << 8 | push20
>>> asm = asm << 8*20 | pubkeyhash
>>> asm = asm << 8 | opeqver
>>> asm = asm << 8 | opchecksig

Затем Ant, чтобы проверить, совпадает ли это:

>>> almost = hex(asm)
>>> ready = almost.partition("0xff")[2]
>>> print(ready)

Надеюсь, это то, что вам нужно :-)

есть ошибка, если используется 0x00 (OP_FALSE), если мы попытаемся сдвинуть влево, ничего не произойдет. быстрое решение - сначала добавить 0xff, а затем удалить его на последнем шаге.

АБСОЛЮТНО Идите!

import(
    "github.com/btcsuite/btcd/txscript"
    "github.com/btcsuite/btcd/wire"
)

tx := wire.NewMsgTx(2)
tx.AddTxOut(wire.NewTxOut(int64(*outputvalueFlag*1e8), script()))

func script() ([]byte) {
    script := txscript.NewScriptBuilder()
    script.AddInt64(1)
    script.AddData(bytes[0:65])
    script.AddInt64(1)
    script.AddOp(txscript.OP_CHECKMULTISIG)
    return script.Script()
}
...