SteemJs/dSteem 代码测试 | Steem Playground

在浏览器里测试 Steem-Js (版本 ()) 代码和 dSteem (v0.8.6). 您可以通过函数 log() 来把变量输出到本页面的控制台中,或者您可以按F12并使用 console.log()等。代码缩进:Ctrl + [ 或者 ]

URL 参数 s: 代码,比如 ?s=//steemjs%0Alog("Hello,%20SteemJs!")

// 按 Ctrl + Enter 运行JS代码
// 按 Alt + Backspace 清空控制台

log(`使用 Steem 节点 ${steem.api.options.url}`);

steem.api.getAccounts(['justyy', 'ety001'], function(err, result) {
  if (!err) {
   for (let i = 0; i < result.length; ++ i) {
      let reputation = result[i].reputation;
      let formatted_rep = steem.formatter.reputation(reputation);
      log(result[i].name + "'s Reputation is " + formatted_rep);
    }
  } else {
   log("Steem API 错误: ", err);
  }
});

/*
  使用 dSteem 的例子
*/
let username = "test";
let password = "password";
log(dsteem.PrivateKey.fromLogin(username, password, 'owner').createPublic());



// ============================================================================
// Mini SteemJS Test Suite (using real steem object)
// ============================================================================

// steem object must already exist globally
// log() must exist — or define fallback:
if (typeof log === "undefined") {
    global.log = (...args) => console.log(...args);
}

// Promise wrapper for steem.api
function steemCall(method, params) {
    return new Promise((resolve, reject) => {
        steem.api[method](...params, (err, result) => {
            if (err) reject(err);
            else resolve(result);
        });
    });
}

// Promise wrapper for generic RPC calls
function steemRpcCall(method, params) {
    return new Promise((resolve, reject) => {
        steem.api.call(method, params, (err, result) => {
            if (err) reject(err);
            else resolve(result);
        });
    });
}


// Test registry
const tests = [];

function addTest(name, fn) {
    tests.push({ name, fn });
}


// ============================================================================
// 1. Basic positive API tests
// ============================================================================

addTest("steem.api.getAccounts", async () => {
    const accounts = await steemCall("getAccounts", [["justyy"]]);
    if (accounts && accounts[0] && accounts[0].name === "justyy") return;
    throw new Error("Account not returned");
});

addTest("steem.formatter.reputation", async () => {
    const rep = steem.formatter.reputation("352352352352");
    if (typeof rep === "number") return;
    throw new Error("Formatter did not return number");
});

addTest("steem.api.getDynamicGlobalProperties", async () => {
    const props = await steemCall("getDynamicGlobalProperties", []);
    if (props && props.head_block_number) return;
    throw new Error("Missing head_block_number");
});

addTest("steem.api.getChainProperties", async () => {
    await steemCall("getChainProperties", []);
});

addTest("steem.api.getConfig", async () => {
    await steemCall("getConfig", []);
});

addTest("steem.api.getRewardFund", async () => {
    const fund = await steemCall("getRewardFund", ["post"]);
    if (fund && fund.reward_balance) return;
    throw new Error("Reward fund missing");
});

addTest("steem.api.getCurrentMedianHistoryPrice", async () => {
    const price = await steemCall("getCurrentMedianHistoryPrice", []);
    if (price && price.base) return;
    throw new Error("Missing price");
});

addTest("steem.api.getAccountHistory", async () => {
    const hist = await steemCall("getAccountHistory", ["justyy", -1, 1]);
    if (Array.isArray(hist)) return;
    throw new Error("History not an array");
});

addTest("steem.api.getDiscussionsByCreated", async () => {
    const posts = await steemCall("getDiscussionsByCreated", [{ tag: "steem", limit: 1 }]);
    if (Array.isArray(posts)) return;
    throw new Error("Posts not array");
});

addTest("steem.api.getTrendingTags", async () => {
    const tags = await steemCall("getTrendingTags", ["steem", 1]);
    if (Array.isArray(tags)) return;
    throw new Error("Tags not array");
});

addTest("steem.api.getBlock", async () => {
    const data = await steemCall("getBlock", [102496700]);
    if (data.previous === "061bf9bb3389a026b4e07f3b28aaa24d87c639e1") return;
    throw new Error("getBlock return error");
});

steem.api.getDynamicGlobalProperties((err, result) => {
  if (err) {
    console.error(err);
    return;
  }

  const latestBlock = result.head_block_number;
  log('Latest block height:', latestBlock);
  addTest(`steem.api.getBlock (latest block height ${latestBlock})`, async () => {
    const data = await steemCall("getBlock", [latestBlock]);
    log(data);
    if (data.previous && data.witness && data.timestamp && data.witness_signature) return;
    throw new Error(`getBlock (latest block height: ${latestBlock}) return error`);
    })  
});


// ============================================================================
// 2. Negative tests
// ============================================================================

addTest("Negative invalid method name", async () => {
    try {
        await steemRpcCall("NON_EXISTENT_METHOD", {});
    } catch {
        return; // PASS
    }
    throw new Error("Invalid method unexpectedly succeeded");
});

addTest("Negative invalid history range", async () => {
    try {
        await steemCall("getAccountHistory", ["justyy", 999999999, -5]);
    } catch {
        return; // PASS
    }
    throw new Error("Invalid history range unexpectedly succeeded");
});


// ============================================================================
// Test Runner
// ============================================================================

async function runTests() {
    log("开始 SteemJS 测试套件...");

    for (const t of tests) {
        try {
            await t.fn();
            log(`✅测试通过: ${t.name}`);
        } catch (err) {
            log(`❌测试失败: ${t.name} (${err.message || err})`);
        }
    }
    
    log("完成。")
}

runTests();

log(`SteemJs Version: ${steem.version}`);

 

$('#nodes'):

查看其它 Steem 在线工具和API接口 | 投 @justyy 为见证人设置 @justyy 为代理!

URL 参数: ?nocache

@justyy 创建并维护. 版权所有 ©, 2026. English Version: SteemJs Editor