Skip to main content

使用anchor build 依賴衝突

· 3 min read
YanAemons

報錯日志

在使用solana-cli時候,鑑於一些依賴版本限制,會用到cli14.xx(主網版本),而不是16.xx(測試網版本)

例如,在使用solana-cli版本爲1.14.17, anchor版本爲0.26.0的環境中, anchor init創建一個新項目後運行 anchor build會發生以下錯誤:

error: package constant_time_eq v0.3.0 cannot be built because it requires rustc 1.66.0 or newer, while the currently active rustc version is 1.62.0-dev

報錯原因

使用的solana-cli版本在14.xxx, cli內自帶的rustc版本過老,無法編譯較新的依賴

解決方案

1. 升級solana-cli至最新版本

solana-install update

2.指定依賴包版本

需要在Cargo.toml文件下指定以下依賴版本

getrandom = { version = "0.2.9", features = ["custom"] }  
solana-program = "=1.14.17"
winnow="=0.4.1"
toml_datetime="=0.6.1"
blake3 = "=1.3.1"

運行cargo clean後重新運行anchor build即可解決

監聽程序log監聽到兩次

在使用program.addEventListener()有可能聽到兩次相同的事件,其中一次的txSign會是“1111111111111111111111111111111111111111111111111111111111111111”, 這是因爲監聽到了模擬時的交易哈系,我們只需要在監聽到該交易哈系時拋棄即可

program.addEventListener("eventName", (event, slot, signature) => {
if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return

// do ur stuff
})

然而,有時websocket訂閱也會多次返回實際簽名。如果是這種情況,您可以使用一些緩存解決方案。例如,創建一個具有一定長度限制的集合,在此處添加簽名並檢查該集合中是否存在新簽名:

const handledSignatures = new Set<string>()
const maxHandledSignaturesLen = 100

program.addEventListener("eventName", (event, slot, signature) => {
if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return
if (handledSignatures.has(signature)) return

// do ur stuff

handledSignatures.add(signature)
if (handledSignatures.size > maxHandledSignaturesLen) {
handledSignatures.delete(handledSignatures.values().next().value)
}
})