概述

loom-js 库包含构建Web应用程序所需的一切,以及与Loom DApp链上运行的智能合约交互的NodeJS 服务。

首先从NPM 安装 loom-js

yarn add loom-js
# 或者若你更喜欢用npm的话...
npm install loom-js

示例代码

您可以在 quickstart 目录中的 Loom JS samples repo 页面上找到所有代码。

连接到DApp链

Contract 类提供了一种方便的方式与Loom DApp链上运行的智能合约进行交互。 让我们编写一个函数,来创建一个与Loom SDK中提供的示例BluePrint 智能合约进行交互的Contract实例......

const {
  NonceTxMiddleware, SignedTxMiddleware, Client,
  Contract, Address, LocalAddress, CryptoUtils
} = require('loom-js')

const { MapEntry } = require('./helloworld_pb')

/**
 * 创建一个新`Contract`实例,它可以被用于和智能合约交互。
 * @param privateKey 将用于签署发送到合约的事务的私钥。
 * @param publicKey 与私钥相对应的公钥。
 * @returns `Contract` 实例。
 */
async function getContract(privateKey, publicKey) {
  const client = new Client(
    'default',
    'ws://127.0.0.1:46658/websocket',
    'ws://127.0.0.1:46658/queryws'
  )
  // required middleware
  client.txMiddleware = [
    new NonceTxMiddleware(publicKey, client),
    new SignedTxMiddleware(privateKey)
  ]
  const contractAddr = await client.getContractAddressAsync('BluePrint')
  const callerAddr = new Address(client.chainId, LocalAddress.fromPublicKey(publicKey))
  return new Contract({
    contractAddr,
    callerAddr,
    client
  })
}

将数据写入 DApp链

要改变智能合约的状态,您需要调用其公共方法之一,为此必须将签名的事务发送到DApp链并由其进行验证。 幸运的是, 当您使用 Contract.callAsync() 方法时, Contract类将处理其中的大部分问题。

BluePrint智能合约具有公共 SetMsg 方法,可以调用该方法来储存键和值之间的关联。 让我们编写一个调用此方法的函数......

/**
 * 在智能合约中存储键和值之间的关联。
 * @param contract 从`getContract()`返回合约实例。
 */
async function store(contract, key, value) {
  const params = new MapEntry()
  params.setKey(key)
  params.setValue(value)
  await contract.callAsync('SetMsg', params)
}

从DApp链读取数据

要读取智能合约的状态,您需要调用其公共只读方法之一,您可以使用 Contract.staticCallAsync() 方法。

BluePrint智能合约具有公共 GetMsg方法,可以调用该方法来查找键和值之间的关联。 让我们编写一个调用此方法的函数......

/**
 * 在智能合约中加载与键相关联的值。
 * @param contract 从`getContract()`返回合约实例。
 */
async function load(contract, key) {
  const params = new MapEntry()
  // 智能合约会查找存储在键之下的值。
  params.setKey(key)
  const result = await contract.staticCallAsync('GetMsg', params, new MapEntry())
  return result.getValue()
}

放在一起

现在, 我们已经有了所有的方法来确保您的 DApp链 运行, 然后运行下面的代码, 您将看到 Value: hello! 在控制台出现。

(async function () {
  const privateKey = CryptoUtils.generatePrivateKey()
  const publicKey = CryptoUtils.publicKeyFromPrivateKey(privateKey)

  const contract = await getContract(privateKey, publicKey)
  await store(contract, '123', 'hello!')
  const value = await load(contract, '123')
  console.log('Value: ' + value)
})()