Hi Vincent,

Indeed the gist was recorded (by mistake) as secret but the link is
supposed to work anyway, I have made it public, thanks for confirming
that it's working now, just in case I am attaching the text file

Regards

Aymeric


Le 04/01/2023 à 21:59, Vincenzo a écrit :
> On Thu Dec 29, 2022 at 5:49 PM CET, Aymeric Vitte via bitcoin-dev wrote:
>> I am not a fan of NFTs as currently designed and used, centralized,
>> insecure, duplicable, virtual, stealable, not signed, expensive
>>
>> But if you consider that a NFT is anything that you can buy or store, as
>> something real, or electronic, or whatever, in the real world, web or
>> metaverse, then it becomes interesting
>>
>> NFTs are mostly used on Ethereum, and a "mess" to describe this stuff is
>> a weak word
>>
>> Then I wrote: "A Bitcoin NFT system": 
>> https://gist.github.com/Ayms/01dbfebf219965054b4a3beed1bfeba7 ,
>> decentralized, secure, not expensive
>>
> The link is gone or just private.
>
> Cheers!
>
> Vincent.

-- 
Sophia-Antipolis, France
LinkedIn: https://fr.linkedin.com/in/aymeric-vitte-05855b26
GitHub : https://www.github.com/Ayms
Move your coins by yourself (browser version): https://peersm.com/wallet
Bitcoin transactions made simple: https://github.com/Ayms/bitcoin-transactions
torrent-live: https://github.com/Ayms/torrent-live
node-Tor : https://www.github.com/Ayms/node-Tor
Zcash wallets made simple: https://github.com/Ayms/zcash-wallets
Bitcoin wallets made simple: https://github.com/Ayms/bitcoin-wallets
Anti-spies and private torrents, dynamic blocklist: 
http://torrent-live.peersm.com
Peersm : http://www.peersm.com

# A Bitcoin NFT system

## Introduction

NFT is another barbarous name invented by the crypto folks meaning quasi 
nothing, by NFT in this proposal we will refer to whatever can be sold or 
referenced from the real world, web and metaverse using a blockchain system

The easy way solution is usually to use Ethereum, create some NFT tokens via 
ERC-721/1155 contracts and/or use some marketplaces such as Opensea which 
always lead to a centralized and insecure system that can collapse at any 
moment, and which is still complicate since nobody understand what is behind, 
fortunately (or not) MetaMask will do the job for you without you understanding 
what you are doing, like wrapped ETH

This is explained here: [Bitcoin, Ethereum, smart contracts, lightning, 
sidechains, Defi, DApps, NFTs, DEX, DAO explained - Centralization vs 
Decentralization](https://gist.github.com/Ayms/04b3084a14ee202e707b3faec57ed26e)

Especially: [tokens and 
sidechains](https://gist.github.com/Ayms/04b3084a14ee202e707b3faec57ed26e#example-2-tokens-and-sidechains)

And: 
[Opensea](https://gist.github.com/Ayms/04b3084a14ee202e707b3faec57ed26e#example-6-opensea)

## Purpose

The purpose of this proposal is to propose <b>a simple NFT system based on the 
Bitcoin blockchain</b>, assuming that the main purpose of a NFT is to be 
sold/bought, but not only, it can be something that you keep for yourself 
proving your ownership on the blockchain, the advantages compared to using 
Ethereum or any blockchain/sidechain on both networks (or others) will be 
explained below

## Referencing a NFT

A NFT can be a physical good, an electronic item (such as image), something 
virtual or not, in fact anything

If we take a document or an image, a simple reference to the NFT is its hash 
(SHA-256), but it is not really relevant since it's easy for a thief to 
slightly modify the document or image which will lead to a different hash

Now in what follows we will allocate a hash to reference any NFT

## The final hash reference to a NFT

Depending on the conditions the hash can be known (public marketplace for 
example) or unknown (only the buyer and the seller know it or the owner)

Thererfore the reference to the NFT will be the SHA-256 of its hash, which then 
hides the original hash, this is of course useless if the hash is known but 
let's keep the same convention, called |reference| in what follows

## Minting a NFT on Bitcoin

"Minting a NFT" just means to record your ownership of the NFT in the blockchain

To mint a NFT that you own on Bitcoin, you can do a transaction whose output 
will be:

    From address A (the seller):
     OP_RETURN |reference|
     DUST (A or B) or refund to an address of yourself (A or B)

Since the transaction is signed by A, we know that A is the owner of the 
reference, but note that from this point the public key of A is known, 
therefore if the purpose is to store a long term NFT then use another address B 
of yourself (because in some time it will be easier to crack a bitcoin address 
for which we know the public key rather than one that holds some bitcoins but 
has not been spent, so knowing only the hash of this address)

An OP_RETURN output is just something where you can store some data, limited to 
512B

A lot of variations are possible in this article, for example you can decide to 
allocate one A address per NFT, it just depends on the use cases

For all the transactions mentioned in this article, opt-in for Replace By Fee 
must not be used [Replace By Fee](https://bitcoin.fr/replace-by-fee-rbf/)

It would be possible not to use OP_RETURN and for example store the |reference| 
in scriptSig, then construct an address (scriptPubKey) that will drop it while 
executing, but this would be a non standard transaction, so you shoud rely on 
some miners to mine it, without stealing your NFT, since it's easy for a miner 
to change the transaction and mint the NFT for himself

## Minting several NFTs in one transaction

You can do the very same using the Chainpoint protocol, which is to build a 
Merkle tree from |reference1| |reference2|....|reference N| (for which we 
recall will be the SHA-256 of the original NFTs hash), and replace the root of 
this tree in |reference| above

How Chainpoint work is well described here: [Chainpoint 
Proof](https://github.com/chainpoint/whitepaper/issues/5#issuecomment-304452107),
 basically while making a Chainpoint tree you get a proof to rebuild it from 
any |reference| (that you must know), which is just the other hashes that you 
need to know to reach the root 

In that case only the owner of the multiple NFTs knows the proofs and/or the 
|references|, unless he decides to release them, which he should do as 
described in the next paragraph (because the hashes and proofs must be known to 
check the validity of NFT transfers)

In what follows we will make reference to a Chainpoint |reference|

## Avoiding double minting

Double minting of NFTs is quite trivial, as far as we know there are zero 
protections against this in existing systems (Ethereum and others), the 
principle is simple: you mint several time the same NFT and possibly sell it 
several time or get robbed (the thief does transactions using the |reference| 
that he saw), because it's easy for a malicious person to do the very same 
transaction that you did and pretend the ownership of the NFT, or it's easy for 
you to mint it to different marketplaces or mint it several time, and then sell 
it several time

To illustrate this, read [Solving the double minting 
problem](https://medium.com/geekculture/solving-the-nft-double-minting-problem-with-computer-vision-c57bbbb4652d)

Unfortunately the above article just refers to images and the solution does not 
work at all at the end, because associating the picture to the camera or 
whatever that took it does not work and is easy to fake

Coming back to our bitcoin case, it seems simple to elect you as the real owner 
of the NFT since you made the transaction first, then based on the timestamp 
you are definitely the owner, but no

The thief could intercept your transaction, decide not to broadcast it further, 
replace it by a transaction minting your NFT for himself, with higher network 
fees for example and more direct access to miners, then this transaction will 
be the first one and the thief would have stolen your NFT

You can't do anything against this without using a third party to record that 
you had the knowledge of the |reference| first

The same problematic exists for example for js code loading, see 
[Bitcoin-transactions wallet/tools](https://peersm.com/wallet), here our github 
account is used to check the code

Then the very same is proposed here, preferably using the [Wayback 
Machine](https://archive.org/web/) to store |reference| (that you are the only 
one to know at this stage) signed by A before minting the NFT, then for sure 
you are the owner of the NFT because you are the first one to have referenced 
|reference| and signed it with your address (note again that as soon as you 
sign something the public key of A is known)

You can use other systems, github, even Twitter

What if all of those systems disappear and I can't prove anything any longer? 
Well, then probably internet has disappeared too

Anyway like the WebRTC peer introduction mechanism you can do this by any means 
you like, your own website, even a letter, you just need to prove that A had 
the knowledge of the double hash first

Now the double minting case is supposed to be marginal, except if you are a 
thief yourself

## Transferring a NFT for free

For a gift or whatever other reason, A can decide to transfer a NFT for free to 
C, the transaction will be:

    From address A (the seller):
     OP_RETURN |some code||reference|
     DUST (C) and refund to an address of yourself (A or B)
                
|some code| is just used to make the distinction between a minting operation

A sends the original hash to C
                
## C Buying a NFT from A

The transaction will be:

    From address C (the buyer):
     OP_RETURN |price||some code||reference|- signed by A
     |price| to A and refund to C or other C address
                
Once A and C have agreed on a price then A should send to C the |price||some 
code||reference| signed by him, which proves that the deal is accepted

If C tries to cheat and does broadcast a transaction that does not match the 
agreed price (since C cannot fake the signature of A), then C is still not the 
owner of the NFT and has lost its bitcoin, if a thief intercepts the 
transaction and does another one for himself, that's the same, since he is not 
willing to pay for the price

If A receives the correct amount, then he will send to C the original hash of 
|reference|, the same principle applies for all following transactions

We can not really enforce this, A could not send the hash, but for what 
purpose? This represents the same trust model than when you are buying some 
goods (the hash is the ticket), now in normal conditions the original hash is 
not really mandatory

Note that we know from minting/signing the public key of A, therefore anybody 
can verify the signature in the OP_RETURN

Note again that the signature of A is enough to know its public key and check 
the signature, <b>therefore minting is not mandatory</b> (depending on the use 
cases again)

Note also that in Ethereum style, that's the other way around, where A would 
initiate the final transaction to the NFT contract that will transfer to C

## C selling a NFT to D

That's the same:

    From address D (the buyer):
     OP_RETURN |price||some code||reference|- signed by C
     |price| to C and refund to D or other D address
                
C sends the original hash to D

## C Buying a NFT from A from a Chainpoint |reference|

A sends to C the |price||some code||reference||Chainpoint proof| signed by him, 
C then do the following transaction:

    From address C (the buyer):
     OP_RETURN |price||some code||reference||Chainpoint proof|- signed by A
     |price| to A and refund to C or other C address
                
## Group/organization C of buyers

C is then a multisig address funded by the group, and as before:

        From address C (the buyers):
                OP_RETURN |price||some code||reference|- signed by A
                |price| to A and refund to C or other C address

Same principle would apply for Chainpoint |reference|

## But, in all of this, what is the purpose of the double hash for |reference|?

Just to hide (if applicable) that the hash is only known by the buyer and the 
seller if the transactions are correct, then if anything unexpected happens 
they can prove that they are the only one to know the original hash of the NFT

We can take here the example of Kering (luxury group): [Kering NFT 
solution](https://www.ulysse-nardin.com/zh_en/blockchain-technology ), this is 
a variation of what is proposed here, when you buy a luxury product you get a 
certificate, then you go to their website, use the certificate information + 
your name & co, then you get a second certificate and the associated hash, the 
hash is then stored in the bitcoin blockchain in an OP_RETURN using the 
Chainpoint protocol via [Woleet](https://www.woleet.io/fr/accueil/) service

So here you are the only one to know the hash (with Kering), the problem of 
this solution is that it is very centralized and you can't correlate the hash 
to the product. That's where the double hash method could be used, you print on 
the luxury product the double hash (QR code or whatever) and give the original 
hash to the buyer, then if the product is counterfeit (with the same double 
hash) or stolen you can detect it since the malicious seller does not know the 
original hash

## Costs

Currently the network fees are 6-12 satoshis per byte, and the dust limit can 
be set at 546 satoshis

It's not possible to give a precise number here since the transactions depend 
on the number of inputs but an 
[estimation](https://www.bitstamp.net/learn/blockchain/how-are-btc-transaction-fees-determined/)
 would be less than 1 USD per transaction (probably 0.5 USD) against 70 to 100 
USD on gas fees in Ethereum

This is far less than Ethereum NFT tokens see [Moxie 
experience](https://gist.github.com/Ayms/04b3084a14ee202e707b3faec57ed26e#example-7-moxies-experience)

## Is this system centralized?

No unlike whatever exists about sidechains (except Lightning), Ethereum NFTs or 
Dstuff, it is not, because you do not rely on any centralized platform to use 
it (the third party is the one you choose and it can't interact with the 
transactions), or Oracles that would be involved in your transactions 
creation/confirmation/transfer

## Is this system anonymous?

Not totally as currently designed, like Lightning again, since buyer/seller 
must "know" each others, but they can do it via anonymous means like Signal, 
Protonmail, Telegram or other stuff, or Tor, the advise is to create a new good 
old gmail address for this purpose and use PGP keys

In any case others around do not know what is going on

## Why not a super sidechain instead?

You can read this conclusion from a previous article: 
[Conclusion](https://gist.github.com/Ayms/04b3084a14ee202e707b3faec57ed26e#conclusion)

We have different examples, but let's take a few, Binance Smart Chain, 
supposedly compatible with Ethereum is a mess (or FTT/FTX token, see [Collapse 
of FTX and others: the Fxcking Token Theory](
https://www.linkedin.com/posts/aymeric-vitte-05855b26_the-fxcking-token-theory-as-a-coincidence-activity-6996493598653317120-vCpA)),
 and 
[Stacks](https://protos.com/what-is-stacks-and-does-it-really-serve-as-defi-for-bitcoin/)
 for Bitcoin supposedly allowing "smart contracts" and NFT on bitcoin is the 
same, both centralized, insecure, making it difficult to swap the tokens 
between one chain to another

Let's hope this article shows how powerfull (and less costly) is bitcoin, if we 
elaborate on Stacks it's another blockchain on top of Bitcoin, they register 
the blocks inside OP_RETURN in Bitcoin via a "proof of transfer". Why do they 
do this? No idea but surely because their blockchain is neither secured neither 
decentralized, this is just flooding the Bitcoin network with useless 
transactions duplicating proofs on two blockchains

There are many "proof-of-whatever" that are just fake stuff (like Filecoin 
proof of replication https://github.com/protocol/research/issues/4), useless, 
quite dubious, as stated in our conclusion above the intermediate states shoud 
be burned and only the final/relevant result stored in Bitcoin, this is very 
exactly what is doing Lightning

In any case, whatever sidechain/blockchain is proposed can only lead to 
something funny, because even the worldwide networks bitcoin and ethereum are 
still not decentralized today, despite of their age, because something like a 
few thousands nodes is not what we can call a decentralized system, then 
proposing something decentralized on top of it or not does not look serious, 
the only real decentralized network remains Bittorrent

This proposal seems to contradict one of our article [How stablecoins really 
work (Tether example), how to crack them and why you should take care if you 
use 
them](https://www.linkedin.com/pulse/how-stablecoins-really-work-tether-example-crack-them-aymeric-vitte/),
 but no in fact since everything is signed here

## Local Bitcoin

We will not talk here about the craziness of the Bitcoin forks period, which we 
have described here: ["Bitcoin Tartuffe - User guide: How to create your 
bitcoin fork in 5mn, fool everybody and become 
rich](https://www.linkedin.com/pulse/user-guide-how-create-your-bitcoin-fork-5mn-fool-everybody-vitte)

But we can envision a local Bitcoin, which would be limited to an area and is 
just a fork of the Bitcoin code (and not the Bitcoin network), restarting from 
the beginning

Then it's possible to adapt the rules according to the local area, for example 
reducing the costs by eliminating the dust limit, network fees by mining at 
lowest difficulty, unlimited supply and no halving

This seems to contradict the good practices of Bitcoin but not really, since 
the area is limited to people that are supposed to cooperate together, then the 
risk of attack is limited also

You might say that we are criticizing in [Bitcoin, Ethereum, smart contracts, 
lightning, sidechains, Defi, DApps, NFTs, DEX, DAO explained - Centralization 
vs 
Decentralization](https://gist.github.com/Ayms/04b3084a14ee202e707b3faec57ed26e)
 the fact that most of ERC-20/NFT tokens are of zero value, because coming from 
nowhere, but we are proposing the same

Not exactly, the local Bitcoin could be seen as a barter money, with a stable 
value, mined by everybody in the area, then unlike ERC-20 tokens you cannot 
issue 1 Billion of them all of a sudden

It remains decentralized since everybody is participating and get rewarded 
according to the probability distribution

To a certain extent, since the local area management might decide to shut down 
the system

An example is a cruise boat (who might have limited connectivity to interact 
with an outside blockchain and is not willing to burn its batteries with 
mining) where each element of the boat (cabins, kitchen, etc) would mine the 
local Bitcoin, then you can buy/exchange NFTs on the boat, services, use the 
token for the casino, restaurants, shops, the boat metaverse, etc

The local Bitcoin can be crawled from the outside and transactions can be sent 
from the outside, so, for example, luxury vendors and others can propose NFTs 
on board (and deliver them on board or when the boat is at some harbour), and 
NFTs can be proposed inside the boat shops/metaverse

Indeed since the local Bitcoin is not a fork of Bitcoin network, you don't have 
to implement replay protection (SIGHASH), then usual Bitcoin transactions can 
be built and sent to the local Bitcoin, of course you must not make mistakes 
between both chains

How can we bridge this with the Bitcoin network ? The first answer is: why 
would you need to do this? If so, then you need to use a bridge which will be 
of course something centralized, right now we are not aware of other possible 
methods (like atomic swap or other bulls)

This can apply to planes and many other local areas

## License and funding

While this work is public, it is not in the public area and under any open 
source license, then to use it, please contact: aymeric peersm com, PGP Key 
fingerprint : 65EF AE3D 973F D36A AB25 1225 2A1D 7B34 2627 AC39

The goal here is to reference who did fund this proposal

https://web.archive.org/web/20221231185645/https://gist.github.com/Ayms/01dbfebf219965054b4a3beed1bfeba7
_______________________________________________
bitcoin-dev mailing list
bitcoin-dev@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev

Reply via email to