# StarkNet代码交互流程

By [scriptmoney](https://paragraph.com/@scriptmoney) · 2022-08-29

---

一些开发类的StarkNet教程教的是创建新的账户、编写新合约和测试。而本文主要介绍如何导出已有钱包账户，并和已经上线的合约进行交互。

1\. 初始化nile项目
-------------

[nile](https://github.com/OpenZeppelin/nile/) 是 StarkNet 上流行的cli开发工具，能简化流程提高效率。根据[README](https://github.com/OpenZeppelin/cairo-contracts)安装后，确保输入 `nile version` 会显示版本号。

然后新建文件夹，输入`nile init`初始化项目并用`nile compile`编译一下示例合约。

2\. 导出私钥
--------

私钥可以本地生成，也可以从钱包导出，重点介绍钱包导出的私钥如何使用。下图分别是argent和braavo的导出位置。

![01 argent导出](https://storage.googleapis.com/papyrus_images/25dc6f7db194cf25fe99d7beeea39b220625418d07ff26718844cd9ece8bf0e7.png)

01 argent导出

![02 braavos导出](https://storage.googleapis.com/papyrus_images/80c1709e89b6012cd198c65e663f251fa0fdc2933fdac19a235ad43a4e156d32.png)

02 braavos导出

获得私钥后，在nile init生产的项目的根目录创建一个 `.env`文件，设置一个变量放置私钥，比如PK1=1234，这个**PK1**是alias，可以设置简单一些，后面会用到。

![03 env](https://storage.googleapis.com/papyrus_images/689d606a4e919af710b79da28bf861dc94c69e4af1d6a1be825518dd61e1f053.png)

03 env

然后输入`nile setup PK1 --network goerli`，会在测试网部署一个合约账户，同时根目录会出现一个 _goerli.accounts.json_ ，里面包含PK1这个私钥派生出的公钥和地址。这个新生成的合约地址和之前钱包里的不一样，需**手动替换**成网页钱包的地址。同样还需要替换 _goerli.deployments.txt_ 中的账户合约地址。

![04 替换地址](https://storage.googleapis.com/papyrus_images/2dc532f6317902aac6e56e1289b0c9046f3d5527564a8767709c38e961a17048.png)

04 替换地址

3\. 获取目标合约abi
-------------

打开 [voyager](https://goerli.voyager.online/)，搜索目标合约，在_code_标签里找到abi，复制到新文件`artifacts/abis/[alias].json`下。文件名alias可以任意取。

![05 获取abi](https://storage.googleapis.com/papyrus_images/6103983bfe83393c59ca69d255c6f2fb02ded93bcbc431b7f67c33a533cc2e22.png)

05 获取abi

在根目录的 _goerli.deployments.txt_ 下添加 **合约地址:abi路径:别名**，我用的是 [starknet-cairo-101](https://github.com/starknet-edu/starknet-cairo-101) 的第1个练习，别名写的是ex01。所以 _goerli.deployments.txt_ 的新增的内容是：`0x29e2801df18d7333da856467c79aa3eb305724db57f386e3456f85d66cbd58b:artifacts/abis/ex01.json:ex01`

4\. 发送交易
--------

创建一个python脚本，一般放到scripts或tests目录下，编写`def run(nre)`方法通过`nile run`指令去执行测试脚本。

下面示例代码是让PK1这个账户去执行ex01的`claim_points`方法，没有参数。

> 参数通常需要转换，建议先参考[该教程](https://blog.openzeppelin.com/getting-started-with-openzeppelin-contracts-for-cairo/)。

最后 max\_fee 需要用官方cli的`starknet estimate_fee`指令去获取，可以先随意设置，如果debug报错再修改。

    from nile.nre import NileRuntimeEnvironment
    from nile.core.account import Account
    
    def run(nre: NileRuntimeEnvironment):
        account: Account = nre.get_or_deploy_account("PK1")
        result = account.send(         "0x29e2801df18d7333da856467c79aa3eb305724db57f386e3456f85d66cbd58b",  # 目标合约地址
            "claim_points", # 方法
            [],  # 参数
            2278140156336 # max_fee
        )
        print(result)
    

> 如果需要通过发送交易到合约钱包去和其他合约交互，必须使用account.send方法，而不是invoke。

输入`nile run tests/demo.py --network goerli` 会执行上面的脚本，并输出交易的hash和地址

![06 地址和Hash](https://storage.googleapis.com/papyrus_images/781df7bb923d3631f8bb38a5a4b7cf4b4d0ad04b3977251d53451fd835f3c4e7.png)

06 地址和Hash

最后用 `nile debug [TxHash] --network goerli` 去检查交易状态。

![07 交易状态](https://storage.googleapis.com/papyrus_images/c195f0817b082190a250cfffccf7e9c8b73aa6cc0070d2ad95992a2e9fcb317e.png)

07 交易状态

以上就是StarkNet用钱包和合约进行代码交互的流程，有疑问欢迎和我沟通，推特是 @scriptdotmoney

---

*Originally published on [scriptmoney](https://paragraph.com/@scriptmoney/starknet)*
