web3.js增加eth.getRawTransactionByHash(txhash)方法步骤

eth_getRawTransactionByHash

https://ethereum.stackexchange.com/questions/7473/get-raw-transaction-from-hash

 

There is an "undocumented" method eth_getRawTransactionByHash from JSON-RPC

curl -H "Content-Type: application/json" -X POST --data \
'{"jsonrpc":"2.0","method":"eth_getRawTransactionByHash","params":["<TX_HASH>"],"id":1}' http://localhost:8545

<TX_HASH> - transaction id

1.项目node_modules 下找到web3  下types.d.ts文件

 

Eth

   类中增加方法

getRawTransaction(hash: string, cb?: Callback<TransactionRaw>): Promise<TransactionRaw>

 

增加TransactionRaw定义

 

export declare interface TransactionRaw {

raw: string

}

 

2.项目node_modules 下找到 web3-eth中   index.js

 

methods={}

增加方法

 

new Method({

name: 'getRawTransaction',

call: 'eth_getRawTransactionByHash',

params: 1,

inputFormatter: [null],

outputFormatter: formatter.outputTransactionRawFormatter

}),

 

3.项目node_modules 下找到 web3-core-helpers中  formatters.js

增加 outputTransactionRawFormatter并module.exports中也增加对应

 

/**

* Formats the output of a transaction raw value

*

* @method outputTransactionRawFormatter

* @param {Object} tx

* @returns {Object}

*/

var outputTransactionRawFormatter = function (tx){

return tx;

};

module.exports = {

inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter,

inputBlockNumberFormatter: inputBlockNumberFormatter,

inputCallFormatter: inputCallFormatter,

inputTransactionFormatter: inputTransactionFormatter,

inputAddressFormatter: inputAddressFormatter,

inputPostFormatter: inputPostFormatter,

inputLogFormatter: inputLogFormatter,

inputSignFormatter: inputSignFormatter,

outputBigNumberFormatter: outputBigNumberFormatter,

outputTransactionFormatter: outputTransactionFormatter,

outputTransactionRawFormatter: outputTransactionRawFormatter,

outputTransactionReceiptFormatter: outputTransactionReceiptFormatter,

outputBlockFormatter: outputBlockFormatter,

outputLogFormatter: outputLogFormatter,

outputPostFormatter: outputPostFormatter,

outputSyncingFormatter: outputSyncingFormatter

};

 

 

 

备注:以上代码是1.0.版本的

一下是0.2

 

/node_modules/web3/lib/web3/methods/eth.js

 

var getRawTransaction = new Method({

name: 'getRawTransaction',

call: 'eth_getRawTransactionByHash',

params: 1,

outputFormatter: formatters.outputTransactionRawFormatter

});

return [

getBalance,

……………………………………………………………………………………………………

getWork,

getRawTransaction

];

 

 

 

node_modules/web3/lib/web3/formatters.js

 

/**

* Formats the output of a transaction raw value

*

* @method outputTransactionRawFormatter

* @param {Object} tx

* @returns {Object}

*/

var outputTransactionRawFormatter = function (tx){

return tx;

};

module.exports = {

inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter,

…………………………………………………………………………………………………………………………………………

outputSyncingFormatter: outputSyncingFormatter,

outputTransactionRawFormatter:outputTransactionRawFormatter

};

 

备注:可以直接用partiy搭建节点,内部web3直接返回raw

web3.eth.getTransaction('0xc0c1984a44bbc8f1933d732920b8b549636147d4e45c42787ca53994e5986d63');
{
     blockHash: "0x1e633c17d7e51c2e5f42c5087646d1e9c3635b48d127c9a0f7bcbd177704ba82",
     blockNumber: 6025314,
     chainId: "0x1",
     condition: null,
     creates: null,
     from: "0x0d4ac6b66d6d9c204069c304da3ebbaf83eaea80",
     gas: 38001,
     gasPrice: 1100000000,
     hash: "0xc0c1984a44bbc8f1933d732920b8b549636147d4e45c42787ca53994e5986d63",
     input: "0xa9059cbb000000000000000000000000347072fcd71a9e251d18a292d9bbc8bc3149cd8a0000000000000000000000000000000000000000000000008ac7230489e80000",
     nonce: 7,
    publicKey: "0x481e82fd238cfbe00c15e4b87cd05c0d2b41a322a149a0a8ca128a8563b44c356ece44cfa987a75daf46ca7263623e22dcf0689c6ebc0aca7d460e493d0e1f3c",
     r: "0x6be79f8bf82c9197bacc0c06c095a8bd0d97d0d9e69d55c10e8a01bf8475c8e5",
raw: "0xf8a807844190ab0082947194aa0bb10cec1fa372eb3abc17c933fc6ba863dd9e80b844a9059cbb000000000000000000000000347072fcd71a9e251d18a292d9bbc8bc3149cd8a0000000000000000000000000000000000000000000000008ac7230489e8000026a06be79f8bf82c9197bacc0c06c095a8bd0d97d0d9e69d55c10e8a01bf8475c8e5a008276ff7a917842c632bcdb59c8a301e3ee3b6bce0aee1a7562a5c90ab9e9dfe",
     s: "0x8276ff7a917842c632bcdb59c8a301e3ee3b6bce0aee1a7562a5c90ab9e9dfe",
     standardV: "0x1",
     to: "0xaa0bb10cec1fa372eb3abc17c933fc6ba863dd9e",
     transactionIndex: 200,
     v: "0x26",
     value: 0
}

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ERC20代币合约中的`toggle`函数是用于切换是否需要签名的函数。如果该函数被调用,那么代币转移交易就不需要经过用户的签名确认,而是直接由智能合约执行。这种方式可以用于一些特殊场景,比如允许信任的第三方执行代币转移交易,或者在某些情况下需要快速执行代币转移交易等。 使用Toggle函数需要满足以下条件: 1. 合约的owner需要调用该函数进行切换。 2. 调用该函数需要提供owner的签名,以验证调用者的身份。 使用web3.js调用Toggle函数的示例代码如下: ``` // 假设以下变量已经定义并初始化 // ERC20代币合约的地址 var tokenAddress = "0x1234567890123456789012345678901234567890"; // 合约owner的地址和私钥 var ownerAddress = "0x1122334455667788990011223344556677889900"; var ownerPrivateKey = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; // web3.js provider var web3Provider = new Web3.providers.HttpProvider("http://localhost:8545"); // 实例化web3.js对象 var web3 = new Web3(web3Provider); // 实例化ERC20代币合约 var tokenContract = new web3.eth.Contract(tokenAbi, tokenAddress); // 调用Toggle函数 function toggleSign() { // 判断是否为owner tokenContract.methods.owner().call().then(function (result) { if (result === ownerAddress) { // 构造toggle函数的参数 var data = tokenContract.methods.toggle().encodeABI(); // 对参数进行签名 var hash = web3.utils.soliditySha3({type: 'address', value: tokenAddress}, {type: 'bytes', value: data}); var sig = web3.eth.accounts.sign(hash, ownerPrivateKey); // 构造调用参数 var payload = '0x' + data.substring(2) + sig.r.substring(2) + sig.s.substring(2) + sig.v.toString(16); // 调用ERC20代币合约的方法 tokenContract.methods.toggle().send({from: ownerAddress, data: payload}).then(function (result) { console.log(result); }).catch(function (err) { console.error(err); }); } else { console.error("Not owner"); } }).catch(function (err) { console.error(err); }); } ``` 在上述示例中,我们首先实例化了web3.js对象和ERC20代币合约,然后定义了一个toggleSign函数,用于调用Toggle函数。在toggleSign函数中,我们首先通过调用owner函数,判断调用者是否为owner。然后,我们构造Toggle函数的参数,并对参数进行签名。最后,我们将签名后的参数和Toggle函数的selector合并,构造调用参数,然后调用ERC20代币合约的方法。在调用Toggle函数时,如果签名验证通过,那么代币转移交易就可以不需要经过用户的签名确认,直接由智能合约执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值