|
|
|
[![npm version](https://img.shields.io/npm/v/@harmony-js/core.svg?style=flat-square)](https://www.npmjs.com/package/@harmony-js/core)
|
|
|
|
[![Build Status](https://travis-ci.com/FireStack-Lab/Harmony-sdk-core.svg?branch=master)](https://travis-ci.com/FireStack-Lab/Harmony-sdk-core)
|
|
|
|
|
|
|
|
# Harmony-SDK-Core
|
|
|
|
|
|
|
|
A Harmony's blockchain javascript library
|
|
|
|
|
|
|
|
It's a mono-repo library, not yet published to npm.
|
|
|
|
|
|
|
|
|
|
|
|
# Install from npm/yarn
|
|
|
|
|
|
|
|
**Note: we added a @next tag to npm package, please use the following command to install with npm/yarn**
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
# npm
|
|
|
|
npm install @harmony-js/core@next
|
|
|
|
|
|
|
|
# yarn
|
|
|
|
yarn add @harmony-js/core@next
|
|
|
|
|
|
|
|
# tslib may be required, we'd better install it as well
|
|
|
|
npm install tslib
|
|
|
|
yarn add tslib
|
|
|
|
|
|
|
|
```
|
|
|
|
# Examples with tutorials
|
|
|
|
|
|
|
|
* [harmony-sdk-examples](https://github.com/FireStack-Lab/harmony-sdk-examples)
|
|
|
|
|
|
|
|
# Packages
|
|
|
|
|
|
|
|
1. [@harmony-js/core](https://github.com/FireStack-Lab/Harmony-sdk-core/tree/master/packages/harmony-core)
|
|
|
|
2. [@harmony-js/account](https://github.com/FireStack-Lab/Harmony-sdk-core/tree/master/packages/harmony-account)
|
|
|
|
3. [@harmony-js/crypto](https://github.com/FireStack-Lab/Harmony-sdk-core/tree/master/packages/harmony-crypto)
|
|
|
|
4. [@harmony-js/network](https://github.com/FireStack-Lab/Harmony-sdk-core/tree/master/packages/harmony-network)
|
|
|
|
5. [@harmony-js/utils](https://github.com/FireStack-Lab/Harmony-sdk-core/tree/master/packages/harmony-utils)
|
|
|
|
6. [@harmony-js/transaction](https://github.com/FireStack-Lab/Harmony-sdk-core/tree/master/packages/harmony-transaction)
|
|
|
|
7. [@harmony-js/contract](https://github.com/FireStack-Lab/Harmony-sdk-core/tree/master/packages/harmony-contract)
|
|
|
|
|
|
|
|
# Hacking from source files
|
|
|
|
|
|
|
|
1. install `lerna` and `typescript` globally (if you have these, you can skip)
|
|
|
|
```bash
|
|
|
|
yarn global add lerna && yarn global add typescript
|
|
|
|
```
|
|
|
|
2. bootstrap repostory
|
|
|
|
```bash
|
|
|
|
yarn install && yarn bootstrap
|
|
|
|
```
|
|
|
|
3. run watcher before editing any source file
|
|
|
|
```bash
|
|
|
|
yarn watch
|
|
|
|
```
|
|
|
|
4. if you are ready to build/test/bundle, please refer to the following section:
|
|
|
|
- [Build](#Build)
|
|
|
|
- [Bundle](#Bundle)
|
|
|
|
- [E2E Tests](#E2E-tests)
|
|
|
|
|
|
|
|
|
|
|
|
# Manually Build/bundle
|
|
|
|
|
|
|
|
## Build
|
|
|
|
|
|
|
|
```bash
|
|
|
|
yarn build
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
## Bundle
|
|
|
|
|
|
|
|
There are 2 ways bundling files.
|
|
|
|
|
|
|
|
1. building the `es5` version bundled javascript for each sub-packages, which can be run in Browser directly.
|
|
|
|
|
|
|
|
```bash
|
|
|
|
yarn dist
|
|
|
|
```
|
|
|
|
All files are exported in `/dist` folder
|
|
|
|
|
|
|
|
2. build `umd` and `esm` version javascript for each sub-packages, which can be accessed by `import` or `require`
|
|
|
|
|
|
|
|
```bash
|
|
|
|
yarn bundle
|
|
|
|
```
|
|
|
|
All files are exported in `packages/dist` folder, use `**.esm.js` or `**.umd.js` format
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# E2E tests
|
|
|
|
|
|
|
|
**Contantly updating now, please get back later**
|
|
|
|
|
|
|
|
1. edit `.env` file if you have custom setting
|
|
|
|
2. run harmony node locally(this fork currently : https://github.com/mikedoan/harmony/tree/enable_tx)
|
|
|
|
3. wait for 1-2 mins, and run this:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
yarn build && yarn test:e2e
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
# Cross-Shard
|
|
|
|
```javascript
|
|
|
|
async function crossShard() {
|
|
|
|
// manually set the shardingStructure
|
|
|
|
// 手动设置 sharding
|
|
|
|
const shardingArray = [
|
|
|
|
{
|
|
|
|
shardID: 0,
|
|
|
|
http: 'http://localhost:9500',
|
|
|
|
ws: 'ws://localhost:9800',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
shardID: 1,
|
|
|
|
http: 'http://localhost:9501',
|
|
|
|
ws: 'ws://localhost:9801',
|
|
|
|
},
|
|
|
|
];
|
|
|
|
|
|
|
|
// get shardingStructure from rpc
|
|
|
|
// 通过api获取sharding设置
|
|
|
|
const res = await harmony.blockchain.getShardingStructure();
|
|
|
|
if (res.result) {
|
|
|
|
// if we can get from network use `harmony.shardingStructures` to set the structure to all sub module
|
|
|
|
//如果网络获取成功,通过`harmony.shardingStructures`进行设置
|
|
|
|
harmony.shardingStructures(res.result);
|
|
|
|
} else {
|
|
|
|
// or set it using local setting
|
|
|
|
// 否则加载本地的设置
|
|
|
|
harmony.shardingStructures(shardingArray);
|
|
|
|
}
|
|
|
|
|
|
|
|
// each account should update it's own shard
|
|
|
|
// 每个帐号更新自己的sharding
|
|
|
|
await acc1.updateBalances();
|
|
|
|
await acc2.updateBalances();
|
|
|
|
|
|
|
|
// to get sharded address, the format goes `bech32_{shardID}`
|
|
|
|
// 获得分片地址,返回格式为 `bech32_{shardID}`
|
|
|
|
const from = acc1.getAddressFromShardID(0);
|
|
|
|
const to = acc2.getAddressFromShardID(1);
|
|
|
|
|
|
|
|
// use `getShardBalance(shardID:number)` to get balance in shardID
|
|
|
|
// 可以获得指定shard的余额
|
|
|
|
acc1.getShardBalance(0).then(console.log);
|
|
|
|
|
|
|
|
// you can print the sharding map for each account
|
|
|
|
// 打印每个帐号的sharding结构
|
|
|
|
console.log({ acc1: acc1.shards, acc2: acc2.shards });
|
|
|
|
|
|
|
|
// now construct a ShardingTransaction, use `harmony.transactions.newTx(obj,true)`
|
|
|
|
// because `from` and `to` here ,are sharded addresses, like `bech32-{shardID}`
|
|
|
|
// you dont have to specify `shardID` and `toShardID`, it will handle it automatically.
|
|
|
|
|
|
|
|
// 构建一个sharding transaction,注意,true这里需要标志好
|
|
|
|
// 因为from,和 to已经被认定为带后缀的分片地址
|
|
|
|
// 格式为`bech32-{shardID}`
|
|
|
|
// 在这里不需要指定 shardID和toShardID了,因为这个txn会自动把 shardID和toShardID填进去
|
|
|
|
const txn = harmony.transactions.newTx(
|
|
|
|
{
|
|
|
|
from,
|
|
|
|
to,
|
|
|
|
value: '10000',
|
|
|
|
gasLimit: '210000',
|
|
|
|
gasPrice: new harmony.utils.Unit('1000000000').asWei().toWei(),
|
|
|
|
},
|
|
|
|
true,
|
|
|
|
);
|
|
|
|
|
|
|
|
// now use acc1 to sign, it will use specific shardID to get the nonce of sharded address
|
|
|
|
// 正常使用acc1进行签名,这里会自动根据shardID来取指定分片的nonce
|
|
|
|
const signed = await acc1.signTransaction(txn, true);
|
|
|
|
|
|
|
|
// send the transaction, it will also use speicific shardID to send the transaction
|
|
|
|
// 发送交易,同样会根据shardID来进行交易的发送
|
|
|
|
const [sent, id] = await signed.sendTransaction();
|
|
|
|
|
|
|
|
// print the id(transactionHash), and the class that return as well
|
|
|
|
// 打印返回的Transaction Class,和transaction ID
|
|
|
|
console.log({ sent, id });
|
|
|
|
|
|
|
|
|
|
|
|
// you can use Transaction.confirm() to confirm the transaction is on the blockchain or not
|
|
|
|
//使用confirm进行transactionReceipt的获取以确认
|
|
|
|
await sent.confirm(id);
|
|
|
|
|
|
|
|
// of course you can use blockchain.getTransactionReceipt to get the receipt
|
|
|
|
// you have to specify the shardID here.
|
|
|
|
// 同样可以通过blockchain类来获取transaction Receipt
|
|
|
|
// 注意你需要指定shardID
|
|
|
|
|
|
|
|
const receipt = await harmony.blockchain.getTransactionReceipt({
|
|
|
|
txnHash: id,
|
|
|
|
shardID: sent.txParams.shardID,
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log({ receipt: receipt.result });
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|