{"id":21981506,"url":"https://github.com/daog1/e001","last_synced_at":"2025-09-06T14:42:04.543Z","repository":{"id":151230360,"uuid":"452254697","full_name":"daog1/e001","owner":"daog1","description":"call smart contract method without abi file","archived":false,"fork":false,"pushed_at":"2022-01-30T13:09:26.000Z","size":18,"stargazers_count":40,"open_issues_count":1,"forks_count":13,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-30T05:05:02.332Z","etag":null,"topics":["abi","solidity","web3py"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/daog1.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-01-26T11:47:48.000Z","updated_at":"2024-06-13T09:48:19.000Z","dependencies_parsed_at":"2024-02-23T16:00:34.665Z","dependency_job_id":null,"html_url":"https://github.com/daog1/e001","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/daog1/e001","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daog1%2Fe001","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daog1%2Fe001/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daog1%2Fe001/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daog1%2Fe001/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/daog1","download_url":"https://codeload.github.com/daog1/e001/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daog1%2Fe001/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273919045,"owners_count":25191204,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-06T02:00:13.247Z","response_time":2576,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["abi","solidity","web3py"],"created_at":"2024-11-29T17:17:44.302Z","updated_at":"2025-09-06T14:42:04.531Z","avatar_url":"https://github.com/daog1.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 在没有abi文件的情况下调用智能合约方法\ncall smart contract method without abi file\n\n[English Doc](readme2.md)\n\npython实现\n\n仓库包含，用到的智能合约，和修改好的,web3py contract.py文件\n\n我的例子里面，\n* greet2 函数签名 '0xf9220889'\n* greet3  函数签名 '0x02d355dc' \n* 例子是用greet2的函数签名调用的 greet3的函数，用本地的测试链测试成功。\n\n## 参考文档\n* [documentation](https://web3py.readthedocs.io/en/latest/)\n* [交易记录](https://bscscan.com/tx/0xa3c53ab27fda6f341f2caefeb356051e1de56e27549a586c79fbc67209a9c53d)\n\n##函数签名\n根据input 得到函数签名，\n0xb45112b2000000000000000000000000000000000000000000000000000000000000f46b\n前面4个字节，函数签名 b45112b2\n##得到函数原型\n* [反汇编合约](https://bscscan.com/bytecode-decompiler?a=0x2f7ef9b063e8481091663799efe3bccdb7fac3dd)\n* 搜索b45112b2\n\n```python\ndef unknownb45112b2(uint256 _param1): # not payable\n  require calldata.size - 4 \u003e=′ 32\n  require _param1 == _param1\n  require ext_code.size(heroContractAddress)\n  static call heroContractAddress.ownerOf(uint256 tokenId) with:\n```\n\n## 写一个合约\n```javascipt\n    function greet2(uint256 num) public view returns (string memory) {\n        return \"greet2\";\n    }\n\n    function greet3(uint256 num) public view returns (string memory) {\n        return \"greet3\";\n    }\n```\n## web3py修改\n原生的web3py是不支持更改函数签名的，需要对web3py进行修改\n```python\n    #增加sigfn参数\n    def call(\n        self, transaction: Optional[TxParams] = None,\n        block_identifier: BlockIdentifier = 'latest',\n        state_override: Optional[CallOverrideParams] = None,\n        sigfn:Optional[HexStr] =None\n        \n        return call_contract_function(\n            self.web3,\n            self.address,\n            self._return_data_normalizers,\n            self.function_identifier,\n            call_transaction,\n            block_id,\n            self.contract_abi,\n            self.abi,\n            state_override,\n            sigfn,\n            *self.args,\n            **self.kwargs\n        )\n    def call_contract_function(\n        web3: 'Web3',\n        address: ChecksumAddress,\n        normalizers: Tuple[Callable[..., Any], ...],\n        function_identifier: FunctionIdentifier,\n        transaction: TxParams,\n        block_id: Optional[BlockIdentifier] = None,\n        contract_abi: Optional[ABI] = None,\n        fn_abi: Optional[ABIFunction] = None,\n        state_override: Optional[CallOverrideParams] = None,\n        sigfn:Optional[str] = None,\n        *args: Any,\n        **kwargs: Any) -\u003e Any:\n        call_transaction = prepare_transaction(\n        address,\n        web3,\n        fn_identifier=function_identifier,\n        contract_abi=contract_abi,\n        fn_abi=fn_abi,\n        transaction=transaction,\n        fn_args=args,\n        sigfn=sigfn,\n        fn_kwargs=kwargs,\n    )\ndef prepare_transaction(\n    address: ChecksumAddress,\n    web3: \"Web3\",\n    fn_identifier: Union[str, Type[FallbackFn], Type[ReceiveFn]],\n    contract_abi: Optional[ABI] = None,\n    fn_abi: Optional[ABIFunction] = None,\n    transaction: Optional[TxParams] = None,\n    sigfn:Optional[HexStr]=None,\n    fn_args: Optional[Sequence[Any]] = None,\n    fn_kwargs: Optional[Any] = None,\n\ndef encode_transaction_data(\n    web3: \"Web3\",\n    fn_identifier: Union[str, Type[FallbackFn], Type[ReceiveFn]],\n    contract_abi: Optional[ABI] = None,\n    sigfn:Optional[HexStr]=None,\n    fn_abi: Optional[ABIFunction] = None,\n    args: Optional[Sequence[Any]] = None,\n    kwargs: Optional[Any] = None\n) -\u003e HexStr:\n\ndef encode_transaction_data(\n    web3: \"Web3\",\n    fn_identifier: Union[str, Type[FallbackFn], Type[ReceiveFn]],\n    contract_abi: Optional[ABI] = None,\n    sigfn:Optional[HexStr]=None,\n    fn_abi: Optional[ABIFunction] = None,\n    args: Optional[Sequence[Any]] = None,\n    kwargs: Optional[Any] = None\n) -\u003e HexStr:\n    if fn_identifier is FallbackFn:\n        fn_abi, fn_selector, fn_arguments = get_fallback_function_info(contract_abi, fn_abi)\n    elif fn_identifier is ReceiveFn:\n        fn_abi, fn_selector, fn_arguments = get_receive_function_info(contract_abi, fn_abi)\n    elif is_text(fn_identifier):\n        fn_abi, fn_selector, fn_arguments = get_function_info(\n            # type ignored b/c fn_id here is always str b/c FallbackFn is handled above\n            fn_identifier, web3.codec, contract_abi, fn_abi, args, kwargs,  # type: ignore\n        )\n    else:\n        raise TypeError(\"Unsupported function identifier\")\n    if sigfn!= None:\n        fn_selector = sigfn\n\n    return add_0x_prefix(encode_abi(web3, fn_abi, fn_arguments, fn_selector))\n```\n## 调用\n```python\n    print(greeter.functions.greet3(456).call(sigfn=\"0xf9220889\"))\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaog1%2Fe001","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaog1%2Fe001","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaog1%2Fe001/lists"}