-
Notifications
You must be signed in to change notification settings - Fork 24
Third Party Wallet Contract Invoke
对于普通的交易,客户端只构造包含一条message的transcation包含用户解锁其UTXO的签名,HashType为All。不包含合约类型的message。 而对于合约交易而言,则需要构造至少包含两条message的transcation。
- 第一条为转移PTN的PaymentPayload message,
- 第二条(最后一条)为合约调用的ContractInvokeRequestPayload message。
一般的合约调用就2条Message,但是如果要转移自定义Token到合约时,则需要3条Message,甚至更多,总之保证ContractInvokeRequestPayload是最后一条。
type Message struct {
App byte //(APP_CONTRACT_INVOKE_REQUEST = 102)
Payload []byte //ContractInvokeRequestPayload对象RLP序列化后的结果
}
type ContractInvokeRequestPayload struct {
ContractId []byte // 合约ID,20字节
Args [][]byte // 要调用的合约函数名和参数列表,第0个是函数名,后面的都是传入该函数的参数,无论函数名还是参数,本质上都是string的数组
Timeout uint32 //超时时间,默认设成0
}
在构造合约调用交易时,先构造的Message0的Input并没有解锁,只有当整个交易构造完毕后再进行解锁。解锁方法与普通转账相同。
对于系统合约,我们写死了每个系统合约的ID。合约ID(合约地址)是一个20字节的byte数组,使用version=28对这20个字节按照比特币的地址生成算法生成。 以保证金为例,我们规定0x0000000000000000000000000000000000000001为保证金合约的地址, 转换为字符串合约地址为:
PCGTta3M4t3yXu8uRgkKvaWd2d8DR32W9vM
在APP端签名后的合约调用交易只是一个请求,还没有被服务器执行,所以APP创建的交易的Hash被称为RequestId,使用以下接口可以查询该请求是否已经被区块链执行:
{
"jsonrpc":"2.0",
"method":"dag_getTxHashByReqId",
"params":["APP计算出的RequestID"],
"id":1
}
如果返回结果形如:
{
"jsonrpc": "2.0",
"id": 1,
"result": "{\"item\":\"tx_hash\",\"info\":\"0x36a965550915496d80ff04b2f7ae9ac4a71ed69e8f319f333cd0be5697553ddc\",\"hex\":\"\"}"
}
返回结果中的0xXXXXXX就是被执行完成的完整交易Hash,如果还没有被执行,则返回结果为:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32000,
"message": "leveldb: not found"
}
}
合约中的查询函数需要通过JSON API调用来查询。格式为:
{
"jsonrpc":"2.0",
"method":"contract_ccquery",
"params":["PC开头的合约地址",["调用的查询函数","查询传入的参数1","查询传入的参数2..."],0,
"id":1
}
要查询当前链中有哪些合约可被调用:
{
"jsonrpc":"2.0",
"method":"contract_listAllContracts",
"params":[""],
"id":1
}
已知某个合约地址,要查询这个合约的ABI信息和其他详细信息为:
{
"jsonrpc":"2.0",
"method":"contract_getContractInfoByAddr",
"params":["PCGTta3M4t3yXu8uRgkKvaWd2d8DREThG43"],
"id":1
}
同质化通证创币的合约地址是:PCGTta3M4t3yXu8uRgkKvaWd2d8DREThG43。
需要构造包含两个message的transcation。
-
第一个是支付token的message,类型为APP_PAYMENT
-
第二个创币的message, 类型为 APP_CONTRACT_INVOKE_REQUEST
首先创建合约message,并在创建基础交易message之后,将其附加到后面。 合约message创建方法例如:
msgReq := &modules.Message{
App: modules.APP_CONTRACT_INVOKE_REQUEST,
Payload: &modules.ContractInvokeRequestPayload{
ContractId: contractId.Bytes(),
Args: args,
Timeout: timeout,
},
}
其中args 为创币参数,建议格式为:
["createToken", "create test description","jze","1","1000","P1EDfmkRcREb2BBdbi1g96U1VCBLvFNAMPr"]]
createToken 方法名
create test description token描述
jze token符号(全局唯一,不能超过5个字符,0-9a-z,不区分大小写)
1 小数最小精度(最大18)
1000 token初始总量(显示精度)
P1EDfmkRcREb2BBdbi1g96U1VCBLvFNAMPr 增发地址(增发调用的地址,为空则不能增发
之后创建基础交易,可参考普通交易创建方式,其中参数包括 :from地址,to地址,PTN数量(单位:Dao),手续费(单位:Dao)
整体的来讲,建议的合约创币参数格式为: "from address","to address","PTN amount","fee","合约地址(固定)",[合约参数"方法名称","合约描述","PRC20资产名称","小数最小精度","初始资产总量","增发地址"]
例如:
"P1AhinG2L56otnRAaUn68YDpwebWuSLR5hQ","P1EDfmkRcREb2BBdbi1g96U1VCBLvFNAMPr","1000","1","PCGTta3M4t3yXu8uRgkKvaWd2d8DREThG43",["createToken", "create description","zxl","1","1000","P1AhinG2L56otnRAaUn68YDpwebWuSLR5hQ"]
增发和初始化发行都是调用相同的合约,转移token的部分完全一致,需要from地址,to地址,PTN数量(单位:Dao),手续费(单位:Dao)
{
"jsonrpc":"2.0",
"method":"contract_ccinvoketxPass",
"params":["P1AhinG2L56otnRAaUn68YDpwebWuSLR5hQ","P1AhinG2L56otnRAaUn68YDpwebWuSLR5hQ","10","1","PCGTta3M4t3yXu8uRgkKvaWd2d8DREThG43",["supplyToken", "zxl","1000"], "1", 120, ""],
"id":1
}
supplyToken 方法名(调用合约时的方法名不同)
zxl token符号(全局唯一)
1000 增发数量
增发权转移和初始化发行都是调用相同的合约,转移token的部分完全一致,需要from地址,to地址,PTN数量(单位:Dao),手续费(单位:Dao)。区别在于调用合约时的方法名不同,增发权转移使用的是changeSupplyAddr,后跟参数为:
"P1AhinG2L56otnRAaUn68YDpwebWuSLR5hQ","P1EDfmkRcREb2BBdbi1g96U1VCBLvFNAMPr","1000","1","PCGTta3M4t3yXu8uRgkKvaWd2d8DREThG43",["changeSupplyAddr", "zxl","P1JZE3fNzG4jG7bh1iAc7mTHmfM7xpQCd5D"]
changeSupplyAddr 方法名(调用合约时的方法名不同)
zxl token符号(全局唯一)
P1JZE3fNzG4jG7bh1iAc7mTHmfM7xpQCd5D 转移token的地址
非同质化通证创币合约地址为: PCGTta3M4t3yXu8uRgkKvaWd2d8DRijspoq
例如:
{
"jsonrpc":"2.0",
"method":"contract_ccinvoketxPass",
"params":["P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS","P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS","100","1","PCGTta3M4t3yXu8uRgkKvaWd2d8DRijspoq",["createToken", "The jade's information in PalletOne","YDPOC","3","1","[{\"TokenID\":\"00000000000000000000000000000001\",\"MetaData\":\"metadata1\"}]",""], "1", 120, ""],
"id":1
}
from 地址 P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS
to 地址 P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS
转账PTN数量 (单位 DAO 1PTN=10^8 DAO) 100
转账手续费(单位 DAO 1PTN=10^8 DAO) 1
合约地址 PCGTta3M4t3yXu8uRgkKvaWd2d8DRijspoq
方法名 createToke
Token名字 "The jade's information in PalletOne"
Token符号 YDPOC
Token类型 (1:Seqence,2:UDID,3:Custom) 3
Token初始总量 1
TokenID(i)代表用户输入的一系列的token信息TokenID:00000000000000000000000000000001
MetaData对应token的详细信息 MetaData:metadata1
增发地址 (为空:都可以增发,不为空:仅增发地址可以增发)
密码 1
解锁时间 120 秒
预留证书字段目前为空 ""
id 1 (固定值)
token类型目前支持4种
1类型 表示token ID从1顺序递增,
2类型表示token ID随机产生UDID,
3类型由用户自定义(十六进制展示),
4类型Ascii码字符串(相对于3类型,展示更友好)
其中token信息格式为Json格式字符串(务必对json原始数据进行转义后作为字符串使用)
形如:
{
"TokenID": "tokenIDHex1",
"MetaData": "metadata1"
}
...
tokenID(i)代表用户输入的一系列的token信息。 其中,TokenID对应tokenID,1类型、23类型填空即可,3类型的格式为长度32的十六进制字符串,4类型的格式为长度为16的字符串,MetaData对应token的详细信息。
例如:
{
"TokenID": "00000000000000000000000000000001",
"MetaData": "metadata1"
}
转换成字符串以后形如
[{\"TokenID\":\"00000000000000000000000000000001\",\"MetaData\":\"metadata1\"},{\"TokenID\":\"00000000000000000000000000000002\",\"MetaData\":\"metadata2\"}]
表示用户输入的2个tokenID和对应的MetaData。
参数列表为: from地址(根据创币调用中的增发地址判断,为空:都可以增发,不为空:仅增发地址可以增发;如果已转移过增发权,则是转移后的增发地址),to地址,PTN数量(Dao),手续费(Dao),合约ID(固定的PCGTta3M4t3yXu8uRgkKvaWd2d8DRijspoq),方法名(supplyToken),token符号(全局唯一),增发数量(最大1000),token信息(格式说明详见下述)
例如:
{
"jsonrpc":"2.0",
"method":"contract_ccinvoketxPass",
"params":["P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS","P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS","100","1","PCGTta3M4t3yXu8uRgkKvaWd2d8DRijspoq",["supplyToken", "YDPOC","1","[{\"TokenID\":\"00000000000000000000000000000002\",\"MetaData\":\"metadata02\"}]"], "1", 120, ""],
"id":1
}
from 地址 P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS
to 地址 P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS
转账PTN数量 (单位 DAO 1PTN=10^8 DAO) 100
转账手续费(单位 DAO 1PTN=10^8 DAO) 1
合约地址 PCGTta3M4t3yXu8uRgkKvaWd2d8DRijspoq
方法名 supplyToken
Token符号 cat1
增发数量 1
TokenID(i)代表token信息TokenID 1类型、23类型填空即可,4类型的格式为长度为16的字符串
MetaData对应token的详细信息 "MetaData":"metadata6"
密码 1
解锁时间 120 秒
id 1 (固定值)
其中, token信息格式为Json格式字符串,
{
"TokenID": "tokenIDHex1",
"MetaData": "metadata1"
}
[{\"TokenID\":\"tokenIDHex1\",\"MetaData\":\"metadata1\"}
tokenID(i)代表用户输入的一系列的token信息,其中,TokenID对应tokenID,1类型、23类型填空即可,3类型的格式为长度32的十六进制字符串,4类型的格式为长度为16的字符串,MetaData对应token的详细信息。
例如,
{
"TokenID": "00000000000000000000000000000001",
"MetaData": "metadata1"
}
[{\"TokenID\":\"00000000000000000000000000000001\",\"MetaData\":\"metadata1\"},{\"TokenID\":\"00000000000000000000000000000002\",\"MetaData\":\"metadata2\"}]
表示用户输入的2个tokenID和对应的MetaData;
转移增发权参数列表为: from地址(必须为创币调用中的增发地址,如果已转移过增发权,则是转移后的增发地址,其他地址不能增发),to地址,PTN数量(单位:Dao),手续费(单位:Dao),合约ID(固定的PCGTta3M4t3yXu8uRgkKvaWd2d8DREThG43),方法名(changeSupplyAddr),token符号(全局唯一),新的增发地址 建议的参数组织格式为: "from地址","to地址","PTN数量(Dao)","手续费(单位:Dao)","合约ID(固定的PCGTta3M4t3yXu8uRgkKvaWd2d8DREThG43)",["方法名(changeSupplyAddr)", "token符号","新的增发地址"] 例如:
{
"jsonrpc":"2.0",
"method":"wallet_transferToken",
"params":["YDPOC+07GF1TSQWJURPXO8K2V-00000000000000000000000000000001","P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS","P1EjdrHLeGr95y17kMJJ7fSwDBcEdGx3GdZ","1", "1", "", "1", 120],
"id":1
}
Token资产ID YDPOC+07GF1TSQWJURPXO8K2V-00000000000000000000000000000001
from 地址 P16XD13zpqZdafLR7zmEh4HXHCyMborSNeS
to 地址 P1EjdrHLeGr95y17kMJJ7fSwDBcEdGx3GdZ
转账Token数量 1
转账手续费(单位 PTN) 1
备注 “”
密码 1
解锁时间 120
id 1 (固定值)
{
"jsonrpc":"2.0",
"method":"contract_ccinvoketx",
"params":[
"P1CNcSt9D2XiuL33T14hA8Ux4xkBPWaFEv8","PCGTta3M4t3yXu8uRgkKvaWd2d8DR32W9vM","1234","1","PCGTta3M4t3yXu8uRgkKvaWd2d8DR32W9vM",["PledgeDeposit"],"1",""
],
"id":1
}
质押地址 P1CNcSt9D2XiuL33T14hA8Ux4xkBPWaFEv8
质押挖矿合约地址为:PCGTta3M4t3yXu8uRgkKvaWd2d8DR32W9vM Hex为: 0x0000000000000000000000000000000000000001
质押数量 1234
手续费 1
方法名 PledgeDeposit
密码 1
预留字符串 "" 即可
- Message0中将想质押的PTN数转账到合约地址PCGTta3M4t3yXu8uRgkKvaWd2d8DR32W9vM,
- Message1中调用合约PCGTta3M4t3yXu8uRgkKvaWd2d8DR32W9vM,函数名为“PledgeDeposit”,无参数。
调用gptn提供的API:
{
"jsonrpc":"2.0",
"method":"contract_ccquery",
"params":[
"PCGTta3M4t3yXu8uRgkKvaWd2d8DR32W9vM",["QueryPledgeStatusByAddr","P1XXX你要查询的地址"],0
],
"id":1
}
返回结果如下:
{
"jsonrpc": "2.0",
"id": 1,
"result": "{\"NewDepositAmount\":0,\"PledgeAmount\":0,\"WithdrawApplyAmount\":0,\"OtherAmount\":0}"
}
NewDepositAmount 新质押金额(Dao)
PledgeAmount 已质押分红金额(Dao)
WithdrawApplyAmount 申请提币金额(Dao)
OtherAmount 其他质押金额(Dao
钱包显示时需要转换Dao为PTN
- Message0为自己转给自己PTN,Input-Output为手续费,
- Message1中调用合约PCGTta3M4t3yXu8uRgkKvaWd2d8DR32W9vM,函数名为“PledgeWithdraw”,参数1个,为提币金额(Dao)的字符串。
如果用户希望提取全部的质押PTN和分红,那么提币金额为:“all”;如果不是全部提取,则是具体的金额(Dao)的数字字符串。
发起新投票,参数格式与创币合约相似,但是没有token符号定义,自动生成VOTE Token
{"jsonrpc":"2.0","method":"contract_ccinvokeToken","params":["P1EyTvr6ExY4JUDRp4Ks267FoSrs1gFAbB3","P1EyTvr6ExY4JUDRp4Ks267FoSrs1gFAbB3","100","1","PCGTta3M4t3yXu8uRgkKvaWd2d8DRLGbeyd",["createToken", "zxl test description","1","1000","2019-03-02 20:00:00","[{\"TopicTitle\":\"vote your love blockchain\",\"SelectOptions\":[\"ptn0\",\"btc0\",\"eth0\",\"eos0\"],\"SelectMax\":2},{\"TopicTitle\":\"vote your hate blockchain\",\"SelectOptions\":[\"ptn1\",\"btc1\",\"eth1\",\"eos1\"],\"SelectMax\":2}]"],"id":1}
from地址 P1EyTvr6ExY4JUDRp4Ks267FoSrs1gFAbB3
to地址 P1EyTvr6ExY4JUDRp4Ks267FoSrs1gFAbB3
PTN数量(Dao) 100
手续费(Dao) 1
合约ID PCGTta3M4t3yXu8uRgkKvaWd2d8DRLGbeyd(固定)
方法名 createToken
token名字 zxl test description
投票类型(暂时没有真正作用,"1"即可)
token初始总量(即选票数量) 1000
投票结束时间(UTC时间,格式 2019-03-02 20:00:00 )
投票内容(格式说明详见下述)
投票内容的格式为Json格式字符串, [{"TopicTitle":"vote topic title","SelectOptions":["item1","item2","item3",...],"SelectMax":M},...] ;一个投票议题的组成:TopicTitle代表投票标题,SelectOptions代表一堆选项即item的开始, SelectMax代表最多选几项;一个投票Token可以有多个投票议题,例如,[{"TopicTitle":"vote your love blockchain","SelectOptions":["ptn0","btc0","eth0","eos0"],"SelectMax":2},{"TopicTitle":"vote the best blockchain","SelectOptions":["ptn1","btc1","eth1","eos1"],"SelectMax":2}] 表示两个投票,第一个的选项为 ptn0、btc0、eth0、eos0,最多选两个,第二个投票类似,不再解释。
把票转给投票人,然后投票人去投票
Token转账:Token资产ID(用getBalance可以看到),from地址,to地址,Token数量,手续费(PTN),备注
{
"jsonrpc":"2.0",
"method":"ptn_transferToken",
"params":["VOTE+02T2AE41XCGGL70XTM3","P1EyTvr6ExY4JUDRp4Ks267FoSrs1gFAbB3","P1CbmPRvSeWXDgN8wZECWUVujirEaxynB8K","1", "1", "Hello Palletone", "1", 120],
"id":1
}
参与投票所涉及的参数列表为: from地址,to地址,销毁地址(必须填这个地址,其他无效 P1111111111111111111114oLvT2 ),PTN数量(Dao),手续费(Dao),Token资产ID(用getBalance可以看到),投票数量(必须和投票请求数量一致),合约ID(固定的PCGTta3M4t3yXu8uRgkKvaWd2d8DREThG43),方法名(support),投票请求(格式说明详见下述) 例如:
{"jsonrpc":"2.0","method":"contract_ccinvokeToken","params":["P1EyTvr6ExY4JUDRp4Ks267FoSrs1gFAbB3","P1EyTvr6ExY4JUDRp4Ks267FoSrs1gFAbB3","P1111111111111111111114oLvT2","100","1","VOTE+02T2AE41XCGGL70XTM3","5","PCGTta3M4t3yXu8uRgkKvaWd2d8DRLGbeyd",["support", "[{\"TopicIndex\":1,\"SelectIndexs\":[1,2]},{\"TopicIndex\":2,\"SelectIndexs\":[1,2]}]"]],"id":1}
from地址 P1EyTvr6ExY4JUDRp4Ks267FoSrs1gFAbB3
to地址 P1EyTvr6ExY4JUDRp4Ks267FoSrs1gFAbB3
销毁地址(必须填这个地址,其他无效 P1111111111111111111114oLvT2 )
PTN数量(Dao) 100
手续费(Dao) 1
投票Token数量 5
Token资产ID(用getBalance可以看到) VOTE+02T2AE41XCGGL70XTM3
合约ID PCGTta3M4t3yXu8uRgkKvaWd2d8DRLGbeyd(固定)
方法名 support
投票请求(格式说明详见下述)
投票请求的格式为Json格式字符串,[{"TopicIndex":topicIndex1,"SelectIndexs":[itemIndex1,selIndex2,...]} ,...] ,TopicIndex代表一堆投票的索引(创建的那些议题对应的索引,整数,从1开始), SelectIndexs代表该次投票的选项索引(某个投票的选项对应的索引,整数,从1开始);每一个投票token对该token下的议题都有效,即同时对多个议题投票,例如,[{"TopicIndex":1,"SelectIndexs":[1,2]},{"TopicIndex":2,"SelectIndexs":[1,2}] 表示两个投票请求,即同时对两个议题投票,第一个议题投票的选项为 1、2,第二个类似。注意:投票示例使用5个投票token,每一个议题对应的选项得了5票。
本功能可以使用RPC方式调用 涉及到的参数为 合约ID(固定的PCGTta3M4t3yXu8uRgkKvaWd2d8DRLGbeyd),方法名(getVoteResult),Token资产ID(用getBalance可以看到) RPC调用方式为:
{"jsonrpc":"2.0","method":"contract_ccquery","params":["PCGTta3M4t3yXu8uRgkKvaWd2d8DRLGbeyd",["getVoteResult", "VOTE+02T2AE41XCGGL70XTM3"]],"id":1}
本功能可以使用RPC方式调用 涉及到的参数为 合约ID(固定的PCGTta3M4t3yXu8uRgkKvaWd2d8DRLGbeyd),方法名(getVoteInfo),Token资产ID(用getBalance可以看到) RPC调用方式为:
{"jsonrpc":"2.0","method":"contract_ccquery","params":["PCGTta3M4t3yXu8uRgkKvaWd2d8DRLGbeyd",["getVoteInfo", "VOTE+02T2AE41XCGGL70XTM3"]],"id":1}
PalletOne©2018-2019
Home
Getting started
- Install and build
- Create a private chain
- Launch the PalletOne Client
- Create a PalletOne Account
- Send and Receive PTN
- Create and send your token
- Backing up your account and data
- Restoring your account
- Deposit contract
- Mediator Node Installation and Joining
- Howto Become a Mediator
- Howto Run a Unit-producing Mediator
Developer Tools
- Getting PTNs from PalletOne's Testnet Faucet
- Wallet restful and console API Usage
- Third-Party-Wallet-Support
- Third-Party-Wallet-Contract-Invoke
- API Document
FAQ