如何创建艺术作品的数字记录(How to create a digital record of a piece of art)
关于资产的数字表示
我们正在走向一个时代,在这个时代,每个物理对象在数据库中都有一个数字表示。这可以是证书、数据库中的简单条目或其他形式的数字足迹的形式。在过去,这是与购买汽车、绘画或任何其他类型的资产相关的纸质轨迹。今天,在我们生活的大部分方面,数字正在慢慢取代模拟。由于密码学的进步,我们正在达到一个点,即使一个特定对象的所有权声明也不再需要是一个有签名的纸质证书。这允许数字化发展到一个新的水平。BigchainDB作为一种解决方案非常适合用作数字资产注册和跟踪工具。
使用您自己的一幅著名画作的数字注册的示例,在本教程中,您将了解如何在BigchainDB上注册资产,以及如何将此资产的所有权数字化地转移给其他人。这个例子是为了说明的目的。对于现实生活中的应用程序,需要包括额外的组件。
1、安装
首先安装官方的BigchainDB JavaScript驱动程序、Python驱动程序或Java驱动程序:
# JavaScript driver
npm i bigchaindb-driver
# Python driver
pip install -U bigchaindb-driver
<!-- Java driver, in pom.xml for Maven users -->
<dependency>
<groupId>com.bigchaindb</groupId>
<artifactId>bigchaindb-driver</artifactId>
<version>1.0</version>
</dependency>
然后,将其作为模块包含并连接到任何BigchainDB节点。
- js
const BigchainDB = require('bigchaindb-driver')
const API_PATH = 'https://test.bigchaindb.com/api/v1/'
const conn = new BigchainDB.Connection(API_PATH)
- python
from bigchaindb_driver import BigchainDB
conn = BigchainDB('https://test.bigchaindb.com')
- java
BigchainDbConfigBuilder
.baseUrl("https://test.bigchaindb.com/").setup();
2、创建密钥对
在BigchainDB中,用户被表示为私钥和公钥对。在我们的例子中,将为Alice创建一个密钥对。
对于Alice,可以使用BIP39库从种子短语生成密钥对,因此只需要记住这个特定的种子短语。下面的代码说明了这一点。
- js
const bip39 = require('bip39')
const seed = bip39.mnemonicToSeed('seedPhrase').slice(0,32)
const alice = new BigchainDB.Ed25519Keypair(seed)
- python
from bigchaindb_driver.crypto import generate_keypair
alice = generate_keypair()
- java
net.i2p.crypto.eddsa.KeyPairGenerator edDsaKpg = new net.i2p.crypto.eddsa.KeyPairGenerator();
KeyPair alice = edDsaKpg.generateKeyPair();
3、BigchainDB上资产的数字注册
现在,让我们假设Alice非常幸运,在西班牙博物馆普拉多美术馆举行的拍卖会上,她以惊人的价格获得了西班牙画家迭戈·维拉兹克斯的名画《拉斯梅尼娜斯》。现在,她想确保她能以数字方式证明自己是这幅画的主人。由于这个原因,她想把这幅画注册为BigchainDB上的资产,以便拥有不可变索赔权。这与BigchainDB中的CREATE事务相对应。使用她的密钥对,Alice可以在BigchainDB上创建资产。在您的情况下,该资产将代表现实生活中的一个对象,即画拉斯梅尼纳斯。该资产将永远驻留在BigchainDB中,并且不可能删除它。
需要的第一步是定义表示绘画的资产字段。这个字段包含关于不可变的资产的数据。它具有JSON格式:
- js
const painting = {
name: 'Meninas',
author: 'Diego Rodríguez de Silva y Velázquez',
place: 'Madrid',
year: '1656'
}
下一步,您需要生成一个CREATE事务来将定义的资产链接到用户Alice。在BigchainDB中发布该事务有三个步骤。首先创建它,然后签名,然后发送。每个步骤都有不同的方法。这里,我们说明其中之一:
- js
function createPaint() {
// Construct a transaction payload
const txCreatePaint = BigchainDB.Transaction.makeCreateTransaction(
// Asset field
{
painting,
},
// Metadata field, contains information about the transaction itself
// (can be `null` if not needed)
{
datetime: new Date().toString(),
location: 'Madrid',
value: {
value_eur: '25000000€',
value_btc: '2200',
}
},
// Output. For this case we create a simple Ed25519 condition
[BigchainDB.Transaction.makeOutput(
BigchainDB.Transaction.makeEd25519Condition(alice.publicKey))],
// Issuers
alice.publicKey
)
// The owner of the painting signs the transaction
const txSigned = BigchainDB.Transaction.signTransaction(txCreatePaint,
alice.privateKey)
// Send the transaction off to BigchainDB
conn.postTransactionCommit(txSigned)
.then(res => {
document.body.innerHTML += '<h3>Transaction created</h3>';
document.body.innerHTML += txSigned.id
// txSigned.id corresponds to the asset id of the painting
})
}
现在,Alice已经把她的画在BigchainDB上进行了数字注册。Alice的公钥出现在输出中,指定她是这幅画的所有者。id是唯一标识您的资产(您的资产id)的id。注意,元数据字段用于记录值以及交易(例如,绘画的价格)。这是一个在每个事务中可以不同的字段(因为每个事务可以具有不同的元数据,因为例如绘画的价格会发生变化)。
一旦事务结束于一个确定的有效块,它就成为“金科玉律”。不能改变,不能删除。该资产现在已注册,不能删除。但是,元数据字段的使用允许您在资产中进行更新。为此,您可以使用TRANSFER事务(及其任意元数据)来存储任何类型的信息,包括可以被解释为更改资产的信息(如果希望以这种方式对其进行解释)。
4、BigchainDB上的资产转移
现在,让我们假设Alice已经把她的画卖给了其他人,并且她想要数字化地反映这种转移。在BigchainDB中,这将对应于TRANSFER事务。为此,首先需要为新所有者(newOwner)创建一个新的密钥对。为了简单起见,在下面的代码中省略了这个步骤。
getTransaction方法允许我们搜索具有其id的事务,因为我们需要完整的事务来进行转移事务。
基于此,我们现在可以创建传输事务:
- js
function transferOwnership(txCreatedID, newOwner) {
// Get transaction payload by ID
conn.getTransaction(txCreatedID)
.then((txCreated) => {
const createTranfer = BigchainDB.Transaction.
makeTransferTransaction(
// The output index 0 is the one that is being spent
[{
tx: txCreated,
output_index: 0
}],
[BigchainDB.Transaction.makeOutput(
BigchainDB.Transaction.makeEd25519Condition(
newOwner.publicKey))],
{
datetime: new Date().toString(),
value: {
value_eur: '30000000€',
value_btc: '2100',
}
}
)
// Sign with the key of the owner of the painting (Alice)
const signedTransfer = BigchainDB.Transaction
.signTransaction(createTranfer, alice.privateKey)
return conn.postTransactionCommit(signedTransfer)
})
.then(res => {
document.body.innerHTML += '<h3>Transfer Transaction created</h3>'
document.body.innerHTML += res.id
})
}
再次注意,在这个传输事务的输出中,我们有newOwner.publicKey。这表明爱丽丝已经把梅尼纳斯的所有权转让给了其他人(新主人)。此外,正在使用的输入是0,因为只有一个输入。另外,请注意,元数据字段用于更新关于绘画的信息(交易的价格,增加到30mn)。欧元等)。
您现在已经更新了您的资产,现在不再是爱丽丝谁将能够转让绘画,因为其他人现在是所有者。
就是这样,我们创建了绘画的数字表示,并将所有权转移给另一个用户。