交互命令行(console)

从v1.1.1开始,应用链客户端SCS也支持使用了和以太坊类似的交互式命令行。用户可以在命令行(console)中执行内置的JAVA script命令或者利用脚本(script),输出结果显示在命令行中。 这里使用的chain3对象,是MOAC参考以太坊,而开发的一套javascript库,目的是让应用程序能够与MOAC的VNODE和SCS节点进行通信。注意,这里有两层,moac启动了一个MOAC VNODE节点,console参数开启了一个javascript的控制台,这个控制台注入了chain3.js这个库,以使我们可以通过chain3对象与MOAC SCS不同应用链节点做交互。

SCS和用户交互的命令行界面

MOAC 应用链节点的客户端(SCS)构建了一个可以和用户交互的JavaScript命令行界面。启动这个命令行首先需要启动一个SCS客户端,并确保打开RPC。

$ ./scsserver –rpc –rpcport 8546

然后使用下面命令

$ scsserver attach

scs客户端会去连接一个已经运行的SCS节点并显示命令行界面,默认路径为./scsdata。

$ scsserver attach ./scsdata/scs.ipc

请注意,默认情况下,MOAC SCS节点不会启动RPC服务。

交互式使用示例

以下是主要的两个交互式命令功能包:scs和appchain。

scs

主要提供SCS节点相关信息,可以使用RPC方法与应用链通讯,具体方法可以参考 JSONRPC 接口。

scs.getSCSId

获取SCS的ID

输入参数:无

示例如下:

> scs.getSCSId()
"0x76449055dc3cf91090c11f7c544b60363bf896cb"

scs.getAppChainList

返回SCS接入的应用链列表。

输入参数:无

示例如下:

scs.sendRawTransaction

发送已加签好的交易

输入参数:
加签交易数据

示例如下:

> scs.sendRawTransaction("0xf86a33808504a817c8008094aa4c98c7efb244f4104bf3bb437cd761df4e648c8084d826f88f018081efa0ec2607997ed3d35adf7821983f996b37495b8d42b47286ec74d166d4f51b5a27a071de43031ce69aaed8c1e66b19f9a5953364503ba2b67599ab218117b3182a30")
"0xa629303563c97821fcaa2ec4bdb1ba7e2963cb06692704d84fbc05946e5576a5"

appchain

应用链对象,内置地址,类似SCS的相应方法,可以省略做为地址的第一个参数。

appchain.setAddress

设置appchain模块的内置参数address,即应用链地址

输入参数:
Addr:应用链地址

示例如下:

> appchain.setAddress("0xc2a0423fac6d1aee906c9bd8560288edc94c00ee")

appchain.getAddress

返回appchain模块的内置参数address,即应用链地址

输入参数:
Addr:应用链地址

示例如下:

> appchain.getAddress()
"0xc2a0423fac6d1aee906c9bd8560288edc94c00ee"

appchain.anyCall

获取dapp合约函数的返回值,调用此接口前必须将dapp注册入dappbase

输入参数:
Params: 第一个参数是调用的方法,之后是方法传入参数 Sender:查询账号 DappAddr:应用链业务逻辑地址

示例如下:

> appchain.anyCall({Sender: "0xc2a0423fac6d1aee906c9bd8560288edc94c00ee", DappAddr:"0xe5d7da7a374663218294c43a7e16575f18e4b746", Params:['getCurNodeList']})
"{\"nodeList\":[\"0x76449055dc3cf91090c11f7c544b60363bf896cb\",\"0xc2a0423fac6d1aee906c9bd8560288edc94c00ee\"]}"

appchain.getAppChainInfo

返回应用链信息。此信息与应用链合约(subchainbase)中定义的信息相同。

输入参数:无

示例如下:

> appchain.getAppChainInfo()
{
  balance: "0x4674edea40000000",
  blockReward: "0x1c6acb234f400",
  bondLimit: "0xde0b6b3a7640000",
  owner: "0xf180041c895a6aA8b2F38500A277cEA3e20C2CBE",
  scsList: ["0x76449055dC3cF91090c11F7C544B60363Bf896cB", "0xC2A0423Fac6d1aeE906c9BD8560288eDC94C00eE"],
  txReward: "0x174782c680",
  viaReward: "0x23857dec231000"
}

appchain.getBalance

获得对应账号在应用链中的原生币余额。

输入参数:

  • 账号地址

示例如下:

> appchain.getBalance('0xf180041c895a6aa8b2f38500a277cea3e20c2cbe')
11000000000000000000

appchain.getBlock

获得当前应用链的指定的区块信息。

输入参数:

  • 块号

示例如下:

> appchain.getBlock(37)
{
  extraData: "0xa77c68b8d817377d61c23bcea32c57eab4db51bd216f066f8440aa6cca256ff80301401c1d7423d512504cc588ab68dd36f90fcd1642b1dfb0a79564f44432311a5fd00ef252dbe79d002929aa42ddaf1650a7b8f18c59edfaa9189d025923f1617a510209313538323638373437034062e8e2de7b1d5af97dc66e51fc93102ebdb5768431e36f65d8ff02af61c7016ba97b07d36cbd22d0ce8da0d7c0c8a13aa6d9fd42ab274d588610442a62d2b00e",
  hash: "0xfe8f215cb8b70d43d50c185fb0b7592a97545de2914c443ac064d436807e39a7",
  miner: "0xc2a0423fac6d1aee906c9bd8560288edc94c00ee",
  number: "0x25",
  parentHash: "0xc881942213aad1bad5403c47f9598798343f0a1793006eab6ce84272da5428ce",
  receiptsRoot: "0xa07cd7906ea8bb65b5341afaa57a7cd068c6f2acd7a165cf599537022b9d8fc4",
  stateRoot: "0xd6f76d1619ae985dfc31b9a583dd7c530569d864323d16d248b8cd3f4581e40e",
  timestamp: "0x5e55e4ee",
  transactions: ["0x36249ce5e68f9565c4149719c5d3f4e7e63d805416d5c038a611b111cd9a43a9", "0xaaf14ac0152fb12f71cce01fb8e244cc0c5fc4d0cbb27cc64f3f78b2720bca6b"],
  transactionsRoot: "0xb7ece0cd0fcc52501c23062dc25fc66529fa5093ae30859f91a11298676bc0f0"
}

appchain.getBlockList

获取某一区间内的区块信息

输入参数:

  • 起始块号
  • 结束块号

示例如下:

> appchain.getBlockList(36, 37)
{
  blockList: [{
      extraData: "0xf0c9626d45789730f1fcb773907f6bae0d47b002f96aee3372867e219d1c73b203014021fd3e788fdb4c10c11e321e3388fb8f48eef828236e5e7c063806f9fda3ed8d893c01ae99335f678658512c9b92c369ce33c42a98808428ad52c018858052a702093135383236383734360340ef9223f63d268f02fb67c09d3c458223842ee8dcff581a21b7b53ccc6837d5c4ba720cb9b373cae71180f4c39f7fd3daf67ee61d79f8e239c3b14ed160f8a606",
      hash: "0xc881942213aad1bad5403c47f9598798343f0a1793006eab6ce84272da5428ce",
      miner: "0xc2a0423fac6d1aee906c9bd8560288edc94c00ee",
      number: "0x24",
      parentHash: "0xc5dd98df039f1d5e9c70b70b7f1c197b666c1db038da2f225bd8a9772de966d4",
      receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
      stateRoot: "0x90766f90ee1d7dfc02909c68030f7ca24cfcb94d6f370b78ff522b3066235325",
      timestamp: "0x5e55e4e4",
      transactions: [],
      transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"
  }, {
      extraData: "0xa77c68b8d817377d61c23bcea32c57eab4db51bd216f066f8440aa6cca256ff80301401c1d7423d512504cc588ab68dd36f90fcd1642b1dfb0a79564f44432311a5fd00ef252dbe79d002929aa42ddaf1650a7b8f18c59edfaa9189d025923f1617a510209313538323638373437034062e8e2de7b1d5af97dc66e51fc93102ebdb5768431e36f65d8ff02af61c7016ba97b07d36cbd22d0ce8da0d7c0c8a13aa6d9fd42ab274d588610442a62d2b00e",
      hash: "0xfe8f215cb8b70d43d50c185fb0b7592a97545de2914c443ac064d436807e39a7",
      miner: "0xc2a0423fac6d1aee906c9bd8560288edc94c00ee",
      number: "0x25",
      parentHash: "0xc881942213aad1bad5403c47f9598798343f0a1793006eab6ce84272da5428ce",
      receiptsRoot: "0xa07cd7906ea8bb65b5341afaa57a7cd068c6f2acd7a165cf599537022b9d8fc4",
      stateRoot: "0xd6f76d1619ae985dfc31b9a583dd7c530569d864323d16d248b8cd3f4581e40e",
      timestamp: "0x5e55e4ee",
      transactions: ["0x36249ce5e68f9565c4149719c5d3f4e7e63d805416d5c038a611b111cd9a43a9", "0xaaf14ac0152fb12f71cce01fb8e244cc0c5fc4d0cbb27cc64f3f78b2720bca6b"],
      transactionsRoot: "0xb7ece0cd0fcc52501c23062dc25fc66529fa5093ae30859f91a11298676bc0f0"
  }],
  endBlk: "0x25",
  microchainAddress: "0xAA4c98C7efb244f4104Bf3bB437CD761Df4e648C",
  startBlk: "0x24"
}

appchain.getBlockNumber

获得当前应用链的区块高度

输入参数:无

示例如下:

> appchain.getBlockNumber()
2245

appchain.getContractAddrList

通过应用链地址获取应用链内所有多合约的地址列表,需要应用链业务逻辑合约调用基础合约registerDapp方法后才能生效

输入参数:无

示例如下:

> appchain.getContractAddrList()
["0xe5d7da7a374663218294c43a7e16575f18e4b746"]

appchain.getExchangeByAddress

获得应用链指定账号指定数量的充提信息 输入参数:

  • 需要查询的账号地址
  • 已经充值记录的起始位置(0)
  • 已经充值记录的长度
  • 已经提币记录的起始位置(0)
  • 已经提币记录的长度
  • 正在充值记录的起始位置(0)
  • 正在充值记录的长度
  • 正在提币记录的起始位置(0)
  • 正在提币记录的长度

示例如下:

> appchain.getExchangeByAddress('0xf180041c895a6aa8b2f38500a277cea3e20c2cbe',0,5,0,5,0,5,0,5)
{
  DepositRecordCount: 5,
  DepositRecords: [null, null, null, null, null, {
      DepositAmt: "0xde0b6b3a7640000",
      Deposittime: "0x5e56244a"
  }, {
      DepositAmt: "0xde0b6b3a7640000",
      Deposittime: "0x5e56244a"
  }, {
      DepositAmt: "0xde0b6b3a7640000",
      Deposittime: "0x5e56244a"
  }, {
      DepositAmt: "0xde0b6b3a7640000",
      Deposittime: "0x5e56244a"
  }, {
      DepositAmt: "0xde0b6b3a7640000",
      Deposittime: "0x5e5623a0"
  }],
  DepositingRecordCount: 0,
  DepositingRecords: null,
  WithdrawRecordCount: 0,
  WithdrawRecords: null,
  WithdrawingRecordCount: 0,
  WithdrawingRecords: null,
  microchain: "0xaa4c98c7efb244f4104bf3bb437cd761df4e648c",
  sender: "0xf180041c895a6aa8b2f38500a277cea3e20c2cbe"
}

appchain.getExchangeInfo

获得应用链指定数量正在充提的信息

输入参数:

  • 正在充值记录的起始位置(0)
  • 正在充值记录的长度
  • 正在提币记录的起始位置(0)
  • 正在提币记录的长度

示例如下:

> appchain.getExchangeInfo(0,5,0,5)
{
  DepositingRecordCount: 0,
  DepositingRecords: null,
  WithdrawingRecordCount: 0,
  WithdrawingRecords: null,
  microchain: "0xaa4c98c7efb244f4104bf3bb437cd761df4e648c",
  scsid: "0x76449055dc3cf91090c11f7c544b60363bf896cb"
}

appchain.getNonce

获得对应账号在应用链的nonce,这是调用应用链DAPP合约的必要参数之一,每当应用链交易发送后会自动加1。

输入参数:

  • 账号地址

示例如下:

> appchain.getNonce('0xf180041c895a6aa8b2f38500a277cea3e20c2cbe')

appchain.getReceiptByHash

通过交易hash获取应用链的tx执行结果

输入参数:

  • 交易哈希

示例如下:

> appchain.getReceiptByHash('0x9cf04d4f00998ba09c2c614dd14fd85b173a406baedde414f08d88df5c992034')
{
  contractAddress: "0x0000000000000000000000000000000000000000",
  failed: false,
  logs: [],
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  queryInBlock: 0,
  result: "",
  transactionHash: "0x9cf04d4f00998ba09c2c614dd14fd85b173a406baedde414f08d88df5c992034"
}

appchain.getReceiptByNonce

通过账号和Nonce获取应用链的tx执行结果

输入参数:

  • 账号地址
  • Nonce

示例如下:

> appchain.getReceiptByNonce('0xf180041c895a6aA8b2F38500A277cEA3e20C2CBE',2)
{
  contractAddress: "0x0000000000000000000000000000000000000000",
  failed: false,
  logs: [],
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  queryInBlock: 0,
  result: "",
  transactionHash: "0x9cf04d4f00998ba09c2c614dd14fd85b173a406baedde414f08d88df5c992034"
}

appchain.getTransactionByHash

通过交易HASH获取应用链的交易信息

输入参数:

*交易哈希

示例如下:

> appchain.getTransactionByHash('0x9cf04d4f00998ba09c2c614dd14fd85b173a406baedde414f08d88df5c992034')
{
  blockHash: "0xdaf05facc57d218528e6c73df4ef98dac51eeed54a9fae9e8be4353c23c58ec6",
  blockNumber: "0x910",
  from: "0xf180041c895a6aa8b2f38500a277cea3e20c2cbe",
  gas: null,
  gasPrice: null,
  hash: "0x9cf04d4f00998ba09c2c614dd14fd85b173a406baedde414f08d88df5c992034",
  input: "0x3876c45f5b6f81a997661cf5ebcb075e400a571e",
  nonce: "0x2",
  r: "0x5c1aeea440bdf02cdf6462ed292eb33c5ed29d42a41c59b299262ffb23a4a5e7",
  s: "0x7dac198898963a33a69af708b9b7aab94328c0c03215467032055eb2f26b716d",
  shardingFlag: "0x2",
  syscnt: "0x0",
  to: "0xaa4c98c7efb244f4104bf3bb437cd761df4e648c",
  transactionIndex: "0x0",
  v: "0xf0",
  value: "0xde0b6b3a7640000"
}

appchain.getTransactionByNonce

通过账号和Nonce获取应用链的交易信息

输入参数:
账号地址 Nonce

示例如下:

> appchain.getTransactionByNonce('0xf180041c895a6aA8b2F38500A277cEA3e20C2CBE',2)
{
  blockHash: "0xdaf05facc57d218528e6c73df4ef98dac51eeed54a9fae9e8be4353c23c58ec6",
  blockNumber: "0x910",
  from: "0xf180041c895a6aa8b2f38500a277cea3e20c2cbe",
  gas: null,
  gasPrice: null,
  hash: "0x9cf04d4f00998ba09c2c614dd14fd85b173a406baedde414f08d88df5c992034",
  input: "0x3876c45f5b6f81a997661cf5ebcb075e400a571e",
  nonce: "0x2",
  r: "0x5c1aeea440bdf02cdf6462ed292eb33c5ed29d42a41c59b299262ffb23a4a5e7",
  s: "0x7dac198898963a33a69af708b9b7aab94328c0c03215467032055eb2f26b716d",
  shardingFlag: "0x2",
  syscnt: "0x0",
  to: "0xaa4c98c7efb244f4104bf3bb437cd761df4e648c",
  transactionIndex: "0x0",
  v: "0xf0",
  value: "0xde0b6b3a7640000"
}

appchain.syncing

返回SCS应用链同步区块状态

示例如下:

> appchain.syncing()
{
startingBlock: '0x384',
currentBlock: '0x386',
highestBlock: '0x454'
}
>
"startingBlock": bc.syncCache.Start,
            "currentBlock":  bc.CurrentBlock().NumberU64(),
            "highestBlock":  bc.syncCache.High,

txpool

txpool.content

获得应用链交易池交易的详细信息。

示例如下:

> txpool.content()
{
  pending: {},
  queued: {
    0xf180041c895a6aA8b2F38500A277cEA3e20C2CBE: {
      3: {
        blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        blockNumber: null,
        from: "0xf180041c895a6aa8b2f38500a277cea3e20c2cbe",
        gas: null,
        gasPrice: null,
        hash: "0x58eb432ff88f766613e990b6c5d92f0a577e6e769712f1a2356fc1c25bde9110",
        input: "0x3876c45f5b6f81a997661cf5ebcb075e400a571e",
        nonce: "0x3",
        r: "0x3c79d4f4b1336565db6234afad3ae24f8f7dda2c1aee1a3107bf92e97361c0b3",
        s: "0x7f582d62b3e99f5dad7d34dcc8c117ddb37f70811aa90c645a1fdd433f349338",
        shardingFlag: "0x2",
        syscnt: "0x0",
        to: "0xaa4c98c7efb244f4104bf3bb437cd761df4e648c",
        transactionIndex: "0x0",
        v: "0xf0",
        value: "0x0"
      }
    }
  }
}

txpool.inspect

获得应用链交易池交易的简要信息。

示例如下:

> txpool.inspect()
{
  pending: {},
  queued: {
    0xf180041c895a6aA8b2F38500A277cEA3e20C2CBE: {
      3: "0xAA4c98C7efb244f4104Bf3bB437CD761Df4e648C: 0 sha + 0 × 20000000000 gas"
    }
  }
}

txpool.status

获得应用链交易池交易的交易数量。

示例如下:

> txpool.status()
{
  pending: 0,
  queued: 1
}

debug

debug_traceTransaction

返回交易在EVM执行期间创建的结构化日志,并将它们作为JSON对象返回。

输入参数:交易哈希

示例如下:

> debug.traceTransaction("1a0da52d43d42223cd4170a40b4ea9505cdc6aba732a74100f7357f0a0128340", "callTracer")
"{\"type\":\"CALL\",\"from\":\"0xc2a0423fac6d1aee906c9bd8560288edc94c00ee\",\"to\":\"0xe5d7da7a374663218294c43a7e16575f18e4b746\",\"value\":\"0x0\",\"gas\":\"0x337be36\",\"gasUsed\":\"0x0\",\"input\":\"0x12df94120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f180041c895a6aa8b2f38500a277cea3e20c2cbe00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000005e562360\",\"output\":\"0x\",\"time\":\"0s\",\"calls\":[{\"type\":\"CALL\",\"from\":\"0xe5d7da7a374663218294c43a7e16575f18e4b746\",\"to\":\"0xf180041c895a6aa8b2f38500a277cea3e20c2cbe\",\"value\":\"0xde0b6b3a7640000\",\"input\":\"0x\"}]}"

注意

MOAC SCS’s JSRE 和以太坊的客户端一样采取了Otto JS VM 虚拟机并具有以下限制:

“use strict” 语句可以编译通过,但没有相应效果。 正则表达式引擎(re2 / regexp)与ECMA5规范不完全兼容。 注意,Otto的另一个已知限制(即缺少计时器)已得到解决。 以太坊JSRE同时实现setTimeout和setInterval。 除此之外,控制台还提供admin.sleep(seconds)以及“ blocktime sleep”方法admin.sleepBlocks(number)。

chain3.js 自动加载 bignumber.js 的软件库(MIT Expat Licence)用于大数处理。