-
Notifications
You must be signed in to change notification settings - Fork 3
Transaction & Smart Contract
Usechain 中,交易是一笔经过地址私钥签名的数据,经过签名的交易可以被节点有选择性地广播到相邻节点,并由相邻节点继续传播,直到被矿工打包进区块。
Usechain 中,交易的合法性验证、合约的执行都需要花费一定的 Gas。发送一笔交易,需要给矿工支付一定的交易手续费,在 Usechain 中,手续费为: TXfee = GasPrice * GasUsed
- from: 发送 USE 的 address
- To: 接收 USE 的 address
- value: 发送 USE 的数量
- 可选参数
- GasPrice: 发送交易的手续费价格
- GasLimit: 一笔交易允许花费的最大 Gas
> 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=0x58e74C32389507DD7d87Dc782434b56b3cA03A13Usechain 的 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 可以使用 JavaScript 与 Usechain 的节点交互,获取数据。使用 web3.js,需要开启节点的 JSON-RPC 接口。
> used --rpc --rpcapi="web3, use" console var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8848"));var transaction = web3.use.getTransaction('0x507d9671630c1524e76208b08d22cdf74a42d3eb8efebadc0cd9e4d2a163cde2');
console.log(transaction);This is the Wiki for the official Usechain golang implementation.