Sui.

Bài viết

Chia sẻ kiến thức của bạn.

Tiền thưởng+15

Xavier.eth.
Jun 27, 2025
Hỏi đáp Chuyên Gia

Giao dịch Sui thất bại: Đối tượng được dành riêng cho giao dịch khác

Tôi gặp phải một sự kiên trì JsonRpcErrorkhi cố gắng thực hiện giao dịch trên Sui. Lỗi chỉ ra rằng các đối tượng được dành riêng cho một giao dịch khác, mặc dù tôi đã thực hiện xử lý giao dịch tuần tự với độ trễ.

JsonRpcError: Failed to sign transaction by a quorum of validators because one or more of its objects is reserved for another transaction. Other transactions locking these objects:
- AV7coSQHWg5vN3S47xada6UiZGW54xxUNhRv1QUPqWK (stake 33.83)
    - 0x1c20f15cbe780ee7586a2df90c1ab70861ca77a15970bea8702a8cf97bd3eed9
    - 0x1c20f15cbe780ee7586a2df90c1ab70861ca77a15970bea8702a8cf97bd3eed9
    - 0x1c20f15cbe780ee7586a2df90c1ab70861ca77a15970bea8702a8cf97bd3eed9

Tôi đã thử:

  • Thực hiện giao dịch tuần tự (chờ giao dịch trước hoàn thành)
  • Thêm độ trễ 3 giây giữa các giao dịch

Và vẫn gặp phải lỗi tương tự một cách nhất quán.

Sử dụng Sui RPC để gửi giao dịch. Cùng một ID đối tượng xuất hiện nhiều lần trong danh sách khóa. Lỗi xảy ra ngay cả với trình tự giao dịch cẩn thận.

  1. Điều gì khiến các đối tượng bị “dành riêng” cho các giao dịch khác?
  2. Làm thế nào tôi có thể kiểm tra chính xác xem một đối tượng có sẵn hay không trước khi sử dụng nó trong một giao dịch?
  3. Có những phương pháp hay nhất để xử lý khóa đối tượng ở Sui không?
  4. Điều này có liên quan đến thời điểm cuối cùng của giao dịch không?

Có ai gặp phải vấn đề này trước đây không? Bất kỳ thông tin chi tiết nào về quản lý đối tượng phù hợp trong giao dịch Sui sẽ được đánh giá cao!

  • Sui
  • Transaction Processing
  • Move
4
8
Chia sẻ
Bình luận
.

Câu trả lời

8
Owen.
Owen4622
Jun 30 2025, 11:03

Sui sử dụng**kiểm soát đồng thời lạc quan, nghĩa là các đối tượng bị khóa khi được sử dụng trong giao dịch cho đến khi giao dịch đó được hoàn tất hoặc hết hạn.

Ngay cả khi bạn đợi 3 giây giữa các giao dịch, nếu giao dịch trước đó chưa được hoàn tất, đối tượng vẫn bị khóa. Điều này có nghĩa là giao dịch vẫn đang chờ xử lý và giữ quyền truy cập độc quyền vào đối tượng.


Cách kiểm tra xem một đối tượng có sẵn không

Sử dụng phương pháp Sui RPC:

sui_getObject

Kiểm tra phản hồi cho "status": "Locked"hoặc"owner": "locked".

Yêu cầu ví dụ:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "sui_getObject",
  "params": ["0x...object_id..."]
}

Nếu bị khóa, chỉ cần đợi thêm và thử lại sau.

5
Bình luận
.
0xduckmove.
Jun 30 2025, 07:04

Này, bạn đang cố gắng thực hiện một giao dịch quá nhanh và các đối tượng bị khóa.

Cố gắng gửi một giao dịch với cùng một đối tượng tại một thời điểm, nếu bạn gửi hai giao dịch, một số trình xác thực có thể chấp nhận giao dịch đầu tiên, một số có thể chấp nhận giao dịch thứ hai và đối tượng của bạn sẽ bị khóa vì mỗi giao dịch cần 66,7% trình xác thực và bạn có thể chỉ nhận được 50%.

=> chỉ cần chờ thiết lập lại kỷ nguyên, nó sẽ sớm

Kiểm tra thêm: https://forums.sui.io/t/beginner-tutorial-error-when-deploying-simple-sui-package/44842

4
Bình luận
.
MiniBob.
Jun 30 2025, 11:50

Lỗi có nghĩa là các đối tượng giao dịch của bạn sử dụng vẫn bị khóa bởi các giao dịch trước đó chưa hoàn tất. Ngay cả với sự chậm trễ, các đối tượng vẫn được bảo lưu cho đến khi các giao dịch đó hoàn thành trên chuỗi.

Để sửa chữa:

  1. Luôn xác nhận các giao dịch trước đó liên quan đến các đối tượng đã hoàn tất đầy đủ trước khi sử dụng lại chúng.
  2. Kiểm tra trạng thái đối tượng thông qua Sui RPC để đảm bảo chúng đã được mở khóa.
  3. Tránh gửi các giao dịch song song hoặc nhanh chóng trên cùng một đối tượng.
  4. Thực hiện các lần thử lại với kiểm tra lùi và kiểm tra tính cuối cùng thay vì độ trễ cố định.

Việc khóa này ngăn chặn các cập nhật mâu thuẫn và là bình thường trong mô hình đối tượng của Sui. JsonRpcErrorTrình tự thích hợp và xác nhận tính cuối cùng là chìa khóa để tránh.

4
Bình luận
.
harry phan.
Jun 30 2025, 15:00

Lỗi này xảy ra nếu bạn thử và chạy hai giao dịch cùng một lúc (ví dụ: bắt đầu một giao dịch trước khi giao dịch trước kết thúc). Nếu bạn thử lại chạy giao dịch xuất bản mà không chạy giao dịch khác trước hoặc cùng một lúc, giao dịch sẽ thành công. Bạn cũng có thể cần phải lấy thêm khí từ vòi (hoặc đợi một ngày - để kỷ nguyên lật lại - để các vật thể được mở khóa)

Khi bạn chạy một giao dịch liên quan đến các đối tượng mà địa chỉ của bạn sở hữu (như các đối tượng gas), các trình xác thực sẽ giữ lại phiên bản mới nhất của đối tượng được sử dụng bởi giao dịch mà nó đang ký. Nếu bạn thử và chạy hai giao dịch đồng thời và chúng đề cập đến cùng một đối tượng, thì chúng sẽ cạnh tranh với nhau để lấy chữ ký từ trình xác thực. Trong trường hợp hạnh phúc, một trong các giao dịch thắng và chạy, và giao dịch kia không nhận được đủ chữ ký. Trong trường hợp không hài lòng, cả hai giao dịch có thể không nhận đủ chữ ký (nếu cả hai đều nhận được hơn một phần ba chữ ký của trình xác thực, thì cả hai giao dịch đều không thể nhận được hơn hai phần ba, đó là ngưỡng), điều này được gọi là không xác định và từ thời điểm đó các đối tượng là đầu vào cho cả hai giao dịch không thể được sử dụng cho bất kỳ giao dịch nào khác.

Vào cuối kỷ nguyên (chúng kéo dài khoảng một ngày - bạn có thể kiểm tra tiến trình sang thay đổi kỷ nguyên tiếp theo trên https://suiexplorer.com), tất cả các khóa được giải phóng, vì vậy bạn có thể sử dụng lại các đối tượng, nhưng nếu bạn không có thay đổi kỷ nguyên kể từ lần cuối bạn thử, bạn sẽ cần phải thu được nhiều khí hơn.

3
Bình luận
.
24p30p.
24p30p2032
Jul 9 2025, 04:14

Trên mạng Sui, khi một giao dịch cố gắng truy cập một đối tượng đã tham gia vào một giao dịch đang tiến hành khác, mạng sẽ trả về lỗi đặt chỗ. Đây là hệ quả trực tiếp của mô hình thực thi lấy đối tượng làm trung tâm của Sui. Bất kỳ giao dịch nào làm biến đổi hoặc tiêu thụ một đối tượng phải có khóa độc quyền trên đó. Một khi giao dịch như vậy được gửi, đối tượng vẫn được bảo lưu cho đến khi giao dịch đạt đến tính cuối cùng. Sự bảo lưu đó ngăn các giao dịch khác tương tác sớm với cùng một đối tượng, do đó đảm bảo tính nguyên tử và tránh các điều kiện chủng tộc. Tuy nhiên, nếu tính cuối cùng bị trì hoãn do độ trễ mạng, độ trễ của trình xác thực hoặc hành vi thực thi bất ngờ, đối tượng có thể bị khóa lâu hơn dự kiến.

Để xác định xem một đối tượng có ở trạng thái có thể sử dụng hay không, bạn có thể sử dụng sui_getObjectphương pháp thông qua giao diện JSON-RPC của Sui hoặc Sui CLI. Kiểm tra trường chủ sở hữu của đối tượng hoặc siêu dữ liệu khóa giao dịch có thể cung cấp sự rõ ràng về trạng thái của đối tượng. Nếu đối tượng dường như đang được sử dụng hoặc không trả lại quyền sở hữu cho địa chỉ mong đợi, nó có thể vẫn được bảo lưu. Một cách tiếp cận mạnh mẽ hơn bao gồm việc thăm dò ý kiến lập trình mạng cho đến khi khóa của đối tượng được giải phóng - đặc biệt hữu ích trong các luồng tự động hoặc khi sắp xếp nhiều giao dịch tuần tự.

Xử lý các khóa này một cách hiệu quả đòi hỏi một vài thực hành chính. Điều quan trọng là tránh tái sử dụng các đối tượng có thể thay đổi trên các giao dịch cho đến khi các hoạt động trước đó liên quan đến chúng được hoàn thành hoàn toàn. Bạn nên cân nhắc sử dụng các đồng xu khí và vật thể riêng biệt hoặc xoay bất cứ khi nào có thể để giảm bớt sự tranh cãi. Ngoài ra, kết hợp logic thử lại và cơ chế bỏ phiếu thông minh — chẳng hạn như phản hồi theo cấp số nhân — có thể giảm thiểu tỷ lệ thất bại giao dịch. Khi các giao dịch được sắp xếp song song, việc cô lập việc sử dụng đối tượng trên mỗi quy trình hoặc luồng sẽ cải thiện đáng kể độ tin cậy.

Điều quan trọng cần lưu ý là hành vi này gắn liền với tính cuối cùng của giao dịch. Ngay cả khi một giao dịch được chấp nhận vào mempool và được phát sóng, các khóa đối tượng liên kết vẫn giữ nguyên vị trí cho đến khi đại số xác thực của mạng xác nhận trạng thái cuối cùng của giao dịch. Bất kỳ nỗ lực nào để sử dụng lại đối tượng đó trước đó, bất kể việc sử dụng độ trễ tùy ý dựa trên thời gian, có thể sẽ dẫn đến lỗi đặt chỗ.

Để hợp lý hóa việc xử lý khóa đối tượng, đây là tiện ích Bash bạn có thể sử dụng trong quy trình phát triển của mình. Nó thăm dò fullnode và chờ các đối tượng được mở khóa trước khi tiến hành giao dịch. Điều này đảm bảo rằng đối tượng an toàn để tái sử dụng và giảm thiểu sự cố sớm.

Tập lệnh Bash: wait-for-unlock.sh

#!/bin/bash

# Sui Fullnode RPC endpoint (adjust as needed)
RPC_ENDPOINT="https://fullnode.testnet.sui.io:443"

# Checks if object is locked
is_locked() {
    obj_id=$1
    lock_info=$(curl -s -X POST $RPC_ENDPOINT \
        -H "Content-Type: application/json" \
        -d '{
            "jsonrpc": "2.0",
            "method": "sui_getObject",
            "params": ["'"$obj_id"'"],
            "id": 1
        }')
    
    echo "$lock_info" | grep -q '"owner":{"AddressOwner"' && return 1 || return 0
}

# Waits until each object is no longer locked
wait_for_unlock() {
    for obj_id in "$@"; do
        echo "Checking object $obj_id..."
        while is_locked $obj_id; do
            echo "Object $obj_id is still locked. Retrying in 2s..."
            sleep 2
        done
        echo "Object $obj_id is now unlocked."
    done
}

# Main handler
main() {
    if [ $# -eq 0 ]; then
        echo "Usage: $0 <object_id_1> <object_id_2> ..."
        exit 1
    fi

    wait_for_unlock "$@"
    echo "All objects unlocked. Safe to proceed with transaction."
}

main "$@"

Để sử dụng tập lệnh, chỉ cần làm cho nó thực thi và cung cấp ID đối tượng bạn muốn theo dõi. Nó sẽ thăm dò cho đến khi các đối tượng đó không còn được bảo lưu bởi các giao dịch đang chờ xử lý, đảm bảo giao dịch tiếp theo của bạn diễn ra suôn sẻ.

chmod +x wait-for-unlock.sh
./wait-for-unlock.sh 0xYOUR_OBJECT_ID

Loại tự động hóa này đặc biệt hiệu quả khi được tích hợp vào các tập lệnh triển khai hoặc đường ống CI/CD, cung cấp một lớp khả năng phục hồi trong các ứng dụng thông lượng cao hoặc nhiều người dùng.

1
Bình luận
.
casey.
Aug 14 2025, 03:01

Bạn chỉ đơn giản là lỗi của anh ấy do thực tế là bạn đang cố gắng chạy nhiều giao dịch cùng một lúc, có thể đang cố gắng gửi các giao dịch đi kèm.

1.** Điều gì khiến các đối tượng bị “dành riêng” cho các giao dịch khác?**

Trả lời: Lỗi đó có nghĩa là giao dịch của bạn đã cố gắng sử dụng một đối tượng (token, NFT, v.v.), trong trường hợp này, gas coin (tx.gas) của bạn đã bị “khóa” bởi một giao dịch trên chuyến bay khác trên mạng Sui. Các đối tượng Sui được sử dụng một lần cho mỗi giao dịch và cho đến khi giao dịch khóa chúng được xác nhận hoặc hết hạn, bạn không thể sử dụng lại chúng ngay lập tức (tức là khi bạn gửi giao dịch gần đây, mạng có thể vẫn đang xử lý giao dịch, vì vậy đồng tiền sẽ tạm thời được bảo lưu cho đến khi giao dịch được thực hiện hoàn toàn).

2.** Làm thế nào tôi có thể kiểm tra chính xác xem một đối tượng có sẵn hay không trước khi sử dụng nó trong giao dịch?**

Trả lời: bạn đợi giao dịch đầu tiên của mình được hoàn thành hoặc thất bại, điều này có nghĩa là đồng xu gas (tx.gas) do mạng dự trữ tạm thời đã được phát hành khi giao dịch hoàn thành hoặc khi nó thất bại. Bạn có thể kiểm tra trạng thái giao dịch bằng cách sử dụng:

bash

sui client tx-status <digest>

3.** Có phương pháp hay nhất để xử lý khóa đối tượng ở Sui không?**

Trả lời: có, Đợi giao dịch trước đó kết thúc hoặc thất bại (có thể mất đến 20 giây trên testnet) trước khi thực hiện giao dịch mới và bạn luôn có thể xác nhận rằng giao dịch của bạn đã hoàn thành trước khi thực hiện giao dịch mới. Bạn cũng có thể thử theo SPLIT YOUR SUI INTO MULTIPLE GAS COINScách này, ngay cả khi một đồng tiền bị khóa, bạn có thể sử dụng đồng tiền khác ngay lập tức bằng cách sử dụng

js


const tx = new Transaction();
const [newGas] = tx.splitCoins(tx.gas, [tx.pure.u64(1_000_000_000n)]); // 1 SUI
tx.transferObjects([newGas], tx.pure.address(ownAddress));

Chạy nó một lần và bạn sẽ có nhiều đồng xu gas nhỏ trong tài khoản của mình.

4.** Điều này có liên quan đến thời điểm cuối cùng của giao dịch không?**

Trả lời: Có, điều này liên quan đến tính cuối cùng của giao dịch, tôi đoán độ trễ 3 giây được thêm vào giữa các giao dịch là không đủ để giao dịch được hoàn thành hoàn toàn, bạn luôn có thể kiểm tra trạng thái giao dịch của mình bằng cách sử dụng sui client tx-status <digest>

1
Bình luận
.
d-podium.
Aug 15 2025, 00:03

Lỗi bạn gặp phải xảy ra do cơ chế khóa giao dịch của Sui, ngăn chặn chi tiêu gấp đôi và đảm bảo hoạt động nguyên tử. Hãy để tôi giải thích chính xác những gì đang xảy ra và làm thế nào để khắc phục nó.

Hiểu về khóa giao dịch trong Sui Khi một giao dịch được gửi đến mạng Sui, người xác thực sẽ khóa các đối tượng thuộc sở hữu được tham chiếu để ngăn chặn các sửa đổi đồng thời. Cơ chế khóa này là cơ bản để ngăn chặn chi tiêu gấp đôi và đảm bảo tính nguyên tử của giao dịch.

Tại sao các giải pháp hiện tại không hoạt động Cách tiếp cận hiện tại của bạn để thêm độ trễ 3 giây giữa các giao dịch không hiệu quả vì:

  1. Tính cuối cùng của giao dịch có thể mất hơn 3 giây.
  2. Nhiều giao dịch có thể cạnh tranh cho cùng một đối tượng.
  3. Mạng không đảm bảo tính khả dụng của đối tượng ngay lập tức sau khi hoàn thành giao dịch.

Giải pháp từng đầu

  1. Thực hiện kiểm tra trạng thái giao dịch thích hợp;
async function waitForTransaction(txDigest) {
    const MAX_RETRIES = 30;
    const RETRY_DELAY_MS = 1000;
    
    for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
        try {
            const result = await suiClient.transactionBlock({
                digest: txDigest,
                options: { showEffects: true }
            });
            
            if (result.status === 'SUCCESS') {
                return result;
            }
            
            if (attempt === MAX_RETRIES - 1) {
                throw new Error(`Transaction ${txDigest} failed`);
            }
        } catch (error) {
            if (error.message.includes('not found')) {
                await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS));
                continue;
            }
            throw error;
        }
    }
}
  1. Kiểm tra tính khả dụng khách quan trước khi giao dịch;

async function checkObjectAvailability(objectId) {
    try {
        const result = await suiClient.objects({
            ids: [objectId],
            options: { showPreviousVersion: true }
        });
        
        // Object is available if we can fetch it successfully
        return result.details.length > 0;
    } catch (error) {
        return false;
    }
}
  1. Thực hiện thử lại giao dịch với Backoff;

async function executeTransactionWithRetry(txBuilder, signer) {
    const MAX_RETRIES = 5;
    const INITIAL_BACKOFF_MS = 500;
    
    for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
        try {
            const tx = await txBuilder.sign();
            const result = await suiClient.submitTransaction(tx);
            
            // Wait for transaction completion
            await waitForTransaction(result.digest);
            return result;
        } catch (error) {
            if (attempt === MAX_RETRIES - 1) {
                throw error;
            }
            
            const backoffMs = INITIAL_BACKOFF_MS * Math.pow(2, attempt);
            console.log(`Attempt ${attempt + 1} failed, retrying in ${backoffMs}ms`);
            await new Promise(resolve => setTimeout(resolve, backoffMs));
        }
    }
}

Các phương pháp hay nhất để quản lý đối tượng

1.** Luôn xác minh trạng thái giao dịch**

  • Chờ chứng chỉ hiệu ứng trước khi xem xét giao dịch hoàn thành

  • Kiểm tra tình trạng giao dịch thường xuyên trong quá trình xử lý

  • Thực hiện xử lý lỗi thích hợp cho các đối tượng bị khóa

2.Kiểm tra tính khả dụng đối tượng

  • Xác minh tính khả dụng của đối tượng trước khi tạo giao dịch

  • Xử lý các trường hợp đồ vật bị khóa trong quá trình chuẩn bị

  • Xem xét triển khai cơ chế đặt trước đối tượng trong hợp đồng thông minh

3.** Trình tự giao dịch**

  • Sử dụng chứng chỉ hiệu ứng làm xác nhận hoàn thành

  • Thực hiện phản hồi theo cấp số nhân cho lần thử lại

  • Duy trì trật tự giao dịch thông qua quản lý phụ thuộc thích hợp

4.** Xử lý lỗi**

  • Phân biệt lỗi khóa tạm thời và lỗi vĩnh viễn

  • Thực hiện logic thử lại thích hợp với backoff

  • Duy trì lịch sử giao dịch cho mục đích gỡ lỗi

Xem xét bổ sung

1.** Kỷ nguyên thay đổi**

  • Giao dịch có thể thất bại trong quá trình chuyển đổi kỷ nguyên

  • Triển khai logic thử lại đặc biệt cho các lỗi liên quan đến thời đại

  • Xem xét thời gian giao dịch liên quan đến ranh giới kỷ nguyên

2.** Tắc nghẽn mạng**

  • Giám sát tải mạng trong thời gian cao điểm

  • Điều chỉnh chiến lược rút lui dựa trên điều kiện mạng

  • Xem xét thực hiện giới hạn tỷ lệ cho các giao dịch tần số cao

Bằng cách triển khai các giải pháp này và làm theo các phương pháp hay nhất được nêu ở trên, bạn sẽ có thể xử lý hiệu quả các tình huống khóa đối tượng và ngăn chặn JSONRPCError mà bạn gặp phải. Hãy nhớ rằng xử lý lỗi thích hợp và cơ chế thử lại là điều cần thiết để xử lý giao dịch đáng tin cậy trên blockchain Sui.

0
Bình luận
.
BigDev.
Aug 15 2025, 16:24

Lỗi này có nghĩa là các đối tượng bạn đang sử dụng vẫn bị khóa bởi các giao dịch trước đó chưa hoàn tất. Ngay cả với sự chậm trễ, Sui vẫn giữ chúng bảo lưu cho đến khi chuỗi xác nhận hoàn thành.

Để khắc phục nó, hãy đảm bảo mọi giao dịch trước đó sử dụng các đối tượng đó được hoàn tất đầy đủ trước khi sử dụng lại chúng. Bạn có thể kiểm tra trạng thái của họ thông qua Sui RPC để xem chúng có được mở khóa hay không. Tránh gửi nhiều giao dịch hoặc nhanh chóng liên quan đến cùng một đối tượng. Thay vì dựa vào độ trễ cố định, hãy sử dụng thử lại với phản hồi và xác nhận tính cuối cùng trước khi thử lại.

Khóa này là một phần của cách Sui đảm bảo cập nhật an toàn, vì vậy việc sắp xếp thứ tự và kiểm tra tính cuối cùng thích hợp là cách để tránh JSONRPCError

0
Bình luận
.

Bạn có biết câu trả lời không?

Hãy đăng nhập và chia sẻ nó.