user6160: I am interested in the possible use of the Bitcoin (or other altcoin) blockchain as a generalized distributed ledger, meaning that it is useful for tracking information other than coin transactions proper. A prerequisite for that would seem to be the ability to pay for transactions whose primary purpose is not moving Bitcoins from one address to another. So, can Bitcoin transactions list no outputs, thus leaving all inputs as a transaction fee reward for the miner?

user2306: No. If you create one, it won't be relayed or mined by Bitcoin Core. If it gets into a block, it will be rejected. From the source code for Bitcoin Core (tx_verify.cpp:164):
if (tx.vout.empty())
    return state.DoS(10, false, REJECT_INVALID, "bad-txns-vout-empty");

However, you can create a vout with 0 satoshis. That isn't a "standard" transaction, so it will not be mined by the software by default. However, if it gets into a block, it's valid.
There is another way you could do it. Using the OP_RETURN opcode. OP_RETURN in a transaction output forces anyone referencing that output to fail spending it(the script returns and transaction is invalid). Although the output exists, it is provably unspendable.

6160: <p>I am interested in the possible use of the Bitcoin (or other altcoin) blockchain as a generalized distributed ledger, meaning that it is useful for tracking information other than coin transactions proper. A prerequisite for that would seem to be the ability to pay for transactions whose primary purpose is not moving Bitcoins from one address to another. So, can Bitcoin transactions list no outputs, thus leaving all inputs as a transaction fee reward for the miner?</p>
 2306: <p>No. If you create one, it won't be relayed or mined by Bitcoin Core. If it gets into a block, it will be rejected. From the source code for Bitcoin Core (<a href="https://github.com/bitcoin/bitcoin/blob/f8a29ca823fba7fc0eb63896ac4d3d5a0093a023/src/consensus/tx_verify.cpp#L164" rel="nofollow noreferrer"><code>tx_verify.cpp:164</code></a>):</p>
<pre><code>if (tx.vout.empty())
    return state.DoS(10, false, REJECT_INVALID, &quot;bad-txns-vout-empty&quot;);
</code></pre>
<p>However, you can create a vout with 0 satoshis. That isn't a &quot;standard&quot; transaction, so it will not be mined by the software by default. However, if it gets into a block, it's valid.</p>
<p>There is another way you could do it. Using the <code>OP_RETURN</code> opcode. <code>OP_RETURN</code> in a transaction output forces anyone referencing that output to fail spending it(the script returns and transaction is invalid). Although the output exists, it is <strong>provably unspendable</strong>.</p>
