Eluvio Javascript 客户端
Eluvio Javascript客户端的设计是为了通过封装所有必要的HTTP请求,授权,和块链交互,使与Eluvio Content Fabric的互动变得简单.
API 文档
安装
从国家预防机制安装:
npm install --save @eluvio/elv-client-js
注:如果看到 unsupported architecture mac OS X 错误, 请尝试以下操作 :
export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
export SDK_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
使用量
// From source
import { ElvClient } from "elv-client-js";
const { ElvClient } = require("elv-client-js");
// From babel-compiled source
import { ElvClient } from "elv-client-js/dist/src/ElvClient.js";
const { ElvClient } = require("elv-client-js/dist/src/ElvClient.js");
// Minified (browser)
import { ElvClient } from "elv-client-js/dist/ElvClient-min.js";
const { ElvClient } = require("elv-client-js/dist/ElvClient-min.js");
// Minified (node)
import { ElvClient } from "elv-client-js/dist/ElvClient-node-min.js";
const { ElvClient } = require("elv-client-js/dist/ElvClient-node-min.js");
// HTML
<script src=".../elv-client-js/dist/ElvClient-min.js"></script>
初始化客户端
初始化客户端与将其指向相应的Eluvio配置 URL一样简单. 此 URL 将自动返回关于最佳 Fabric, 块链和 KMS 节点的信息, 以及 Fabric 的内容空间 - 客户端与 Fabric 通信所需的所有信息 .
主网:
const client = await ElvClient.FromConfigurationUrl({
configUrl: "https://main.net955305.contentfabric.io/config"
});
对于演示网:
const client = await ElvClient.FromConfigurationUrl({
configUrl: "https://demov3.net955210.contentfabric.io/config"
});
授权
钱包和签名人
以区块链技术为主,与Fabric的互动需要使用一个ethereum私人密钥——代表一个用户账户——以验证和认证请求,进行加密,转移资金,与智能合同互动,一般作为用户的身份.
为了进行必要的区块链互动,客户端要求 签名 包含用户的私钥。 这是一个实例 乙醚(js) 钱包。 ElvClient 有实用类 ElvWallet 以方便处理。 (注:新的elv-media-wallet利用代表用户管理签名机的Fabric API. 详情请联系 支持@ eluv.io(中文(简体) )
在创建 ElvClient 实例后,您可以生成 ElvWallet 用于客户端 client.GenerateWallet()。这一类提供了从各种信息生成签名符的简单方法,以及按名称存储和检索签名符.
使用 Adcount 方法创建签名器后, 您可以使用 ElvClient 设置签名器 client.SetSigner。 。 。 .
const wallet = client.GenerateWallet();
const signer = wallet.AddAccount({
privateKey: "0x0000000000000000000000000000000000000000000000000000000000000000"
});
client.SetSigner({signer});
您不需要使用钱包的账户管理功能,只需使用钱包即可根据需要生成签名对象. 调用任何 Addcount 时选择名称参数 - 将只返回而不是存储签名符 .
请注意,Fabric上的大多数业务都需要资金。 如果该账户没有任何资金,大多数业务都会失败. 您可以使用 ElvClient# 发送基金。 。 。 .
国家频道认证( 如 ElvClient# 播放选项不需要资金.
注意:总是将私人密钥(和mnemonics)视为私人,敏感的用户数据. 总是存储并传送加密( 客户端有密码加密私钥的方法 - 见 ElvWallet# Generate 被压缩的私钥) (中文(简体) ). 简写私钥或元音应 永远 离开用户浏览器 - 所有私钥的使用都在客户端上完成.
访问内容
作为一个分散的,不信任的生态系统,Fabric的内容依赖于智能合同和块链交易来验证一个用户被允许执行某项行动. 每种类型的内容(内容空间,库,对象,类型等)都有相关的智能合同被部署到调解访问的块链上.
例如,要访问内容对象,请求者必须在该内容对象的智能合同上调用访问请求方法,然后在查询内容Fabric API时通过授权符中的交易散列. 内容 Fabric 将在执行请求的行动之前核实交易。 如果交易缺失或无效, 访问将被拒绝 .
ElvClient自动处理所有这一切. 当一种方法被调用时,它将进行适当的交易,并随请求发出正确的授权令牌.
内容、合同和多格式哈舍
如前所述,Fabric上的每一个实体都有一个智能合同的支持. 该合同用于授权和其他功能,但也被用作实体的身份.
每个智能合同都有块链地址. 例如:
0x0472ec0185ebb8202f3d4ddb0226998889663cf2
这个地址用于直接与合同互动,调用方法和进行交易.
然而,这个地址可以被转换为ID,以解决Fabric上的内容.
通过编码Base58的地址,我们得到:
4bWCz6SZZiJ51VUkAb4xGLTgKGm
Fabric上每种不同类型的实体都有前缀. 对于一个图书馆,它是 ilib。如果这份合同是内容库合同,我们可以使用库ID在Fabric上找到相应的图书馆
ilib4bWCz6SZZiJ51VUkAb4xGLTgKGm
然后我们就可以使用这个ID作为 libraryId 在客户端中论证.
此外,我们可以走相反的方向——将Fabric ID转换为相应的合同地址. 这非常有益 -- -- 当我们想查阅内容时,我们需要呼吁遵守内容契约。 通过这个计划,我们很容易从Fabric的身份证上确定合同地址.
简而言之,每个Fabric ID包含
- 实体类型( 图书馆、 对象、 类型、 用户钱包等) 作为 4 字节前缀
- 合同地址
这种转换不应是必须经常完成的事情,因为客户端囊括了Fabric和块链之间的许多共同互动,但当你想在内容的合同上调用方法时是有用的.
客户端包含使这种转换简单化的实用方法.
const address = "0x0472ec0185ebb8202f3d4ddb0226998889663cf2";
// Convert to multihash
const id = client.utils.AddressToHash(address);
// Convenience methods for automatically adding prefixes
const libraryId = client.utils.AddressToLibraryId(address);
const objectId = client.utils.AddressToObjectId(address);
// Convert back to address (requires prefix)
client.utils.HashToAddress(libraryId);
哈谢斯版本
Fabric上的内容对象由不可改变的版本所组成. 每当内容被修改时,都会创建出一个新的版本,而旧版本保持不变.
当指向对象时,对象ID(iq__2vDbmxTdaivPnmDn8RKLbxSHUMfj)指整个对象. 提及带有对象ID的内容会参考最新版本.
然而,您也可以使用hash版本来指代对象的特定版本. 此对象的一个这样的版本是 hq__BD1BouHkFraAcDjvoyHoiKpVhf4dXzNsDT5USe8mrZ7YDhLPDoZGnoU32iZvDYiQW8vVi6X7rV。 。 。 .
作为类比,指一个有对象ID的物体,比起用版本散列来指代它,就如同指Git repo,而指在特定承诺时的repo. 前者指实体整体并随着修改而更新,而后者指特定时间点的实体而不会被修改.
此版本散列为Base58编码字符串,格式如下:
hq__<Base58(<SHA256 digest><size><object ID>)>
简言之,"散文"版本指的是Fabric上的具体内容,它也包含了对象ID,这意味着我们可以确定其合同地址.
客户端包含用于解析版本散列的实用方法 :
client.utils.DecodeVersionHash("hq__BD1BouHkFraAcDjvoyHoiKpVhf4dXzNsDT5USe8mrZ7YDhLPDoZGnoU32iZvDYiQW8vVi6X7rV")
/*
{
"digest": "7e98af41257c1446a4c5fcab9306e5d4f783145391cfa996bf9eca0197dd9388",
"size": 139,
"objectId": "iq__2vDbmxTdaivPnmDn8RKLbxSHUMfj",
"partHash": "hqp_3rzPdsErVFeqjdG9o31rhr62fpEGhg5qv7QJjL6esVLV47i"
}
*/
请注意,像对象ID这样的合同地址无法生成版本散列. 它们是Fabric特有的,必须使用对象ID检索.
创建和编辑内容
如上一节所述,内容由不可改变的版本组成。 这些版本是通过起草草案、修改草案、最后敲定和完成草案而创建的.
在此客户端中, 将创建新的草稿 CreateContentObject 财务报告和审定财务报表 EditContentObject 方法。 。 。 前者创建了新的内容对象,草案提及对象的初始版本,而后者则根据特定内容对象的最新版本创建了新的草案.
两种方法返回 写入符号. 这些符号用于修改内容的所有方法和参考草案的定稿方法.
最终确定对象后,草案被关闭进行编辑,为新版本创建了"散列"版本,对象被承诺并在整个织物上分布.
创建或编辑内容对象的过程如下:
- 打开草稿并取回一个写符
- 使用写入符修改内容( 更新元数据、 上传文件等)
- 最终敲定草案以创建新版本的内容
以下是以文件和元数据创建新内容的例子:
const createResponse = await client.CreateContentObject({libraryId});
const objectId = createResponse.id;
const writeToken = createResponse.write_token;
await client.ReplaceMetadata({
libraryId,
objectId,
writeToken,
metadata: {
tags: [
"video",
"audio"
]
}
});
await client.UploadFiles({
libraryId,
objectId,
writeToken,
fileInfo: [
{
path: "image.jpg",
mime_type: "image/jpeg",
size: 10000,
data: (<ArrayBuffer 10000>)
}
]
});
const finalizeResponse = await client.FinalizeContentObject({
libraryId,
objectId,
writeToken
});
const versionHash = finalizeResponse.hash;
无论编辑类型如何,编辑内容的过程将始终由 CreateContentObject 或者说 EditContentObject 打开一个草案,和 FinalizeContentObject 以发表.
除了内容对象,织物上的其他实体也可以以同样的方式访问和修改,包括库,访问组和用户钱包. 为此,通过转换实体地址获取实体对象:
const libraryId = "ilib2vDbmxTdaivPnmDn8RKLbxSHUMfj";
const libraryAddress = client.utils.HashToAddress(libraryId);
const libraryObjectId = client.utils.AddressToObjectId(libraryAddress);
对象Id然后可以在这些方法中被作为内容对象来修改. 对于库ID参数,请为库指定库ID,以及 client.contentSpaceLibraryId 其他类型.
页:1 默认, FinalizeContentObject 将等待新版本在织物中分发和确认。 在大多数情况下,这种情况发生得很快。 然而,如果在草稿中上传了很多文件内容,这可能需要一些时间. 在此情况下, 您可以指定在定稿时不要等待, 这样您的程序就可以继续 :
await client.FinalizeContentObject({
libraryId,
objectId,
writeToken,
awaitCommitConfirmation: false
});
只有在一个版本内所做的修改才被分发,因此这只是大文件被上传到编辑中的一个因素.
框架客户端
为了保护用户对私钥的访问,统一账户管理功能,应用程序在IFrame内部运行,由 埃卢维奥核心。框架库可以在这个受限制的IFrame中以等效方式取代ElvClient,而无需使用任何用户密钥.
帧客户端包含与ElvClient中的方法相对应的动态定义方法,通过向Eluvio Core帧传递带有方法名称和参数的信息来工作. 然后Core拿下该消息,用所提供的参数调用它自己的客户端中的方法(它拥有当前用户的密钥),并将结果传回另一个消息. 帧客户端然后将结果交回给呼叫者.
除了少数例外,核心作品内部使用框架Client,与完整客户端相同.
注意无法在帧之间传递函数 - 任何函数,包括对象中包含的函数,都会被浏览器自动从发送的消息中去除.
两者 Eluvio Fabric 浏览器 编辑 Eluvio 视频编辑器 仅使用框架客户端.
播放 Fabric 的视频
见 流样 App 关于使用 Eluvio JavaScript 客户端播放 Fabric 视频的详细解释.
发布 Fabric 上的 ABR 视频内容
关于如何发布 ABR 内容的更多信息,请参见 本详细指南。 。 。 .
其他资源
Our Core, Fabric 浏览器和视频编辑器应用程序都是完全开源的,并广泛使用这个客户端:
您也可以查看此客户端的源代码并测试代码. 它包含了许多如何与Fabric,区块链,以及合同代码互动的例子.