Here's some great news! Under the
Write tab there is a button
Import to Paystamper. PayStamper is essentially a means to let a dedicated cryptograffiti encoder save the message to the block chain for you. But that's not all you should know about that button.

Some time ago someone made a very interesting donation to cryptograffiti.info:
https://blockchain.info/tx/075dacbc6eff01de36a1e03bb8b2fe58e49e9e5bd17f6e588b8ddf19f6bcb9e1
As you can see, the donation contains duplicate output addresses (make sure to enable the
Advanced mode at the bottom of blockchain.info's web page). So far I deemed it impossible to make Bitcoin transactions that contain duplicate outputs. However, it clearly is not impossible. Thanks to that particular donation I started to develop the needed functionality that would allow PayStamper to also include duplicate outputs in the same transaction.

This functionality is now done. Whenever your message contains duplicate chunks and your normal wallet would not allow to make the transaction, import the message to PayStamper and it will save your text no matter how many duplicate outputs it contains. Because PayStamper is currently under development the paystamper.com and cryptograffiti.info/paystamper are not synchronized. The version that is pointed by the CryptoGraffiti.info's
Write tab is the latest version of PayStamper so I'd recommend you use that link instead of going to paystamper.com.
How to make a transaction to duplicate outputs? There are 2 ways. You could change the source code of your bitcoin-core wallet. Comment out the exception that is thrown on duplicate outputs when you attempt to create a raw transaction with RPC (see the highlighted line below, it's from
rpcrawtransaction.cpp).

Or, the way paystamper does it --- before calling
createrawtransaction replace the addresses with unique indexes that map your real output addresses. After receiving the hex string of the raw transaction replace the unique index address substrings with your actual output addresses.
Here's the
Lua code I implemented to do the trick explained above:
function bitcoin_fun_create_raw_transaction(inputs, outputs)
-- Because Lua dictionaries cannot have a predefined order we must
-- construct this request manually.
local outputlist = "{";
local k, v;
local mapping = {};
local order = {};
local index;
local index_hex;
local hex;
local salt = "MPGdJA7KX9TwBB7i";
for i=1, #outputs do
k, v = next(outputs[i], nil);
index_hex = hash_SHA256(i..salt, false);
index_hex = string.sub(index_hex, 1, 40);
index = string.fromhex(index_hex);
index = Bitcoin.stringToAddress(index);
hex = Bitcoin.addressToString(k);
hex = string.tohex(hex);
mapping[index_hex] = hex;
table.insert(order, index_hex);
--log("mapping["..index_hex.."] = "..hex);
outputlist = outputlist..'"'..index..'": '..v;
if (i < #outputs) then
outputlist = outputlist .. ", ";
end;
end;
outputlist = outputlist .. "}";
local inputlist = JSON:encode(inputs);
local request = '{\n'..
' "id": 1, \n'..
' "jsonrpc": "2.0", \n'..
' "method": "createrawtransaction", \n'..
' "params": [ '..inputlist..', '..outputlist..' ]\n'..
'}';
--warn(request);
response = url_post("http://"..bitcoin.rpc_user..":"
..bitcoin.rpc_password.."@"
..bitcoin.rpc_ip..":"
..bitcoin.rpc_port.."/", request);
--warn(response);
if (response ~= nil) then
local t = JSON:decode(response);
if (t ~= nil and type(t) == "table") then
if (type(t.error) == "table" and type(t.error.message) == "string" ) then
log("Bitcoin createrawtransaction: "..t.error.message);
else
local k,v;
local s = 1;
local e;
local bad = nil;
-- Replace indexes with real output hex representations that may
-- contain duplicates.
for i=1, #order do
k = order[i];
v = mapping[k];
s, e = string.find(t.result, k, s, true);
if (s ~= nil and e ~= nil) then
t.result = t.result:sub(1, s-1) .. v .. t.result:sub(e+1);
s = e + 1;
else
bad = k;
end;
end;
--warn(t.result);
if (bad ~= nil) then
warn("Index hex "..bad.." not found from raw transaction.");
return nil;
end;
end;
return t.result;
end;
end;
return nil;
end;
This added functionality should be a lifesaver for people who want to save ASCII art or other texts that contain repetition to the block chain.