Skip to content

Commit

Permalink
Merge pull request #174 from vivian1912/master
Browse files Browse the repository at this point in the history
new release update
  • Loading branch information
ethan1844 authored Nov 29, 2024
2 parents 5913879 + 8bcaa25 commit 2b9bc21
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 268 deletions.
142 changes: 6 additions & 136 deletions docs/contracts/compiler.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,148 +10,18 @@
### 2. TronBox

波场智能合约部署工具。支持solidity语言智能合约的编译,部署,移植等功能。
[https://cn.developers.tron.network/reference/tronbox-%E7%AE%80%E4%BB%8B](https://cn.developers.tron.network/reference/tronbox-%E7%AE%80%E4%BB%8B)
[https://developers.tron.network/reference/what-is-tronbox](https://developers.tron.network/reference/what-is-tronbox)

### 3. TronWeb

波场智能合约开发使用的http api库。提供和主链交互,合约部署调用等接口。
[https://cn.developers.tron.network/docs/dapp-development-tools-tronweb](https://cn.developers.tron.network/docs/dapp-development-tools-tronweb)
波场智能合约开发使用的javascript库。提供和主链交互,合约部署调用等接口。
[https://tronweb.network/docu/docs/intro/](https://tronweb.network/docu/docs/intro/)

### 4. TronGrid

波场智能合约事件查询服务。可以查询智能合约中写入的事件log信息。
[https://cn.developers.tron.network/docs/trongrid](https://cn.developers.tron.network/docs/trongrid)
[https://developers.tron.network/docs/trongrid](https://developers.tron.network/docs/trongrid)

## 使用命令行工具进行智能合约开发

在tron上进行智能合约的开发,除了使用现有的工具(tron-studio)之外,也可以直接使用wallet-cli命令行工具进行智能合约的开发,编译和部署。编写智能合约,可以使用使用TronStudio进行编译、调试等前期的开发工作。 当合约开发完成之后,可以把合约复制到[SimpleWebCompiler](https://github.com/tronprotocol/tron-demo/tree/master/SmartContractTools/SimpleWebCompiler)中进行编译,获取ABI和ByteCode。

我们提供一个简单的数据存取的合约代码示例,以这个示例来说明编译、部署、调用的步骤。

```text
pragma solidity ^0.4.0;
contract DataStore {
mapping(uint256 => uint256) data;
function set(uint256 key, uint256 value) public {
data[key] = value;
}
function get(uint256 key) view public returns (uint256 value) {
value = data[key];
}
}
```

### 启动私有链

确保前提条件中,私有链已经在本地部署完成。可以检查FullNode/logs/tron.log中,是否有持续产块的log信息出现:“Produce block successfully”

### 开发智能合约

把上述代码复制到remix中编译,调试,确保代码的逻辑是自己需要的,编译通过,没有错误

### 在SimpleWebCompiler编译得到ABI和ByteCode

因为波场的编译器与以太坊的编译略有差异,正在与Remix集成中,所以临时采用改方案获取ABI和ByteCode,而不是通过Remix直接获取ABI和ByteCode。
把上述代码复制到SimpleWebCompiler中,点击Compile按钮,获取ABI和ByteCode。

### 通过Wallet-cli部署智能合约

下载Wallet-Cli,文件然后编译。

```shell
# 下载源代码
git clone https://github.com/tronprotocol/wallet-cli
cd wallet-cli
# 编译
./gradlew build
cd build/libs
```

注意:
wallet-cli 默认的配置会连接本地127.0.0.1:50051的 fullnode,如果开发者需要连接不同的其他节点或者端口可在 config.conf 文件中进行修改

启动wallet-cli

```text
java -jar wallet-cli.jar
```

启动之后,可在命令中交互式输入指令。导入私钥,并查询余额是否正确

```text
importwallet
<输入你自己的设定的钱包密码2次>
<输入私钥:da146374a75310b9666e834ee4ad0866d6f4035967bfc76217c5a495fff9f0d0>
login
<输入你自己的设定的钱包密码>
getbalance
```

部署合约

```text
# 合约部署指令
DeployContract contractName ABI byteCode constructor params isHex fee_limit consume_user_resource_percent <value> <library:address,library:address,...>
# 参数说明
contract_name:自己制定的合约名
ABI:从SimpleWebCompiler中获取到的 ABI json 数据
bytecode:从SimpleWebCompiler中获取到的二进制代码
constructor:部署合约时,会调用构造函数,如果需要调用,就把构造函数的参数类型填写到这里,例如:constructor(uint256,string),如果没有,就填写一个字符#
params:构造函数的参数,使用逗号分隔开来,例如 1,"test" ,如果没有构造函数,就填写一个字符#
fee_limit:本次部署合约消耗的TRX的上限,单位是SUN(1 SUN = 10^-6 TRX),包括CPU资源、STORAGE资源和可用余额的消耗
consume_user_resource_percent:指定的使用该合约用户的资源占比,是[0, 100]之间的整数。如果是0,则表示用户不会消耗资源。如果开发者资源消耗完了,才会完全使用用户的资源。
value:在部署合约时,给该合约转账金额,使用十六进制32位表示
library:address,library:address,...:如果合约包含library,则需要在部署合约的时候指定library的地址,具体见下文;没有library的话则不需要填写。
# 运行例子
deploycontract DataStore [{"constant":false,"inputs":[{"name":"key","type":"uint256"},{"name":"value","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"key","type":"uint256"}],"name":"get","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}] 608060405234801561001057600080fd5b5060de8061001f6000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631ab06ee58114604d5780639507d39a146067575b600080fd5b348015605857600080fd5b506065600435602435608e565b005b348015607257600080fd5b50607c60043560a0565b60408051918252519081900360200190f35b60009182526020829052604090912055565b600090815260208190526040902054905600a165627a7a72305820fdfe832221d60dd582b4526afa20518b98c2e1cb0054653053a844cf265b25040029 # # false 1000000 30 0
部署成功会显示Deploy the contract successfully
```

得到合约的地址

```text
Your smart contract address will be: <合约地址>
# 在本例中
Your smart contract address will be: TTWq4vMEYB2yibAbPV7gQ4mrqTyX92fha6
```

调用合约存储数据、查询数据

```text
Shell
# 调用合约指令
triggercontract <contract_address> <method> <args> <is_hex> <fee_limit> <value>
# 参数说明
contract_address:即之前部署过合约的地址,格式 base58,如:TTWq4vMEYB2yibAbPV7gQ4mrqTyX92fha6
method:调用的函数签名,如set(uint256,uint256)或者 fool(),参数使用','分割且不能有空格
args:如果非十六进制,则自然输入使用','分割且不能有空格,如果是十六进制,直接填入即可
is_hex:输入参数是否为十六进制,false 或者 true
fee_limit:和deploycontract的时候类似,表示本次部署合约消耗的TRX的上限,单位是SUN(1 SUN = 10^-6 TRX),包括CPU资源、STORAGE资源和可用余额的消耗。
value:在部署合约时,给该合约转账金额,使用十六进制32位表示
# 调用的例子
## 设置 mapping 1->1
triggercontract TTWq4vMEYB2yibAbPV7gQ4mrqTyX92fha6 set(uint256,uint256) 1,1 false 1000000 0000000000000000000000000000000000000000000000000000000000000000
## 取出 mapping key = 1的 value
triggercontract TTWq4vMEYB2yibAbPV7gQ4mrqTyX92fha6 get(uint256) 1 false 1000000 0000000000000000000000000000000000000000000000000000000000000000
```

如果调用的函数是 constant 或 view,wallet-cli 将会直接返回结果

如果包含library,则需要在部署合约之前先部署library,部署完library之后,知道了library地址,将地址填进library:address,library:address,...

```text
# 比如使用remix生成的合约,bytecode是
608060405234801561001057600080fd5b5061013f806100206000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063f75dac5a14610046575b600080fd5b34801561005257600080fd5b5061005b610071565b6040518082815260200191505060405180910390f35b600073<b>__browser/oneLibrary.sol.Math3__________<\b>634f2be91f6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156100d357600080fd5b505af41580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b81019080805190602001909291905050509050905600a165627a7a7230582052333e136f236d95e9d0b59c4490a39e25dd3a3dcdc16285820ee0a7508eb8690029
```

之前部署的library地址是:TSEJ29gnBkxQZR3oDdLdeQtQQykpVLSk54
那么部署的时候,需要将 browser/oneLibrary.sol.Math3:TSEJ29gnBkxQZR3oDdLdeQtQQykpVLSk54 作为deploycontract的参数。
### 5. Trident-java
trident-java是一个极其轻量的JAVA SDK。它包含了一系列库,方便开发者使用波场网络的系统与智能合约。
23 changes: 6 additions & 17 deletions docs/contracts/contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
## 波场智能合约介绍

智能合约是一种能自动执行其条款的计算化交易协议。智能合约和普通合约一样,定义了参与者相关的条款和奖惩机制。一旦合约被启动,便能按照设定的条款执行,并自动检查所承诺的条款实施情形。
Tron兼容以太坊(Ethereum)上采用Solidity编写的智能合约。当前建议的Solidity语言版本为0.4.24 ~ 0.4.25。合约编写、编译完成后,部署到Tron公链上。部署后的合约,被触发时,就会在公链的各个节点上自动执行。
Tron兼容以太坊(Ethereum)上采用Solidity编写的智能合约。你可以在[Tron solidity 代码库](https://github.com/tronprotocol/solidity/releases)中了解最新的版本。合约编写、编译完成后,部署到Tron公链上。部署后的合约,被触发时,就会在公链的各个节点上自动执行。

## 波场智能合约特性

Expand Down Expand Up @@ -96,7 +96,7 @@ Constant function 是指用 view/pure/constant 修饰的函数。会在调用的

另一个与合约调用相关的是调用指令集的时候使用CREATE指令。这个指令将会创建一个新的合约并生成新的地址。与以太坊的创建唯一的不同在于波场新生成的地址使用的是传入的本次智能合约交易id与调用的nonce的哈希组合。和以太坊不同,这个nonce的定义为本次根调用开始创建的合约序号。即如果有多次的 CREATE指令调用,从1开始,顺序编号每次调用的合约。详细请参考代码。还需注意,与deploycontract的grpc调用创建合约不同,CREATE的合约并不会保存合约的abi。

* 内置功能属性及内置函数 (Odyssey-v3.1.1及之后的版本暂时不支持TVM内置函数)
* 内置功能

```shell
1)TVM兼容solidity语言的转账形式,包括:
Expand All @@ -106,23 +106,12 @@ transfer/send/call/callcode/delegatecall函数调用转账

注意,波场的智能合约与波场系统合约的逻辑不同,如果转账的目标地址账户不存在,不能通过智能合约转账的形式创建目标地址账户。这也是与以太坊的不同点。

2)不同账户为超级节点投票 (Odyssey-v3.1.1及之后的版本暂时不支持)
3)超级节点获取所有奖励 (Odyssey-v3.1.1及之后的版本暂时不支持)
4)超级节点通过或否定提案 (Odyssey-v3.1.1及之后的版本暂时不支持)
5)超级节点提出提案 (Odyssey-v3.1.1及之后的版本暂时不支持)
6)超级节点删除提案 (Odyssey-v3.1.1及之后的版本暂时不支持)
7)波场byte地址转换为solidity地址 (Odyssey-v3.1.1及之后的版本暂时不支持)
8)波场string地址转换为solidity地址 (Odyssey-v3.1.1及之后的版本暂时不支持)
9)向目标账户地址发送token转账 (Odyssey-v3.1.1及之后的版本暂时不支持)
10)查询目标账户地址的指定token的数量 (Odyssey-v3.1.1及之后的版本暂时不支持)
11)兼容所有以太坊内置函数
2)为超级节点投票
3)质押
4)资源代理
5)兼容所有以太坊内置函数
```

注意:
波场2)- 10)为波场自己的内置函数 具体中文文档请参看:https://github.com/tronprotocol/Documentation/blob/master/中文文档/虚拟机/虚拟机内置函数.md

以太坊 RIPEMD160 函数不推荐使用,波场返回的是一个自己的基于sha256的hash结果,并不是准确的以太坊RIPEMD160。以后会考虑删除这个函数。

### 3. 合约地址在solidity语言的使用

以太坊虚拟机地址为是20字节,而波场虚拟机解析地址为21字节。
Expand Down
49 changes: 1 addition & 48 deletions docs/introduction/dpos.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,55 +87,8 @@ DPOS共识在区块链系统中根据节点获取选票的多少确定出部分

## 基于提案对参数进行调整

DPOS的一个重要的特性是任何系统参数的调整都可以通过链上的提案发起,记账人通过对提案的投票来决定提案是否生效这样的好处是在链上新增加一些特性不需要进行硬分叉升级,波场目前能够支持的系统参数调整有:
DPOS的一个重要的特性是任何系统参数的调整都可以通过链上的提案发起,记账人通过对提案的投票来决定提案是否生效这样的好处是在链上新增加一些特性不需要进行硬分叉升级。目前TRON网络的动态参数及其值,以及过往的提案,请参考[这里](https://tronscan.org/#/sr/committee)

1.两个维护期之间的时间间隔

2.申请成为记账候选人花费的TRX的数量

3.激活一个账号需要花费的TRX的数量

4.每笔交易中1个字节需要的带宽费用

5.在波场中发行资产需要花费的TRX的数量

6.witness生产每个区块的奖励

7.所有记账人(包括记账候选人)得票数在前127名按得票比例将要获得的TRX奖励总数

8.通过系统合约激活账号需要花费的TRX的数量

9.激活一个账号需要花费的带宽数量

10.能量和Sun的兑换关系

11.创建基于TRC-10的token去中心化交易对需要花费的TRX的数量

12.单笔交易执行允许花费的最大cpu时间

13.是否允许修改账号名称

14.是否允许发行同名的资产

15.是否允许资源委托

16.波场区块链系统中的能量上限值

17.是否允许在智能合约中转移TRC-10资产

18.是否允许开启能量上限动态调整

19.是否允许多重签名

20.账号权限更新需要花费的TRX数量

21.多重签名交易需要花费的TRX数量

22.是否对block和transaction的protobuf消息是否开启校验

## 带宽和能量机制

待补充

## 附录:参考文档

Expand Down
2 changes: 1 addition & 1 deletion docs/mechanism-algorithm/account.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## 账户模型介绍

Tron采用账户模型。账户的唯一标识为地址address,对账户操作需要验证私钥签名。每个账户拥有TRX、Token余额及智能合约、带宽、能量等各种资源。通过发送交易可以增减TRX或者Token余额,需要消耗带宽;可以发布并拥有智能合约,也可以调用他人发布的智能合约,需要消耗能量。可以申请成为超级代表并被投票,也可以对超级代表进行投票。等等。Tron所有的活动都围绕账户进行
TRON采用账户模型,账户的唯一标识为地址(address),对账户操作需要私钥签名。每个账户可以拥有TRX、TRC10 Token、带宽、能量等各种资源。通过发送交易可以增减TRX或者TRC10 Token余额,可以发布并拥有智能合约,也可以调用自己或者他人发布的智能合约。可以申请成为超级代表并被投票,也可以对超级代表进行投票等等。TRON所有的活动都围绕账户进行

## 创建账号的方式

Expand Down
31 changes: 8 additions & 23 deletions docs/mechanism-algorithm/multi-signatures.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@

## 背景

**注意:V3.5版本后支持**
目前TRON的所有交易签名,都是用的同一个私钥完成。没有权限分级,也不能实现多人共同控制账户。因此,设计并实现多重签名功能,每个权限可以对应多个私钥。
多重签名功能允许权限分级,每个权限可以对应多个私钥。这使得实现账户的多人联合控制成为可能。

[Tron multi-signatures TIP](https://github.com/tronprotocol/tips/blob/master/tip-16.md)

Expand All @@ -13,7 +12,7 @@

### 结构说明

#### Account修改
#### Account

```protobuf
message Account {
Expand All @@ -24,9 +23,9 @@ message Account {
}
```

在账户结构中新增三个权限属性,分别是 owner_permission、witness_permission 和 active_permission,其中 active_permission 是个列表,可以指定最多8个。
在账户结构中有三个权限属性,分别是 owner_permission、witness_permission 和 active_permission,其中 active_permission 是个列表,可以指定最多8个。

#### ContractType修改
#### ContractType

```protobuf
message Transaction {
Expand All @@ -39,8 +38,7 @@ message Transaction {
}
}
```

新增一种交易类型 AccountPermissionUpdateContract,用于更新账户权限。
AccountPermissionUpdateContract类型的交易,用于更新账户权限。

#### AccountPermissionUpdateContract

Expand All @@ -58,7 +56,7 @@ message AccountPermissionUpdateContract {
`witness`:修改后的 witness 权限(如果是 witness )
`actives`:修改后的 actives 权限

该接口是覆盖原账户权限,因此,如果只想修改owner权限,witness(如果是witnss账户)及actives的也需要设置。
注意:该接口是覆盖原账户权限,因此,如果只想修改owner权限,witness(如果是witnss账户)及actives的也需要设置。

#### Permission

Expand Down Expand Up @@ -102,7 +100,7 @@ message Key {
`address`:拥有该权限的地址
`weight`:该地址对该权限拥有权重

#### Transaction修改
#### Transaction

```protobuf
message Transaction {
Expand Down Expand Up @@ -243,7 +241,6 @@ http://{{host}}:{{port}}/wallet/accountpermissionupdate
}]
}

参数字段的定义及限制,请查看"2.1 结构说明"。

```

Expand Down Expand Up @@ -280,9 +277,7 @@ n+1、验证多重签名的权重之和大于域值则接受交易,否则拒

[多重签名示例](https://github.com/tronprotocol/wallet-cli/blob/multi_sign_V2/src/main/java/org/tron/demo/MultiSignDemo.java)

### 其他新增接口

接口详细说明,请查看Tron-http.md与波场钱包RPC-API.md
### 其他相关接口


#### 查询已签名地址
Expand All @@ -300,13 +295,3 @@ curl -X POST http://127.0.0.1:8090/wallet/getsignweight -d '{"transaction"}'

rpc GetTransactionSignWeight (Transaction) returns (TransactionSignWeight) {}
```

## 其他

### 支持多重签名后,创建账户时有什么变化?

在升级到V3.5版本后,并且多重签名提议生效后,创建账户时将自动生成owner-permission以及一个active-permission,
其中owner-permission中仅包含一个key,权限及阈值都为1。active-permission中也包含一个key,权限及阈值都为1,并且
operations为"7fff1fc0033e0000000000000000000000000000000000000000000000000000",表示支持除
AccountPermissionUpdateContract以外的所有操作。
在V3.5版本以后,如果有新增系统合约,新创建的账户的默认operations值会发生变化。已经创建的账户的operations不会发生变化。
Loading

0 comments on commit 2b9bc21

Please sign in to comment.