Skip to content

Transaction & Smart Contract

lyszhang edited this page Mar 30, 2019 · 2 revisions

发送交易、合约

交易

Usechain 中,交易是一笔经过地址私钥签名的数据,经过签名的交易可以被节点有选择性地广播到相邻节点,并由相邻节点继续传播,直到被矿工打包进区块。

Gas

Usechain 中,交易的合法性验证、合约的执行都需要花费一定的 Gas。发送一笔交易,需要给矿工支付一定的交易手续费,在 Usechain 中,手续费为: TXfee = GasPrice * GasUsed

原始交易

  • from: 发送 USE 的 address
  • To: 接收 USE 的 address
  • value: 发送 USE 的数量
  • 可选参数
    • GasPrice: 发送交易的手续费价格
    • GasLimit: 一笔交易允许花费的最大 Gas

Example

> use.sendTransaction({"from": "0xe0f7556cf57751fa447ee0b4a1cfdebf805fb87b","to": "0x3866b65c5dd12bbcba367c45d33677475e44524c","gas": "0x5208", "gasPrice": "0x9184e72a000", "value": "0x874ef557a00f00000"})

"0x507d9671630c1524e76208b08d22cdf74a42d3eb8efebadc0cd9e4d2a163cde2"

交易确认

Usechain采用了全新的RPOW算法,与其他算法根据区块确认数而给出的概率性确认不同,RPOW的移动检查点策略给予交易绝对的确认。在观察到交易被打包进区块后,若在其后续区块中产生了移动检查点区块,该交易即可被认为已被网络确认。目前移动检查点每隔10个区块产生一次,即平均25~30s内即可确认一笔交易。

合约

Usechain 中,合约是存储在链上的字节码 (bytecode),合约中存储一定的状态 ,合约状态的改变由被矿工打包的一笔交易触发。合约的字节码由支持图灵完备的Usechain 的虚拟机执行计算。合约的字节码一般由高级的语言编写,由编译器编译成可供虚拟机执行的字节码。

Usechain 的虚拟机兼容以太坊的字节码。合约的源码一般类似于:

pragma solidity ^0.4.24;
contract HelloWorld {
    function () public {
        revert();
    }
    event SayHello();
    function sayHello() public pure returns(string) {
        return "Hello, World!";
    }  
    constructor() public {}
}

生成的字节码:

608060405234801561001057600080fd5b5061013f806100206000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663ef5fb05b8114610052575b34801561004c57600080fd5b50600080fd5b34801561005e57600080fd5b506100676100dc565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100a1578181015183820152602001610089565b50505050905090810190601f1680156100ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051808201909152600d81527f48656c6c6f2c20576f726c6421000000000000000000000000000000000000006020820152905600a165627a7a72305820534ba9759bc36d93879fcbeecb1bb3870615cd6058342a77cca4f87cdde8a18e0029

部署合约:

> use.sendTransaction({"from": "0xe0f7556cf57751fa447ee0b4a1cfdebf805fb87b","gas": "0x2146b", "gasPrice": "0x9184e72a000", "value": 0, "data":"0x608060405234801561001057600080fd5b5061013f806100206000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663ef5fb05b8114610052575b34801561004c57600080fd5b50600080fd5b34801561005e57600080fd5b506100676100dc565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100a1578181015183820152602001610089565b50505050905090810190601f1680156100ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051808201909152600d81527f48656c6c6f2c20576f726c6421000000000000000000000000000000000000006020820152905600a165627a7a72305820534ba9759bc36d93879fcbeecb1bb3870615cd6058342a77cca4f87cdde8a18e0029"})

Submitted contract creation              fullhash=0x0a516c8612ab9d8548805080c12b64018cbce18035d576ad6b12791ef1b32c19 contract=0x58e74C32389507DD7d87Dc782434b56b3cA03A13

获取交易、合约信息

Console

Usechain 的 Console 是 JavaScript 支持的命令行工具。它载入了 web3.js 文件。可以实现 Usechain 身份认证、RPOW 矿工注册、发送交易等操作。

获取区块信息

> use.getBlock(30000)
{
  difficulty: 1,
  difficultyLevel: 0,
  extraData: "0xd301847573656486676f312e3130856c696e7578",
  gasLimit: 210000000,
  gasUsed: "0x0",
  gasuse: 0,
  hash: "0xcc6df406e289dca57aa2055237e4aeb02d11a7fd9e1cfc3cd25bf1e828c55b7f",
  isCheckPoint: 1,
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x9c7d17437c0552fbd06a0a5d22df270c2bdf6f0a",
  minerQrSignature: "Nh7P0eEsG8G8NgOGbiPUif92gmqodIIhsXa6IfY1qN4frFCcvtq97b+1l5XBVweDIdizXVZJFNxLnNoMqtdqVwE=",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000000",
  number: 30000,
  parentHash: "0x08d5beb90fdb47d79581e006fa13227c57959217e6c5eda4d3b547d4c28d3d08",
  primaryMiner: "0x9c7d17437c0552fbd06a0a5d22df270c2bdf6f0a",
  receiptsRoot: "0x47d17d1b08a2811603719b8391ca1a7dc02a0621f90721cd2d621e0eaa70ea08",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 1353,
  stateRoot: "0xfe478748aab3dcec01d76df095b172179cff158ea799446d1ee0cd8799ac459a",
  timestamp: 1553317898,
  totalDifficulty: 46384,
  transactions: ["0xb8a4b317a3dc893bd7994abaa146e557d281c63a08c3bfead4a50fee0f2341eb", "0xa59230ed7b121925cfe6596bf9a453ed6044c162b4c83f9c4d6dd80b820ecb83", "0x1162ae54a7d1cdddf32741b4534cf1e409f5a40b0c9aff5fb67be8b9c7e9178b", "0x392af4848119a6f87c3f6e50eac7b272193c8b3ce3815009ffc53811f1c8d2f9", "0xb450f8aab8ab690856369c59e3c732aa39912a1bb562a9ea2b68aad2cc2785f8"],
  transactionsRoot: "0x6a9a2e5fd48e7d452abfd7ce36dff642f3185508be2fb5582ec641a184cde749",
  uncles: []
}

获取交易信息

> use.getTransaction("0xb8a4b317a3dc893bd7994abaa146e557d281c63a08c3bfead4a50fee0f2341eb")

{
  blockHash: "0xcc6df406e289dca57aa2055237e4aeb02d11a7fd9e1cfc3cd25bf1e828c55b7f",
  blockNumber: 30000,
  flag: 1,
  from: "0xa414f648803fc0c8ac67272a19853a9ed6cafb12",
  gas: 0,
  gasPrice: 0,
  hash: "0xb8a4b317a3dc893bd7994abaa146e557d281c63a08c3bfead4a50fee0f2341eb",
  input: "0x08d5beb90fdb47d79581e006fa13227c57959217e6c5eda4d3b547d4c28d3d08000000000000752f0000000000000000",
  nonce: 2895,
  r: "0xa91414606115d59e4dc46daf9af934bb091b00fa9dbcbba832476b30f7201a20",
  s: "0x2116cbf8ea18ad4be54257ec314778f38f1e88a52f9f0348260d73ffbf529f6a",
  to: "0x0000000000000000000000000000000000000000",
  transactionIndex: 0,
  v: "0x1c",
  value: 0
}

获取合约的 Code,与生成的字节码对应。

> eth.getCode("0x58e74C32389507DD7d87Dc782434b56b3cA03A13")

608060405234801561001057600080fd5b5061013f806100206000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663ef5fb05b8114610052575b34801561004c57600080fd5b50600080fd5b34801561005e57600080fd5b506100676100dc565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100a1578181015183820152602001610089565b50505050905090810190601f1680156100ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051808201909152600d81527f48656c6c6f2c20576f726c6421000000000000000000000000000000000000006020820152905600a165627a7a72305820534ba9759bc36d93879fcbeecb1bb3870615cd6058342a77cca4f87cdde8a18e0029

Web3.js

通过 web3.js 可以使用 JavaScript 与 Usechain 的节点交互,获取数据。使用 web3.js,需要开启节点的 JSON-RPC 接口。

开启节点的 RPC 接口

> used --rpc --rpcapi="web3, use" console 

Web3.js 的初始化

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8848"));

查询交易

Example

var transaction = web3.use.getTransaction('0x507d9671630c1524e76208b08d22cdf74a42d3eb8efebadc0cd9e4d2a163cde2');
console.log(transaction);

Clone this wiki locally