【问题标题】:How to create a paywall using the Etherscan API in JavaScript?如何在 JavaScript 中使用 Etherscan API 创建付费墙?
【发布时间】:2018-07-31 00:08:12
【问题描述】:

我正在尝试制作一个简单的付费墙,它使用 Etherscan API 从一个地址(当前设置到我在 rinkby 测试网络上的钱包中)检索交易并收集所有“发件人”地址(所有发送过的人的地址以非常基本的方式向地址汇款)。

我设法创建了一个包含所有发件人的字符串。下一部分我需要对照网页上输入的地址检查此地址列表 - 如果输入的地址与发件人地址字符串var x 上的地址匹配 - 取消支付墙。

这就是我卡住的地方。

输入框的输入和x变量都是stings,如控制台所示。但是我无法获得与 x 匹配的输入值。

我尝试匹配并使用indexOf,如果您手动输入地址作为代码的一部分(显示在代码中),这将起作用,但它不适用于输入框中的值。我用indexOf 尝试了类似的事情,同样的问题。

如果我可以让它工作,我遇到的另一个问题是我只需要一个完整地址的完全匹配,因为使用我尝试过的方法仍然可以在 x 中找到部分匹配。

我基本上需要发件人地址作为密码/密钥来访问付费墙后面的任何内容。

我相信有很多更好的方法可以做到这一点,如果可以,请提供帮助。

<?php 
$url = "http://api-rinkeby.etherscan.io/api?module=account&action=txlist&address=0x445b5f277D463122a2Aaeac8B77d8f60865156Dc&startblock=0&endblock=99999999&sort=asc&apikey=YourApiKeyToken";
$fgc = json_decode(file_get_contents($url), true);
$fgc2 = $fgc["result"];

?>
<html>
all senders
<div id="demo"> </div>
matched in all senders list
<div id="demo2"></div>

<input type="text" id="ethadd" onChange="ethConvert()"; onKeyUp="ethConvert()"; value="enter address";  > enter address to check if payment has been sent

<script>
var myObj, i, x = "", lenght, allSenders; 
var amount = document.getElementById("ethadd").value
var amount2 = toString(amount);

myObj = <?php echo json_encode($fgc2);?>;

for (i in myObj) {
    x += myObj[i].from + "<br>" ;
}

//both iput from the iput box and the x variable are stings however I cant get an input value to be matched to x
console.log(typeof x);
console.log(typeof amount);

var n = x.indexOf(amount);

//tried using this to match an address put in the input box to part of the string - it works if you have enter the address
//manually like this but wont work with a value fromt the input box tried a similar thing with indexOf, same problem - wont work with
//anything from the input box 
var string = x;
var expr = /0x445b5f277d463122a2aaeac8b77d8f60865156dc/

document.getElementById("demo2").innerHTML = string.match(expr);

document.getElementById("demo").innerHTML = x;

</script>
</html>

【问题讨论】:

  • 实际上让 indexOf 与 function ethConvert() { n = x.indexOf(document.getElementById("ethadd").value) document.getElementById("demo3").innerHTML = n; } 还有其他问题。
  • 看看$fgc的结构会很有帮助。 ethConvert 在哪里定义?
  • 这里是 $fgc:api-rinkeby.etherscan.io/… 我需要的位是“结果”中的一个数组,然后是数组的每个索引中的“发件人”地址。我已经设法解决了我在使用 indexOf 和 match 时遇到的问题,现在的问题是确保只能从输入到输入框中的数据中进行完整地址的完全匹配。如何将 indexOf 和 match 限制为仅查找完整地址匹配项?

标签: javascript php string blockchain ethereum


【解决方案1】:

您的某些标记有误,这可能会导致一些问题。我在任何地方都没有看到 ethConvert 定义,因此这可能是您在更改/键位事件上看不到所需行为的另一个原因。这是一个精简且未经测试的示例,其中包含收集移动到 PHP 而不是 JS 的“发件人”地址的逻辑。

应该注意,这并不安全,所以不要依赖它来处理任何重要的事情。

<?php 
    $apiKey       = '';
    $url          = "http://api-rinkeby.etherscan.io/api?module=account&action=txlist&address=0x445b5f277D463122a2Aaeac8B77d8f60865156Dc&startblock=0&endblock=99999999&sort=asc&apikey={$apiKey}";
    $transactions = json_decode(file_get_contents($url), true);
    $addresses    = [];

    if (isset($transactions['result'])) {
        foreach ($transactions['result'] as $transaction) {
            $addresses[] = $transaction['from'];
        }
        // in php5.5+, this foreach could be replaced with
        // $addresses = array_column($transactions['result'], 'from');
    }
?>
<html>
    enter address to check if payment has been sent

    <input type="text" id="eth_address" onchange="checkAddress()" value="enter address" />
    <!-- you had some markup mistakes on this input, specifically the ; chars -->

    <script>
        var addresses = <?php echo json_encode($addresses); ?>;

        function isValid() {
            return addresses.indexOf(document.getElementById('eth_address').value) > -1;
        }

        function checkAddress() {
            if (isValid()) {
                alert('lift paywall');
            }
        }
    </script>
</html>

【讨论】:

  • 谢谢,感谢您的帮助。我在发布后稍微更新了代码,这就是您看不到它的原因,对造成的混乱表示歉意。我会试试你的建议,看起来更整洁。我知道这不安全——问题在于区块链上的所有数据无论如何都是公开的,所以老实说,如果人们不顾一切不付钱,他们可以在 etherscan 上扫描交易,然后从那里复制并粘贴地址,所以我看不出让它安全的意义,更多的付出你想要的东西捐赠的东西无论如何都是免费的,你怎么看?
  • 再次感谢,效果很好,比我想出的要好很多哈哈
  • 是的,安全方面的好点,很高兴它被考虑了!很高兴我能帮助你。顺便说一句,它并没有更好,它几乎正是你想出的,只是做了一些细微的调整。祝项目好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2019-10-17
  • 2021-07-03
  • 1970-01-01
  • 2017-08-13
  • 2018-12-17
  • 1970-01-01
相关资源
最近更新 更多