如何通过 Solana JSONRPC 发送和接收令牌

Posted

技术标签:

【中文标题】如何通过 Solana JSONRPC 发送和接收令牌【英文标题】:how to send and receive tokens via Solana JSONRPC 【发布时间】:2021-12-31 15:51:25 【问题描述】:

有以下 ETH JSONRPC 实现来传输令牌,可以通过 php 中的 curl 使用,我想完全一样,但在 Solana 区块链上 - 它支持它自己的 JSONRPC implementation

var whatever= ;
whatever.jsonrpc="2.0";
whatever.id=1;
whatever.method="eth_sendTransaction";
whatever.params= [];
whatever.params[0].from="0x52f273a06a420453aa5b33c4f175395c9a1fddd8";
whatever.params[0].to=data.ethAddress;
whatever.params[0].value=1e18;
whatever.params[0].currency="xxx";

source on stack overflow for the above code is here

Solana 文档仅提到 sendTrasactions,这是我的两个问题:

    如何使用 Solana 实现上述示例(请参阅下面我们对 Solana JSONRPC 的 curl 实现,以在 php 中获取用户当前的令牌数量,即“getTokenAmount”) 我从哪里获得完全签名的事务作为编码字符串,它是“sendTransaction”的参数*

*我假设转账完成后会发出完全签名的交易,不是吗?

----- 上面提到的我们的实现示例(对于那些可能对它感兴趣的人-----

public function getTokenAmount($wallet_address, $token_address)

    $data = array(
        "jsonrpc" => "2.0",
        "id" => 1,
        "method" => "getTokenAccountsByOwner",

        "params" => array(
            0 => $wallet_address,
            1 => array(
                "mint" => $token_address
            ),
            2 => array(
                "encoding" => "jsonParsed"
            )
        )
    );


    $data = json_encode($customer);
    $response = $this->initCurl($data);

    return $response->result->value[0]->account->data->parsed->info->tokenAmount->uiAmount;


private function initCurl($data)


    $ch = @curl_init();
    @curl_setopt($ch, CURLOPT_POST, true);
    @curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    @curl_setopt($ch, CURLOPT_URL, $this->_endpoint);
    @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    @curl_setopt($ch, CURLOPT_HTTPHEADER, array( "accept: application/json", "content-type: application/json"));

    $response = json_decode(@curl_exec($ch));
    $err = @curl_error($ch);

    curl_close($ch);

    // TODO: ERROR HANDLING
    if ($err) 
        return false; //"cURL Error #:" . $err;
    

    return $response;


【问题讨论】:

【参考方案1】:

1 和 2 的答案非常相似。

为了发送交易,您必须使用所有交易数据创建一个 base64 或 base58 编码字符串,其中包括帐户、数据和任何其他所需的标志。之后,您必须使用 ed25519 密钥对交易进行签名,并将整个字符串作为交易提供。

您可以按照 JS 的做法自行构建:

系统指令,具体为transfer:https://github.com/solana-labs/solana/blob/005592998dd107b3d54d9203babe24da681834f5/web3.js/src/system-program.ts#L676 事务,具体添加指令,编译消息,签名:https://github.com/solana-labs/solana/blob/005592998dd107b3d54d9203babe24da681834f5/web3.js/src/transaction.ts#L205

不过,您最好的选择是重用已为您完成大量此类工作的现有库。例如,https://github.com/tighten/solana-php-sdk#transactions 提供了一个简单的 API,可以完全满足您的需求。

【讨论】:

以上是关于如何通过 Solana JSONRPC 发送和接收令牌的主要内容,如果未能解决你的问题,请参考以下文章

Solana 按 Epoch 确定通货膨胀奖励分配的日期和时间

如何通过“@solana/web3.js”传输自定义令牌

通过向关联令牌元数据帐户发送资金来解决 Solana 钱包问题

在 C# 中实现 TCP/IP JSONRPC 连接 - 需要设计建议

Solana,如何使用 javascript/wallets 将 NFT(spl 代币)发送到另一个钱包

如何通过“@solana/web3.js”和“@solana/spl-token”调用 nft 程序?