我通过 geth 部署了一个私有网络,并在那里发布了一个智能合约。账户设置在创世区块中
我正在创建一个 python 函数,我想在其中调用智能合约函数
import web3
import json
class Estate():
    with open("abi.txt", 'r') as file:
        abi = json.load(file)
    contract_address = "0x4FD52ce1140d67b8c721AB7967eeca44FE56c883"
    contract_address = web3.Web3.toChecksumAddress(contract_address)
    w3 = web3.Web3(web3.HTTPProvider('http://127.0.0.1:8545'))
    con = w3.eth.contract(address=contract_address, abi=abi)
    def create_estate(self, address, info, square):
        address = web3.Web3.toChecksumAddress(address)
        print(self.con.functions.create_estate(address, info, square).transact())
        #self.w3.eth.waitForTransactionReceipt(tx)
c = Estate()
c.create_estate("0xE64021f5387Dc5FA859e0641437a45542D511e7E","street", 200)
我收到以下错误:
web3.exceptions.ExtraDataLengthError:字段 extraData 是 97 字节,但应该是 32。很可能您连接到了 POA 链。有关更多详细信息,请参阅http://web3py.readthedocs.io/en/stable/middleware.html#geth-style-proof-of-authority 。完整的额外数据为: HexBytes('0xda83010a0d846765746888676f312e31372e328777696e646f7773000000000053ea481c4aca3824d51d3c8103abe60179d3f1c4ec68a0c87d5 533e8e0580e14433b6cf8a285b519add550d59e70e60619721861b2d855cb7a175978610bb65500')
我正在Azure上的虚拟机上部署私有以太坊区块链(geth).在区块链上部署我的Solidity合同并启动我的NodeJS应用程序后,我能够通过nodejs Loopback App的web apis正常添加数据,一切正常,我可以使用GET apis查看添加的数据.
然而,在1-2-3天(随机)后,我无法检索通过我的GET apis添加的数据,而我仍然能够添加新数据,确认Geth正常运行并且没有中断.
我正在运行geth使用:
geth --datadir ./myDataDir --rpc --networkid 1441 console 2>> myEth.log
myEth.log没有显示任何错误,nodejs日志也是干净的.
eth.syncing显示false哪个网络已同步.
myDataDir文件夹的大小仍然在增加,所以逻辑上数据应该在某处,但它没有显示.
我无法获得以太网LES getProofsV2(或getProofs)请求来生成ProofsV2(或Proofs)响应,除了一个空的节点数组外.这适用于针对打开LES连接的GETH节点的请求.
请求参数是[B_32 (blockHash), B_32 (key), B_32 (key2), P (fromLevel)].我blockHash从最近开采的块中提供了一个; a key作为20字节帐户的Keccak256哈希值(来自几个月前的事务),一个key232字节的0和0,fromLevel我期望得到一个Nodes最后一个节点具有RLP编码的数组在AccountState(用{nonce,balance,...}.就是这种期望纠正或将我只期望得到节点的数组,如果?key在有交易的规定blockHash?[事实是,我都尝试- blockHash瓦特/或W/O交易,仍然肿大[].
具体来说,这是请求数据:
ETH: LES-ProofsV2-Req:   L  1: [
ETH: LES-ProofsV2-Req:     L  4: [
ETH: LES-ProofsV2-Req:       I 32: 0x0a89dd55d38929468c1303b92ab43ca57269ac864175fc6208ae739ffcc17c9b
ETH: LES-ProofsV2-Req:       I 32: 0x272cf200ca06815ab2170fde0901e7da10ab1dddc31223184f139def3b09f670
ETH: LES-ProofsV2-Req:       I 32: 0x0000000000000000000000000000000000000000000000000000000000000000
ETH: LES-ProofsV2-Req:       I  0: 0x
ETH: LES-ProofsV2-Req:     ]
ETH: LES-ProofsV2-Req:   ]
其中blockHash 0x0a89...是blockNumber 5732521,key2是帐户的哈希值0x49f4C50d9BcC7AfdbCF77e0d6e364C29D5a660DF.
为完整起见,回复是: …
我已经创建了自己的 ERC-20 代币(AJR)并部署在以太坊私有节点上,现在我想按代币名称列出所有交易。
另外,我需要使用合约地址或代币名称列出所有代币持有者。
我尝试使用 web3 获取,但我只得到符号、名称、总供应量等,但没有得到代币持有者或交易
下面是我的示例代码:
from web3 import Web3
Web3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
contract_instance = Web3.eth.contract(contract_address, abi=abi)
print(contract_instance.functions.name().call())
我找到了以下使用 SimulatedBackend 的示例。直到最近,该代码还可以正常工作,但是现在这段代码会导致恐慌(恐慌:每个 Gas 的最大费用低于区块基本费用:地址 0xbc8153EE0b1E9B1f1E8153945400dc38EDbD8638,maxFeePerGas:1 baseFee:875000000)。我怀疑这与伦敦的更新有关。
package eth
import (
    "context"
    "math/big"
    "testing"
    "github.com/ethereum/go-ethereum/accounts/abi/bind"
    "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/core"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/crypto"
)
func TestSimulatedBackend(t *testing.T) {
    privateKey, err := crypto.GenerateKey()
    if err != nil {
        t.Fatalf("failed to generate key: %v", err)
    }
    auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(1337))
    if err != nil {
        t.Fatalf("failed to generate transaction: %v", err)
    }
    balance := new(big.Int)
    balance.SetString("10000000000000000000", 10) // 10 eth in wei
    address := auth.From
    genesisAlloc := map[common.Address]core.GenesisAccount{
        address: {
            Balance: balance,
        },
    } …我正在运行ethereum/client-go带有以下标志的
\n\ndocker run -p 8545:8545 ethereum/client-go --rpcapi personal,db,eth,net,web3 --rpc --rpcaddr 0.0.0.0 --rpccorsdomain * --rinkeby\n该映像在机器 A 上运行,我可以查询其中的 RPC。但是当我尝试从机器 BI 查询它时,收到以下响应:
\n\n要求:
\n\ncurl -X POST http://<machine_A_address>:8545 -H "Content-Type: application/json" --data \'{"jsonrpc":"2\xc3\xb7.0","method":"eth_coinbase","params":[],"id":64}\' --verbose\n回复:
\n\n< HTTP/1.1 403 Forbidden\n< Content-Type: text/plain; charset=utf-8\n< X-Content-Type-Options: nosniff\n< Date: Wed, 18 Apr 2018 14:58:44 GMT\n< Content-Length: 23\n< \ninvalid host specified\n* Connection #0 to host ... left intact\n如何从机器 B 查询机器 A 上托管的以太坊客户端?在哪里可以找到以太坊客户端日志以便进行调试?
\n> w3.eth.syncing
AttributeDict({
  'currentBlock': 5787386,
  'highestBlock': 5787491,
  'knownStates': 138355583,
  'pulledStates': 138341120,
  'startingBlock': 5787335,
})
> w3.eth.blockNumber
0
我已经完成了完全同步,但块号始终为 0。
我正在使用 golang 来监听智能合约事件。我将我的合约部署到 ganache ui 和 ganache-cli 端口。但我收到以下错误:
?  sc_events go run main.go
2019/04/17 14:25:04 write tcp 127.0.0.1:54917->127.0.0.1:8545: i/o timeout
exit status 1
我尝试使用 ganache ui(侦听端口 7545)和 ganache-cli(8545)。他们两个似乎都产生了相同的错误。但是如果我听 infura URL,我想我不会收到这个错误,
package main
import (
    "context"
    "fmt"
    "log"
    "github.com/ethereum/go-ethereum"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/ethclient"
)
func main() {
    client, err := ethclient.Dial("ws://127.0.0.1:8545")
    // client, err := ethclient.Dial("wss://rinkeby.infura.io/ws/v3/010590bb415e4664835a05a53b18a293")
    if err != nil {
        log.Fatal(err)
    }
    contractAddress := common.HexToAddress("0x82726c7c1202565f1fef63fa8d4caca6366d4749")
    query := ethereum.FilterQuery{
        Addresses: []common.Address{contractAddress},
    }
    logs := make(chan types.Log)
    sub, err := client.SubscribeFilterLogs(context.Background(), query, logs) …在我的 Ubuntu 中运行 geth 中的私有链节点和 Chainlink 节点后,我想测试 Chainlink Any API 的功能(https://docs.chain.link/any-api/get-request/examples/single-word -响应,单字响应)。
我运行这些命令来运行节点:
## SHELL1
cd ~/myChain/localChain/node1 && geth --datadir data --gcmode "archive" --syncmode=full --networkid 4190 --http --http.addr 0.0.0.0 --http.port 6789 --http.corsdomain "*" --ws --port 30305 --allow-insecure-unlock --unlock edd96278959aA8B27DdC14FD70ACb31f7e7beC2F --keystore ./keystore console
## SHELL2
cd ~/myChain/chainlink/.chainlink && docker run --net host -u=root  -p 6688:6688 -v ~/.chainlink:/chainlink -it --env-file=.env smartcontract/chainlink:1.11.0 local n
我成功部署了我的LinkToken合约,operator并在我的 Chainlink 节点 UI Operator 中创建了一个新作业(GET>uint256)。它们如下:
链克.sol
pragma solidity ^0.4.11;
import …我想使用web3js与智能合约进行交互.每个示例都将从以下开始
var Web3 = require('web3');
var web3 = new Web3('http://localhost:8545');
// or
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
我不明白使用Web3.providers.HttpProvider('Address').我的猜测:因此,在建立专用网络时,每个节点都应该提供一个不同的rpcport来识别它,因此它连接到网络.我错了吗?例如,上面的代码用于网站的前端,以便连接前端并在以太坊专用网络中部署合同.因此,前端代码必须是通用的,这意味着它不应该在其代码中添加特定的以太坊节点地址.那么什么是使用Web3.providers.HttpProvider('地址')?