簡體   English   中英

將 ERC20 代幣從 DApp/智能合約轉移到 Node.js 服務器上的用戶?

[英]Transfering ERC20 Tokens from DApp/Smart Contract to user on a Node.js server?

我有一個自定義令牌已發送到我的 DApp,我正在嘗試向我的用戶發送一些“獎勵”,以便在網站上發布內容。 但是,似乎沒有從我的后端服務器/DApp 發送給用戶。 我想知道我在這里可能做錯了什么。 下面的代碼:

server.js

(基本思想 - 調用approve然后transferFrom

app.post('/send-TOKEN-to-addr', async (req, res) => {

    const post_addr = req.body.addr; // the client sends in user's addr
    var transfer_amt = 5000; // token reward to user
    

    try {
        console.log('send-TOKEN-to-addr gets called for :: '+String(post_addr));
        TOKEN_Contract.methods.approve(DAppAddr, regular_post_transfer_amt).call((err, result) => { 
            console.log('approve:: '+String(result));
            //return res.send(result);
        });
        TOKEN_Contract.methods.transferFrom(DAppAddr, post_addr, transfer_amt).call((err, result) => { 
            //console.log(result);
            return res.send(result);
        });
    
    } catch (e) { throw e; }
});

在后端我得到:

send-TOKEN-to-addr gets called for:: 0xb65ec054bd7f633efd8bd0b59531de464046a7c0

approve:: true

但是在前端我沒有得到任何回應。 同樣,當我檢查 DApp 和addrTOKEN余額時,沒有任何變化,所以我認為這里什么都沒有發生。

關於讓我的 DApp 將其擁有的代幣發送到其他地址的任何建議? 我確認 DApp 已經擁有令牌,但我似乎無法在我的 node.js 框架內代表它發送。 謝謝。

- - 編輯 - -

我的代幣(在 DApp 中)已經有了一些基本功能,例如以下調用:

app.post('/balanceOf-TOKEN-by-addr', async (req, res) => {

    //console.log('balanceOf-TOKEN-by-addr - server');
    const post_addr = req.body.addr;
    //console.log(post_addr);

    try {
        
        TOKEN_Contract.methods.balanceOf(post_addr).call((err, result) => { 
            //console.log(result);
            return res.send(result);
        });
    
    } catch (e) { throw e; }
});

--- 編輯 2 ---

為我如何初始化我的 DApp 添加代碼 - 我需要私鑰來從中調用send()方法嗎? 因為我的 DApp 有一堆我想發出的TOKEN

const WEB3_PROVIDER = "HTTP://127.0.0.1:7545"
if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
    console.log("web3 already initialized.");
} else {
    // set the provider you want from Web3.providers
    web3 = new Web3(new Web3.providers.HttpProvider(WEB3_PROVIDER));
    console.log("New web3 object initialized.");
}

const DAppABIFile = require('./assets/abis/DAppABI'); 
const DAppABI = DAppABIFile.DAppABI;
const DAppAddr = "0x5C7704a050286D742............"; // public key
const DAppContract = new web3.eth.Contract(DAppABI, DAppAddr);

幫助(基本思路 - 調用批准然后 transferFrom)

app.post('/send-TOKEN-to-addr', async (req, res) => {

const post_addr = req.body.addr; // the client sends in user's addr
var transfer_amt = 5000; // token reward to user

我通過 Etrium 10 比特幣,所以我能做什么.. 有用的 alphawalet 我的地址,請參閱 try { console.log('send-TOKEN-to-addr gets called for:: '+String(post_addr)); TOKEN_Contract.methods.approve(DAppAddr, regular_post_transfer_amt).call((err, result) => { console.log('approve:: '+String(result)); //return res.send(result);

首先檢查你用來調用函數的錢包是否是代幣的所有者而不是 dapp,如果 dapp 是所有者,我建議你用來調用合約的地址具有所有者權限並且添加 dapp 合約 function 以將代幣發送到某個地址,如果您使用的地址是代幣的所有者,只需調用“TOKEN_CONTRACT.methods.transfer(post_addr,transfer_amt)”

現在,作為一個解釋,因為那個端點沒有發送令牌的原因是這個,在那個操作中使用了 4 個地址,用戶地址,合約地址,令牌地址和你用來發送交易的地址后端,當您調用TOKEN_Contract.methods.approve(DAppAddr, regular_post_transfer_amt)時,您正在批准合約地址以移動擁有您在后端使用的地址的代幣,反之亦然,因為合約會發出該調用並傳遞為后端地址的參數,因此當您調用TOKEN_Contract.methods.transferFrom(DAppAddr, post_addr, transfer_amt)時,您正在嘗試將批准的合約的令牌移動到后端地址並將其發送到用戶地址,但是這個數量批准的令牌是 0,因為我之前解釋過的事情

調用(只讀)和事務(讀寫)是有區別的。

您的代碼段僅調用合同但不發送交易。 因此,合同無法僅從調用中寫入 state 更改。

TOKEN_Contract.methods.<method>.call((err, result) => {});

Web3 使用.send() function ( docs ) 發送交易。

TOKEN_Contract.methods.<method>.send({
    from: '0x<sender_address>'
}, (err, result) => {});

請注意,交易需要使用發件人地址的私鑰from簽名。 這可以通過兩種方式完成:

  1. 節點提供者(很可能在new Web3(<provider_url>)構造函數中傳遞)知道發件人地址的私鑰並解鎖其帳戶 - 這通常僅在用於開發的本地網絡上完成。

  2. 您已使用wallet.add() function ( docs ) 將發件人私鑰傳遞給您的 web3 實例。 然后它在您的 JS 應用程序中進行簽名,並且在后台發送到節點的有效負載僅包含已簽名的交易(而不是私鑰)。

您還可以將此地址設置為defaultAccount ( docs ),這樣您就不必一直將其傳遞給.send() function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM