Apple M1 芯片架构上的 RSK 节点?

bgu*_*uiz 8 apple-silicon apple-m1 rsk

按照这些说明 在配备 Apple M1 Pro 芯片的 2021 MBP 上安装 RSK 节点。我想在本地regtest模式下运行 RSK 节点。安装后,运行命令启动 RSKj:

java \
  -classpath ~/.rsk/rskj-core-3.1.0-IRIS-all.jar \
  -Drpc.providers.web.cors=\* \
  -Drpc.providers.web.ws.enabled=true \
  co.rsk.Start \
  --regtest
Run Code Online (Sandbox Code Playgroud)

...导致以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no leveldbjni in java.library.path, /private/var/folders/40/k7t383452q75nkmr_5kl12_80000gn/T/libleveldbjni-64-8276576211622720497.jnilib: dlopen(/private/var/folders/40/k7t383452q75nkmr_5kl12_80000gn/T/libleveldbjni-64-8276576211622720497.jnilib, 0x0001): tried: '/private/var/folders/40/k7t383452q75nkmr_5kl12_80000gn/T/libleveldbjni-64-8276576211622720497.jnilib' (fat file, but missing compatible architecture (have 'x86_64,i386', need 'arm64e')), '/usr/lib/libleveldbjni-64-8276576211622720497.jnilib' (no such file)]
        at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182)
        at org.fusesource.hawtjni.runtime.Library.load(Library.java:140)
        at org.fusesource.leveldbjni.JniDBFactory.<clinit>(JniDBFactory.java:48)
        at org.ethereum.datasource.LevelDbDataSource.init(LevelDbDataSource.java:104)
        at org.ethereum.datasource.LevelDbDataSource.makeDataSource(LevelDbDataSource.java:70)
        at co.rsk.RskContext.buildTrieStore(RskContext.java:1031)
        at co.rsk.RskContext.buildAbstractTrieStore(RskContext.java:951)
        at co.rsk.RskContext.getTrieStore(RskContext.java:408)
        at co.rsk.RskContext.buildRepositoryLocator(RskContext.java:1073)
        at co.rsk.RskContext.getRepositoryLocator(RskContext.java:384)
        at co.rsk.RskContext.getTransactionPool(RskContext.java:353)
        at co.rsk.RskContext.buildInternalServices(RskContext.java:844)
        at co.rsk.RskContext.buildNodeRunner(RskContext.java:836)
        at co.rsk.RskContext.getNodeRunner(RskContext.java:302)
        at co.rsk.Start.main(Start.java:34)
Run Code Online (Sandbox Code Playgroud)

看起来最可能的问题是 RSKj 中的某些内容与我的芯片架构不兼容。是否存在允许 RSKj 在 M1 芯片上运行的解决方法?

Ale*_*hin 6

你是对的,问题在于leveldbjni依赖关系,它没有在aarch64架构上运行。但是,可以通过在 Docker 容器中运行 RSK 节点来绕过这一限制。RSK 开发门户上的Docker 安装说明详细描述了此过程。

概括:

您可以安装 Docker 运行

brew install --cask docker
Run Code Online (Sandbox Code Playgroud)

注册一个免费的 Docker 帐户,登录到您安装的桌面应用程序,然后在终端中运行

docker run rsksmart/rskj-standalone
Run Code Online (Sandbox Code Playgroud)

然后您应该从工件存储库Dockerfile.RegTest下载并在同一文件夹中执行:supervisord.conf

docker buildx build --platform linux/amd64 -t regtest -f Dockerfile.RegTest .
Run Code Online (Sandbox Code Playgroud)

构建完成后,您就有了一个可以运行 RSK 的容器。要运行容器,您应该执行

docker run -d --name regtest-node-01  -p 4444:4444 -p 30305:30305 regtest
Run Code Online (Sandbox Code Playgroud)

现在,您的本地测试 RSK 节点将准备运行以测试您的智能合约。


Ale*_*kov 5

您可以尝试使用Rosetta在M1上运行x86代码。arch -x86_64只需在命令开头添加即可。

arch -x86_64 java \
  -classpath ~/.rsk/rskj-core-3.1.0-IRIS-all.jar \
  -Drpc.providers.web.cors=\* \
  -Drpc.providers.web.ws.enabled=true \
  co.rsk.Start \
  --regtest
Run Code Online (Sandbox Code Playgroud)