教程:如何创建汽车的数字双胞胎(How to create a digital twin of your car)

关于数码双胞胎(digital twin)

我们正在走向一个物联网正在成为现实的时代。汽车变得更加连通,装备有传感器的设备可以传送数据,物体变得更加智能。这触发了对这些设备的数字化表示的需要,以便将它们的数据存储在安全的位置中,并具有对其活动的完整审计跟踪。这是数字孪生对象的核心思想。
BigchainDB是创建智能设备的数字双胞胎的理想解决方案。在本教程中,您将学习如何构建一个简单和基本版本的数字双胞胎汽车,它允许车主存储和更新汽车的里程。汽车包含一个GPS跟踪器提交里程,GPS传感器有自己的身份识别。

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、去中心化的标示类(Decentralized Identifier Class)


在遥测应用中,某些物体(例如在我们的例子中的汽车)需要有一个身份标示在系统中执行动作。理想情况下,此身份不受任何人控制,从而设备可以真正自主地操作。对于这些用例,在BigchainDB中,我们将使用去中心化标识符(DID),这些标识符是用于可验证的数字身份的、自主的标识符。它们不依赖于集中的注册中心、身份提供者或证书颁发机构。您可以在我们的DID规范中进一步了解它。
因此,在我们的应用程序中,现实世界中的每个对象(如汽车、汽车中的遥测箱、GPS设备等),都将由DID表示。每个对象都有一个包含安全私钥的标签或密码芯片作为唯一标识。
您将创建一个从Orm BigchainDB驱动程序继承的DID类,因此DID对象将具有Orm中可用的所有方法。实体表示对象本身的公钥。

  • Orm BigchainDB JavaScript驱动程序安装:
npm i bigchaindb-orm
  • 建立DID类
const Orm = require('bigchaindb-orm')

class DID extends Orm {
    constructor(entity) {
        super(API_PATH)
        this.entity = entity
    }
}

因此,由于现在每个对象都有自己的密钥对,因此可以从每个对象创建DID。因此,这些物体是自主权的,没有一个中心控制它们。它们将只具有一个用户或其他对象,这些对象将对它们拥有所有权。因为在我们的Orm驱动程序中,需要一个模型,所以本教程可以使用缺省模型。

const car = new BigchainDB.Ed25519Keypair()
const sensorGPS = new BigchainDB.Ed25519Keypair()

const userDID = new DID(alice.publicKey)
const carDID = new DID(car.publicKey)
const gpsDID = new DID(sensorGPS.publicKey)

userDID.define("myModel", "https://schema.org/v1/myModel")
carDID.define("myModel", "https://schema.org/v1/myModel")
gpsDID.define("myModel", "https://schema.org/v1/myModel")

如您所见,在我们的系统中,每个对象或参与者(alice、car、GPS传感器)现在都有自己的密钥对和标识。

4、BigchainDB上资产的数字注册


在生成密钥对(和标识)之后,现在可以在BigchainDB中创建实际资产。在我们的系统中有三种资产:汽车、用户和GPS传感器。因此,作为第一步,您将创建表示每个对象的资产。由于使用了去中心化的标识符,所以可以轻松地调用它们各自的create方法,并且创建资产。
这些资产现在将永远存在于BigchainDB中,并且不可能删除它们。这就是块链技术的不变性。
为了创建第一个资产,您可以生成一个CREATE事务,该事务将BigchainDB中的用户DID表示为资产。用户是自有标识,因此将使用Alice的密钥对创建userDID。

  • js
userDID.myModel.create({
        keypair: alice,
        data: {
            name: 'Alice',
            bithday: '03/08/1910'
        }
    }).then(asset => {
        userDID.id = 'did:' + asset.id
        document.body.innerHTML +='<h3>Transaction created</h3>'
        document.body.innerHTML +=asset.id
    })

如您所见,通过继承Orm类,在BigchainDB中创建资产非常容易。唯一需要的是密钥对和资产。
在DID对象中设置id属性。这是此资产的唯一标识符。
为了创建汽车的资产,您首先需要定义表示汽车的资产字段。它具有JSON格式:

  • js
const vehicle = {
  value: '6sd8f68sd67',
  power: {
    engine: '2.5',
    hp: '220 hp',
  }
  consumption: '10.8 l',
}

现在可以为汽车创建DID。汽车的所有者是Alice,并且她是将来可以转移此资产的人,因此需要Alice密钥对来创建此资产:

  • js
carDID.myModel.create({
        keypair: alice,
        data: {
            vehicle
        }
    }).then(asset => {
        carDID.id = 'did:' + asset.id
        document.body.innerHTML +='<h3>Transaction created</h3>'
        document.body.innerHTML +=txTelemetrySigned.id
    })

对于GPS和汽车的任何其他部分,汽车是这些资产的所有者,因此您将需要汽车密钥对来创建这些资产:

  • js
gpsDID.myModel.create({
        keypair: car,
        data: {
            gps_identifier: 'a32bc2440da012'
        }
    }).then(asset => {
        gpsDID.id =  'did:' + asset.id
        document.body.innerHTML +='<h3>Transaction created</h3>'
        document.body.innerHTML +=txTelemetrySigned.id

    })

现在,您已经在BigchainDB测试网络上以数字方式注册了汽车的部件。
一旦事务结束于一个确定的有效块,它就变成了“金科玉律”。没有改变,没有删除。该资产现在已注册,不能删除。但是,元数据字段的使用允许您将来添加新信息。

5、BigchainDB上资产的更新


在Orm驱动程序中,普通数据库中的所谓Update称为块链中的Append,因为无法真正删除或更新任何数据。因此,为了跟踪汽车的里程,GPS部件将附加一个新事务,该事务包含元数据中的新更新的里程。
因为汽车里程的更新并不意味着所有权的任何改变,所以您的转移事务将只是与作为受益人的先前所有者(汽车)的转移事务,但是在事务中具有新的元数据。因此,从技术上讲,汽车正在将GPS传送到自己,并且只是向该交易添加额外的新信息。

function updateMileage(did, newMileage){
    did.myModel
    .retrieve(did.id)
    .then(assets => {
        // assets is an array of myModel
        // the retrieve asset contains the last (unspent) state
        // of the asset
        return assets[0].append({
            toPublicKey: car.publicKey,
            keypair: car,
            data: { newMileage }
        })
    })
    .then(updatedAsset => {
        did.mileage =  updatedAsset.data.newMileage
        document.body.innerHTML +='<h3>Append transaction created</h3>'
        document.body.innerHTML +=txTelemetrySigned.id
        return updatedAsset
    })
}

因此,最后您已经更新了资产,现在记录您的汽车已经行驶了一段新里程。
就是这样,我们已经创建了一个汽车资产,并且每当汽车行驶新公里时,都会用该资产的新值调用updateMileage,这导致汽车里程不断更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值