# Mina--发送交易

By [chezhe](https://paragraph.com/@v2y3x4) · 2021-11-12

---

通过 Mina 发送交易
============

在本节中，我们将简要介绍如何用 Mina 客户端发送交易，以及如何开始与区块链进行互动。

使用离线签名交易
========

如果你想在不自己运行节点的情况下发送交易，而是委托别人运行节点，请继续关注这里。如果你想直接用运行中的节点发送事务，请跳到[使用连接的节点](https://docs.minaprotocol.com/en/using-mina/send-payment#using-a-connected-node)。

### 使用 Ledger

如果你的私钥在 Ledger 设备上，要想在离线状态下生成签名交易，请看 Ledger 离线模式。

### 使用用生成密钥对工具生成的密钥对

一个更好的工具即将到来：[https://github.com/MinaProtocol/mina/issues/8928](https://github.com/MinaProtocol/mina/issues/8928)。现在，请使用在该问题的评论中提供的[解决方法](https://github.com/MinaProtocol/mina/issues/8928#issuecomment-857095846)。

### 使用用离线客户端 SDK 生成的密钥对

要使用客户端 SDK 生成一个签名的交易，按照[客户端 SDK README](https://github.com/MinaProtocol/mina/tree/develop/frontend/client_sdk)页面上的显示，记录创建的签名付款。

### 发送交易

你可以使用一个托管服务来广播你的签名交易。发送你的签名交易并不会泄露你的私钥。

用客户端 SDK 签名的交易： [https://minaexplorer.com/broadcast-tx](https://minaexplorer.com/broadcast-tx)

使用 Ledger 签署的交易： [https://minaexplorer.com/broadcast-ledger](https://minaexplorer.com/broadcast-ledger)

### 使用一个连接的节点

在剩下的部分，我们假设你的系统已经安装了 Mina 客户端，如果你没有安装 Mina，请看[入门指南](https://mirror.xyz/0x3445a4f377Ff5Be3D22F990490236BA20fbFDF71/mPD_a03YQpl6LbpNYTolvkvTdfgjHSrW-I0bwU7Gyqs)。

### 导入账户

一旦我们的节点同步，我们将需要导入我们的公钥/私钥对，以便我们可以签署交易并生成一个地址来接收付款。为了安全起见，我们要把钥匙放在一个攻击者更难访问的目录下。

运行下面的命令来导入你以前生成的密钥对文件：

    mina accounts import --privkey-path ~/keys/my-wallet
    

你会被提示输入创建账户时的密码。

> 警告：公钥可以与任何人自由分享，但对你的私钥文件要非常小心。千万不要与任何人分享这个私钥，因为它相当于你资金的密码。

这个命令的响应将看起来像这样：

    😄 Imported account!
    Public key: B62qjaA4N9843FKM5FZk1HmeuDiojG42cbCDyZeUDQVjycULte9PFkC
    

此外，你可以使用 `mina accounts create` 命令来生成新的账户来发送和接收交易。

由于公钥相当长，难以记忆，让我们把它保存为环境变量。使用下面的命令，但将 `<YOUR-PUBLIC-KEY>` 替换为前面命令输出的公钥。

    export MINA_PUBLIC_KEY=<YOUR-PUBLIC-KEY>
    

现在我们可以以 `$MINA_PUBLIC_KEY` 的身份到处访问它 -- 通过尝试 `echo $MINA_PUBLIC_KEY` 来检查它是否正确保存。

注意，这些环境变量只为当前的shell会话保存，所以如果你想保存它们以便将来使用，你可以把它们添加到 `~/.profile` 或 `~/.bash_profile`。

> 注意： 如果你在云虚拟机上运行节点，确保导出并保存密钥文件。你可以用以下方法导出密钥：
> 
>     mina accounts export --public-key <PUBLIC-KEY> --privkey-path <EXPORT-PATH>
>     
> 
> 然后保存在本地，可以使用 [scp](https://linux.die.net/man/1/scp):
> 
>     scp <EXPORT-PATH> <LOCAL-DESTINATION>
>     
> 
> 之后，当启动一个新的虚拟机时，你可以上船私钥和引用：
> 
>     mina accounts import --privkey-path <PRIVATE-KEY-FILE>
>     

如果你忘记了你已经创建了哪些密钥对，你可以通过以下方式看到它们：

### Check account balance

我们可以用这个命令检查我们所有账户的余额：

你可能会看到余额`Balance: 0 mina` ，根据网络中的流量，可能需要几个区块才能通过你的交易。

### 支付

最后，我们进入正题--发送我们的第一笔交易! 在你发送付款之前，你需要解锁你的账户：

    mina accounts unlock --public-key $MINA_PUBLIC_KEY
    

为了测试的目的，我们将指定你的公钥作为接收方和发送方。这只是意味着我们在向自己发送一个交易，你可以通过发出以下命令看到你的公钥。

    echo $MINA_PUBLIC_KEY
    

> 警告：如果接收账户没有收到任何交易，将有一个额外的账户创建费 1 MINA，将从交易金额中扣除。

让我们把一些 MINA 寄给自己，看看付款是什么样子。

    mina client send-payment \
      --amount 1.5 \
      --receiver $MINA_PUBLIC_KEY \
      --fee 0.1 \
      --sender $MINA_PUBLIC_KEY
    

如果你想知道我们在上面的命令中传递了什么。

*   `amount`是将发送一个1.5米纳的测试值，这足以支付账户创建费。
    
*   `receiver` 是接收交易的账户的公钥，如 `B62qjaA4N9843FKM5FZk...`
    
*   `fee`，用 0.1 MINA 吧
    
*   `sender` 是发送交易的地址，如 `B62qjaA4N9843FKM5FZk...`
    

如果这个命令的格式正确，我们应该得到一个看起来像下面的响应。

    Dispatched payment with ID 3XCgvAHLAqz9VVbU7an7f2L5ffJtZoFega7jZpVJrPCYA4j5HEmUAx51BCeMc232eBWVz6q9t62Kp2cNvQZoNCSGqJ1rrJpXFqMN6NQe7x987sAC2Sd6wu9Vbs9xSr8g1AkjJoB65v3suPsaCcvvCjyUvUs8c3eVRucH4doa2onGj41pjxT53y5ZkmGaPmPnpWzdJt4YJBnDRW1GcJeyqj61GKWcvvrV6KcGD25VEeHQBfhGppZc7ewVwi3vcUQR7QFFs15bMwA4oZDEfzSbnr1ECoiZGy61m5LX7afwFaviyUwjphtrzoPbQ2QAZ2w2ypnVUrcJ9oUT4y4dvDJ5vkUDazRdGxjAA6Cz86bJqqgfMHdMFqpkmLxCdLbj2Nq3Ar2VpPVvfn2kdKoxwmAGqWCiVhqYbTvHkyZSc4n3siGTEpTGAK9usPnBnqLi53Z2bPPaJ3PuZTMgmdZYrRv4UPxztRtmyBz2HdQSnH8vbxurLkyxK6yEwS23JSZWToccM83sx2hAAABNynBVuxagL8aNZF99k3LKX6E581uSVSw5DAJ2S198DvZHXD53QvjcDGpvB9jYUpofkk1aPvtW7QZkcofBYruePM7kCHjKvbDXSw2CV5brHVv5ZBV9DuUcuFHfcYAA2TVuDtFeNLBjxDumiBASgaLvcdzGiFvSqqnzmS9MBXxYybQcmmz1WuKZHjgqph99XVEapwTsYfZGi1T8ApahcWc5EX9
    Receipt chain hash is now A3gpLyBJGvcpMXny2DsHjvE5GaNFn2bbpLLQqTCHuY3Nd7sqy8vDbM6qHTwHt8tcfqqBkd36LuV4CC6hVH6YsmRqRp4Lzx77WnN9gnRX7ceeXdCQUVB7B2uMo3oCYxfdpU5Q2f2KzJQ46
    

在账户的第一笔交易中，你可能看不到 `Receipt chain hash`，但在随后的交易中，这将向你显示收据链哈希值列表的头部。

### 质押和 Snarking

一旦你对创建地址、发送和接收米娜的基础知识感到满意，我们就可以进入 Mina 网络真正独特的部分，如[参与共识和帮助压缩区块链](https://docs.minaprotocol.com/en/using-mina/staking)。

高级
--

### 批量发送交易

有时你可能希望发送许多交易：例如，如果你正在运行一个赌注池，则向委托你的人支付奖励。

这里的所有信息都与1.2.0版本有关（目前处于测试阶段）：

### 速率限制

目前，网络上的节点会限制从一个给定的节点接收信息的速率。从1.2.0版本开始，你的节点在发送交易时也将遵循这一速率限制。具体来说，目前的限制是每15秒10个交易，在5分钟的窗口内计算。如果你试图以超过这个速度发送交易，你的节点将排队，并在计算速率限制的窗口中的旧交易过期时刷新它们。你不需要自己控制这些交易的发送。

注意，旧版本的mina守护进程不执行这种速率限制；如果你运行的是旧版本，你应该手动限制交易的数量。由于重新广播交易的开销，如果你需要手动限制速率，我们不建议每5分钟发送超过50个交易。

### 我的节点在我完成发送交易之前就崩溃了或断开了连接

Mina守护进程目前没有持久化交易池。这意味着，如果你的节点在这个过程中崩溃了，你的节点将不知道你迄今为止发送的任何交易。从1.2.0版本开始，你可以重新发送所有的交易（和以前的方式完全一样），它们将在网络上被重新广播。

如果你认为你暂时与网络断开了连接，但你的节点仍然在线（即八卦网络可能错过了你的一个或多个交易），从1.2.0版本开始，你可以在本地重新发送任何交易，即使你的节点认为它们已经被共享，它们也会被重新广播到网络上。

### 取消一项交易并设置新的费用

要取消一个交易，你需要在你的本地交易 mempool 中拥有所有之前还没有提交到链上的交易。这意味着如果你的节点崩溃了（见上文），你将需要重新发送那些早期的交易。最后，要取消一个交易，你所需要做的就是发送一个与你想取消的交易相同的 nonce，并收取更大的费用。没有最小增量，只是需要稍微大一点（并且大到足以让区块生产者选择你的交易）。

原文：

[https://docs.minaprotocol.com/en/using-mina/send-payment](https://docs.minaprotocol.com/en/using-mina/send-payment)

---

*Originally published on [chezhe](https://paragraph.com/@v2y3x4/mina-4)*
