🤢
Tron
  • Mastering TRON
  • Introduction
    • TRON 引言
    • TRON 基础
    • 节点客户端
    • 钱包
    • 交易(内置合约类型)
    • API
    • 开发者资源
  • Internals
    • 超级代表和投票
    • 产块和维护周期
    • 提案和链升级
  • Smart Contract
    • 什么是智能合约
    • Solidity 基础
    • Solidity 进阶
    • Solidity ABI
    • Use Solidity Like a Professional
    • 合约编程误区
    • Tooling
    • TVM
  • TRON by Example
    • Generate Address Offline
    • Transfer TRX
    • Transfer TRC20
    • Parse Event Logs
    • Estimate Energy Usage
    • Call Justswap
    • Query TRC20 Balance
  • Next Generation TRON
    • Current Tech that Benifits Blockchain
由 GitBook 提供支持
在本页
  • 单位 - unit
  • 全局变量/全局函数
  • Block 及 Transaction 处理
  • address 成员函数
  • ABI Encoding and Decoding Functions
  • 错误处理
  • 数学和加密函数
  • 内联汇编 - assembly
  • 内部交易 - inline transaction / internal transaction

这有帮助吗?

  1. Smart Contract

Solidity 进阶

这里介绍 Solidity 的进阶概念。

上一页Solidity 基础下一页Solidity ABI

最后更新于4年前

这有帮助吗?

单位 - unit

Solidity 引入了单位的概念,TVM 对以太坊 EVM 做了相关修改。所以合约里可以轻松进行 trx 和 sun 的换算。

另外还有时间单位 seconds, minutes, hours, days, weeks. 基础单位是 seconds.

全局变量/全局函数

是合约代码编写过程中可用的函数和常量。

参考:

Block 及 Transaction 处理

// 为兼容提供,在 TVM 中无具体意义
block.difficulty (uint): current block difficulty
gasleft() returns (uint256): remaining gas
block.gaslimit (uint): current block gaslimit
tx.gasprice (uint): gas price of the transaction

blockhash(uint blockNumber) returns (bytes32): hash of the given block - only works for 256 most recent, excluding current, blocks
block.coinbase (address payable): current block miner’s address
block.number (uint): current block number
block.timestamp (uint): current block timestamp as seconds since unix epoch

msg.data (bytes calldata): complete calldata
msg.sender (address payable): sender of the message (current call)
msg.sig (bytes4): first four bytes of the calldata (i.e. function identifier)
msg.value (uint): number of wei sent with the message
msg.tokenvalue (uint): TRC10 token value
msg.tokenid (trcToken): TRC10 token 10
now (uint): current block timestamp (alias for block.timestamp)
tx.origin (address payable): sender of the transaction (full call chain)

address 成员函数

<address>.balance -> (uint256)

<address>.tokenBalance(trcToken) -> (uint)

<address payable>.transfer(uint256 amount)

<address payable>.transferToken(uint, trcToken)

.call()
.delegatecall()
.staticcall()

ABI Encoding and Decoding Functions

abi.decode(bytes memory encodedData, (...)) returns (...): ABI-decodes the given data, while the types are given in parentheses as second argument. Example: (uint a, uint[2] memory b, bytes memory c) = abi.decode(data, (uint, uint[2], bytes))
abi.encode(...) returns (bytes memory): ABI-encodes the given arguments
abi.encodePacked(...) returns (bytes memory): Performs packed encoding of the given arguments. Note that packed encoding can be ambiguous!
abi.encodeWithSelector(bytes4 selector, ...) returns (bytes memory): ABI-encodes the given arguments starting from the second and prepends the given four-byte selector
abi.encodeWithSignature(string memory signature, ...) returns (bytes memory): Equivalent to abi.encodeWithSelector(bytes4(keccak256(bytes(signature))), ...)`

错误处理

assert(bool condition)
require(bool condition)
require(bool condition, string memory message)
revert()
revert(string memory reason)

数学和加密函数

addmod(uint x, uint y, uint k) returns (uint)
> (x + y) % k

mulmod(uint x, uint y, uint k) returns (uint)
> (x * y) % k

keccak256(bytes memory) returns (bytes32)

sha256(bytes memory) returns (bytes32)

ripemd160(bytes memory) returns (bytes20)

ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)
> 注意,`v` 未处理

内联汇编 - assembly

assembly {
    // retrieve the size of the code, this needs assembly
    let size := extcodesize(_addr)
    // allocate output byte array - this could also be done without assembly
    // by using o_code = new bytes(size)
    o_code := mload(0x40)
    // new "memory end" including padding
    mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
    // store length in memory
    mstore(o_code, size)
    // actually retrieve the code, this needs assembly
    extcodecopy(_addr, add(o_code, 0x20), 0, size)
}

内部交易 - inline transaction / internal transaction

合约的 transfer , create ,及 call, suicide 调用,会生成内部交易。

其定义是:

message InternalTransaction {
  // internalTransaction identity, the root InternalTransaction hash
  // should equals to root transaction id.
  bytes hash = 1;
  // the one send trx (TBD: or token) via function
  bytes caller_address = 2;
  // the one recieve trx (TBD: or token) via function
  bytes transferTo_address = 3;
  message CallValueInfo {
    // trx (TBD: or token) value
    int64 callValue = 1;
    // TBD: tokenName, trx should be empty
    string tokenId = 2;
  }
  repeated CallValueInfo callValueInfo = 4;
  bytes note = 5;
  bool rejected = 6;
}

目前 TRON 对合约创建合约的支持还不够完善。

https://solidity.readthedocs.io/en/v0.6.6/units-and-global-variables.html