I'm trying to make a simple program that can reliably upload an OP_RETURN transaction. I have found some examples online, but so far they don't work consistently. The ones that go through seem to be random. Here are the transactions that went through


It is very hit or miss every time I try. I have been entirely unable to upload any transactions using the script, however once in a while if I upload the raw transaction using blockchain they go through. Any ideas? Here is the error message.

Traceback (most recent call last):
  File "/Users/JC/Documents/DevelopmentStuff/programming /Python/bit/op-return_test2.py", line 51, in <module>
  File "/Library/Python/2.7/site-packages/bitcoin/bci.py", line 237, in pushtx
    return f(*args)
  File "/Library/Python/2.7/site-packages/bitcoin/bci.py", line 192, in bci_pushtx
    return make_request('https://blockchain.info/pushtx', 'tx='+tx)
  File "/Library/Python/2.7/site-packages/bitcoin/bci.py", line 23, in make_request
    raise Exception(p)
Exception: None Standard Script Output OP_RETURN 48656c6c6f

Here is the code. I would really appreciate any help. Thanks

# coding: utf-8

from bitcoin import *
import binascii
from test import *

priv = "Private key"

pub = "1Eoo7G7u97EMwptSxjYjpvdx9zYcqJBn9y"

addr= "1Eoo7G7u97EMwptSxjYjpvdx9zYcqJBn9y"
inputs = unspent(addr)

message = "Hello"
FullLen = format(len(message)+2,'x').rjust(2,'0') 
MessageLen = format(len(message),'x').rjust(2,'0')
ID = binascii.hexlify(str(message))
#snd = "6a4c28"+ID
snd = "6a"+MessageLen+ID
print hexlify(chr(len(message)))
print MessageLen
print snd
#snd = "6a4c"+MessageLen+ID
#print snd
newScriptPubKey = "6a" + hexlify(chr(len(message)))+ hexlify(message)
#print newScriptPubKey

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

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

print tx

print(pushtx(tx)) # Error is raised on this line
  • What line specifically does it error on? Can you post the full traceback?
    – Nick ODell
    Apr 29 '15 at 3:35
  • In the future, please edit it in instead of putting it in a comment.
    – Nick ODell
    Apr 29 '15 at 3:47
  • Yeah sorry I'm trying to reformat it. How do I do this in the comments ? I just deleted it so I can format it correctly.
    – Jay Sea
    Apr 29 '15 at 3:49
  • You can't edit comments.
    – Nick ODell
    Apr 29 '15 at 3:50
  • Alright well thanks to whoever added it to the original post.
    – Jay Sea
    Apr 29 '15 at 3:52

From e90acad12b19d7b9a4760a5af4603a9da06e6231e699072bcb71aced795abd62:


{'ins': [{'outpoint': {'hash': 'a5221ad4b031d9487dfb2c334b3d84a3c33d908e5f1089141a72b2f4c98baf55',
    'index': 0},
   'script': '483045022100e684df2de15562b09f267d6ec25a1f8043e0162fb7426e40ee87a1a0b51a4ab8022009069aced5a4a33ac720dbbafad37b36e1
   'sequence': 4294967295L},
  {'outpoint': {'hash': 'a5221ad4b031d9487dfb2c334b3d84a3c33d908e5f1089141a72b2f4c98baf55',
    'index': 2},
   'script': '483045022008e0edd19548f7098db140d703fd60e00b184c7d4746da57fdb36f5ff573bc080221008203612b6bf02e9e15bde7e412085323e4
   'sequence': 4294967295L}],
 'locktime': 0,
 'outs': [{'script': '76a91497734226bd4c9c7764771a077e775e8581e030e988ac',
   'value': 50000},
  {'script': '6a4c0848656c6c6f526179', 'value': 0},
  {'script': '76a91497734226bd4c9c7764771a077e775e8581e030e988ac',
   'value': 210477}],
 'version': 1}

{'script': '6a4c0848656c6c6f526179', 'value': 0}

That OP_RETURN is Non-Standard, which is the error message BCI is throwing. It's the 4c preceding 6a that's the issue: if a push data code is not needed, then the Tx is non-standard. It should just read 6a48656c6c6f526179, or in the serialized Tx it'd be 096a48656c6c6f526179 instead of 0b6a4c0848656c6c6f526179.

  • That is one of the transactions that went through. I was simply messing around trying to see if adding things to the beginning of the script made a difference. You can see that in the #snd = "6a4c"+MessageLen+ID. I have no idea why that one worked. As the program looks now the script is correct but still not uploading anything even when its 6a0848656c6c6f726179. Any thoughts ?
    – Jay Sea
    Apr 29 '15 at 16:47
  • Have you got the 0b in front of it? That's crucial as it's saying push 11 bytes (the message, op_return and varint = 9+1+1) Apr 30 '15 at 5:22
  • There is no 0b in front. I am simply running the code I posted above. I can message you the private key with a few dollars on it if you would like to run it yourself.
    – Jay Sea
    Apr 30 '15 at 15:08
  • read the comment. I'll email you tomorrow. Thanks.
    – Jay Sea
    May 1 '15 at 4:33
  • @jaysea I've forked pybitcointools so you can use the mk_opreturn function, as discussed: https:// github.com/simcity4242/pybitcointools. I'll detail a signed example Tx here shortly May 19 '15 at 5:15

You might find our python-OP_RETURN library helpful, either to use out-of-the-box, or to look inside to see how we are building OP_RETURN transactions.


It also has a neat feature to store arbitrary-sized data in the blockchain using multiple chained transactions with OP_RETURNs, and to retrieve that data using a single 12-digit reference number.

  • Looks like this could help , thanks. I don't plan on downloading bitcoin core however. From what I can see it can be used as a library ? Where does the private key go ?
    – Jay Sea
    Jul 1 '15 at 23:08
  • Currently it requires Bitcoin Core. Although we are also working on a version of SparkBit (a lightweight SPV client) which will be usable together with python-OP_RETURN to do this without requiring Bitcoin Core. Jul 2 '15 at 6:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.