教程

手把手教你用以太坊和 IoT 来 token 化你的车

Ajian   |     |   697 次阅读

去年,我们在黑客松上与 Karma Automotive 合作的概念证明项目荣获第一名。现在,我终于有时间将这个实现写下来,与开发者社区的各位分享。我希望你们都能有所收获。

如果你想深入了解本项目的意义(将资产代币化并通过代币来整合网络服务,从而实现无摩擦市场),请点击这里

Karma Car Token(Karma 汽车代币)会提供一个由以太坊保证安全的 attestation,用于代表汽车的使用权;其代币化的形式也可以在 DeFi 市场上流通,用于出租和贷款。

通过 TokenScript、AlphaWallet 和 Web3E 的完整用户接口,很容易就能把 token 部署到网络上。

部署并创建 Car Token TokenScript 的步骤如下:

  • 在以太坊区块链上部署 NFT Token(非同质化代币)来代表所有权
  • 编写 TokenScript 来提供用户接口,以便用户使用代币功能
  • 编写 IoT (物联网)接口,实现与汽车的物理连接

部署 token

可访问以下网站快速部署非同质化代币:

在最终实现中,你可以得到一个 factory 式合约,用户发行特殊 token(或者说 attestation)和 token。用户可以使用该 attestation 来铸造可在预定时间段内使用的代币;通过这种方式,我们可以实现一个去中心化的汽车借贷平台,token 的用途也是得到明确限定的(例如,使用时限)。不过,对于我们当前的实验来说,只要有铸造 token 的功能就可以了。

铸造代币之后,请记下合约地址。本例中所使用的代币是在 Rinkeby 上铸造的(network ID 4)

编写 TokenScript

我们可以使用 TokenScript 示例库中的几个脚本示例

归根结底,TokenScript 的设计主要包含以下几个部分:

  • 原始合约 —— 脚本所引用的代币合约,即,你在钱包页面点击的代币。
  • 功能 —— 除固有代币功能之外的定制功能。
  • 代币视图卡 —— 用来覆写默认视图,提供一个更加个性化的用户体验。

点击此处,查看完整的 Car TokenScript 。

该 TokenScript 已经预先经过规范化,使其更易于实现。点击此处,查看现行模块。你可以在 Karma.XML 文件中看到文件的基本布局,其中包括功能和属性。在你利用 makefile 文件构建脚本之时,这些视图会被解析到脚本之中。

请注意第 17 行的合约地址;这个地址是之前被用来铸造代币的。这就是 “origin” 代币;请注意这里的 “origins” 可以有多个定义;同一个脚本可应用于多个代币;同一个代币合约可部署到不同的地方和不同的网络。毕竟,你可能会想在测试网上部署测试代币,以便开发和调试。

TokenScript 中包含 CSS 格式的代码,即,一个图标化的视图。该视图是用户点击代币时显示的第一个视图,而且代币页面上还会显示一些功能按钮:

每个功能都有各自的关联页面,都是由 CSS 、HTML 和 JavaScript 组成的标准网页。在每个页面中,你都可以访问脚本底部第 717 行开始定义的属性。请注意,这些属性可以来自 TokenID 或智能合约功能(分别对应的是 origins/token-id 和 origins/ethereum)。

  • 开始:授权代币持有人进入汽车并启动引擎。
  • Attestation:由官方机构(政府)、保险(经过认证的保险公司)和服务商(汽车厂商)开具的汽车登记证明。
  • 市场:在 DeFi 市场上将汽车所有权代币作为质押物,用来拍卖、出租或出售汽车。这些服务可由第三方,甚至由所有者自己创建的服务,来托管。如果代币所有者被转移到了另一个账户,这个账户就合法拥有这辆汽车。

钱包还提供了代币合约的固有功能。就本文的案例而言,这些功能指的是转移、出售和赎回。赎回功能可以被动充当所有权证明,用来向用户提供专属服务,比如,机场贵宾室。换言之,它提供了安全的所有权证明 —— 除了合约或代币所有者之外,无人可转移或销毁代币。

要将 TokenScript 部署到钱包中,最简单的方式是通过电子邮件或聊天服务将其发送到运行 AlphaWallet 的设备上。点击文件之后,intent service(意图服务)会将 AlphaWallet 显示为打开方式。点击会将该脚本加载到钱包中。假设你的钱包里有之前(在“Deploying your Token(部署你的代币)”中)创建的代币,你就能在钱包页面中点击该代币,看到对应汽车的图形。

硬件连接

为实现硬件连接,我们要使用 Web3E 库来作为 TokenScript 的桥梁。

在硬件上运行 Web3E 很简单;如果你之前使用过 Arduino ,就不会有任何困难。

要求:

  • ESP32 或其他兼容至少 4 MB 内存内置 WiFi 的 Arduino 。
  • Visual Studio Code 或安装了 PlatformIO 的 Atom 。

使用 PlatformIO 来创建固件:

  1. 使用 Arduino 框架创建一个新的 ESP32 项目。
  2. 将 Web3E 库添加到依赖项中。
  3. 设置 API 端点,以便 TokenScript 调用。

点击此处,查看已经被设置成使用上述合约的示例固件

你应该将 CAR_CONTRACT_TOKEN 替换成你的铸币地址,否则你无法通过 attestation check。请注意,该代码已经被设置成使用 Rinkeby 测试网。如果你使用其他链,请相应修改 INFURA_HOST (例如,INFURA_HOST = “mainnet.infura.io”)。

你在 TokenScript 中定义的 API 端点必须在固件中进行初始化:

  • getChallenge:返回当前设备挑战,每次尝试挑战时都会更新。
  • checkSignature (sig=XXXXX…):将挑战的签名传递给设备,该设备是依据当前挑战进行验证的,还需要检查来自生成地址的代币是否有效。
  • allForward (addr=XXXX…), backwards (addr=XXXX…), turnLeft (addr=XXXX …), turnRight (addr=XXXX…):指示设备对汽车发出移动指令,来显示对汽车的控制。

然后填写每一个 API 调用的代码。“handleAPI” 函数是在收到 API 调用之后来自 UDPBridge 的回调。每个路径必须向服务器返回一条消息,向用户反馈设备已经收到该指令。在我们的案例中,4 个控制 API 用来切换汽车上的电动机控制器,挑战和签名 API 调用用来实现上文所述的功能。

第一次运行固件会为该设备创建一个 UID 。这个 UID 是使用两组较大的随机值来创建的。这个熵值有两个来源:其中一部分是服务器通过 Java SecureRandom 创建的 16 字节字符串;另外一部分是设备处于活动状态的时间(以微秒计),包括用来连接 WiFi 和 ScriptProxy 的时间。

你必须打开 karma.canonicalized.xml 文件,并复制你的设备地址到文件第 340 行的 iotAddr 变量。确保你已更新手机上的脚本,并通过消息服务或邮件将该脚本再次发送到你的钱包。

使用 token

现在你已经创建了一个在 ESP32 上运行的固件,并将 TokenScript 部署到了 AlphaWallet 上。现在是时候建立连接了!

首先,在你的钱包中找到该代币。如果找不到的话 —— 你用来创建该代币的账户可能与你的手机上的账户不同。在这种情况下,请将该代币转移到你的 AlphaWallet ,或将创建该代币的私钥导入你的 AlphaWallet 。你可以通过助记词、keystore 文件和原始私钥这三种主要格式中的任意一种将密钥导入 AlphaWallet 。Metamask 可导出 keystore 和原始密钥。

现在点击该代币,你就会看到对应汽车的图形。

现在,点击汽车图形查看详细视图,然后点击“开始”。等待很短一段时间(0.5 至 2 秒之间)之后,你就会看到挑战。签署该挑战,你就会看到汽车控制 API 。如果你已经将这些控制 API 连接到电动机上,你就可以通过钱包远程控制你的汽车。

身份验证的准确顺序是从以当前挑战作为消息的已传递签名的 EC-Recover 处获取以太坊地址,然后检查该以太坊地址的代币余额。这是一个非常简单的验证,不考虑代币的有效性。

了解更多关于 TokenScript 和 AlphaWallet 的信息

(完)


原文链接: https://medium.com/alphawallet/a-step-by-step-guide-to-operate-and-tokenise-your-car-ownership-using-ethereum-and-iot-1f04b04d04e2
作者: James Brown
翻译&校对: 闵敏 & 阿剑


你可能还会喜欢:

应该如何处理上链数据?

代币经济学入门:什么是代币 ?

 
0 人喜欢