diff --git a/2.x/.readthedocs.yaml b/2.x/.readthedocs.yaml new file mode 100644 index 000000000..7871ef8c3 --- /dev/null +++ b/2.x/.readthedocs.yaml @@ -0,0 +1,29 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.7" + # nodejs: "20" + # rust: "1.70" + # golang: "1.20" + +sphinx: + configuration: 2.x/conf.py + +# Optionally build your docs in additional formats such as PDF and ePub +formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ./requirements.txt \ No newline at end of file diff --git a/2.x/conf.py b/2.x/conf.py index 9aac22c40..02bac0fb0 100644 --- a/2.x/conf.py +++ b/2.x/conf.py @@ -67,7 +67,7 @@ master_doc = 'index' # General information about the project. -project = u'FISCO BCOS' +project = u'FISCO BCOS 2.0' copyright = u'© 2020. All rights reserved.' author = u'fisco-bcos-dev' @@ -139,7 +139,7 @@ "github_repo": "FISCO-BCOS-DOC", # Repo name "github_user": "FISCO-BCOS", "github_version": "release-2", # Version - "conf_py_path": "/", # Path in the checkout to the docs root + "conf_py_path": "/2.x/", # Path in the checkout to the docs root } # Theme options are theme-specific and customize the look and feel of a theme @@ -349,3 +349,22 @@ def setup(app): app.add_transform(AutoStructify) app.add_stylesheet('css/custom.css') app.add_javascript('js/readthedocs-analytics.js') + app.connect('build-finished', replace_source) + +def replace_source(app, exception): + if exception is None: + build_dir = os.environ.get('READTHEDOCS_OUTPUT', '_build') + + for root, dirs, files in os.walk(build_dir): + for file in files: + if file.endswith('.html'): + html_path = os.path.join(root, file) + + with open(html_path, 'r') as file: + lines = file.readlines() + + new_lines = [line.replace('https://unpkg.com', 'https://npm.onmicrosoft.cn') for line in lines] + new_lines = [line.replace('https://cdnjs.cloudflare.com', 'https://cdn.bootcdn.net') for line in new_lines] + + with open(html_path, 'w') as file: + file.writelines(new_lines) \ No newline at end of file diff --git a/2.x/docs/articles/1_conception/safe_and_controllable.md b/2.x/docs/articles/1_conception/safe_and_controllable.md index 4d97ee9b6..4b45bce5f 100644 --- a/2.x/docs/articles/1_conception/safe_and_controllable.md +++ b/2.x/docs/articles/1_conception/safe_and_controllable.md @@ -136,8 +136,6 @@ [《中华人民共和国密码法》](https://baike.baidu.com/item/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E5%AF%86%E7%A0%81%E6%B3%95/22860972?fromtitle=%E5%AF%86%E7%A0%81%E6%B3%95&fromid=24078179) -[《工信部对十三届全国人大二次会议第1394号建议的答复》](http://www.miit.gov.cn/n1146295/n1146592/n3917132/n4545264/c7503420/content.html) - [《工信部隐私保护规范》](http://www.cbdforum.cn/bcweb/index/bz/1-6.html) [《WeDPR隐私保护白皮书》](https://mp.weixin.qq.com/s/fYCHWb2SwWu-9ySLibrI0w) \ No newline at end of file diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/H{{L4[OWBMMNR}5FCIVD8UA.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/H{{L4[OWBMMNR}5FCIVD8UA.png" new file mode 100644 index 000000000..c895e5ba9 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/H{{L4[OWBMMNR}5FCIVD8UA.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/QQ\345\233\276\347\211\20720231016112850.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/QQ\345\233\276\347\211\20720231016112850.png" new file mode 100644 index 000000000..c895e5ba9 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/QQ\345\233\276\347\211\20720231016112850.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104130933.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104130933.png" new file mode 100644 index 000000000..ad869ddc9 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104130933.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104348280.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104348280.png" new file mode 100644 index 000000000..4d67ebc8f Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104348280.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104429480.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104429480.png" new file mode 100644 index 000000000..d64ce9f24 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104429480.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104509554.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104509554.png" new file mode 100644 index 000000000..e77b804d9 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104509554.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104547562.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104547562.png" new file mode 100644 index 000000000..696745c76 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104547562.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104646869.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104646869.png" new file mode 100644 index 000000000..0f5f13533 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104646869.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104842394.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104842394.png" new file mode 100644 index 000000000..096e218a5 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016104842394.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016105346886.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016105346886.png" new file mode 100644 index 000000000..1ecc92b42 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016105346886.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016105409664.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016105409664.png" new file mode 100644 index 000000000..1ecc92b42 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016105409664.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016105437956.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016105437956.png" new file mode 100644 index 000000000..eb7786cbf Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016105437956.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016111144312.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016111144312.png" new file mode 100644 index 000000000..708a0fde8 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016111144312.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016111704475.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016111704475.png" new file mode 100644 index 000000000..888c567e2 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016111704475.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016111815321.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016111815321.png" new file mode 100644 index 000000000..4cf252017 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016111815321.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112215664.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112215664.png" new file mode 100644 index 000000000..add888db3 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112215664.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112256810.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112256810.png" new file mode 100644 index 000000000..43c99b6cd Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112256810.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112420989.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112420989.png" new file mode 100644 index 000000000..e32b11040 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112420989.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112613639.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112613639.png" new file mode 100644 index 000000000..934c8529c Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231016112613639.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019105956621.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019105956621.png" new file mode 100644 index 000000000..190c219d6 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019105956621.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019110653446.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019110653446.png" new file mode 100644 index 000000000..2ca149f0c Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019110653446.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019112540817.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019112540817.png" new file mode 100644 index 000000000..91a3b3f60 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019112540817.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019112616789.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019112616789.png" new file mode 100644 index 000000000..b9e4c4f84 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019112616789.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113026956.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113026956.png" new file mode 100644 index 000000000..a5fd88caa Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113026956.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113312346.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113312346.png" new file mode 100644 index 000000000..a8460b680 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113312346.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113347876.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113347876.png" new file mode 100644 index 000000000..1c70c86d6 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113347876.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113437394.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113437394.png" new file mode 100644 index 000000000..6cd73d97b Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113437394.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113444696.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113444696.png" new file mode 100644 index 000000000..6cd73d97b Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019113444696.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019115803764.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019115803764.png" new file mode 100644 index 000000000..2dbad6902 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019115803764.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019120132592.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019120132592.png" new file mode 100644 index 000000000..a98e4cdf0 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019120132592.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019120519771.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019120519771.png" new file mode 100644 index 000000000..dcfc2b6f1 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019120519771.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019120608331.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019120608331.png" new file mode 100644 index 000000000..517d59e1b Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019120608331.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019134453143.png" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019134453143.png" new file mode 100644 index 000000000..e08658579 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/image-20231019134453143.png" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/zdb.jpg" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/zdb.jpg" new file mode 100644 index 000000000..b733957d5 Binary files /dev/null and "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.assets/zdb.jpg" differ diff --git "a/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.md" "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 000000000..898a8808a --- /dev/null +++ "b/2.x/docs/articles/7_community/fisco\351\200\202\351\205\215\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223/fisco\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,266 @@ +## fisco-bcos适配达梦数据库 + +作者:dyy8888(董耀宇)|北京邮电大学 + +### 为什么需要达梦数据库? + +达梦数据库作为一款国产数据库软件,拥有自主产权,满足国内要求自主产权、安全和国产化等要求。 + +目前`fisco-bcos`支持的数据库有:`mysql`、`rocksdb`,并不支持国产数据库达梦数据库,本次改造在`fisco-bcos2.9.1`版本的源代码基础上,对其中`mysql`的源码`zdbStorage`部分进行修改以适配达梦数据库。目前改造版本将暂不支持`mysql`数据库。 + +我们成功在搭载鲲鹏`CPU`,麒麟`os`的系统上运行了达梦区块链节点,实现了`CPU`、操作系统和数据库的国产化适配。 + +### 达梦FISCO改造思路 + +首先明确一点,我们的改造基于源码是`FISCO-BCOS 2.9.1`版本。 + +达梦数据库与`mysql`数据库都属于关系型数据库,就此次改造而言,两者主要区别包含两点: + +1. `SQL`语句和数据类型不同 +2. 数据库结构不同:`mysql`数据库有库和表的概念,可以建立多个数据库,每个数据库中包含多个表,数据库之间彼此独立。所以在使用`mysql`存储引擎时,需要为每一个节点配置一个数据库;然而达梦数据库中并不是这样的架构,其架构更类似于`oracle`数据库,不存在可以配置多个数据库的情况。所以对于一个达梦节点而言,就需要配置一个达梦数据的实例。 + +由于达梦和`mysql`具有一定的相似性,所以我们的改造也是基于`mysql`源码部分。那么首先我们需要了解一下`fisco`是如何实现`mysql`存储的。 + +#### fisco如何使用mysql数据库 + +有关于`mysql`部分的源码位于源码文件的`libStorage`文件夹中的`ZdbStorage`文件中。通过阅读源码我们发现在`fisco`与`mysql`的连接上使用了一款叫做`libzdb`的插件。这款插件提供了一系列数据库操作的接口,比如连接池、URL连接、`SQL`语句执行封装等接口,并且是线程安全的。目前这款插件支持的数据库包括支持`Mysql` `Oracle` `SQLite` `PostgreSQL`。 + +所以这给适配达梦提供了思路,如果想使用这些接口的话,那么就需要让达梦和`libzdb`进行适配,然后就可以直接使用这些接口了。 + +#### fisco如何使用达梦数据库 + +由于`libzdb`官方给出的说明中并不支持达梦数据库,所以我们有必要让两者进行适配,才可以进行与`fisco`的结合。 + +在达梦数据库给出的驱动方面,其提供的`OCI`驱动包是按照`oracle`进行书写的,所以与`oracle`天然适配,这无疑给我们的改造提供了极大的便利。所以此次改造我们使用了`libzdb oracle`部分的代码,进行修改后使其适配达梦数据库。 + +在完成`libzdb`适配后,我们修改了`fisco zdb`部分的代码,主要是针对`sql`语句的改造,成功实现`fisco`与达梦数据库的结合。 + +image-20231019105956621 + +#### 对于源码编译的改造 + +说完了适配的整体思路,继续说一下关于编译环节的改造。 + +首先说一下`fisco`在源码编译部分的处理。`fisco`是用`cmake`进行组织编译的,在源码的`cmake`文件夹中存放着需要拉取依赖的地址和操作方式,文件目录如下图所示 + +image-20231019110653446 + +其中我们可以发现一个叫`ProjectLibzdb.cmake`的文件,我们进去看一下 + +![zdb](fisco达梦数据库.assets/zdb.jpg) + +这是修改后文件,其主要作用就是根据URL地址拉取第三方依赖包。由于我们对`libzdb`进行了自己的适配改造,所以我们将改造后的`libzdb`代码上传到了自己的仓库中,以便进行下载。 + +所以我们对`cmake`文件也进行了修改 + +### fisco-dm源码编译 + +本章节将针对如何从源码编译出适配达梦的`fisco-bcos`程序。当然,我们在文末也提供了直接编译好的`fisco-bcos`程序,您可以跳过这一章节,直接使用编译好的程序也可以。 + +#### 相关依赖 + +`fisco-bcos`:2.9.1版本 + +`达梦数据库`:DM8 + +`达梦驱动包`:dmoci + +操作系统:centos7+,ubuntu20.04,麒麟osV10;支持ARM,不支持windows系统 + +#### libzdb适配教程 + +由于开发周期较短,所以`libzdb`适配达梦数据库的一键配置的脚本并没有完成,所以需要进行人工手动适配,过程略有繁琐。 + +1. 首先请准备一台装有`mysql`的电脑/服务器,将l`ibzdb-dm`代码拉取到本地,代码仓库地址:https://github.com/dyy8888/LibzdbForDM.git 此仓库提供的就是改造好的`libzdb-dm`代码 + +2. 在`libzdbForDM`文件夹中,执行自动检测脚本,这一步会自动检测所拥有的数据库 + + ![image-20231019112540817](fisco达梦数据库.assets/image-20231019112540817.png) + + ```shell + ./configure + ``` + + image-20231016104130933 + + 可以发现检测到了`Mysql`的环境,同时会生成`MakeFile`文件 + + ![image-20231019112616789](fisco达梦数据库.assets/image-20231019112616789.png) + +3. 编辑`MakeFile`文件,修改其中的配置信息。 + + 修改前: + + image-20231016104348280 + + 修改后: + + image-20231016104429480 + + 修改前: + + image-20231016104509554 + + 修改后: + + image-20231016104547562 + + 因为自动检测到的是`mysql`环境,所以需要注释掉`mysql`相关的信息,打开`oracle`相关的 + + 修改前: + + image-20231016104646869 + + 修改后: + + image-20231016104842394 + + 这两步的作用是将达梦给的`dmoci`的驱动和`DCI.h`的头文件导入`libzdb`项目中。驱动和头文件会在文末的百度网盘链接中给出。下图给出`dmoci`驱动包的文件结构。可以发现其中包含驱动`dmoci.a dmoci.so`和依赖的头文件`DCI.h DCI1.h oci.h` + + image-20231019113026956 + + 其中:`/root/dmoci/include`其中包含`DCI.h`头文件,此路径需根据实际情况进行修改 + + `dmoci`为驱动,需要将达梦提供的`oci`驱动包中的`libdmoci`文件复制到系统目录下,这个目录可以参考359行前面给出路径。比如此图片中,需要将`dmoci`复制到`/usr/lib64`中 + + 保存退出`MakeFile`文件 + +4. 进入src文件夹,修改其中的xconfig.h文件 + + ![image-20231019113312346](fisco达梦数据库.assets/image-20231019113312346.png) + + ![image-20231019113347876](fisco达梦数据库.assets/image-20231019113347876.png) + + 修改前: + + ![image-20231016105409664](fisco达梦数据库.assets/image-20231016105409664.png) + + 修改后: + + ![image-20231016105437956](fisco达梦数据库.assets/image-20231016105437956.png) + + 这一步的目的是关闭`mysql`,打开`oracle` + +5. 返回与Makefile同级目录中,如下图所示,执行编译安装步骤 + + ![image-20231019113444696](fisco达梦数据库.assets/image-20231019113444696.png) + + ```shell + make -j4 + sudo make install + ``` + +6. 安装成功后说明适配成功,执行清除指令 + + ```shell + sudo make clean + ``` + +7. 将上述适配好的代码上传到个人的仓库中,这一步的目的是`fisco`在源码编译的时候需要根据依赖的地址去下载,所以请将此代码上传一个可以进行拉取下载的仓库中。同时可能会有疑问,为什么不直接拉取作者改造好的代码呢?这是因为我自己改造的代码相关配置路径是在执行`./configure`后根据我自己服务器的相关信息产生的。所以对于用户来说,肯定和我的服务器路径不相同,所以需要您手动拉取代码后进行配置。 + +#### fisco适配 + +##### **源码编译** + +修改后的fisco代码仓库位于:https://github.com/dyy8888/FISCO-BCOS-2.9.1.git + +请先拉取代码到本地。 + +```shell +#进入cmake目录下,修改ProjectLibzdb.cmake +将下载地址设置为上一步中适配好的libzdb代码地址,也就是您自己上传的github仓库,其他仓库也可以,只要确保可以通过URL下载下来就行 +``` + +image-20231016111144312 + +```shell +#返回上一级目录,新建文件夹build +mkdir build +#执行cmake指令 +cmake .. +#如果是arm64架构,执行。x86不需要 +cmake -DARCH_NATIVE=on .. +#进行编译 +make -j4 +``` + +在编译过程中,会自动将依赖拉取到deps目录下 + +![image-20231016111704475](fisco达梦数据库.assets/image-20231016111704475.png) + +```shell +#需要手动复制rt和oci驱动至deps/libs文件夹中,如下图所示,其余的依赖会在编译中自动放入。这两个依赖,#libdmoci.a在网盘提供的包里有。librt.a请在您的系统目录下寻找。也可以使用命令查找 +whereis librt.a +``` + +![image-20231016111815321](fisco达梦数据库.assets/image-20231016111815321.png) + +最后,可在build/bin目录下得到`fisco-bcos`可执行程序 + +### 具体使用教程 + +文末的百度网盘包中提供了编译好的`fisco-bcos`可执行程序,如果您跳过了源码编译环节,您可以直接看本章节进行部署使用 + +由于测试环境仅包含一台达梦实例,所以本教程将搭建三个`mysql`节点和一个达梦节点 + +首先根据官网文档教程搭建本地四节点的`fisco-bcos`链 + +```shell +## 创建操作目录 +cd ~ && mkdir -p fisco && cd fisco + +## 下载脚本 +curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.9.1/build_chain.sh && chmod u+x build_chain.sh +## 执行建链脚本 +bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 +``` + +可以得到以下的目录结构,其中包含着四个节点 + +![image-20231019115803764](fisco达梦数据库.assets/image-20231019115803764.png) + +```shell +## 返回主目录,新建文件夹fisco-DM +cd ~ && mkdir -p fisco-DM +## 复制刚才的fisco文件夹到fisco-DM中 +cp -r fisco fisco-DM/ +``` + +![image-20231019120132592](fisco达梦数据库.assets/image-20231019120132592.png) + +```shell +## 我们将node0设置为达梦节点,其他节点为mysql节点。 +## 所以删除fisco文件夹中的node0文件夹,删除fisco-DM中的node1,node2,node3文件夹 +## 处理完毕后的目录结构为 +``` + +![image-20231019120519771](fisco达梦数据库.assets/image-20231019120519771.png) + +![image-20231019120608331](fisco达梦数据库.assets/image-20231019120608331.png) + +将`fisco-DM`文件夹中的`fisco-bcos`程序,换成达梦版本的程序(源码编译而来,或者直接使用链接包中的程序) + +修改达梦节点(node0)下,conf/group.1.ini + +image-20231016112613639 + +QQ图片20231016112850 + +目前仅支持SYSDBA的写入,请确保您的用户具备`DBA`的权限 + +启动节点后,查询节点的运行日志,检查是否共识正常。同时可以登录达梦数据库的命令行,查询相关的表格信息。如下图所示: + +![image-20231019134453143](fisco达梦数据库.assets/image-20231019134453143.png) + +### 软件包链接 + +链接:https://pan.baidu.com/s/13VLvYNdrdloMZFMjzWQsrQ?pwd=dm10 +提取码:dm10 + +fisco-dm的PR链接为:https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3969 + +这里可以看到关于fisco-dm对于底层文件的改动情况 + +如有更多问题,可联系我们:2497213126@qq.com + +可以进行指导部署安装达梦区块链节点 \ No newline at end of file diff --git a/2.x/docs/articles/index.md b/2.x/docs/articles/index.md index 94ba43a62..78aa1358c 100644 --- a/2.x/docs/articles/index.md +++ b/2.x/docs/articles/index.md @@ -2,7 +2,7 @@ ## 介绍 -FISCO BCOS开源社区已沉淀120+篇技术文章,这些文章涉猎理论、开发以及应用案例等方面,有助于开发者快速上手、全面掌握FISCO BCOS,依据平台关键特性,社区对这些文章进行整理编排成《深入浅出FISCO BCOS》,供各位浏览阅读。 +新的一年已经开启,为了感谢大家的长久陪伴和倾力支持,我们将FISCO BCOS开源社区成立至今超400篇技术干货和经典篇章整理成文,作为区块链干货合辑,分享给大家! 请点击这里查阅[完整版](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247493260&idx=1&sn=b042be04819c89169b81bcee99eb2a18&chksm=9e3a71e6e1d2ad682bf8fde9f178c91160e5d7cdf187a81cedb191b8da1605f206f9bfd98ec0&from=industrynews&version=4.1.7.6018&platform=win#rd) 《深入浅出FISCO BCOS》分为六大章节,由社区全体成员共创完成并不断优化,社区开发者可以在GitHub上提交PR贡献文章,分享FISCO BCOS开发经验与使用心得。 diff --git a/2.x/docs/community.md b/2.x/docs/community.md index da36c3cb0..dd619fec0 100644 --- a/2.x/docs/community.md +++ b/2.x/docs/community.md @@ -14,7 +14,7 @@ FISCO BCOS是国内企业主导研发、对外开源、安全可控的企业级 ## 更多开源工具 -![](../../_static/images/products.jpeg) +![](../../_static/images/products_2023.jpeg) - **FISCO BCOS企业级金融联盟链底层平台**: [GitHub](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0) 、[Gitee](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0) 、 [文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html) - **WeBASE 区块链中间件平台**:[GitHub](https://github.com/WeBankFinTech/WeBASE) 、 [Gitee](https://gitee.com/WeBank/WeBASE) 、 [文档](https://webasedoc.readthedocs.io/) @@ -37,6 +37,8 @@ FISCO BCOS是国内企业主导研发、对外开源、安全可控的企业级 - SmartDev-Contract 智能合约库组件:[GitHub](https://github.com/WeBankBlockchain/SmartDev-Contract) 、 [Gitee](https://gitee.com/WeBankBlockchain/SmartDev-Contract) 、 [文档](https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) - SmartDev-SCGP 合约编译插件:[GitHub](https://github.com/WeBankBlockchain/SmartDev-SCGP) 、 [Gitee](https://gitee.com/WeBankBlockchain/SmartDev-SCGP) 、 [文档](https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/index.html) - SmartDev-Scaffold 应用开发脚手架:[GitHub](https://github.com/WeBankBlockchain/SmartDev-Scaffold) 、 [Gitee](https://gitee.com/WeBankBlockchain/SmartDev-Scaffold) 、 [文档](https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html) +- **DDCMS分布式数据协作管理解决方案**:[GitHub](https://github.com/WeBankBlockchain/DDCMS) 、 [Gitee](https://gitee.com/WeBankBlockchain/DDCMS) 、 [文档](https://ddcms-docs.readthedocs.io/en/latest/) + ## 加入FISCO BCOS社区 diff --git a/2.x/docs/community/MVP_list_new.md b/2.x/docs/community/MVP_list_new.md index e83bb69fd..4ff6148cc 100644 --- a/2.x/docs/community/MVP_list_new.md +++ b/2.x/docs/community/MVP_list_new.md @@ -1,38 +1,21 @@ ## MVP -**2021年度 | FISCO BCOS MVP榜单** +**2023年度 | FISCO BCOS MVP榜单** 作者:小助手 -在《大教堂与集市》一书中,开源世界好比集市,相较传统开发模式更重视开发者间的交流,每位开源社区的参与者、贡献者都是集市中的主角。 - -FISCO BCOS开源社区“集市”历经四载共建,逐渐发展壮大,孕育出超7万个人用户、逾3000企业/机构的活跃开源生态。 - -大家围绕FISCO BCOS开发各类实用的应用组件、持续优化项目,并自发输出技术解析、使用案例、操作实践等丰富内容。点滴的分享让FISCO BCOS的开发体验越来越丝滑友好,也让我们看到区块链的无限可能。 - -今年3月,社区开放FISCO BCOS MVP认定以鼓励为开源社区贡献高质量技术内容的意见先锋与意见领袖。6月,社区认定了首批共10位MVP,而下半年,我们也迎来了新一批16位MVP。 +为了鼓励为开源社区贡献高质量技术内容的意见先锋与意见领袖,开源社区开放FISCO BCOS MVP认定,截止2023年,开源社区共认定63位MVP 。 这些优秀的贡献者或是将FISCO BCOS技术落地到各领域应用中,助力产业数字化,或是在多渠道布道,将开源社区精神传播到更远的地方。 下面,让我们一起来认识这些技术的践行者、社区的布道者。 -**2021年首批MVP** -![](https://user-images.githubusercontent.com/93572056/154943706-ea874249-63ff-496e-a937-d6494b08a89f.png) -![](https://user-images.githubusercontent.com/93572056/154943834-eb21629b-bd39-4d5c-bac1-d251529e09d5.png) -![](https://user-images.githubusercontent.com/93572056/154943855-66d90863-7305-408a-8271-de4667ef268e.png) - -**2021年第二批MVP** -![](https://user-images.githubusercontent.com/93572056/154944202-7a7325b2-a584-4f5e-aa9c-bf103f3a4d93.png) -![](https://user-images.githubusercontent.com/93572056/154944228-af5167d5-68e4-4167-a0fc-e5ee5d65454e.png) - -**推荐阅读**: - -[FISCO BCOS MVP计划](https://mp.weixin.qq.com/s/cqwrzBnQaSd9-jVMrE6_WQ) - -[对话MVP | 谷月:结缘FISCO BCOS,成为区块链浪潮中的弄潮儿](https://mp.weixin.qq.com/s/4pufWZVsW7-fdAMsYggDyg) +![](../../../_static/images/mvp_review_2023.png) +
-[对话MVP | 郭伟:区块链必将成为数字世界的基石](https://mp.weixin.qq.com/s/ENIviP4dmqXgwlO2LdVLmg) +![](../../../_static/images/mvp_2023.png) -[对话MVP | 李海滨:从文科生到运维架构师,兴趣是最大的动力力](https://mp.weixin.qq.com/s/WbEPg4jlQNUNIlCGrh6n4g) +![](../../../_static/images/mvp_2022.png) -[对话MVP | 林宣名:坚持知识分享,为开发者学习注入活水水](https://mp.weixin.qq.com/s/1r_LdJGobk1xUoYk3LknZA) +![](../../../_static/images/mvp_2021.png) +
\ No newline at end of file diff --git a/2.x/docs/community/contributor_list_new.md b/2.x/docs/community/contributor_list_new.md index c22623b27..7e6413186 100644 --- a/2.x/docs/community/contributor_list_new.md +++ b/2.x/docs/community/contributor_list_new.md @@ -1,310 +1,128 @@ ## 贡献者 -**2021年度 | FISCO BCOS贡献者榜单** +**2023年度 | FISCO BCOS贡献者榜单** 作者:小助手 -践行开源共创的精神,FISCO BCOS开源社区致力打造开放多元的开源联盟链生态。 +2023年,世界风云变幻,科技日新月异。FISCO BCOS秉承对区块链技术的信仰,汇聚超过5000家企业机构、10万余名个人成员共建共治共享,打造更加活跃更加繁荣的开源联盟链生态圈。 -目前,社区已汇聚了超70000名社区用户,大家聚集于此碰撞观点、交流技术,围绕FISCO BCOS开发各类实用的应用组件、持续优化项目,并自发输出技术解析、使用案例、操作实践等丰富内容。 +过去一年,一大批开源贡献者加入我们,从代码、工具、方案和布道多个方向支撑FISCO BCOS开源发展。百余位小伙伴为FISCO BCOS贡献代码,为社区带来了更健壮、更强大的FISCO BCOS;十余个团队为开源社区贡献工具组件和解决方案,进一步丰富开源生态组件和应用案例;六十多位伙伴成为FISCO BCOS的“自来水”,自发输出技术解读、操作实践和应用案例,以社区布道者身份推广FISCO BCOS。 -在大家的共同建设下,FISCO BCOS生态不断丰富完善,涌现了众多开发工具,让FISCO BCOS的开发体验越来越丝滑友好,并且有效提升了社区用户的开发效率。 +我们整理了2023年FISCO BCOS贡献者荣誉榜,感谢大家的热情参与和积极贡献! -为感谢大家对FISCO BCOS开源生态作出的贡献,社区发布2021年度贡献榜单,和大家一起回顾见证2021 年FISCO BCOS的演进与成长。以下名单排名不分先后,如有错漏,敬请联系小助手【**fiscobcosfan**】完善。 +向上生长,向下扎根。来自社区的力量是支撑FISCO BCOS技术领先和生态繁荣的坚实底座。我们相信,一个更有活力、更加繁荣的区块链行业正在到来。期待更多小伙伴加入我们,共建区块链美好未来。 -### 代码/文档贡献 +以下名单排名不分先后,如有错漏,敬请联系小助手【FISCOBCOS010】完善。 + +### 代码贡献 代码贡献是指围绕FISCO BCOS项目,以及社区生态项目代码仓库所作的贡献,贡献形式包括但不限于提交PR修改源代码、贡献新代码、共建技术文档等。 -**GitHub账号** |**姓名**|**所在机构** | -| - | - |- | -ahahahaha | 许文杰 | 重庆邮电大学 -aiottots | 刘仲明 | 中兴协力(山东)教育科技集团 -antorny | 梁兴通 | 易联众信息技术股份有限公司 -anyspa | 刘宏微 | 社区开发者 -AOMEILSH | 刘斯韩 | 华南理工大学 -arlequinfei | 熊飞 | 西南林业大学 -Aurora-yzj | 殷梓敬 | 清华大学 -bit1120173455 | —— | 社区开发者 -blackflowerli | —— | 社区开发者 -Blockchain_Key | 黄杰 | 武汉学院 -bo-hub | —— | 社区开发者 -bottlelee | 李海滨 | 上海新致软件股份有限公司 -bright60 | —— | 社区开发者 -bxq2011hust | 白兴强 | 微众银行 -caseone | 李传庆 | 微众银行 -ccznb | 丘玉刚 | 华南理工大学 -chaychen2005 | 陈宇 | 微众银行 -Chris-Howard | —— | 社区开发者 -chuchaochen | —— | 社区开发者 -coderkentzhang | 张开翔 | 微众银行 -CodingCattwo | 黎宁 | 微众银行 -CoreyLin | —— | 社区开发者 -cuiyuchain | 崔宇 | 北方工业大学 -cyjseagull | 陈宇杰 | 微众银行 -Daidj | —— | 社区开发者 -dalaocu | 毛嘉宇 | 微众银行 -dependabot | —— | 社区开发者 -DreamEagle0 | 许少勇 | 浙江大学 -Duanraudon | —— | 社区开发者 -dwusiq | 伍思强 | 社区开发者 -Ehangnet | 罗志达 | 深圳市一航网络信息技术有限公司 -engzhen | 韦鹏振 | 浙商银行 -ErQi | 齐涛 | 柏安网络科技有限公司 -EvanCley | —— | 社区开发者 -eveagle | —— | 社区开发者 -fCorleone | 马福辰 | 清华大学 -fengqiao | 曾铜桥 | 世纪鼎科技股份有限公司 -flowerrun | —— | 社区开发者 -fmlwlher | 王礼辉 | 牛津海南区块链研究院有限公司 -fqliao | 廖飞强 | 微众银行 -freezehe | 何结兵 | 上海久誉软件系统有限公司 -fxjya | 赵方鑫 | 齐鲁工业大学 -gongdaxia | 龚浩 | 社区开发者 -grayson1001 | 张龙 | 微众银行 -hailong99 | 李龙 | 深圳市缦星链盟软件工程有限公司 -HaoXuan40404 | 李昊轩 | 微众银行 -hnustyangjieyu | 杨杰宇 | 中山大学InPlusLab -hongfish | 余昌鸿 | 广电运通 -hzxGoForward | 虎振兴 | 北京大学 -IronStrong | 宋铁强 | 光大集团 -Jay1213811 | 江会文 | 江西师范大学 -jaz888 | —— | 社区开发者 -jc0803kevin | 肖拔赟 | 社区开发者 -jianglongwei | 魏江龙 | 宁夏希望信息产业股份有限公司 -JimmyShi22 | 石翔 | 微众银行 -jinjzk | 金兆康 | 杭州亦笔科技有限公司 -JinZhiWen | 金志汶 | 深圳软通动力信息技术有限公司 -jishitang | 欧阳小安 | 微众银行 -jiuyu-software | 刘泉 | 上海久誉软件系统有限公司 -jsrzx | 阮泽鑫 | 社区开发者 -julyawang | 王朝阳 | 微众银行 -kongqp | 孔雀屏 | 中山大学InPlusLab -Kwinin | 崇建 | 社区开发者 -kyonRay | 郭锐 | 微众银行 -laifagen4897 | —— | 社区开发者 -lalalaterraria | —— | 社区开发者 -larryxiang | 向彪 | 湖南边城智能科技有限公司 -leeduckgo | 李骜华 | 上海对外经贸大学区块链技术与应用研究中心 -lilianwen | 黎连文 | 微位科技 -linbin524 | 林宣名 | 厦门哈希科技 -llzz9595 | 黎培珊 | 微众银行 -LoAcer | 董卅 | 乘以几网络科技有限公司 -longdacao | 曹大龙 | 微众银行 -longJJ2016 | 龙江江 | 厦门哈希科技有限公司 -longranger2 | —— | 社区开发者 -ltyuanmu | 梁腾 | 上海新致软件股份有限公司 -LucasLi1024 | —— | 社区开发者 -LunaWang5209 | 王炯 | 中兴协力(山东)教育科技集团有限公司 -Lynn | 汪阳斌 | 武汉链动时代科技有限公司 -MaggieNgWu | —— | 社区开发者 -maochaowu | 毛超武 | 杭州亦笔科技有限公司 -masonhunk | 储雨知 | 微众银行 -miaoxingrenya | 刘志国 | 长春工业大学 -mingzhenliu | 刘明臻 | 微众银行 -MirSu0429 | 苏鹏飞 | 社区开发者 -morebtcg | 莫楠 | 微众银行 -nanjingboy | 黄子龙 | 社区开发者 -ningshiwen | 宁诗雯 | 微众银行 -paul-lee-attorney | 李力 | 北京市竞天公诚律师事务所 -piggypiggy | —— | 社区开发者 -Popping007 | 刘鸿飞 | 华南理工大学 -qyan-dev | —— | 社区开发者 -renardbebe | 任萌 | 清华大学 -saberdance | 黄一 | 四川万物数创科技有限公司 -safarika | 张羽彤 | 宁夏希望软件 -Sands8y0 | —— | 社区开发者 -Sayou1989 | 陈良科 | 文思海辉 -setrsw | —— | 社区开发者 -Shareong | 贺双洪 | 微众银行 -shawn-skt | 杨硕 | 中山大学InPlusLab -shitou13 | 吴媛媛 | 上海久誉软件系统有限公司 -Skkypy |  —— | 社区开发者 -slash-l | 刘靖毅 | 上海新致软件 -smallsuqirrel | 王子成 | 华南理工大学 -SomeJoker | 闫让南 | Abakus -starzhou | 周星 | 西安纸贵科技 -sunliying2020 | 孙丽英 | 柏链教育 -supermqB | 殷文宝 | 联仁健康医疗大数据科技股份有限公司 -tan-sen | 谭广森 | 杭州亦笔科技有限公司 -TechWZ | 吴圳 | 清华大学 -Thompson-Chen | 陈俊鹏 | 华南理工大学 -unisolate | 冯宗浩 | 香港科技大学 -vita-dounai | —— | 社区开发者 -vvMonster | 饶应典 | 中科智能 -wangfeng-1 | —— | 社区开发者 -wangyue168git | 王越 | 微众银行 -wattswang | 王超 | 亚信科技 -wenhuancai | 蔡文欢 | 深圳市网安计算机安全检测技术有限公司 -wfnuser | 黄清昊 | 腾讯 -xiaomdong | 肖东 | 深圳前海股权交易中心 -xiaoxiaobanxian | 林森 | 社区开发者 -xiaoyue2019 | 肖越 | 上海对外经贸大学 -xiongmao133 | 熊欢周 | 知道创宇 -xueying4402 | 李卫 | 中山大学InPlusLab -XuHugo | 许强 | 吉利集团 -xyzshen | 沈园甲 | 社区开发者 -yangaobiao | 杨敖彪 | 社区开发者 -yanggang-JV | 杨刚 | 微众银行 -yanyanho | —— | 社区开发者 -yekai1003 | 高野 | 京北方信息技术股份有限公司 -YongYuIT | 余勇 | 微众银行 -yovenchen | 陈岳峰 | 品高软件 -yuanmomo | —— | 社区开发者 -ywy2090 | 王章 | 微众银行 -zhaoxll | —— | 社区开发者 -zhaozhihom | 赵志宏 | 神州信息 -zhuangql | 庄虔伟 | 东北大学 -zRich | —— | 社区开发者 -724338817 | 金志汶 | 深圳软通动力信息技术有限公司 -767472021 | 夏雨 | 金山云 -112ld | 刘鼎 | 华南理工大学 -99Kies | 汤会枫 | 湖州学院 +![](../../../_static/images/contributors_2023.png) +### 工具贡献 +在FISCO BCOS基础之上,社区开发者不断探索,开发出多种实用的组件、工具,便捷开发流程的同时也拓展了平台功能。目前,这些工具已全部开源并贡献给社区开发者使用,极大降低了应用开发的门槛和成本。 +**项目名称:WeCross-BCOS3-Stub** +贡献方:科大讯飞股份有限公司、微众银行 +核心参与者:詹大卫、方洋、韩林波、郭锐 -### 工具贡献 -在FISCO BCOS基础之上,社区开发者不断探索,开发出多种实用的组件、工具,便捷开发流程的同时也拓展了平台功能。目前,这些工具已全部开源并贡献给社区开发者使用,极大降低了应用开发的门槛和成本。 +项目介绍: + +WeCross-BCOS3-Stub是WeCross用于适配FISCO BCOS v3.0及以上版本的插件,成功实现了FISCO BCOS v3.0及以上版本的跨链适配。 +https://github.com/WeBankBlockchain/WeCross-BCOS3-Stub + +**项目名称:SmartDev-Contract 智能合约库组件** + +贡献方:宁夏为教科技有限公司、广东工业大学、厦门哈希科技有限公司、深圳职业技术大学、江西师范大学、北京伽罗华域科技有限公司、京北方信息技术股份有限公司、重庆电子工程职业学院、深圳职业技术大学、深圳信息职业技术学院、湖南科技职业学院。 + +核心参与者:张生、陈汛、李奇龙、金伟、林滨、张宇豪、王江宇、刘武阳、何鸿坤、高野、向键雄、杜小敏、袁佳佳、彭添淞、罗嘉城、肖晶雄。 + +项目介绍: + +为了让更多开发者参与到智能合约库组件优化,社区启动了“Task挑战赛”活动。2023年第1、2季活动分别征集了“供应链金融应收款保理融资”、“历史块高查询”、“类型转换合约”、“时间锁操作”、“多方投票”、“区块链资金透明监管与投票解决方案”、“打怪升级高达游戏”、“共享单车案例”、“给合约添加代码注释”、“公共领域的创新解决方”“电子病历案例”“囚徒困境”等合约。 +https://github.com/WeBankBlockchain/SmartDev-Contract + +### 方案贡献 +在2023深圳国际金融科技大赛等众多区块链权威赛事中,涌现不少基于FISCO BCOS的优秀参赛方案。本着回馈社区的开源精神,参赛者将这些方案贡献出来,为社区用户提供区块链学习了有益参考。 + +**方案名称:AI4C——面向AIGC创作的文化数字产品运营平台** + +核心参与者:于祯奇、胡鑫、孙俨、杨国铭 + +目前,AIGC文化创作面临海量素材难存查、链下推理不可信、产品版权难保护、利益分配不透明等诸多难题。为解决以上问题,团队构建面向文化数字产品AIGC创作的版权运营平台。平台集成可信版权标识等6大关键功能,实现文化数字作品版权全流程服务。开展链上存储检索、链下可信扩展技术研究,设计文化数字产品运营方案。已完成平台与FISCO BCOS区块链的研发部署,并使用可信计算硬件支撑生成式模型的隐私计算与推理加速。 +https://github.com/FISCO-BCOS/hackathon/pull/81/files + +**方案名称:基于FISCO BCOS的联邦学习平台** -**项目名称** |**贡献方**|**核心参与者** |项目介绍| -| - | - |- |:----| -fisco-bcos-spring-boot-starter | 联仁健康医疗大数据科技股份有限公司 | 殷文宝 | fisco-bcos-spring-boot-starter是对 java sdk的springboot starter封装,使用该starter仅需简单的配置就可以快速集成java sdk。开发者将更加聚焦在合约接口调用的开发工作上,大大降低了服务开发的入门门槛和学习成本。项目地址:https://github.com/FISCO-BCOS/fisco-bcos-spring-boot-starter -WeBASE-代理合约模板 | 深圳前海股权交易中心 | 肖东 | 本合约模板由深圳前海股权交易中心贡献,包括合约接口层代理、合约数据层代理等主要功能,为开发者提供代理合约的源码实现,方便合约应用的迭代升级。WeBASE 代码仓库:https://github.com/WeBankBlockchain/WeBASE -spring-boot-crud | 宁夏希望软件 | 张羽彤 | spring-boot-crud是一个基于java sdk的spring boot demo,基于CRUD基本接口,通过访问web api的方式实现链上插入、更新、删除和查询用户信息功能。项目地址:https://github.com/FISCO-BCOS/spring-boot-crud -WeBASE-溯源应用模板 | 世纪鼎利科技股份有限公司 | 曾铜桥 | 本合约模板由世纪鼎利科技股份有限公司基于家禽溯源场景,贡献溯源合约的开源实现参考,包括种类注册、家禽注册、状态变更、溯源查询等主要功能。WeBASE 代码仓库:https://github.com/WeBankBlockchain/WeBASE -WeCross-Fabric2-Stub | FISCO BCOS CC-SIG组员 | 石翔、苏鹏飞、夏雨、林森、赵方鑫、肖拔赟 | 本次项目依托FISCO BCOS开源社区跨链专项兴趣小组(CC-SIG),一同建设完成了Hyperledger Fabric 2.0跨链适配器代码仓库(WeCross-Fabric-Stub)实现FISCO BCOS 与Fabric2.0的跨链适配。WeCross-Fabric2-Stub代码仓库:https://github.com/WeBankBlockchain/WeCross-Fabric2-Stub -SmartDev-Contract 智能合约库组件 | 社区开发者 | 张龙、毛嘉宇、储雨知 、曾铜桥、何结兵、高野、魏江龙、闫让南、董卅、韦鹏振、黄杰、许文杰、余昌鸿 | 为了让更多开发者参与到智能合约库组件优化,社区启动了“智能合约库有奖征码”活动。第二期智能合约库有奖征集活动,征集新增了“浮点数计算”、“金融票据”、“时间戳解析”、“内置函数”、“隐私计算”、“位操作”“积分、分发、转账类”“二维数组”、“角色合约”等合约功能。SmartDev-Contract 智能合约库组件仓库:https://github.com/WeBankBlockchain/SmartDev-Contract -WeBankBlockchain-OpenLedger | 微众银行 | 赵振华、李传庆、黎培珊 | OpenLedger聚焦链上的“用户、业务方、权益、账户和账本”,建立与实际业务匹配的账本体系,承载数字化权益的完整生命周期,以此形成多方参与的可信分布式账本。项目地址:https://github.com/WeBankBlockchain/OpenLedger -WeBankBlockchain-SmartDev区块链应用开发组件 | 微众银行 | 张龙、毛嘉宇、储雨知、王越 | "WeBankBlockchain-SmartDev包含了一套开放、轻量的开发组件集,覆盖合约的开发、编译、应用开发等环节,开发者可根据自己的情况选择相应开发工具,提升开发效率。项目地址:SmartDev-Contract 智能合约库组件https://github.com/WeBankBlockchain/SmartDev-Contract SmartDev-SCGP 智能合约编译插件https://github.com/WeBankBlockchain/SmartDev-SCGP SmartDev-Scaffold 智能合约应用开发脚手架https://github.com/WeBankBlockchain/SmartDev-Scaffold -SCStudio | 清华大学软件系统安全保障小组 | 任萌、马福辰、欧阳乐容 | SCStudio是一个针对Solidity合约的安全分析工具,可帮助开发者在开发阶段避免出现安全漏洞。项目地址:https://github.com/FISCO-BCOS/SCStudio -fisco-bcos-android-sdk | 微众银行 | 陈宇 | 开发者可在 Android 应用中通过 fisco-bcos-android-sdk实现对 FISCO BCOS 区块链的操作。项目地址:https://github.com/FISCO-BCOS/fisco-bcos-android-sdk -IOS SDK v0.8 | 微众银行 | 吴昊 | 在go-sdk中新增了mobile/ios模块,该模块可以编译得到iOS SDK , iOS开发者可以使用FISCO BCOS iOS SDK开发区块链应用。项目地址:https://github.com/FISCO-BCOS/go-sdk/tree/master/mobile/ios -csharp-sdk | 厦门哈希科技 | 林滨 | 可帮助csharp语言用户快速接入FISCO BCOS。项目地址:https://github.com/FISCO-BCOS/csharp-sdk -联盟链可信预言机Truora | 微众银行 | 何硕彦、袁鸿彬 | Truora是一套联盟链可信预言机解决方案,致力于让互联网数据安全可信地上链。项目地址:https://github.com/WeBankBlockchain/Truora-Service -区块链系统部署运维实践文档 | 微众银行 | 袁鸿彬 | 基于多年研发FISCO BCOS底层开源平台的经验,总结出的系统部署和运维实践的操作指南。项目地址:https://fisco-bcos-devops-docs.readthedocs.io/ -区块链治理通用组件 | 微众银行 | 张龙、毛嘉宇、储雨知、王越 | 区块链治理通用组件由私钥管理组件、账户治理组件、权限治理组件、证书管理组件等组件构成,提供轻量解耦、开箱即用、简洁易用、一站式的区块链治理能力。项目地址:https://github.com/WeBankBlockchain/Governance-Doc -智能合约编程语言Liquid | 微众银行 | 李陈希、白兴强 | Liquid是一套涵盖安全、性能、体验及定制能力四个设计规范的全新智能合约编程语言。白皮书同步发布,清华大学软件学院软件系统安全保障小组(姜宇、马福辰、任萌)、中山大学深圳研究院区块链与智能金融研究中心(郑子彬、孔雀屏、钟志杰、叶铭熙、苏健钟)对白皮书亦有贡献。项目地址:https://github.com/WeBankBlockchain/liquid +核心参与者:马昊滨、苏柄权 +该平台创新性地整合了联邦学习与区块链技术,实现了高效而安全的业务流程。创新提出串行+并行的联邦学习方式,巧妙提升了训练数据的多样性,减轻数据存储的压力,最大程度地保护了隐私安全。系统采用FISCO BCOS多群组部署和Ribbon负载均衡相结合,显著提升了区块链服务的处理效率与吞吐量。利用RocketMQ实现削峰确保了系统的稳定性;同时采用模型文件与文件索引分开存储的方式实现了大数据量文件上链存证的功能。通过公私钥文件实现节点可信认证,为整个系统提供了安全的基石。 +https://github.com/FISCO-BCOS/hackathon/pull/87/files -### 应用参考实现/方案贡献 -基于区块链中间件平台WeBASE的应用管理功能,社区伙伴踊跃将基于FISCO BCOS研发的区块链应用,以开源应用管理案例的形式接入到WeBASE中,贡献具体行业场景的应用开源实现参考,包括应用前后端和业务合约全部代码,以及完善的开源使用文档。 +**方案名称:基于区块链的供应链碳足迹一体化系统** -**案例名称** |**贡献方**|**核心参与者** |**案例介绍**| -| - | - |- |:-| -供应链支付结算案例 | 上海久誉软件系统有限公司 | 何结兵、吴媛媛 | 本案例由上海久誉软件系统有限公司基于FISCO BCOS研发并贡献,针对供应链支付结算场景提供完整的应用开源实现参考,包括应用前后端和业务合约全部代码,覆盖用户的注册登录、用户建链数据分成比例上链、各方签名确认、模拟支付积分下发等主要功能,并提供完善的开源使用文档。开源仓库:https://github.com/jiuyu-software/supply-chain-demo -区块链电子存证平台 | 杭州亦笔科技有限公司 | 毛超武、谭广森、金兆康 | 杭州亦笔科技有限公司基于 FISCO BCOS 上线区块链电子存证平台,并已成功应用于各省市金融机构和司法机构。此次,亦笔科技将其全数据生命周期电子数据存管与证明解决方案以开源形式接入WeBASE应用管理,开源了应用案例的前后端和业务合约全部代码,并提供完善的开源使用文档。开源仓库:https://github.com/YibiOpen/evidence-chain-demo +核心参与者:邓淏天、梁浩天、王炜杰、轩浩均、任旭豪 +传统供应链厂商通常将碳足迹数据存储在各自的本地数据库中,导致不同供应链厂商之间的数据库数据无法流通,造成了碳足迹数据难以同步的问题。本作品提出“基于区块链的供应链碳足迹一元化系统”。该系统由三个关键技术组成,包括面向区块链的细粒度访问控制技术、链上链下混合存储的体系架构以及高效的链上链下协同机制。该系统实现了各供应链厂商间数据的同步和一致,从而助力企业实现“双碳”目标。 +https://github.com/FISCO-BCOS/hackathon/pull/89/files +**方案名称:基于区块链和情感寄托的二手潮玩交易平台** +核心参与者:卢隆基、高韬、伍嘉恒、袁瑶、林佳儿 -本年度,在中国区块链开发大赛、BSN开发者大赛等众多区块链权威赛事中,涌现出不少基于FISCO BCOS的优秀参赛方案。本着回馈社区的开源精神,参赛伙伴将这些方案贡献出来,为社区用户提供区块链学习的参考与借鉴。 +本项目旨在构建更加可信、高效、安全且富有温度的二手潮玩交易平台,通过情绪寄存和原创确权提升用户体验,利用区块链技术让情感故事永远留存、原创内容受到保护,同时减少交易过程的欺诈和恶意行为,推动二手交易市场的健康发展。本项目的创新点在于让情感产生价值,保护原创作者权益,项目初期在前景广阔的二手交易市场中,聚焦于二手潮玩这个特殊的品类,用故事和商品连结买家和卖家的情感进而产生共鸣:让卖家通过情感赋值将商品卖出更高的价格;同时为最有情感需求的买家,提供情绪消费的场所。 +https://github.com/FISCO-BCOS/hackathon/pull/80/files -**方案名称** |**贡献方**|**核心参与者** |**方案介绍**| -| - | - |- |:-| -医链—面向隐私保护的医药大数据可信流转溯源解决方案 | 香港大学、香港科技大学、华中科技大学 | 王为红、陈洁、张诚儒、鄢宁 | 本方案由关山口男子职业技术学院联创分部贡献,致力于构建全时空维度视图的“链”上医疗平台。从隐私保护出发,基于密钥可重新随机化的代理重加密、零知识证明与聚合签名,提出健康记录共享方案与药企供应链溯源⽅案,⼀站式解决异地复诊、取药、授权、溯源等问题,实现健康记录可信共享,加速医药数字化⽣态落地,为医疗⼤数据价值挖掘做技术背书。了解详情:https://github.com/FISCO-BCOS/hackathon/pull/47/files -安产链-链上安全生产监督治理平台 | 中国科学技术大学 | 罗昕怡、陈鲁同、朱滨、孙文拓、徐卓、薛开平 | 本方案由安产链队贡献,该队创新性地将区块链和现代密码学技术应用于安全生产领域,建立提供可监管隐私保护的分布式统一数据共享和信用体系,实现对安评过程的强制随机审查和精确到个人的细粒度精准监管,切实解决安评行业“两虚假、两出借、监管难”三大痛点问题,提供可信、可靠、可监管的链上安全生产监督治理平台,以区块链为武器维护人民群众的生命财产安全。方案详情:https://github.com/FISCO-BCOS/hackathon/pull/46/files -亿点爱- 让隐私与公益同行 | 北京交通大学 | 伍羽放、刘煜昊、袁恩泽、赵双、周琳 | 本方案由上园村小红果队贡献,本作品旨在通过区块链构建公益众筹平台,利用隐私保护技术实现安全可信存储,保护用户个人隐私的的同时,有效防止虚假筹款和善款挪用,以此促进互联网公益众筹行业健康有序地发展。了解详情:https://github.com/FISCO-BCOS/hackathon/pull/52/files -区块链+私域流量运营SaaS服务平台 | 德德市界(深圳)科技有限公司 | 刘伟杰、谢嘉林 | 新一代私域流量运营saas服务平台通过uiapp/vue + springboot 实现应用层逻辑及页面展示,通过jsonrpc、abi,实现对FISCO BCOS链上智能合约的调用,同时可查询区块链相关信息(如块高,区块,节点连接等)。了解详情:https://github.com/FISCO-BCOS/hackathon/pull/41/files -Maskview数字版权保护平台 | 西安电子科技大学 | 初金朝、任飞、张晓瑞 | MaskView数字内容分布式确权交易链采用业界成熟可控的区块链底层平台,支持所有权与使用权分离的确权水印技术和高效可靠的溯源水印技术,集数字内容确权、授权交易、侵权检测、取证维权能力于一体,从源头解决素材确权难、司法取证难、用户维权难与自由交易难等痛点问题。该产品旨在实现数字内容供需关系再平衡,保障创作者权益和收益,降低消费者使用成本,刺激图片生产创作,同时服务于普通用户和商业用户,带动数字内容产业经济发展。了解详情:https://github.com/FISCO-BCOS/hackathon/pull/50/files -煎bing队-基于区块链的多层级信用卡风控系统 | 天津大学 | 任晓旭、曹一凡、刘铸滔、陈哲远、戴子明 | 本项目以信用卡风控这一国家重大需求为应用对象,系统地分析解决信用卡在身份认证、风险评估和金融监管等方面的新挑战, 聚焦信用卡风控“证-估-管-用”全链条的运维管理问题,提出基于区块链的多层级信用卡风控系统平台。研究分布式多方数字身份认证机制,探索如何利用区块链技术构建多中心化运行的统一身份认证; 基于区块链群组划分的联邦学习方法,实现精准的还款能力预测; 构建信用分计算以及金融监管的智能合约,实现多元化分级金融监管;最终利用FISCO BCOS底层平台搭建平台系统,实现以“链”管“卡”,“链上”风控。了解详情:https://github.com/FISCO-BCOS/hackathon/pull/59/files -蒲公英-基于联盟链的视频价值交易系统 | 成都信息工程大学 | 刘炎、张静、方杰、黄春霖 | 本项目利用联盟链为视频创作者提供了一个多中心化的视频发布方案,同时,为广告商和视频平台方之间提供了一个监管下的自由市场,平台方在系统内发布包含目标人群、投放规则等广告位信息,广告商可根据自己的需求进行选择与申请,且其广告投入费用与曝光量直接相关。本项目中采用积分作为价值计量载体。通过限定其流向,在能够为各方实现价值结算的同时破除消除了投机属性,为区块链项目落地提供了一种新的思路。方案详情:https://github.com/FISCO-BCOS/hackathon/pull/55/files -结合数字徽章的交互式区块链金融证书系统 | 南京大学、湖州师范大学、浙江工业大学之江学院、无锡太湖学院 | 汪琪、汤会枫、蒲沧龙、王宁波 | 本方案由南大-上贸大微芒小队研发并贡献,重点探索了更开放的数字证书体系的可能性、用户对自己数字身份和证书的自治在金融场景中的应用;在证书方面,用多方共治去代替原有金融机构的一方独治。方案详情:https://github.com/FISCO-BCOS/hackathon/pull/45/files +**方案名称:问链—基于区块链的ESG评级系统** +核心参与者:郑惠文、钟南海、李志远 +在可持续发展的背景下,ESG评估成为了企业可持续性的重要指标。然而,当前市场上缺乏统一、透明且高效的ESG评估平台。现有的评估工具往往面临着评分标准不一、数据不透明、易篡改、流程冗余等问题,这不仅影响了评估的公正性,也增加了企业的运营成本。因此,开发基于区块链的ESG评分系统,旨在为企业提供可靠、透明且易于操作的ESG评估解决方案,本系统在成本效率方面具有显著优势,适合各种规模的企业及评估机构、相关监管机构使用。 +https://github.com/FISCO-BCOS/hackathon/pull/83/files + +**方案名称:碳路—基于区块链的碳资产管理与可信交易方案** + +核心参与者:张帆、宋雨、肖轶涛、王青楠、申铜博 + +本方案针对碳数据采集、接入认证、碳资产交易、碳数据管理流程中存在的痛点,制定项目的解决方案,通过碳排放可信自动采集、多主体低成本接入认证、碳资产高效可信交易、碳数据动态授权管理等技术优势,提供打破碳市场资产交易壁垒、支持多元碳资产交易业务、多市场交易数据融合分析、碳资产交易与管理一体化方案。本项目使用FISCO BCOS v3.0区块链架构,前端使用VUE,后端使用SpringBoot等核心开发工具实现基于区块链的碳资产管理与可信交易一体化平台。 +https://github.com/FISCO-BCOS/hackathon/pull/92/files + +**方案名称:WeTender—适用于修建“四好农村路”的政府与企业之间的项目招标ESG治理模型** + +核心参与者:丁俞嘉、代钰堃、陈炜权、熊语嘉、盛媛 + +WeTender是一个基于FISCO BCOS底层开源平台搭建的适用于修建“四好农村路”的政府与企业之间的项目招标的区块链数据信息管理平台,充分发挥了区块链技术的不可篡改性、可追溯性以及对智能合约的支持,致力于解决在“四好农村路”建设过程中的信任问题。 +https://github.com/FISCO-BCOS/hackathon/pull/86/files + +**方案名称:基于FISCO BCOS的匿名投票系统** + +核心参与者:陈鸣远、林泽君、叶力涛、鲁宇豪、张诗洁 + +基于FISCO BCOS区块链平台搭建匿名权重投票系统,充分发挥了区块链技术的不可篡改性、可追溯性以及对智能合约的支持,致力于解决传统投票系统由中心化机构控制、不公开透明、不支持权重投票和隐私性等问题。 +https://github.com/FISCO-BCOS/hackathon/pull/91/files + +**方案名称:智慧兴农——从触网到触链,“红星苹果”特色农产品持“证”一键溯源** + +核心参与者:白琪利、李艺乐、高慧雯、陈国翠、常嘉璇 + +智慧农业特色农产品溯源系统是集物联网、云计算、数据分析、区块链技术为一体的对农业环境与运输进行感知、分析、预测、控制的物联网平台。区块链是融合了数字、密码学、互联网和计算机编程等技术,通过去中心化和可信的方式,集体维护一个可靠数据库的技术方案。首先依托部署在农业生产现场的各种传感节点实时在线采集监测生长条件等实时数据,通过websocket长连接方式采集数据传输至FISCO BCOS区块链网络云端区块链计算中心,并通过储存加密保证了运行联盟链的数据在硬盘上的安全性与可视性,形成实际农作物从种植到运输全流程追溯,通过AI分析向种植户提供科学的种植指导和赋予农作物“一物一码”,提高农作物质量的真实性,为农作物了提供精准化种植、可视化管理、智能化决策。 +https://github.com/FISCO-BCOS/hackathon/pull/90/files ### 布道贡献 -除了代码贡献与工具贡献,还有一类贡献者不吝于在各种渠道分享基于FISCO BCOS的开发经验与技术/产业观点,赋予了FISCO BCOS社区更强劲、长久的生命力和影响力,鼓励了更多人参与到生态共建中。 - -布道贡献包括但不限于在各类活动中分享FISCO BCOS相关技术、撰写文章或编制视频解析FISCO BCOS相关技术等。布道渠道不限,如果贡献名单有所遗漏,欢迎联系小助手告知我们。 - -**姓名** |**所在机构** | -| - | - | -白兴强 | 微众银行 -蔡伟鑫 | 中钞区块链技术研究院 -蔡文欢 | 深圳市网安计算机安全检测技术有限公司 -陈超 | 深圳瀚兰区块链地产 -陈晨 | 德方智链 -陈宏鸿 | 神州方圆 -陈伟杰 | 万高信息科技有限公司 -陈宇 | 社区开发者 -陈宇杰 | 微众银行 -程亮 | 上海久誉软件系统有限公司 -程阳 | 中国信通院 -储雨知 | 微众银行 -樊奇 | 链动时代 -范克峰 | 柏链教育 -房少君 | 深圳市建信筑和科技有限公司 -付佳金 | 上海新致软件股份有限公司 -高祥 | 上海久誉软件系统有限公司 -高野 | 京北方信息技术股份有限公司 -郭锐 | 微众银行 -何晟 | 金蝶软件(中国)有限公司 -何结兵 | 上海久誉软件系统有限公司 -何硕彦 | 微众银行 -贺双洪 | 微众银行 -虎振兴 | 北京大学 -黄子龙 | 社区开发者 -江杰龙 | 广电运通 -姜宇 | 清华大学 -黎宁 | 微众银行 -李骜华 | 上海对外经贸大学区块链技术与应用研究中心 -李斌 | 微众银行 -李陈希 | 社区开发者 -李海滨 | 上海新致软件股份有限公司 -李辉忠 | 微众银行 -李琨 | 桂林电子科技大学 -李龙 | 深圳市缦星链盟软件工程有限公司 -李奇富 | 博彦科技 -李胜新 | 武汉领晟旺链科技有限公司 -梁睿 | 成都如清科技 -林森 | 社区开发者 -林宣名 | 厦门哈希科技有限公司 -刘辰 | PingCAP社区 -刘靖毅 | 上海新致软件 -刘明瑞 | 安永 -刘明臻 | 微众银行 -刘希诚 | 价值互联(广州)区块链科技有限责任公司 -刘雪峰 | 西安电子科技大学 -毛岱山 | 熵链科技(福建)有限公司 -毛嘉宇 | 微众银行 -莫楠 | 微众银行 -任园 | 科大讯飞 -石翔 | 微众银行 -宋飞虎 | 深圳市建信筑和科技有限公司 -苏鹏飞 | 社区开发者 -孙海霞 | 域乎科技 -唐先杰 | 上海旺链信息科技有限公司 -陶祥忍 | 安妮股份 -王霏 | 深圳市新国都数字科技有限公司 -王琳 | 易联众信息技术股份有限公司 -王渝伟 | 北京观韬中茂(上海)律师事务所 -王越 | 微众银行 -魏江龙 | 宁夏希望信息产业股份有限公司 -向彪 | 湖南边城智能科技有限公司 -谢京杰 | 深圳市前海公证处 -谢鹏 | 虎彩印艺股份有限公司 -严强 | 微众银行 -易飞 | 浙江天演维真网络科技股份有限公司 -袁栩栩 | 安链科技 -张开翔 | 微众银行 -赵振华 | 微众银行 -周钰 | 中国银联 -朱跃生 | 北京大学 -庄虔伟 | 东北大学 +除了代码贡献与工具贡献,还有一类贡献者不吝于在各种渠道分享基于FISCO BCOS的开发经验与技术/产业观点,赋予了FISCO BCOS开源社区更强劲、长久的生命力和影响力,鼓励了更多人参与到生态共建中。 -### 贡献数据来源说明 -本期贡献者名单主要从GitHub中 FISCO BCOS代码仓库,以及FISCO BCOS Toolbox、WeBankBlockchain等社区生态项目的代码仓库中收集,统计时间周期为2021年1月1日-2021年12月30日,如有遗漏、改进建议,可联系小助手【fiscobcosfan】反馈。 +布道贡献包括但不限于在各类活动中分享FISCO BCOS相关技术、撰写文章或编制视频解析FISCO BCOS相关技术等。布道渠道不限,如贡献名单有遗漏,欢迎联系小助手告知我们。 -![](https://img-blog.csdnimg.cn/36063a1f8c44498e8969d3cf296066f9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARklTQ09fQkNPUw==,size_20,color_FFFFFF,t_70,g_se,x_16) +![](../../../_static/images/sermon_contributors_2023.png) -扫码查看季度贡献者榜单 +### 贡献数据来源说明 +本期贡献者名单主要从GitHub中 FISCO BCOS代码仓库,以及FISCO BCOS Toolbox、WeBankBlockchain等社区生态项目的代码仓库中收集,统计时间周期为2023年1月1日-2023年12月31日,如有遗漏、改进建议,可联系小助手【FISCOBCOS010】反馈。 -### 推荐阅读: -[感谢有你 | FISCO BCOS 2021年第一季度贡献榜单](https://mp.weixin.qq.com/s/d9W-SGxHWhbmkgQtdOelTw) +![](../../../_static/images/img.png) -[感谢有你 | FISCO BCOS 2021年第二季度贡献榜单](https://mp.weixin.qq.com/s/UOLiY9boNwkIf_b1oE-t9A) +扫码查看季度贡献者榜单 -[感谢有你 | FISCO BCOS 2021年第三季度贡献榜单](https://mp.weixin.qq.com/s/zsHW7_YOINevEozumBn1LQ) diff --git a/2.x/docs/community/img.png b/2.x/docs/community/img.png new file mode 100644 index 000000000..6e0aa6431 Binary files /dev/null and b/2.x/docs/community/img.png differ diff --git a/2.x/docs/community/partner_list_new.md b/2.x/docs/community/partner_list_new.md index 6bde3f033..94a1ec5c6 100644 --- a/2.x/docs/community/partner_list_new.md +++ b/2.x/docs/community/partner_list_new.md @@ -1,16 +1,19 @@ ## 合作伙伴 -**2021年度|FISCO BCOS 合作伙伴** +**FISCO BCOS 合作伙伴** 作者:小助手 -为了更好地共建开源生态,进一步推动区块链产业发展及人才培育体系建设,金链盟FISCO BCOS合作伙伴计划长期面向社区招募“产业应用合作伙伴”与“人才培育合作伙伴”。 +为了更好地推动区块链落地产业,为行业培育更多专业人才,助力区块链生态蓬勃发展,金链盟FISCO BCOS合作伙伴计划面向业界长期招募“产业应用合作伙伴”、“人才培育合作伙伴”与“生态发展合作伙伴”。 -产业应用合作伙伴将与FISCO BCOS开源社区一同共建区块链开源生态,助力技术更好落地应用,推动区块链产业发展。 +产业应用合作伙伴旨在助力区块链技术更好落地应用,推动区块链产业发展;人才培育合作伙伴将与FISCO BCOS开源社区共同携手,基于FISCO BCOS开源区块链技术,开展课程研发、人才培育与人才认证等工作,助力共建区块链人才培育体系,为产业发展提供专业技能人才;生态发展合作伙伴将与FISCO BCOS开源社区共建区块链开源生态,以坚实的基础科技支撑引领产业高质量发展。 -人才培育合作伙伴将与FISCO BCOS开源社区共同携手,基于FISCO BCOS开源区块链技术,开展课程研发、人才培育与人才认证等工作,助力共建区块链人才培育体系,为产业发展提供专业技能人才。 +自FISCO BCOS合作伙伴计划启动以来,有众多伙伴踊跃申请。截止2023年通过认证的金链盟FISCO BCOS合作伙伴共计50家(35家产业应用合作伙伴、13家人才培育合作伙伴、2家生态发展合作伙伴),为推动FISCO BCOS落地产业应用,助力区块链产业发展发挥重要作用。 +认证合作伙伴公示如下,欢迎大家添加小助手【FISCOBCOS010】了解并报名加入计划。 -现将认证合作伙伴公示如下,欢迎大家添加小助手【fiscobcosfan】报名加入计划。 +![](../../../_static/images/industrial_application_partners_2023.jpeg) + +![](../../../_static/images/talent_development_partner_2023.jpeg) ### FISCO BCOS产业应用合作伙伴 @@ -22,23 +25,38 @@ 北京版全家科技发展有限公司携手FISCO BCOS提供数字版权服务,开发的版权区块链系统联合版权监管机构、司法机构、国家授时中心、CA等提供版权确权、盗版监测、版权维权以及版权交易等一站式版权综合服务,实现创作即确权、使用即授权、发现即维权! -![](https://img-blog.csdnimg.cn/343fead6b7a643c1bf534149d224b3e5.png) +![](../../../_static/images/peer_safe.png) + +**北京众享比特科技有限公司** + +北京众享比特科技有限公司成立于2014年7月,是国内首批从事区块链底层平台和应用案例开发的技术驱动型公司之一,基于FISCO BCOS为国内外众多客户提供区块链产品和综合解决方案服务。 + +众享比特是国家高新技术企业、北京市“专精特新”中小企业、2021北京市知识产权示范单位,获得2022/2021北京民营企业中小百强、2021/2020/2019毕马威中国领先金融科技50企业、2020/2019中关村瞪羚企业等荣誉。 -**广州广电运通金融电子股份有限公司** +![](../../../_static/images/GRG_baking.png) + +**广电运通集团股份有限公司** 广电运通创立于1999年,隶属于广州无线电集团,是国有控股的高科技上市企业(证券代码:002152),主营业务覆盖智能金融、公共安全、交通出行、政务、大文旅、新零售及教育等领域,携手FISCO BCOS为全球客户提供具有竞争力的智能终端、运营服务及大数据解决方案。 公司从国内金融自助设备起步,凭借多年来积累的场景落地能力、技术研发、供应链等优势,贯彻新发展理念,聚焦金融科技和城市智能两条主线,在智能金融、智能交通、智能安全、智能便民等领域,以科技赋能传统产业升级。在海外市场,公司已建立9大全球分支机构,产品及服务已进入全球100多个国家和地区。面对新一轮科技浪潮,广电运通将继续加快区块链、人工智能、大数据、物联网等前沿信息技术与实体经济的深度融合,为建设智慧大湾区和“数字中国”贡献力量。 -![](https://img-blog.csdnimg.cn/bbf93b5ae6ea41e1976137f072cd8dcd.png) +![](../../../_static/images/one_chain.png) **广州市一链区块链科技有限公司** 广州市一链区块链科技有限公司专注于区块链技术产品与行业应用解决方案,拥有软著专利10余项,成功应用FISCO BCOS于政企 “审计监管”场景,上线“区块链数据防篡改平台”。 - 平台致力于“让天下的数据可信,没有造假”,已成功落地广汽本田、招商高速公路、安居宝等客户的审计监管场景。 -![](https://img-blog.csdnimg.cn/f3a426136533477b8561146dce75ae9f.png) +![](../../../_static/images/hucais.jpeg) + +**虎彩集团有限公司** + +虎彩集团有限公司成立于1989年,是一家集数字印刷、原浆啤酒、智慧婚拍三大业务板块于一体的集团企业,旗下拥有数十家成员企业,涵盖虎彩印艺、泰山原浆啤酒、鲜檬智慧婚拍三大品牌。总部位于东莞国家级高新技术开发区松山湖。 + +基于公司数字化和工业互联网战略,虎彩于2020年成立虎彩区块链创新应用中心,将区块链技术发展为公司工业互联网五大核心能力之一。基于FISCO BCOS,虎彩构建了包含从营销、物流、商城到内容的大量产业区块链应用,包括小虎智数营销、运力链、兑换商城、内容生态平台、统一交易结算平台和印刷链等平台,已广泛应用在虎彩实际业务中,服务超百万的合作伙伴和用户。 + +![](../../../_static/images/jinan_fountain_chain.png) **济南泉链海沃数字科技有限公司** @@ -46,13 +64,13 @@ 公司携手FISCO BCOS,提供一站式区块链应用解决方案,已推出链联金服平台、防篡改对比审查系统、专项资金监管、区块链超融合一体机、共享单车治理、社区数字化防疫、分布式大数据共享等产品,获得国内多项区块链赛事大奖。 -![](https://img-blog.csdnimg.cn/2df1a680702f4f30b7002066f8f0af44.png) +![](../../../_static/images/value.png) **价值互联(广州)区块链科技有限责任公司** 价值互联(广州)区块链科技有限责任公司(简称“价值互联”或“Value++”),成立于2017年,专注于区块链相关技术、产品的研发和销售,通过打造基于区块链技术的数据交换和流通平台,融合区块链、隐私安全计算、云计算、人工智能等先进技术,构建企业间数据交换、交易、流通和共享平台,解决企业数据互信和数据的自由流通和交换,激活企业沉睡数据,实现数据聚合升华,帮助企业迈入DT智能化时代。 -![](https://img-blog.csdnimg.cn/d701715249f140e88c17b1b8b760f349.png) +![](../../../_static/images/anhuang.png) **江苏安凰领御科技有限公司** @@ -60,19 +78,43 @@ 安凰领御于2020年11月获得了国家网信办区块链备案企业称号,2021年5月成功入选IDC区块链数字存证领域创新者。 -![](https://img-blog.csdnimg.cn/5d6e5a309d4343519f15ec191fe27c9b.png) +![](../../../_static/images/north_king.png) + +**京北方信息技术股份有限公司** + +京北方信息技术股份有限公司[股票代码:002987]作为领先的金融科技服务提供商,向以金融机构为主的客户提供软件与信息技术服务,为企业数字化建设聚势赋能。公司以大数据、云计算、人工智能、区块链、隐私计算及5G应用为引领,将前沿科技与金融业务场景深度耦合,成为行业发展的新引擎。 + +京北方基于FISCO BCOS打造了通用的区块链公共服务平台,平台拥有区块链分布式账本、加密算法、数据存储、网络协议、共识机制、智能合约、应用API接口等核心模块。该平台支持业务信息上链、金融交易、合同文件和金融数据存证服务,优化业务流程,提升系统运行效率。平台支持金融业应用,可用于供应链金融、票据管理、跨境结算、工资代发等场景。利用加密算法、公私钥体系、共识算法、时间戳等技术,平台可出具金融区块链证书,提升金融安全,相关发明专利已获得国家知识产权局专利授权。 + +![](../../../_static/images/img_1.png) + +**科大讯飞股份有限公司** + +科大讯飞股份有限公司是一家专业从事智能语音及语言技术,人工智能技术研究,软件及芯片产品开发,语音信息服务及电子政务系统集成的国家级骨干软件企业。2008年,科大讯飞在深圳证券交易所挂牌上市。 + +科大讯飞致力于面向政府、行业和用户,构建一套基于区块链的数字身份、公共数据共享、智能感知的新型区块链基础设施,实现对数据要素的全面互联,解决数据跨地域、跨行业、跨系统的可信流通,推动数字经济变革。公司携手FISCO BCOS,提供区块链基础设施平台和区块链应用解决方案,已推出开放联盟链服务、存证溯源平台、版权保护系统、供应链金融融资平台等。 + +![](../../../_static/images/andlinks.jpeg) **南京安链数据科技有限公司** 南京安链数据科技有限公司是国内专业、领先的区块链公司,研发方向覆盖区块链、大数据分析等领域,已成功应用FISCO BCOS于物流、金融、溯源、存证等多业务场景,大幅降低区块链应用层开发成本。 -![](https://img-blog.csdnimg.cn/332ceb0c12fb403fb1a56226753c5327.png) +![](../../../_static/images/ctk.jpeg) + +**厦门哈希科技有限公司** + +厦门哈希科技有限公司成立于2018年4月,隶属于北京哈希数道集团,是中关村北京绿色碳汇研究院理事单位,是致力于碳汇全产业链及生态价值开发与服务的绿色生态科技公司。 + +公司坚持自主创新、掌握自主核心技术,以GEP为切入点,基于区块链底层平台FISCO BCOS,先后打造多个国家级、省级、市级生态价值开发及碳中和体系建设,通过林业碳汇、碳普惠等串联碳汇生态产业链,助力数字化转型,赋能碳市场交易,拓展“两山”转化通道,引领绿色低碳产业体系。将数字化的“绿水青山”变成真正价值的“金山银山”,为各地方政府职能机构及金融资源体提供全链条生态价值服务。 + +![](../../../_static/images/shangchain.jpeg) **熵链科技(福建)有限公司** 熵链科技(福建)有限公司是一家专注于产业数字化应用的综合服务商。公司于2017年率先布局区块链技术,搭建领先的区块链产业生态服务平台,为产业数字化发展提供先进的区块链解决方案。针对区块链供应链金融、农业溯源、分布式商业、数据存证与数据资产化等领域拥有自主的技术解决方案。熵链科技作为福建省区块链协会首任会长单位以及BSN福建省区块链主干网指定唯一运营商,汇聚全球领先区块链产业资源,具有专业的实践应用和市场拓展服务能力。 -![](https://img-blog.csdnimg.cn/58e8010398fb4754b9324b72cd79face.png) +![](../../../_static/images/jiuyu.png) **上海久誉软件系统有限公司** @@ -80,7 +122,26 @@ 携手FISCO BCOS,上海久誉围绕支付清算、消费交换两大核心技术,在卡基业务、移动支付、城市公交“一卡通”、“一票换乘”资金清分清算、智能终端、数据服务等行业领域拥有一流技术;公司集行业知识、应用开发、系统集成、运营管理、项目实施和增值服务为一体,坚持“自主创新、自有品牌、立足上海、辐射周边”的发展战略,在金融电子化、社会信息化等行业领域,为客户提供行业解决方案、系统集成服务及机具销售。公司在成立近5年时间内已获得二十三项项软件著作权和十七项软件产品认证证书。 -![](https://img-blog.csdnimg.cn/289b2382adc840369106d00dcc42ad08.png) +![](../../../_static/images/img_2.png) + +**上海碳抵信息科技有限公司** + +上海碳抵信息科技有限公司是一家专注于碳中和数字化的金融科技公司。公司长期深耕金融数字化服务业,在软件及小程序开发,数字化及运营管理等方面具备较强能力。 + +目前,公司战略聚焦于“碳中和数字化”与“协同低碳”,致力于通过SaaS平台为政府及企业提供快速便捷的碳减排、碳中和服务,以及助力碳普惠体系建设运营、低碳数据增信等多元服务。 + +基于区块链底层平台FISCO BCOS,公司打造了碳低链服务平台,为科技赋能低碳减排提供了新的实践探索思路。碳抵科技的合作伙伴包括多家低碳领域专业机构,服务客户包括多家大型公司以及多个大中型会议。 + +![](../../../_static/images/img_3.png) + +**上海旺链信息科技有限公司** + +上海旺链信息科技有限公司成立于2016年,是高速成长的国家高新技术企业、国家工信部区块链重点实验室成员单位,总部位于上海,在宁波、合肥、长沙、西安、雅加达、新加坡设有分公司。2018年,荣登工信部赛迪区块链“中国区块链企业百强榜”;2020年,荣膺“亚洲创新企业Top10”;2022年,入选“2022中国产业区块链100强”。 + +旺链科技以数据中心运营、云计算为依托,自研云管平台和云操作系统,为全球客户提供前沿的高新技术解决方案,包括智慧农业、区块链溯源、供应链金融、工业互联网、边缘计算、元宇宙模型渲染、高速分布式存储、自治组织管理等多个应用场景,已成功服务包含航空、政府、金融、能源、农业、医疗、教育、房地产、快消和汽车等在内的数十个行业数百家客户。 +旺链科技和FISCO BCOS一直保持良好的合作关系,基于FISCO BCOS研发了VoneBaaS区块链基础服务平台;公司也持续参与社区建设,多次荣登FISCO BCOS贡献榜单。 + +![](../../../_static/images/newtouch.png) **上海新致软件股份有限公司** @@ -88,26 +149,62 @@ 公司依托20多年服务金融行业的实践经验,基于云计算、大数据、人工智能、区块链四大基础实验室的研发能力,为金融客户提供包括渠道、核心、数据、管理等全面的信息化解决方案,满足金融客户实现智能化、安全合规、业务多样化等需求,连续多年在中国保险业、银行业IT解决方案市场份额中占据领先地位。同时,公司的相关产品及服务已广泛应用于电信、医疗、汽车等诸多领域,赢得包括中国太保、中国人寿、中国人保、交通银行、建设银行、中国银联、中国电信、上海汽车、复星集团等众多优质客户。 -![](https://img-blog.csdnimg.cn/2c768788331843469936a1796277d2ff.png) +![](https://img5.tianyancha.com/logo/product/b75785ccf33885df0c815de4129a697c.png@!f_200x200) + +**上海信医科技有限公司** + +上海信医科技有限公司,是坐落在上海区块链生态谷的医疗区块链与大数据领军企业,是国家卫健委及上海、山东、湖北、浙江、四川、江西等多省市医疗区块链的核心成员与技术支撑单位;也是多家企业及多个健康医疗大数据中心等主流平台的合作伙伴。 + +信医科技为多家医疗平台的建设提供FISCO BCOS区块链技术支持,包括“信医链电子病历夹应用”、“基于区块链的商业保险结算与审核支撑服务”、“基于区块链的中药饮片流转质量服务与监管平台”等。公司参与广州国家实验室、上海申康、国家健康医疗大数据(北方)中心多个专病库与科创大数据平台建设,覆盖近百个专病库。 + +![](../../../_static/images/huyu.png) **上海域乎信息技术有限公司** 上海域乎信息技术有限公司是一家以区块链技术为核心的高新技术企业,专注于区块链技术与数字资产服务,2018年通过工信部区块链系统功能测试,曾参与工信部物联网区块链蓝皮书和区块链技术安全标准编写。域乎应用FISCO BCOS实现农业数字化,确保数字农业主体身份和数据可信,助力企业、政府、银行等机构实现可信数据共享。 -![](https://img-blog.csdnimg.cn/fef9f8c1236f45389ea7f8ffee06ed04.png) +![](../../../_static/images/lanfanglian.png) **深圳市瀚兰区块链地产有限公司** 深圳瀚兰区块链地产有限公司基于区块链帐本管理技术自主研发互联网平台兰房链,由成熟的区块链底层技术及海内外区块链专家团队提供技术支持,实现一种“非接触”式的可信赖的新型房地产商业模式,在房地产开发行业中建立信用及价值体系,立足数字经济,打造的房地产数字化运营管理SaaS工具,解决房地产开发中的痛点,为房地产行业上下游企业提质增效。 -![](https://img-blog.csdnimg.cn/c987946337474f24a1a790e2f90c3276.png) +![](../../../_static/images/green_credit_tech.png) + +**中碳绿信科技(深圳)有限公司** + +中碳绿信科技(深圳)有限公司成立于2018年5月17日,是中国碳中和发展集团旗下专注于以区块链赋能双碳经济的国家高新技术企业。 + +绿信科技为产业打造跨组织协同、驱动价值共识、提炼数字资产的金融级可信协同网络-绿信链。通过降低区块链技术的使用门槛与成本,促进全球更多企业和个体基于区块链建立数字信用,实现商业创新,连接绿色金融。 -**深圳市建信筑和科技有限公司** +![](../../../_static/images/XGD.png) -深圳市建信筑和科技有限公司是深圳市建筑科学研究院股份有限公司(300675.SZ)旗下控股科技公司,应用FISCO BCOS助力建筑业数字化,为项目管理者提供具有穿透式管理、信息透明、责任可溯、信用评价的超轻量项目全过程透明管理系统。 +**深圳市新国都数字科技有限公司** + +深圳市新国都数字科技有限公司成立于 2016 年,是上市公司新国都股份(300130) 旗下公司。新国都数科依托数字科技能力,形成了数字政企、数字征信、数字安全、数字用工四大核心业务板块,主要提供数据治理、数据产品、数据应用开发、数据资产运营、数据安全等服务。 + +新国都数科坚持以“数据资产运营商”为使命,以大数据、人工智能、区块链技术为核心,携手FISCO BCOS在区块链底层平台、隐私计算等领域开展合作,提供数据分析、平台技术、区块链产品和运营服务,为政府、金融机构、国有企业提供数字化服务综合解决方案,致力于为社会诚信体系建设做出贡献。 + +![](https://storage-public.zhaopin.cn/org/logo/1644992846111082045/7bf6f160950405e91717b28e1d89586b330aa8db533bb5d2452c2f62b5a38136fa86a38250e8e3ab.jpg) + +**数金公共服务(青岛)有限公司** + +数金公共服务(青岛)有限公司是一家数字金融科技企业,是数字人民币试点落地机构和标准组成员企业,业务涉及绿色低碳及数字金融等领域。公司深度参与数字人民币试点推广过程中的技术研发、产品创新、运营拓展、资源协同以及生态建设等服务,为政府、企业以及金融机构接入数字人民币系统、开展数字人民币活动提供“场景+技术+服务”支持,推动数字金融科技生态构建和产业升级。 + +公司携手FISCO BCOS 围绕个人碳普惠领域推出了场景化解决方案,包括利用区块链做数据的可信存证,解决数据的多方信任问题;链接碳普惠的各参与方,构建一个开放、共创、可信的碳普惠联盟链生态。 + +![](../../../_static/images/digit_guangdong.jpeg) + +**数字广东网络建设有限公司** + +数字广东网络建设有限公司作为广东省数字政府建设运营中心和中国电子二级机构,坚持数字政府公益性、基础性、平台性、保障性定位,聚焦数字政府公共服务、基础设施、平台建设、安全防护等主责主业,有力支撑广东省经济社会高质量发展,有力推进治理体系和治理能力现代化,为积极探索中国式现代化的广东路径作出了重要贡献。公司目前拥有近3000名员工,其中技术类人员占比超过七成。 + +数字广东公司现已建成省市一体化的政务云平台、一网共享平台和公共支撑平台,持续夯实数字政府基础底座,并打造了粤省事、粤商通、粤政易、广东政务服务网、“一网统管”粤治慧平台、粤公平等一系列数字政府改革建设重要成果,全面支撑广东数字政府改革建设事业走在全国前列,在改善民生服务、优化营商环境、提升政府治理能力现代化等方面发挥了重要作用。数字广东将携手FISCO BCOS持续探索区块链在智慧政务领域的应用场景。 ![](https://user-images.githubusercontent.com/93572056/155054328-57752ba6-e40d-42d5-bfba-888d83c5fd73.png) +**四川虹信软件股份有限公司** + 四川虹信软件股份有限公司是四川长虹旗下旗舰企业之一,历经十余年高速发展,成为拥有四大核心能力的高新技术企业,专注于智慧企业、智慧城市、军民融合三大业务领域前沿IT技术研发、咨询与实施。借助在智能家居领域的优势,长虹携手FISCO BCOS建立可信互联物联网,虹信软件承担身份认证模块,利用FISCO BCOS证书认证体系,完善物联网中群组/节点准入验证机制,为跨品牌智能家居场景提供可信数据基础。 ![](https://user-images.githubusercontent.com/93572056/155054716-90294c2f-831d-4385-b5d1-7917baabce09.png) @@ -118,7 +215,15 @@ 公司核心团队由海外归国专家及世界500强企业管理者组成,拥有多项知识产权和优质合作伙伴。 -![](https://img-blog.csdnimg.cn/2662383423db48dc8892d3b1c29f45ad.png) +![](../../../_static/images/taikang_pension.jpeg) + +**泰康养老保险股份有限公司** + +泰康养老保险股份有限公司是由泰康人寿保险股份有限公司和泰康资产管理有限责任公司共同出资成立的全国性、股份制专业养老保险公司。业务范围涵盖团体保险、企业年金、个人养老保险三大领域。目前在全国已成立了23家分公司及9家企业年金中心。 + +泰康养老作为国内五家专业养老保险公司之一,始终奉行“专业化、规范化、国际化”的发展战略,携手泰康资产,依托泰康人寿十七年丰富的员工福利及补充养老保险管理经验,坚持“以客户为中心、以价值为导向,做强员福、做大年金”的经营策略,致力于为广大企业和企业员工提供团体寿险、意外伤害险、短期健康险、团体养老险、企业年金、个人养老险全方位的员工福利计划和一站式服务,用专业的服务做市场上最好的企业员工福利解决方案的好管家。泰康养老已基于FISCO BCOS落地多个应用,未来将继续携手FISCO BCOS针对保险健康管理场景探索更多解决方案。 + +![](../../../_static/images/infomacro.png) **万高信息科技有限公司** @@ -126,13 +231,14 @@ 目前公司已接受FISCO BCOS专业培训的人员有8人,并计划让更多的人员接受FISCO BCOS的专业培训。万高专注移动及数据应用程式开发,2019年疫情期间,成功采用FISCO BCOS技术开发澳门健康码供澳门政府应对疫情,并助力粤澳两地健康码在2020年5月实现跨境互认。迄今,粤澳健康码跨境互认系统已服务上亿人次通关。 -![](https://img-blog.csdnimg.cn/b887aab7a31f4711aece65fd258201c0.png) +![](../../../_static/images/liandong.png) **武汉链动时代科技有限公司** 武汉链动时代科技有限公司携手FISCO BCOS解决区块链应用开发“最后一公里”问题,研发的“inBC区块链存证服务系统”对链上数据进行格式化协同,实现区块链存证一键触达;”Falcon零代码开发平台” 通过图形化拖拽、参数配置等即可高效完成系统搭建和部署。 -![](https://img-blog.csdnimg.cn/e70b73e27d6e43b8859ba1adb75c4010.png) + +![](../../../_static/images/lingsheng.png) **武汉领晟旺链科技有限公司** @@ -140,33 +246,61 @@ 同时,公司获批成为工业和信息化重点领域(区块链)人才能力评价机构,目前已获得区块链相关软著15项,已申报了8项专利。 -![](https://img-blog.csdnimg.cn/be9d01ea303a4e3cb2a3d3b0787995c0.png) +![](../../../_static/images/yeepay.png) + +**易宝支付有限公司** + +易宝支付成立于2003年,是首批获得中国人民银行《支付业务许可证》的第三方支付机构。2006年易宝创立B端行业支付模式,为企业客户提供集技术、产品、服务为一体的一站式数字化交易服务解决方案。目前,易宝已累计服务超过百万家商户,覆盖航空、旅游、零售、能源、汽车、互联网3.0、跨境、金融、政务、本地生活等众多行业头部客户,业务规模位居行业前列。 + +公司基于FISCO BCOS孵化了极速不卡顿的交易级联盟链——亿链,亿链首创支付节点合约规则,并引入公信力节点,可保障数字资产永久留存、可信流通。通过打造聚焦Web3.0经济系统的技术底座,持续为企业客户提供极速、安全、稳定的链上交易解决方案,构建生态共融的开放联盟链,引领Web3.0可信生态的升级跃迁。 + +![](../../../_static/images/yilianzong.png) **易联众信息技术股份有限公司** 易联众信息技术股份有限公司是国内民生信息服务领域上市公司。自2000年成立以来,易联众牢记“让天下没有难过的人生”的企业使命,以大数据为驱动,重点围绕“医疗保障、卫生健康、人力资源和社会保障”等民生领域,提供全方位的整体解决方案和产品与技术服务体系。公司充分利用大数据、区块链及人工智能等技术,持续研发并提升产品创新能力,推动主营业务数字创新。 -![](https://img-blog.csdnimg.cn/a90c74530b7b4d39b237b220fe767499.png) +![](../../../_static/images/evotrue.png) + **浙江天演维真网络科技股份有限公司** 浙江天演维真网络科技股份有限公司是全国领先的乡村振兴数字化服务整体解决方案提供商,成功应用FISCO BCOS于农业全过程溯源,目前正在融合区块链与物联网技术研发智慧农业云平台、探索区块链+农业金融应用场景。 +![](../../../_static/images/chinatower.png) + +**中国铁塔股份有限公司** + +中国铁塔股份有限公司是由国务院推动成立的国有大型通信基础设施服务企业。主要从事通信铁塔等基站配套设施和高铁地铁公网覆盖、大型室内分布系统的建设、维护和运营,同时依托独特资源面向社会提供信息化应用和智能换电、备电、充电等能源应用服务,是我国移动通信基础设施建设的“国家队”和5G新基建的“主力军”,是全球最大通信基础设施服务商。 + +中国铁塔入选2019年《财富》全球未来50强(排名第22位)和全球数字经济100强(排第71位),2018-2020连续三年被评为中国证券金紫荆奖“最具投资价值上市公司”,在第十一届中国证券金紫荆奖中荣获“十四五最具投资价值上市公司”特别大奖。 + +中国铁塔聚焦自主可控区块链技术研发,具备FISCO BCOS开发能力,正在基于FISCO BCOS开源技术建设区块链管理平台。中国铁塔也致力于区块链应用研究,开展的“区块链+税务”的研究成果获得国资委主办的首届“国企数字场景创新专业赛”大赛一等奖,业务模式受到社会各界关注与国内外权威媒体报道。 + +![](../../../_static/images/img_5.png) + +**中金数据(武汉)超算技术有限公司** + +中金数据(武汉)超算技术有限公司成立于2016年,位于武汉市国家网络人才与创新产业基地,是一家主要以数据中心外包与运维服务为基础,对外开展云计算、区块链、网络与信息安全、超级计算、系统集成等信息技术服务业务的高新技术企业,同时,也是武汉市科技“小巨人”企业、武汉市“瞪羚”企业,并获得武汉市大数据企业20强、武汉市软件与信息技术百强企业等资质荣誉。 + +公司携手FISCO BCOS提供国内领先的安全数据底座和可信数据服务。公司基于云计算和区块链底层技术搭建的中金数据云链平台,面向用户提供纵贯数据中心、云计算、大数据、区块链的开发、部署、应用的一体化服务,被评为湖北省发展和改革委员会2022年数字经济试点示范项目、入选“2022年湖北省区块链十大优秀应用案例”。 + ### FISCO BCOS人才培育合作伙伴 (下列根据公司名称首字母排序) -![](https://img-blog.csdnimg.cn/7b143cb03f484ac2b4864461bb928fec.png) +![](../../../_static/images/babite.png) **巴比特学院** 巴比特是国内领先的区块链信息与技术服务商,已发展成集资讯内容、线下活动、培训、孵化器、投资和区块链技术落地应用于一体的生态体平台。巴比特学院是巴比特旗下教育培训品牌,携手FISCO BCOS打造区块链人才高地,向社会输送优质区块链人才。 -![](https://img-blog.csdnimg.cn/a459dafa03f045b3a8be2b673f54e5b3.png) + +![](../../../_static/images/palliums_edu.png) **北京柏链道捷教育科技有限公司** 柏链教育是国内领先的区块链及数字化教育人才服务机构,入选工信部重点领域人才评价和能力提升任务承担单位,携手FISCO BCOS推出《区块链工程技术系列认证课程》,学员通过认证考试可获得国家级区块链技术证书。 -![](https://img-blog.csdnimg.cn/251b477e43f242ada74c97ee83ea5718.png) +![](../../../_static/images/zhiguxingtu.png) **北京智谷星图教育科技有限公司** @@ -174,13 +308,38 @@ 智谷星图的团队成员多数来自美国硅谷,拥有成熟的新技术研发能力,包括区块链底层技术积累。同时,产品及教研团队则拥有丰富的教育行业从业经验,顾问团队来自斯坦福大学、卡耐基梅隆大学等知名高校。依托于强大的硅谷产学研资源及全球产业合作方,智谷星图紧扣产业发展趋势,用新技术推动高等教育的进步,力求培养具有国际化视野及实践能力的综合型人才。 -![](https://img-blog.csdnimg.cn/00d7bbf0c5a24a13af8dc63bde12dbcc.png) +![](../../../_static/images/img_6.png) + +**广东中创智慧科技有限公司** + +广东中创智慧科技有限公司成立于2018年,从事数字经济产教融合的业务。公司是广东省发改委评定的产教融合型企业、广东省产教融合促进会副会长单位,以数字经济产教融合专家为定位。中创智科通过自身优势资源,以及强大的整合能力,发展数字经济产教融合的业务,为广东省各类院校的专业建设和人才培养提供最优产教融合解决方案。包括:区块链、大数据、人工智能、信创、网络安全、工业互联网六个领域,与广东省今年7月8日发布的《广东省数字经济发展指引》中重点发展的数字经济新兴产业高度契合。 + +中创携手FISCO BCOS支持了2022年度教育部区块链国家级培训计划项目,支持了深圳市人社局区块链应用操作员赛项,同时,也是广东省人社厅区块链应用操作员赛项唯一技术支持单位,广东省教育厅区块链技术应用赛项唯一技术支持单位。 + + +![](../../../_static/images/img_7.png) + +**教链科技(深圳)科技有限公司** + +教链科技(深圳)有限公司是国际领先的区块链教培产品及应用解决方案供应商,致力于构建数字化时代的职业教育培训基础设施。教链科技专注于区块链人才发展的专业服务,提供创新课题申报、学科专业共建、区块链培训课程、国家区块链人才技能等级认证培训、实训游学营和师资培训等服务。 + +秉着“让每位区块链从业者都拥有中高级技能职称”的愿景,教链科技已经发布了《区块链应用操作员》职业培训教材,承办了国内多期区块链应用操作员职业培训,其区块链在线实训平台已通过国家工业和信息化部备案。教链科技拥有目前国内最大的区块链应用操作考试题库以及培训课程资源,基于FISCO BCOS开发的应用系统已对超过8000件的区块链课程进行版权上链保护,也是广东、海南、浙江、上海、安徽等全国多个省市的区块链职业认证合作伙伴。 + +![](../../../_static/images/chainHR.png) **链人国际咨询(北京)有限责任公司** 链人国际服务G端、B端、C端,是中国领先的区块链产业人才综合服务商,三部委区块链人才认证服务商,工信部人才交流中心区块链产业人才研究所运营方,拥有院士科学家人才库、从业者人才库和师资人才库。已在高校公开课、区块链开发工程师(周末班)、《企业级联盟链原理及应用》线上课中培训FISCO BCOS区块链。 -![](https://img-blog.csdnimg.cn/74bf4a085db14dd1b45ee95ab1bfd3b4.png) +![](../../../_static/images/IBWEDU.png) + +**南京秉蔚信息科技有限公司** + +南京秉蔚信息科技有限公司聚焦区块链、人工智能、大数据新工科专业工程实践能力建设。与全球知名产业企业合作,以岗位技能需求为设计出发点,为高校提供泛IT领域的专业课程资源库,以真实商业案例实现过程为蓝本,为院校提供案例数据、实验实训手册以及实验实训环境,并和高校教师组成混编师资为学生提供专业技能实训教学服务,是“互联网+教育”领域的综合人才培养解决方案提供商,助力高校建设产学融合的新工科教育新生态。 + +公司坚持以赛促教、以赛促学,积极参与高校相关赛事。2023年联合微众区块链作为技术支持单位支持“中国大学生计算机设计大赛-区块链应用与开发”赛道,围绕FISCO BCOS及其周边组件进行赛道命题。目前公司已与全国100余所高校有过深度合作。 + +![](../../../_static/images/FCBlockchain.png) **前海丰创区块链(深圳)有限公司** @@ -188,7 +347,15 @@ 目前公司已培养了首期区块链行业产品经理、区块链金融行业工程师等行业领军人才,学员遍及山东、山西、河南、河北、安徽、江苏、浙江、广东、湖南、湖北、北京、上海等25个省份(直辖市),涵盖传统行业中高层管理者、区块链爱好者、应届大学生等 。 -![](https://img-blog.csdnimg.cn/11a2ddd3eb014d0f8fbfb0015d6fb77c.png) +![](../../../_static/images/digQuant.png) + +**深圳点宽网络科技有限公司** + +深圳点宽网络科技有限公司是一家致力于协助高校实现交叉学科建设的教育科技公司,主要在金融科技领域协助高校培养“金融+科技”的复合人才。公司为高校相关专业提供课程、实训系统、专业建设解决方案以及共建金融科技产业学院。点宽以自主研发的课程产品和实训系统产品为依托,目前已自研金融科技相关课程超400个小时,全自主研发行业实训系统6套,协助高校的经济管理、数学统计、金融工程和金融数学等专业实现金融科技人才培养服务。 + +公司携手FISCO BCOS,落地了面向高校区块链专业人才培养的BCW v1.0区块链编程实践平台,用于区块链专业知识学习和智能合约编程实践。创新项目CERX研学资源交换平台正在研发中,该平台是一个基于FISCO BCOS区块链技术的分布式研学资产交换网络,其目标是在高校之间创建一个数据、算法模型、论文和课程的数据资产流转平台,公司首席架构师曾凭对社区的贡献荣获FISCO BCOS年度MVP。 + +![](../../../_static/images/firelinks.png) **深圳市火链教育科技有限公司** @@ -196,18 +363,42 @@ 公司主要的产品与业务包括,为政府提供区块链技术支持与咨询服务,构建区块链生态结构,赋能地方经济;为企事业单位输出技术服务,主导或参与DApps开发;与全国各大高校合作建立区块链学院,开设区块链专业,并面向社会招生。 -![](https://img-blog.csdnimg.cn/59e3af34a51a4117baf6a32b6d47bfdd.png) +![](../../../_static/images/shenzhen_polytechnic.png) + +**深圳职业技术学院** + +深圳职业技术学院2019年起开办区块链技术应用专业,并面向全国招生,以FISCO BCOS国产开源区块链为技术主线,成立区块链与数字经济研究所和FISCO BCOS区块链人才培育SIG,深化区块链部署运维、智能合约编程、工程项目开发等能力的培养,为区块链产业输送高素质技术技能人才。多名学生在国家及省市各类区块链比赛中获得10余项大奖,其中2名学生荣获FISCO BCOS年度MVP。 + +![](../../../_static/images/tencent_edu.png) **腾讯教育腾实学院** 腾实学院是腾讯教育旗下的学院,提供全面、最新的教育人才培养解决方案,学院切实推动教育部关于“世界一流大学和一流学科”、“特色高水平高职学校和专业”建设的宏伟目标,涵盖区块链、人工智能、大数据等十大领域课程内容。去年开始,腾实学院与FISCO BCOS展开培训领域广泛合作。 -**推荐阅读:** +![](../../../_static/images/img_9.png) + +**西南林业大学** + +西南林业大学建设有云南省供应链管理区块链工程研究中心和云南省高校供应链管理区块链创新团队,承担了多项区块链领域的国家级项目和省部级重大项目,其研发的安全可控区块链基础服务平台“西林链”已在跨境贸易、数字烟叶、供应链和绿色食品溯源等多个领域进行应用。中心和团队携手FISCO BCOS提供区块链产品、技术研发和人才培养等服务,助力政府和企业的数字化转型。 + +“西林链”于2022年3月通过了国家网信办第七批境内区块链信息服务备案,2022年5月通过了中国电子技术标准化研究院“区块链系统功能测试”和中国合格评定国家认可委员会(CNAS)认证 + +### FISCO BCOS生态发展合作伙伴 + +(下列根据公司名称首字母排序) + +![](../../../_static/images/beijing_blockchain_application_association.png) + +**北京区块链技术应用协会** + +北京区块链技术应用协会是中国首家区块链应用协会,于2016年正式发起成立,是依法在民政部门注册,在北京市投资促进服务中心指导成立的非营利性专业性社会组织。协会基于“政策引导、理论研究、场景应用、资本接入、技术实践“的全业务链整合原则,利用丰富的社会资源,与国内一流高校科研院所、国内外知名企业及核心会员单位共同构建政、产、学、研、用一体的区块链生态体系,旨在通过区块链集聚行业资源,跨界融合推进区块链发展,促进先进技术的创新与发展。 + +协会携手FISCO BCOS在区块链行业赛事、生态交流、人才培养等多方面开展合作,推动技术成果落地应用,营造产业发展良好生态,加快推动区块链蓬勃发展。 -[FISCO BCOS合作伙伴计划正式启动,火热招募中](https://mp.weixin.qq.com/s/BXiNVs-OBY3AD13NI8gF_Q) +![](../../../_static/images/sichuang_blockchain_association.jpeg) -[首批FISCO BCOS合作伙伴公示](https://mp.weixin.qq.com/s/JAm14f7LzHO8gDRe_LXjbw) +**四川省区块链行业协会** -[公告 | FISCO BCOS新增9家合作伙伴](https://mp.weixin.qq.com/s/p7Mv3X18h6099sHpfoOVJg) +四川省区块链行业协会是在四川省经济和信息化厅的指导下,在四川省民政厅登记注册成立的社会团体。协会成立旨在推动四川区块链与实体经济融合发展,加强行业企、事业单位和个人之间的合作与联系,加速区块链技术的应用,发展四川区块链产业、积极推动本土企业开拓国内外市场,并发挥协会的纽带作用,起到推进四川省区域内区块链产业的良好发展作用。 -[公告 | FISCO BCOS新增6家合作伙伴](https://mp.weixin.qq.com/s/TI_M5pbBhb0utu0jf6e3hA) +蜀信链是在四川省经济和信息化厅指导下,在四川省区块链行业协会组织下,由全省区块链相关从业与应用机构共同参与建设和运营的区域性区块链基础设施,目前已适配FISCO BCOS。协会将携手FISCO BCOS开源社区,通过多方协同共同打造合作共赢的区块链产业生态。 diff --git a/2.x/docs/compatibility.md b/2.x/docs/compatibility.md index c617a8294..f03bccbe1 100644 --- a/2.x/docs/compatibility.md +++ b/2.x/docs/compatibility.md @@ -52,7 +52,7 @@ Git Commit : 07f3ca4fa727300290113c8ba339db27b6516864 | spring-boot-starter | Gradle SpringBoot 应用示例 | v2.9.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/master-2.0) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/master-2.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/master-2.0) | | | spring-boot-crud | Maven SpringBoot 应用示例 | v2.9.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/master-2.0) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/master-2.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/master-2.0) | | generator | 企业区块链部署工具 | v1.9.0 | [文档]() | [github](https://github.com/FISCO-BCOS/generator) | [gitee](https://gitee.com/FISCO-BCOS/generator) | -| WeBASE | 区块链中间件平台 | v1.5.4 | [文档](https://webasedoc.readthedocs.io/zh_CN/latest) | [github](https://github.com/WeBankBlockchain/WeBASE) | [gitee](https://gitee.com/WeBank/WeBASE) | +| WeBASE | 区块链中间件平台 | v1.5.5 | [文档](https://webasedoc.readthedocs.io/zh_CN/latest) | [github](https://github.com/WeBankBlockchain/WeBASE) | [gitee](https://gitee.com/WeBank/WeBASE) | | WeCross | 跨链协作平台 | v1.2.1 | [文档](https://wecross.readthedocs.io/zh_CN/latest) | [github](https://github.com/WeBankBlockchain/WeCross) | [gitee](https://gitee.com/WeBank/WeCross) | | WeIdentity | 分布式身份解决方案 | v1.8.5-rc1 | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | WeBankBlockchain-Data-Export | 数据导出组件 | v1.7.7 | [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Export/index.html) | [github](https://github.com/WeBankBlockchain/Data-Export) | [gitee](https://gitee.com/WeBankBlockchain/Data-Export) | @@ -76,36 +76,42 @@ FISCO-BCOS 3.0.0 及之后的版本之间相互兼容。FISCO-BCOS 3.0.0-rc的 - [v3.0.0-rc2](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-0-0-rc2) - [v3.0.0-rc3](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-0-0-rc3) - [v3.0.0-rc4](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-0-0-rc4) -- [v3.0.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-0-0) -- [v3.1.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-1-0) +- [v3.0.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-0-x) +- [v3.1.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-1-x) +- [v3.2.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-2-x) +- [v3.3.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-3-x) +- [v3.4.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-4-x) +- [v3.5.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-5-x) +- [v3.6.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-6-x) +- [v3.7.0](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-7-x) #### 3.2.1. FISCO-BCOS v3.0.0-rc1 -| 项目 | 功能简介| 版本 | 文档 | github | gitee | 备注 | -| ---------------| -----------|-------- |----------|--------|---------|------- -| FISCO-BCOS | 区块链底层平台 | v3.0.0-rc1 | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/v3.0.0-rc1/) | [github](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/v3.0.0-rc1) | -| Solidity | Solidity智能合约 | v0.8.11 | [文档](https://docs.soliditylang.org/en/v0.8.11) | | | **最高支持solidity v0.8.11** -| JavaSDK | Java语言SDK | v3.0.0-rc1 | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/v3.0.0-rc1/docs/develop/sdk/java_sdk/index.html) | [github](https://github.com/FISCO-BCOS/java-sdk/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk/tree/v3.0.0-rc1) | -| GoSDK | Go语言SDK| 暂不支持
后续版本规划 | | | | -| PythonSDK | Python语言SDK | 暂不支持
后续版本规划 | | | | -| 控制台(console) | 交互式命令行工具 | v3.0.0-rc1 | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/v3.0.0-rc1/docs/develop/console/index.html) | [github](https://github.com/FISCO-BCOS/console/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/console/tree/v3.0.0-rc1) | -| java-sdk-demo | Java压测工具 | v3.0.0-rc1 | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/v3.0.0-rc1/docs/develop/stress_testing.html) | [github](https://github.com/FISCO-BCOS/java-sdk-demo/tree/3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk-demo/tree/v3.0.0-rc1) | -| spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0-rc1 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc1#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc1) | -| spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0-rc1 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc1#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc1) | -| generator | 部署运维工具 | 不支持 | | | | -| WeBASE | 区块链中间件平台 | lab-rc1 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab-rc1/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/lab-rc1) | [gitee](https://gitee.com/WeBank/WeBASE/tree/lab-rc1) | -| WeCross| 跨链协作平台 | 暂不支持
后续版本规划 | | | | -| WeIdentity | 分布式身份解决方案 | 不支持 | | | | -| WeBankBlockchain-Data-Export| 数据导出组件 | 不支持 | | | | -| WeBankBlockchain-Data-Stash | 数据仓库组件 | 不支持 | | | | -| WeBankBlockchain-Data-Reconcile | 数据对账组件 | 不支持 | | | | -| WeBankBlockchain-SmartDev-Scaffold | 应用开发脚手架 | 不支持 | | | | -| WeBankBlockchain-SmartDev-SCGP | 智能合约编译插件 | **适配中** | | | | -| WeBankBlockchain-SmartDev-Contract | 智能合约库 | v1.0.0 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Contract) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Contract) | -| WeBankBlockchain-Governance-Cert | 证书管理组件 | v1.0.1 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Cert) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Cert) | -| WeBankBlockchain-Governance-Key | 私钥管理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Key) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Key) | -| WeBankBlockchain-Governance-Authority | 权限治理组件 | v1.0.0 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority) | 合约部分支持,sdk部分不支持 -| WeBankBlockchain-Governance-Account | 账户治理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account) | 合约部分支持,sdk部分不支持 +| 项目 | 功能简介 | 版本 | 文档 | github | gitee | 备注 | +|---------------------------------------|------------------------|-----------------|-----------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------|---------------------------------------------------------------------------|-------------------------- +| FISCO-BCOS | 区块链底层平台 | v3.0.0-rc1 | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/v3.0.0-rc1/) | [github](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/v3.0.0-rc1) | +| Solidity | Solidity智能合约 | v0.8.11 | [文档](https://docs.soliditylang.org/en/v0.8.11) | | | **最高支持solidity v0.8.11** +| JavaSDK | Java语言SDK | v3.0.0-rc1 | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/v3.0.0-rc1/docs/develop/sdk/java_sdk/index.html) | [github](https://github.com/FISCO-BCOS/java-sdk/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk/tree/v3.0.0-rc1) | +| GoSDK | Go语言SDK | 暂不支持
后续版本规划 | | | | +| PythonSDK | Python语言SDK | 暂不支持
后续版本规划 | | | | +| 控制台(console) | 交互式命令行工具 | v3.0.0-rc1 | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/v3.0.0-rc1/docs/develop/console/index.html) | [github](https://github.com/FISCO-BCOS/console/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/console/tree/v3.0.0-rc1) | +| java-sdk-demo | Java压测工具 | v3.0.0-rc1 | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/v3.0.0-rc1/docs/develop/stress_testing.html) | [github](https://github.com/FISCO-BCOS/java-sdk-demo/tree/3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk-demo/tree/v3.0.0-rc1) | +| spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0-rc1 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc1#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc1) | +| spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0-rc1 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc1#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc1) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc1) | +| generator | 部署运维工具 | 不支持 | | | | +| WeBASE | 区块链中间件平台 | lab-rc1 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab-rc1/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/lab-rc1) | [gitee](https://gitee.com/WeBank/WeBASE/tree/lab-rc1) | +| WeCross | 跨链协作平台 | 暂不支持
后续版本规划 | | | | +| WeIdentity | 分布式身份解决方案 | 不支持 | | | | +| WeBankBlockchain-Data-Export | 数据导出组件 | 不支持 | | | | +| WeBankBlockchain-Data-Stash | 数据仓库组件 | 不支持 | | | | +| WeBankBlockchain-Data-Reconcile | 数据对账组件 | 不支持 | | | | +| WeBankBlockchain-SmartDev-Scaffold | 应用开发脚手架 | 不支持 | | | | +| WeBankBlockchain-SmartDev-SCGP | 智能合约编译插件 | **适配中** | | | | +| WeBankBlockchain-SmartDev-Contract | 智能合约库 | v1.0.0 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Contract) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Contract) | +| WeBankBlockchain-Governance-Cert | 证书管理组件 | v1.0.1 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Cert) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Cert) | +| WeBankBlockchain-Governance-Key | 私钥管理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Key) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Key) | +| WeBankBlockchain-Governance-Authority | 权限治理组件 | v1.0.0 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority) | 合约部分支持,sdk部分不支持 +| WeBankBlockchain-Governance-Account | 账户治理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account) | 合约部分支持,sdk部分不支持 #### 3.2.2. FISCO-BCOS v3.0.0-rc2 @@ -233,7 +239,7 @@ FISCO-BCOS 3.0.0 及之后的版本之间相互兼容。FISCO-BCOS 3.0.0-rc的 | spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc4#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | | | spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc4#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | | | generator | 企业区块链部署工具 | 不支持 | | | | | -| WeBASE | 区块链中间件平台 | v3.0.0 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | +| WeBASE | 区块链中间件平台 | v3.0.1 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | | WeCross | 跨链协作平台 | v1.3.0(测试中) | | | | | | WeIdentity | 分布式身份解决方案 | v1.8.5-rc1 | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | | WeBankBlockchain-Data-Export | 数据导出组件 | V3 | [文档](https://data-doc.readthedocs.io/zh_CN/data_export_3.0/docs/WeBankBlockchain-Data-Export/index.html) | [github](https://github.com/WeBankBlockchain/Data-Export/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Data-Export/tree/V3/) | | @@ -247,7 +253,35 @@ FISCO-BCOS 3.0.0 及之后的版本之间相互兼容。FISCO-BCOS 3.0.0-rc的 | WeBankBlockchain-Governance-Authority | 权限治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account/tree/V3/) | | | WeBankBlockchain-Governance-Account | 账户治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority/tree/V3/) | | -#### 3.2.6. FISCO-BCOS v3.2.x +#### 3.2.6. FISCO-BCOS v3.2.0 + +| 项目 | 功能简介 | 版本 | 文档 | github | gitee | 备注 | +| ------------------------------------- | -------------------------- | ------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ---------------------------- | +| FISCO-BCOS | 区块链底层平台 | v3.2.0 | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/) | [github](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/v3.2.0) | [gitee](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/v3.2.0) | | +| Solidity | solidity智能合约 | v0.8.11 | [文档](https://docs.soliditylang.org/en/v0.8.11) | | | **最高支持solidity v0.8.11** | +| JavaSDK | Java语言SDK | v3.2.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/sdk/java_sdk/index.html) | [github](https://github.com/FISCO-BCOS/java-sdk/tree/v3.2.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk/tree/v3.2.0) | | +| GoSDK | Go语言SDK | 暂不支持
后续版本规划 | | | | | +| PythonSDK | Python语言SDK | 暂不支持
后续版本规划 | | | | | +| 控制台(console) | 交互式命令行工具 | v3.2.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/index.html) | [github](https://github.com/FISCO-BCOS/console/tree/v3.2.0) | [gitee](https://gitee.com/FISCO-BCOS/console/tree/v3.2.0) | | +| java-sdk-demo | Java压测工具 | v3.2.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/stress_testing.html) | [github](https://github.com/FISCO-BCOS/java-sdk-demo/tree/3.2.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk-demo/tree/3.2.0) | | +| spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc4#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | | +| spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc4#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | | +| generator | 企业区块链部署工具 | 不支持 | | | | | +| WeBASE | 区块链中间件平台 | v3.0.2 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | +| WeCross | 跨链协作平台 | v1.3.0(测试中) | | | | | +| WeIdentity | 分布式身份解决方案 | 存在兼容问题,建议将节点升级至v3.2.1+ | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | +| WeBankBlockchain-Data-Export | 数据导出组件 | V3 | [文档](https://data-doc.readthedocs.io/zh_CN/data_export_3.0/docs/WeBankBlockchain-Data-Export/index.html) | [github](https://github.com/WeBankBlockchain/Data-Export/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Data-Export/tree/V3/) | | +| WeBankBlockchain-Data-Stash | 数据仓库组件 | 不支持 | | | | | +| WeBankBlockchain-Data-Reconcile | 数据对账组件 | v1.0.0 | [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Reconcile/index.html) | [github](https://github.com/WeBankBlockchain/Data-Reconcile) | [gitee](https://gitee.com/WeBankBlockchain/Data-Reconcile) | | +| WeBankBlockchain-SmartDev-Scaffold | 应用开发脚手架 | V3 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3/) | | +| WeBankBlockchain-SmartDev-SCGP | 智能合约编译插件 | v1.0.1 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-SCGP) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-SCGP) | | +| WeBankBlockchain-SmartDev-Contract | 智能合约库 | v1.0.0 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Contract) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Contract) | | +| WeBankBlockchain-Governance-Cert | 证书管理组件 | v1.0.1 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Cert) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Cert) | | +| WeBankBlockchain-Governance-Key | 私钥管理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Key) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Key) | | +| WeBankBlockchain-Governance-Authority | 权限治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account/tree/V3/) | | +| WeBankBlockchain-Governance-Account | 账户治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority/tree/V3/) | | + +#### 3.2.7. FISCO-BCOS v3.2.x | 项目 | 功能简介 | 版本 | 文档 | github | gitee | 备注 | | ------------------------------------- | -------------------------- | ------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ---------------------------- | @@ -261,9 +295,9 @@ FISCO-BCOS 3.0.0 及之后的版本之间相互兼容。FISCO-BCOS 3.0.0-rc的 | spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc4#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | | | spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc4#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | | | generator | 企业区块链部署工具 | 不支持 | | | | | -| WeBASE | 区块链中间件平台 | v3.0.0 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | -| WeCross | 跨链协作平台 | v1.3.0(测试中) | | | | | -| WeIdentity | 分布式身份解决方案 | v1.8.5-rc1 | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | +| WeBASE | 区块链中间件平台 | v3.0.2 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | +| WeCross | 跨链协作平台 | v1.3.0 | | | | | +| WeIdentity | 分布式身份解决方案 | v3.0.0-rc.1 | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | | WeBankBlockchain-Data-Export | 数据导出组件 | V3 | [文档](https://data-doc.readthedocs.io/zh_CN/data_export_3.0/docs/WeBankBlockchain-Data-Export/index.html) | [github](https://github.com/WeBankBlockchain/Data-Export/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Data-Export/tree/V3/) | | | WeBankBlockchain-Data-Stash | 数据仓库组件 | 不支持 | | | | | | WeBankBlockchain-Data-Reconcile | 数据对账组件 | v1.0.0 | [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Reconcile/index.html) | [github](https://github.com/WeBankBlockchain/Data-Reconcile) | [gitee](https://gitee.com/WeBankBlockchain/Data-Reconcile) | | @@ -275,3 +309,142 @@ FISCO-BCOS 3.0.0 及之后的版本之间相互兼容。FISCO-BCOS 3.0.0-rc的 | WeBankBlockchain-Governance-Authority | 权限治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account/tree/V3/) | | | WeBankBlockchain-Governance-Account | 账户治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority/tree/V3/) | | +#### 3.2.8. FISCO-BCOS v3.3.x + +| 项目 | 功能简介 | 版本 | 文档 | github | gitee | 备注 | +| ------------------------------------- | -------------------------- | ----------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ---------------------------- | +| FISCO-BCOS | 区块链底层平台 | v3.3.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/) | [github](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/v3.3.0) | [gitee](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/v3.3.0) | | +| Solidity | solidity智能合约 | v0.8.11 | [文档](https://docs.soliditylang.org/en/v0.8.11) | | | **最高支持solidity v0.8.11** | +| JavaSDK | Java语言SDK | v3.3.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/sdk/java_sdk/index.html) | [github](https://github.com/FISCO-BCOS/java-sdk/tree/v3.3.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk/tree/v3.3.0) | | +| GoSDK | Go语言SDK | 开发中 | | [github](https://github.com/FISCO-BCOS/go-sdk) | | | +| PythonSDK | Python语言SDK | 暂不支持 | | | | | +| 控制台(console) | 交互式命令行工具 | v3.3.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/index.html) | [github](https://github.com/FISCO-BCOS/console/tree/v3.3.0) | [gitee](https://gitee.com/FISCO-BCOS/console/tree/v3.3.0) | | +| java-sdk-demo | Java压测工具 | v3.3.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/stress_testing.html) | [github](https://github.com/FISCO-BCOS/java-sdk-demo/tree/3.3.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk-demo/tree/3.3.0) | | +| spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc4#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | | +| spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc4#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | | +| generator | 企业区块链部署工具 | 不支持 | | | | | +| WeBASE | 区块链中间件平台 | v3.0.2 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | +| WeCross | 跨链协作平台 | v1.3.0 | | | | | +| WeIdentity | 分布式身份解决方案 | v3.0.0-rc.1 | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | +| WeBankBlockchain-Data-Export | 数据导出组件 | V3 | [文档](https://data-doc.readthedocs.io/zh_CN/data_export_3.0/docs/WeBankBlockchain-Data-Export/index.html) | [github](https://github.com/WeBankBlockchain/Data-Export/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Data-Export/tree/V3/) | | +| WeBankBlockchain-Data-Stash | 数据仓库组件 | 不支持 | | | | | +| WeBankBlockchain-Data-Reconcile | 数据对账组件 | v1.0.0 | [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Reconcile/index.html) | [github](https://github.com/WeBankBlockchain/Data-Reconcile) | [gitee](https://gitee.com/WeBankBlockchain/Data-Reconcile) | | +| WeBankBlockchain-SmartDev-Scaffold | 应用开发脚手架 | V3 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3/) | | +| WeBankBlockchain-SmartDev-SCGP | 智能合约编译插件 | v1.0.1 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-SCGP) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-SCGP) | | +| WeBankBlockchain-SmartDev-Contract | 智能合约库 | v1.0.0 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Contract) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Contract) | | +| WeBankBlockchain-Governance-Cert | 证书管理组件 | v1.0.1 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Cert) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Cert) | | +| WeBankBlockchain-Governance-Key | 私钥管理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Key) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Key) | | +| WeBankBlockchain-Governance-Authority | 权限治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account/tree/V3/) | | +| WeBankBlockchain-Governance-Account | 账户治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority/tree/V3/) | | + +#### 3.2.9. FISCO-BCOS v3.4.x + +| 项目 | 功能简介 | 版本 | 文档 | github | gitee | 备注 | +|---------------------------------------|------------------------|-------------|-----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------|---------------------------------------------------------------------------|--------------------------| +| FISCO-BCOS | 区块链底层平台 | v3.4.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/) | [github](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/v3.4.0) | [gitee](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/v3.4.0) | | +| Solidity | solidity智能合约 | v0.8.11 | [文档](https://docs.soliditylang.org/en/v0.8.11) | | | **最高支持solidity v0.8.11** | +| JavaSDK | Java语言SDK | v3.4.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/sdk/java_sdk/index.html) | [github](https://github.com/FISCO-BCOS/java-sdk/tree/v3.4.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk/tree/v3.4.0) | | +| GoSDK | Go语言SDK | 开发中 | | [github](https://github.com/FISCO-BCOS/go-sdk) | | | +| PythonSDK | Python语言SDK | 暂不支持 | | | | | +| 控制台(console) | 交互式命令行工具 | v3.4.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/index.html) | [github](https://github.com/FISCO-BCOS/console/tree/v3.4.0) | [gitee](https://gitee.com/FISCO-BCOS/console/tree/v3.4.0) | | +| java-sdk-demo | Java压测工具 | v3.4.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/stress_testing.html) | [github](https://github.com/FISCO-BCOS/java-sdk-demo/tree/3.4.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk-demo/tree/3.4.0) | | +| spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc4#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | | +| spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc4#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | | +| generator | 企业区块链部署工具 | 不支持 | | | | | +| WeBASE | 区块链中间件平台 | v3.0.2 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | +| WeCross | 跨链协作平台 | v1.3.0 | | | | | +| WeIdentity | 分布式身份解决方案 | v3.0.0-rc.1 | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | +| WeBankBlockchain-Data-Export | 数据导出组件 | V3 | [文档](https://data-doc.readthedocs.io/zh_CN/data_export_3.0/docs/WeBankBlockchain-Data-Export/index.html) | [github](https://github.com/WeBankBlockchain/Data-Export/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Data-Export/tree/V3/) | | +| WeBankBlockchain-Data-Stash | 数据仓库组件 | 不支持 | | | | | +| WeBankBlockchain-Data-Reconcile | 数据对账组件 | v1.0.0 | [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Reconcile/index.html) | [github](https://github.com/WeBankBlockchain/Data-Reconcile) | [gitee](https://gitee.com/WeBankBlockchain/Data-Reconcile) | | +| WeBankBlockchain-SmartDev-Scaffold | 应用开发脚手架 | V3 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3/) | | +| WeBankBlockchain-SmartDev-SCGP | 智能合约编译插件 | v1.0.1 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-SCGP) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-SCGP) | | +| WeBankBlockchain-SmartDev-Contract | 智能合约库 | v1.0.0 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Contract) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Contract) | | +| WeBankBlockchain-Governance-Cert | 证书管理组件 | v1.0.1 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Cert) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Cert) | | +| WeBankBlockchain-Governance-Key | 私钥管理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Key) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Key) | | +| WeBankBlockchain-Governance-Authority | 权限治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account/tree/V3/) | | +| WeBankBlockchain-Governance-Account | 账户治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority/tree/V3/) | | + +#### 3.2.10. FISCO-BCOS v3.5.x + +| 项目 | 功能简介 | 版本 | 文档 | github | gitee | 备注 | +|---------------------------------------|------------------------|-------------|-----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------|---------------------------------------------------------------------------|--------------------------| +| FISCO-BCOS | 区块链底层平台 | v3.5.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/) | [github](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/v3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/v3.5.0) | | +| Solidity | solidity智能合约 | v0.8.11 | [文档](https://docs.soliditylang.org/en/v0.8.11) | | | **最高支持solidity v0.8.11** | +| JavaSDK | Java语言SDK | v3.5.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/sdk/java_sdk/index.html) | [github](https://github.com/FISCO-BCOS/java-sdk/tree/v3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk/tree/v3.5.0) | | +| GoSDK | Go语言SDK | 开发中 | | [github](https://github.com/FISCO-BCOS/go-sdk) | | | +| PythonSDK | Python语言SDK | 暂不支持 | | | | | +| 控制台(console) | 交互式命令行工具 | v3.5.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/index.html) | [github](https://github.com/FISCO-BCOS/console/tree/v3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/console/tree/v3.5.0) | | +| java-sdk-demo | Java压测工具 | v3.5.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/stress_testing.html) | [github](https://github.com/FISCO-BCOS/java-sdk-demo/tree/3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk-demo/tree/3.5.0) | | +| spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc4#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | | +| spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc4#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | | +| generator | 企业区块链部署工具 | 不支持 | | | | | +| WeBASE | 区块链中间件平台 | v3.0.2 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | +| WeCross | 跨链协作平台 | v1.3.0 | | | | | +| WeIdentity | 分布式身份解决方案 | v3.0.0-rc.1 | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | +| WeBankBlockchain-Data-Export | 数据导出组件 | V3 | [文档](https://data-doc.readthedocs.io/zh_CN/data_export_3.0/docs/WeBankBlockchain-Data-Export/index.html) | [github](https://github.com/WeBankBlockchain/Data-Export/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Data-Export/tree/V3/) | | +| WeBankBlockchain-Data-Stash | 数据仓库组件 | 不支持 | | | | | +| WeBankBlockchain-Data-Reconcile | 数据对账组件 | v1.0.0 | [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Reconcile/index.html) | [github](https://github.com/WeBankBlockchain/Data-Reconcile) | [gitee](https://gitee.com/WeBankBlockchain/Data-Reconcile) | | +| WeBankBlockchain-SmartDev-Scaffold | 应用开发脚手架 | V3 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3/) | | +| WeBankBlockchain-SmartDev-SCGP | 智能合约编译插件 | v1.0.1 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-SCGP) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-SCGP) | | +| WeBankBlockchain-SmartDev-Contract | 智能合约库 | v1.0.0 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Contract) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Contract) | | +| WeBankBlockchain-Governance-Cert | 证书管理组件 | v1.0.1 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Cert) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Cert) | | +| WeBankBlockchain-Governance-Key | 私钥管理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Key) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Key) | | +| WeBankBlockchain-Governance-Authority | 权限治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account/tree/V3/) | | +| WeBankBlockchain-Governance-Account | 账户治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority/tree/V3/) | | + +#### 3.2.11. FISCO-BCOS v3.6.x + +| 项目 | 功能简介 | 版本 | 文档 | github | gitee | 备注 | +|---------------------------------------|------------------------|-------------|-----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------|---------------------------------------------------------------------------|--------------------------| +| FISCO-BCOS | 区块链底层平台 | v3.6.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/) | [github](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/v3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/v3.5.0) | | +| Solidity | solidity智能合约 | v0.8.11 | [文档](https://docs.soliditylang.org/en/v0.8.11) | | | **最高支持solidity v0.8.11** | +| JavaSDK | Java语言SDK | v3.5.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/sdk/java_sdk/index.html) | [github](https://github.com/FISCO-BCOS/java-sdk/tree/v3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk/tree/v3.5.0) | | +| GoSDK | Go语言SDK | 开发中 | | [github](https://github.com/FISCO-BCOS/go-sdk) | | | +| PythonSDK | Python语言SDK | 暂不支持 | | | | | +| 控制台(console) | 交互式命令行工具 | v3.6.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/index.html) | [github](https://github.com/FISCO-BCOS/console/tree/v3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/console/tree/v3.5.0) | | +| java-sdk-demo | Java压测工具 | v3.6.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/stress_testing.html) | [github](https://github.com/FISCO-BCOS/java-sdk-demo/tree/3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk-demo/tree/3.5.0) | | +| spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc4#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | | +| spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc4#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | | +| generator | 企业区块链部署工具 | 不支持 | | | | | +| WeBASE | 区块链中间件平台 | v3.0.2 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | +| WeCross | 跨链协作平台 | v1.3.0 | | | | | +| WeIdentity | 分布式身份解决方案 | v3.0.0-rc.1 | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | +| WeBankBlockchain-Data-Export | 数据导出组件 | V3 | [文档](https://data-doc.readthedocs.io/zh_CN/data_export_3.0/docs/WeBankBlockchain-Data-Export/index.html) | [github](https://github.com/WeBankBlockchain/Data-Export/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Data-Export/tree/V3/) | | +| WeBankBlockchain-Data-Stash | 数据仓库组件 | 不支持 | | | | | +| WeBankBlockchain-Data-Reconcile | 数据对账组件 | v1.0.0 | [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Reconcile/index.html) | [github](https://github.com/WeBankBlockchain/Data-Reconcile) | [gitee](https://gitee.com/WeBankBlockchain/Data-Reconcile) | | +| WeBankBlockchain-SmartDev-Scaffold | 应用开发脚手架 | V3 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3/) | | +| WeBankBlockchain-SmartDev-SCGP | 智能合约编译插件 | v1.0.1 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-SCGP) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-SCGP) | | +| WeBankBlockchain-SmartDev-Contract | 智能合约库 | v1.0.0 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Contract) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Contract) | | +| WeBankBlockchain-Governance-Cert | 证书管理组件 | v1.0.1 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Cert) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Cert) | | +| WeBankBlockchain-Governance-Key | 私钥管理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Key) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Key) | | +| WeBankBlockchain-Governance-Authority | 权限治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account/tree/V3/) | | +| WeBankBlockchain-Governance-Account | 账户治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority/tree/V3/) | | + +#### 3.2.12. FISCO-BCOS v3.7.x + +| 项目 | 功能简介 | 版本 | 文档 | github | gitee | 备注 | +|---------------------------------------|------------------------|-------------|-----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------|---------------------------------------------------------------------------|--------------------------| +| FISCO-BCOS | 区块链底层平台 | v3.7.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/) | [github](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/v3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/v3.5.0) | | +| Solidity | solidity智能合约 | v0.8.11 | [文档](https://docs.soliditylang.org/en/v0.8.11) | | | **最高支持solidity v0.8.11** | +| JavaSDK | Java语言SDK | v3.5.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/sdk/java_sdk/index.html) | [github](https://github.com/FISCO-BCOS/java-sdk/tree/v3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk/tree/v3.5.0) | | +| GoSDK | Go语言SDK | 开发中 | | [github](https://github.com/FISCO-BCOS/go-sdk) | | | +| PythonSDK | Python语言SDK | 暂不支持 | | | | | +| 控制台(console) | 交互式命令行工具 | v3.7.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/index.html) | [github](https://github.com/FISCO-BCOS/console/tree/v3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/console/tree/v3.5.0) | | +| java-sdk-demo | Java压测工具 | v3.7.x | [文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/stress_testing.html) | [github](https://github.com/FISCO-BCOS/java-sdk-demo/tree/3.5.0) | [gitee](https://gitee.com/FISCO-BCOS/java-sdk-demo/tree/3.5.0) | | +| spring-boot-starter | Gradle SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0-rc4#spring-boot-starter) | [github](https://github.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-starter/tree/v3.0.0) | | +| spring-boot-crud | Maven SpringBoot 应用示例 | v3.0.0 | [文档](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0-rc4#spring-boot-crud) | [github](https://github.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | [gitee](https://gitee.com/FISCO-BCOS/spring-boot-crud/tree/v3.0.0) | | +| generator | 企业区块链部署工具 | 不支持 | | | | | +| WeBASE | 区块链中间件平台 | v3.0.2 | [文档](https://webasedoc.readthedocs.io/zh_CN/lab/) | [github](https://github.com/WeBankBlockchain/WeBASE/tree/master-3.0) | [gitee](https://gitee.com/WeBank/WeBASE/tree/master-3.0) | | +| WeCross | 跨链协作平台 | v1.3.0 | | | | | +| WeIdentity | 分布式身份解决方案 | v3.0.0-rc.1 | [文档](https://weidentity.readthedocs.io/zh_CN/latest/) | [github](https://github.com/WeBankBlockchain/WeIdentity) | [gitee](https://gitee.com/WeBank/WeIdentity) | | +| WeBankBlockchain-Data-Export | 数据导出组件 | V3 | [文档](https://data-doc.readthedocs.io/zh_CN/data_export_3.0/docs/WeBankBlockchain-Data-Export/index.html) | [github](https://github.com/WeBankBlockchain/Data-Export/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Data-Export/tree/V3/) | | +| WeBankBlockchain-Data-Stash | 数据仓库组件 | 不支持 | | | | | +| WeBankBlockchain-Data-Reconcile | 数据对账组件 | v1.0.0 | [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Reconcile/index.html) | [github](https://github.com/WeBankBlockchain/Data-Reconcile) | [gitee](https://gitee.com/WeBankBlockchain/Data-Reconcile) | | +| WeBankBlockchain-SmartDev-Scaffold | 应用开发脚手架 | V3 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Scaffold/tree/V3/) | | +| WeBankBlockchain-SmartDev-SCGP | 智能合约编译插件 | v1.0.1 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-SCGP) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-SCGP) | | +| WeBankBlockchain-SmartDev-Contract | 智能合约库 | v1.0.0 | [文档](https://toolkit-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) | [github](https://github.com/WeBankBlockchain/SmartDev-Contract) | [gitee](https://gitee.com/WeBankBlockchain/SmartDev-Contract) | | +| WeBankBlockchain-Governance-Cert | 证书管理组件 | v1.0.1 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Cert) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Cert) | | +| WeBankBlockchain-Governance-Key | 私钥管理组件 | v1.0.2 | [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Key) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Key) | | +| WeBankBlockchain-Governance-Authority | 权限治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Acct/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Account/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Account/tree/V3/) | | +| WeBankBlockchain-Governance-Account | 账户治理组件 | V3 | [文档](https://governance-doc.readthedocs.io/zh_CN/v3.0.0/docs/WeBankBlockchain-Governance-Auth/index.html) | [github](https://github.com/WeBankBlockchain/Governance-Authority/tree/V3) | [gitee](https://gitee.com/WeBankBlockchain/Governance-Authority/tree/V3/) | | diff --git a/2.x/docs/console/console_of_java_sdk.md b/2.x/docs/console/console_of_java_sdk.md index f90e93cd9..1357138be 100644 --- a/2.x/docs/console/console_of_java_sdk.md +++ b/2.x/docs/console/console_of_java_sdk.md @@ -1706,7 +1706,7 @@ Remove OK, 1 row affected. ```eval_rst .. important:: - 执行`freezeContract`、`unfreezeContract`和`grantContractStatusManager`三个合约管理的控制台命令,需指定私钥启动控制台,用于进行操作权限判断。该私钥为部署指定合约时所用的账号私钥,即部署合约时也许指定私钥启动控制台。 + 执行`freezeContract`、`unfreezeContract`和`grantContractStatusManager`三个合约管理的控制台命令,需指定私钥启动控制台,用于进行操作权限判断。该私钥为部署指定合约时所用的账号私钥,即部署合约时也是指定私钥启动控制台。 ``` ### **freezeContract** diff --git a/2.x/docs/installation.md b/2.x/docs/installation.md index 4a93038f4..d66727d00 100644 --- a/2.x/docs/installation.md +++ b/2.x/docs/installation.md @@ -189,7 +189,7 @@ info|2019-01-21 17:31:18.317105| [P2P][Service] heartBeat,connected count=3 tail -f nodes/127.0.0.1/node0/log/log* | grep +++ ``` -正常情况会不停输出`++++Generating seal`,表示共识正常。 +正常情况会不停输出带有`++++Generating seal`的日志,即表示共识正常。 ```bash info|2020-12-22 17:24:43.729402|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=2e133146... diff --git a/2.x/docs/introduction.md b/2.x/docs/introduction.md index f6e334ce6..7e57d5481 100644 --- a/2.x/docs/introduction.md +++ b/2.x/docs/introduction.md @@ -4,9 +4,16 @@ --- -FISCO BCOS是由国内企业主导研发、对外开源、安全可控的企业级金融联盟链底层平台,由金链盟开源工作组协作打造,并于2017年正式对外开源。 +FISCO BCOS是由深圳市金融区块链发展促进会(以下简称“金链盟”)开源工作组牵头研发的金融级、国产安全可控的区块链底层平台。作为最早开源的国产联盟链底层平台之一,FISCO BCOS于2017年面向全球开源。 + +开源六周年至今,FISCO BCOS开源社区在技术创新、应用产业以及开源生态均取得了非凡成绩。 + +FISCO BCOS持续攻关核心关键技术,单链性能突破10万TPS。首创DMC算法大幅度提升性能、推出三种架构形态灵活适配业务需求;全链路国产化,采用国密算法与软硬件体系,支持国产OS,适配国产芯片和服务器,支持多语言多终端国密接入。拥有覆盖底层+中间件+应用组件的丰富周边组件。 + +底层平台可用性已经广泛应用实践检验,支撑政务、金融、医疗、双碳、跨境数据流通等关乎国计民生的重点领域落地超过400个标杆应用,在助力实体经济发展、促进公平与可持续等方面贡献力量。 + +社区以开源链接多方,截止2023年12月,围绕FISCO BCOS构建的国产开源联盟链生态圈已汇聚了超过5000家机构、超10万名个人成员,以及50家认证合作伙伴、500余名核心贡献者。社区认证了63位FISCO BCOS MVP, 发展了12个专项兴趣小组SIG,此外与上百所知名院校开展人才共育合作,培育区块链产业人才超8万人次,已发展成为最大最活跃的国产开源联盟链生态圈之一。 -社区以开源链接多方,截至2022年末,FISCO BCOS已支撑300余个产业数字化标杆应用,开源生态圈汇聚超4000家机构 、超90000名个人成员,以及38家认证合作企业、400余名核心贡献者。底层平台可用性经广泛应用实践检验,数百个应用项目基于FISCO BCOS底层平台研发,超300个已在生产环境中稳定运行,覆盖文化版权、司法服务、政务服务、物联网、金融、智慧社区等领域,共同推动最大最活跃国产开源联盟链生态圈的形成。 ```eval_rst .. note:: diff --git a/2.x/docs/manual/certificates.md b/2.x/docs/manual/certificates.md index 3ecf73679..46ad967ac 100644 --- a/2.x/docs/manual/certificates.md +++ b/2.x/docs/manual/certificates.md @@ -264,7 +264,7 @@ bash ~/mynode/node/start.sh tail -f ~/mynode/log/log* | grep +++ ``` -正常情况会不停输出`++++Generating seal`,表示共识正常。 +正常情况会不停输出带有`++++Generating seal`的日志,即表示共识正常。 通过上述操作,完成了证书续期的操作。 diff --git a/2.x/docs/manual/group_use_cases.md b/2.x/docs/manual/group_use_cases.md index daceceaa4..239e8182a 100644 --- a/2.x/docs/manual/group_use_cases.md +++ b/2.x/docs/manual/group_use_cases.md @@ -192,12 +192,12 @@ ubuntu16 131068 0.8 0.0 986644 7672 pts/0 Sl 15:21 0:00 /home/ubu **查看群组共识状态** -不发交易时,共识正常的节点会输出`+++`日志,本例中,`node0`、`node1`同时属于`group1`、`group2`和`group3`;`node2`、`node3`属于`group1`;`node4`、`node5`属于`group2`;`node6`、`node7`属于`group3`,可通过`tail -f node*/log/* | grep "++"`查看各节点是否正常。 +不发交易时,共识正常的节点会输出带有`+++`的日志,本例中,`node0`、`node1`同时属于`group1`、`group2`和`group3`;`node2`、`node3`属于`group1`;`node4`、`node5`属于`group2`;`node6`、`node7`属于`group3`,可通过`tail -f node*/log/* | grep "++"`查看各节点是否正常。 ```eval_rst .. important:: - 节点正常共识打印 ``+++`` 日志, ``+++`` 日志字段含义: + 节点正常共识打印带有 ``+++`` 的日志, ``+++`` 日志字段含义: - ``g:``:群组ID - ``blkNum``:Leader节点产生的新区块高度; - ``tx``: 新区块中包含的交易数目; diff --git a/2.x/docs/sdk/java_sdk/event_sub.md b/2.x/docs/sdk/java_sdk/event_sub.md index 5e4cd1bc2..3c4d3c9f6 100644 --- a/2.x/docs/sdk/java_sdk/event_sub.md +++ b/2.x/docs/sdk/java_sdk/event_sub.md @@ -33,7 +33,7 @@ - filerID:字符串类型,每次请求唯一,标记一次注册任务 - groupID:字符串类型,群组ID -- fromBlock:整形字符串,初始区块。“latest” 当前块高 +- fromBlock:整形字符串,初始区块。“latest” 当前块高(传入块高时,需大于0) - toBlock:整形字符串,最终区块。“latest” 处理至当前块高时,继续等待新区块 - addresses:字符串或者字符串数组:字符串表示单个合约地址,数组为多个合约地址,数组可以为空 - topics:字符串类型或者数组类型:字符串表示单个topic,数组为多个topic,数组可以为空 diff --git a/2.x/docs/tutorial/multihost.md b/2.x/docs/tutorial/multihost.md index 66fc530a5..0e258ec9d 100644 --- a/2.x/docs/tutorial/multihost.md +++ b/2.x/docs/tutorial/multihost.md @@ -215,7 +215,7 @@ info|2019-01-21 17:31:18.317105| [P2P][Service] heartBeat,connected count=3 ```bash tail -f ~/fisco/*/node0/log/* |grep -i +++ ``` -正常情况会不停输出`++++Generating seal`,表示共识正常。 +正常情况会不停输出带有`++++Generating seal`的日志,即表示共识正常。 ```bash info|2020-12-22 17:24:43.729402|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=2e133146... info|2020-12-22 17:24:47.740603|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=eb199760... @@ -372,4 +372,4 @@ Return values: # 获取当前块高 [group:1]> getBlockNumber 2 -``` \ No newline at end of file +``` diff --git a/2.x/docs/tutorial/mysql_node.md b/2.x/docs/tutorial/mysql_node.md index 095d09814..c5403fdef 100644 --- a/2.x/docs/tutorial/mysql_node.md +++ b/2.x/docs/tutorial/mysql_node.md @@ -274,7 +274,7 @@ info|2019-01-21 17:31:18.317105| [P2P][Service] heartBeat,connected count=3 tail -f nodes/127.0.0.1/node0/log/log* | grep +++ ``` -正常情况会不停输出`++++Generating seal`,表示共识正常。 +正常情况会不停输出带有`++++Generating seal`的日志,表示共识正常。 ```bash info|2020-12-22 17:24:43.729402|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=2e133146... info|2020-12-22 17:24:47.740603|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=eb199760... @@ -357,4 +357,4 @@ MariaDB> select * from u_t_demo; | 100025 | 2 | 0 | fruit | 1 | apple1 | +--------+-------+----------+-------+---------+-----------+ 1 row in set (0.00 sec) -``` \ No newline at end of file +``` diff --git a/2.x/docs/tutorial/stress_testing.md b/2.x/docs/tutorial/stress_testing.md index 76d2d4820..1be49947e 100644 --- a/2.x/docs/tutorial/stress_testing.md +++ b/2.x/docs/tutorial/stress_testing.md @@ -119,6 +119,7 @@ Java SDK Demo是基于Java SDK的基准测试集合,能够对FISCO BCOS节点 ```eval_rst .. note:: + 目前通过Caliper进行压测FISCO BCOS的方式已较为陈旧,推荐用户使用Java SDK Demo进行压力测试。 目前FISCO BCOS适配的Caliper版本为0.2.0,请在部署Caliper运行环境时确保Caliper的版本为0.2.0,如在部署或使用过程中遇到任何问题,请优先参考 `https://github.com/FISCO-BCOS/FISCO-BCOS/issues/1248 `_ 中的解决方案进行排查。 ``` diff --git a/2.x/en/.readthedocs.yaml b/2.x/en/.readthedocs.yaml new file mode 100644 index 000000000..08887bb06 --- /dev/null +++ b/2.x/en/.readthedocs.yaml @@ -0,0 +1,29 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.7" + # nodejs: "20" + # rust: "1.70" + # golang: "1.20" + +sphinx: + configuration: 2.x/en/conf.py + +# Optionally build your docs in additional formats such as PDF and ePub +formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ./requirements.txt \ No newline at end of file diff --git a/2.x/en/conf.py b/2.x/en/conf.py index 25bdb844e..da74fa34f 100644 --- a/2.x/en/conf.py +++ b/2.x/en/conf.py @@ -68,7 +68,7 @@ master_doc = 'index' # General information about the project. -project = u'FISCO BCOS EN' +project = u'FISCO BCOS v2 EN' copyright = u'© 2020. All rights reserved.' author = u'fisco-dev' diff --git a/2.x/en/index.rst b/2.x/en/index.rst index 37eaf51d1..e38b74fbd 100644 --- a/2.x/en/index.rst +++ b/2.x/en/index.rst @@ -2,7 +2,7 @@ FISCO BCOS Documentation ############################################################## -.. image:: _static/images/FISCO_BCOS_Logo.svg +.. image:: _static/images/FISCO_BCOS_Logo_2.0.svg FISCO BCOS is a reliable, secure, efficient and portable blockchain platform with proven success from many partners and successful financial-grade applications. diff --git a/2.x/images/tutorial/link_2.0.svg b/2.x/images/tutorial/link_2.0.svg new file mode 100644 index 000000000..d404d71eb --- /dev/null +++ b/2.x/images/tutorial/link_2.0.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/2.x/images/tutorial/link_2.0_gray.svg b/2.x/images/tutorial/link_2.0_gray.svg new file mode 100644 index 000000000..e1e2ea64c --- /dev/null +++ b/2.x/images/tutorial/link_2.0_gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/2.x/images/tutorial/link_3.0.svg b/2.x/images/tutorial/link_3.0.svg new file mode 100644 index 000000000..4d47dd33c --- /dev/null +++ b/2.x/images/tutorial/link_3.0.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/2.x/images/tutorial/link_3.0_gray.svg b/2.x/images/tutorial/link_3.0_gray.svg new file mode 100644 index 000000000..8734f3edb --- /dev/null +++ b/2.x/images/tutorial/link_3.0_gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/2.x/index.rst b/2.x/index.rst index f73ebbe13..b77c7d1f4 100644 --- a/2.x/index.rst +++ b/2.x/index.rst @@ -1,9 +1,45 @@ +请根据需求选择FISCO BCOS的版本,并确认周边组件与其版本相匹配。 + +.. container:: row + + .. container:: card-holder-bigger + + .. container:: card-bigger + + .. image:: _static/images/FISCO_BCOS_Logo_2.0.svg + + .. raw:: html + +
+
+ 本文档版本 2.0:简单、易用、经典、稳定 +


+
+
+ + .. raw:: html + +
+
+ ====>> 切换至 3.0 版本文档 +

+
+
+ + +.. container:: row + + .. raw:: html +

+
+
+ + + ############################################################## -FISCO BCOS 技术文档 +FISCO BCOS 2.0 技术文档 ############################################################## -.. image:: _static/images/FISCO_BCOS_Logo.svg - FISCO BCOS 是一个稳定、高效、安全的区块链底层平台,经过多家机构、多个应用,长时间在生产环境运行的实际检验。 .. note:: @@ -230,7 +266,7 @@ FISCO BCOS 是一个稳定、高效、安全的区块链底层平台,经过多             更多开源工具

- + .. container:: tools @@ -258,6 +294,7 @@ FISCO BCOS 是一个稳定、高效、安全的区块链底层平台,经过多 - SmartDev-Contract 智能合约库组件:`[GitHub] `_ `[Gitee] `_ `[文档] `_ - SmartDev-SCGP 合约编译插件:`[GitHub] `_ `[Gitee] `_ `[文档] `_ - SmartDev-Scaffold 应用开发脚手架:`[GitHub] `_ `[Gitee] `_ `[文档] `_ + - **DDCMS分布式数据协作管理解决方案:**:`[GitHub] `_ `[Gitee] `_ `[文档] `_ .. toctree:: diff --git a/3.x/_static/css/custom.css b/3.x/_static/css/custom.css index f8d3ca5f4..a00f37e93 100644 --- a/3.x/_static/css/custom.css +++ b/3.x/_static/css/custom.css @@ -48,6 +48,10 @@ p { width: 100% } +ul.wy-breadcrumbs a.icon.icon-home::after { + content: " FISCO BCOS 3.0"; +} + .wy-side-nav-search img { display: block; margin: auto auto .809em auto; diff --git a/3.x/_static/images/FISCO_BCOS_Logo_3.0.svg b/3.x/_static/images/FISCO_BCOS_Logo_3.0.svg new file mode 100644 index 000000000..5a7fd923a --- /dev/null +++ b/3.x/_static/images/FISCO_BCOS_Logo_3.0.svg @@ -0,0 +1,72 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + + + + + + + + + + + + + + + + diff --git a/3.x/_static/images/FISCO_BCOS_Logo_3_0.png b/3.x/_static/images/FISCO_BCOS_Logo_3_0.png new file mode 100644 index 000000000..009889ec6 Binary files /dev/null and b/3.x/_static/images/FISCO_BCOS_Logo_3_0.png differ diff --git a/3.x/_static/images/img_1.png b/3.x/_static/images/img_1.png new file mode 100644 index 000000000..0c29f3b69 Binary files /dev/null and b/3.x/_static/images/img_1.png differ diff --git a/3.x/_static/images/link_2.0_gray.svg b/3.x/_static/images/link_2.0_gray.svg new file mode 100644 index 000000000..e1e2ea64c --- /dev/null +++ b/3.x/_static/images/link_2.0_gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/3.x/_static/images/link_3.0.svg b/3.x/_static/images/link_3.0.svg new file mode 100644 index 000000000..4d47dd33c --- /dev/null +++ b/3.x/_static/images/link_3.0.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/3.x/_static/images/products_2023.jpeg b/3.x/_static/images/products_2023.jpeg new file mode 100644 index 000000000..fc113fc66 Binary files /dev/null and b/3.x/_static/images/products_2023.jpeg differ diff --git a/3.x/_templates/layout.html b/3.x/_templates/layout.html index 4c9879626..f95defea0 100644 --- a/3.x/_templates/layout.html +++ b/3.x/_templates/layout.html @@ -1,15 +1,26 @@ {% extends "!layout.html" %} -{%- if pagename == '404' %}{% set metatags = '\n ' + metatags %}{% endif %} +{%- if pagename == '404' %}{% set metatags = ' +\n ' + metatags %}{% endif %} {% block sidebartitle %} {{ super() }} +
-FISCO BCOS -GitHub +FISCO BCOS +FISCO BCOS 3.0 +FISCO BCOS 2.0
+GitHub 微信群和公众号 -Twitter + style="background: transparent; padding: 0px; margin: auto auto auto auto; height: 30px;" alt="微信群和公众号" + src="{{ pathto("_static/images/wechat_button.svg", 1) }}" /> +Twitter + {% endblock %} diff --git a/3.x/release_note.txt b/3.x/release_note.txt index 6d260c3af..130165bc0 100644 --- a/3.x/release_note.txt +++ b/3.x/release_note.txt @@ -1 +1 @@ -v3.2.0 +v3.6.0 diff --git a/3.x/zh_CN/.readthedocs.yaml b/3.x/zh_CN/.readthedocs.yaml new file mode 100644 index 000000000..8aeb92280 --- /dev/null +++ b/3.x/zh_CN/.readthedocs.yaml @@ -0,0 +1,30 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.7" + # nodejs: "20" + # rust: "1.70" + # golang: "1.20" + +sphinx: + configuration: 3.x/zh_CN/conf.py + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: +# - pdf +# - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ./requirements.txt + diff --git a/3.x/zh_CN/conf.py b/3.x/zh_CN/conf.py index 1d9320373..cee3bb7da 100644 --- a/3.x/zh_CN/conf.py +++ b/3.x/zh_CN/conf.py @@ -76,7 +76,7 @@ master_doc = 'index' # General information about the project. -project = u'FISCO BCOS v3' +project = u'FISCO BCOS 3.0' copyright = u'© 2022. All rights reserved.' author = u'fisco-bcos-dev' @@ -87,7 +87,7 @@ # The short X.Y version. version = '3.0' # The full version, including alpha/beta/rc tags. -release = 'v3.2.0' +release = 'v3.6.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -140,7 +140,7 @@ using_rtd_theme = True html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] todo_include_todos = True -html_extra_path = ['../_static', '../../2.x/images', 'images', './docs/develop/sdk/java_sdk/javadoc'] +html_extra_path = ['../_static', '../../2.x/images', 'images', './docs/sdk/java_sdk/javadoc'] # VCS options: https://docs.readthedocs.io/en/latest/vcs.html#github html_context = { @@ -148,7 +148,7 @@ "github_repo": "FISCO-BCOS-DOC", # Repo name "github_user": "FISCO-BCOS", "github_version": "release-3", # Version - "conf_py_path": "/", # Path in the checkout to the docs root + "conf_py_path": "/3.x/zh_CN/", # Path in the checkout to the docs root } # Theme options are theme-specific and customize the look and feel of a theme @@ -359,3 +359,22 @@ def setup(app): app.add_transform(AutoStructify) app.add_stylesheet('css/custom.css') app.add_javascript('js/readthedocs-analytics.js') + app.connect('build-finished', replace_source) + +def replace_source(app, exception): + if exception is None: + build_dir = os.environ.get('READTHEDOCS_OUTPUT', '_build') + + for root, dirs, files in os.walk(build_dir): + for file in files: + if file.endswith('.html'): + html_path = os.path.join(root, file) + + with open(html_path, 'r') as file: + lines = file.readlines() + + new_lines = [line.replace('https://unpkg.com', 'https://npm.onmicrosoft.cn') for line in lines] + new_lines = [line.replace('https://cdnjs.cloudflare.com', 'https://cdn.bootcdn.net') for line in new_lines] + + with open(html_path, 'w') as file: + file.writelines(new_lines) diff --git a/3.x/zh_CN/docs/advanced_function/distributed_event.md b/3.x/zh_CN/docs/advanced_function/distributed_event.md new file mode 100644 index 000000000..6cc170a0e --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/distributed_event.md @@ -0,0 +1,18 @@ +# 4. 分布式事件框架 WeEvent +标签: ``分布式事件`` + +------- + +WeEvent是的一套可信、可靠、高效的跨机构、跨平台事件通知机制,支持FISCO BCOS。 + +具体而言,WeEvent是一个基于区块链实现的事件中间件服务,面向用户提供事件发布订阅Publish/Subscribe功能。发布到WeEvent上的事件永久存储,不可篡改,支持事后跟踪和审计。生产者Producer通过WeEvent代理服务发布事件,事件内容会被记录到区块链如FISCO-BCOS上,消费者Consumer从WeEvent订阅事件。订阅成功后,只要生产者发布事件,消费者都会及时得到通知。 + +WeEvent服务使用Spring Boot框架开发,在业务集成上,既支持直接加载独立的JAR包使用服务,也支持通过代理服务来提供功能。 + +weEvent秉承分布式商业模式中对等合作、智能协同、价值共享的设计理念,致力于提升机构间合作效率,降低合作成本,同时打通应用程序、物联网、云服务和私有服务等不同平台,最终在不改变已有商业系统的开发语言、接入协议的情况下,做到跨机构、跨平台的事件通知与处理。 + +详细内容可参考 + +- [WeEvent在线文档](https://weeventdoc.readthedocs.io/zh_CN/latest/index.html) + +- [WeEvent github主页](https://github.com/WeBankBlockchain/WeEvent) \ No newline at end of file diff --git a/3.x/zh_CN/docs/advanced_function/distributed_identity.md b/3.x/zh_CN/docs/advanced_function/distributed_identity.md new file mode 100644 index 000000000..502e01dcf --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/distributed_identity.md @@ -0,0 +1,16 @@ +# 3. 分布式身份 WeIdentity +标签: ``分布式身份`` ``Identity`` + +------ + +WeIdentity是一套分布式多中心的技术解决方案,可承载实体对象(人或者物)的现实身份与链上身份的可信映射、以及实现实体对象之间安全的访问授权与数据交换,支持FISCO BCOS。 + +WeIdentity由微众银行自主研发并完全开源,秉承公众联盟链整合资源、交换价值、服务公众的理念,致力于成为链接多个垂直行业领域的分布式商业基础设施,促进泛行业、跨机构、跨地域间的身份认证和数据合作。 + +WeIdentity目前主要包含两大模块:分布式身份标识(WeIdentity DID)以及可验证数字凭(WeIdentity Credential)。 + +WeIdentity详细内容介绍可参考 + +- [WeIdentity技术文档](https://weidentity.readthedocs.io/zh_CN/latest/index.html) + +- [WeIdentity github主页](https://github.com/WeBankBlockchain/WeIdentity) \ No newline at end of file diff --git a/3.x/zh_CN/docs/advanced_function/privacy/index.md b/3.x/zh_CN/docs/advanced_function/privacy/index.md new file mode 100644 index 000000000..8eb5e7c39 --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/privacy/index.md @@ -0,0 +1,36 @@ +############################################################## +6. 隐私保护方案 +############################################################## + +标签:``隐私保护`` ``同态加密`` ``群/环签名`` ``WeDPR`` + +---- + +隐私保护是联盟链的一大技术挑战。为了保护链上数据、保障联盟成员隐私,并且保证监管的有效性,FISCO BCOS以[预编译合约](../../contract_develop/c++_contract/index.md) +的形式集成了同态加密、群/环签名验证功能,提供了多种隐私保护手段。此外,通过ZPK(零知识证明)以及WeDPR-Lab等一系列隐私保护项目保证链上链下数据隐私和信息安全。 + +**群/环签名:** +FISCOBCOS 支持一个群/环签名,群/环签名包括群签名(Group Signature)与环签名(Ring Signature)两个部分。 + +群签名是一种能保护签名者身份的具有相对匿名性的数字签名方案,用户可以代替自己所在的群对消息进行签名,而验证者可以验证该签名是否有效,但是并不知道签名属于哪一个群成员。同时,用户无法滥用这种匿名行为,因为群管理员可以通过群主私钥打开签名,暴露签名的归属信息。 + +环签名是一种特殊的群签名方案,但具备完全匿名性,即不存在管理员这个角色,所有成员可主动加入环,且签名无法被打开。 + +**同态加密:** +同态加密本质是一种公钥加密算法,即加密使用公钥pk,解密使用私钥sk;并且支持密文计算。FISCO BCOS采用的是paillier加密算法,支持加法同态。paillier的公私钥兼容主流的RSA加密算法,接入门槛低。同时paillier作为一种轻量级的同态加密算法,计算开销小易被业务系统接受。 + +**ZPK:** +零知识证明 + + +**WeDPR-Lab:** +WeDPR-Lab是一系列即时可用场景式隐私保护高效解决方案套件和服务。此方案致力于解决业务数字化中隐私不“隐”、共享协作不可控等隐私保护风险痛点,消除隐私主体的隐私顾虑和业务创新的合规壁垒,助力基于隐私数据的核心价值互联和新兴商业探索,营造公平、对等、共赢的多方数据协作环境,达成数据价值跨主体融合和数据治理的可控平衡。 + + + +.. toctree:: + :maxdepth: 1 + + privacy.md + zpk.md + wedpr.md diff --git a/3.x/zh_CN/docs/advanced_function/privacy/privacy.md b/3.x/zh_CN/docs/advanced_function/privacy/privacy.md new file mode 100644 index 000000000..5cdcbcd4a --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/privacy/privacy.md @@ -0,0 +1,198 @@ +# 同态加密与群环签名 + +标签:``隐私合约`` ``隐私保护`` ``合约开发`` ``同态加密`` ``环签名`` + +---- +隐私保护是联盟链的一大技术挑战。为了保护链上数据、保障联盟成员隐私,并且保证监管的有效性,FISCO BCOS以[预编译合约](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html#id2)的形式集成了同态加密、群/环签名验证功能,提供了多种隐私保护手段。 + +文档一、二节分别对同态加密和群/环签名算法以及相关应用场景进行了简单介绍,第三、四节则详细介绍了FISCO BCOS隐私保护模块启用方法以及调用方式。 + + +```eval_rst +.. note:: + 1. FISCO BCOS 2.3.0+ 支持同态加密、群签名和环签名 + 2. FISCO BCOS 2.3.0, 2.4.0以及2.4.1,需要手动编译二进制启用隐私保护模块 + 3. FISCO BCOS 2.5.0+默认启用隐私保护模块 +``` + +## 同态加密 + +### 算法简介 + +同态加密(Homomorphic Encryption)是公钥密码系统领域的明珠之一,已有四十余年的研究历史。其绝妙的密码特性,吸引密码学家前赴后继,在业界也受到了广泛的关注。 + +- 同态加密本质是一种公钥加密算法,即加密使用公钥pk,解密使用私钥sk; +- 同态加密支持密文计算,即由相同公钥加密生成的密文可以计算​f( )操作,生成的新密文解密后恰好等于两个原始明文计算f( )的结果; +- 同态加密公式描述如下: + +![](../../images/privacy/formula.jpg) + +FISCO BCOS采用的是paillier加密算法,支持加法同态。paillier的公私钥兼容主流的RSA加密算法,接入门槛低。同时paillier作为一种轻量级的同态加密算法,计算开销小易被业务系统接受。因此经过功能性和可用性的权衡,最终选定了paillier算法。 + + +### 功能组件 + +FISCO BCOS同态加密模块提供的功能组件包括: + +- paillier同态库[GitHub源码](https://github.com/FISCO-BCOS/paillier-lib)/[Gitee源码](https://gitee.com/FISCO-BCOS/paillier-lib),包括java库和c++同态接口。 + +- paillier[预编译合约](#id18),供智能合约调用,提供密文同态运算接口。 + +### 使用方式 + +对于有隐私保护需求的业务,如果涉及简单密文计算,可借助本模块实现相关功能。凡是上链的数据可通过调用paillier库完成加密,链上的密文数据可通过调用paillier预编译合约实现密文的同态加运算,密文返还回业务层后,可通过调用paillier库完成解密,得到执行结果。具体流程如下图所示: + +![](../../images/privacy/paillier.jpg) + +### 应用场景 + +在联盟链中,不同的业务场景需要配套不同的隐私保护策略。对于强隐私的业务,比如金融机构之间的对账,对资产数据进行加密是很有必要的。在FISCO BCOS中,用户可以调用同态加密库对数据进行加密,共识节点执行交易的时候调用同态加密预编译合约,得到密文计算的结果。 + +## 群/环签名 + +### 算法简介 + +**群签名** + +群签名(Group Signature)是一种能保护签名者身份的具有相对匿名性的数字签名方案,用户可以代替自己所在的群对消息进行签名,而验证者可以验证该签名是否有效,但是并不知道签名属于哪一个群成员。同时,用户无法滥用这种匿名行为,因为群管理员可以通过群主私钥打开签名,暴露签名的归属信息。群签名的特性包括: + +- 匿名性:群成员用群参数产生签名,其他人仅可验证签名的有效性,并通过签名知道签名者所属群组,却无法获取签名者身份信息; +- 不可伪造性:只有群成员才能生成有效可被验证的群签名; +- 不可链接性:给定两个签名,无法判断它们是否来自同一个签名者; +- 可追踪性:在监管介入的场景中,群主可通过签名获取签名者身份。 + +**环签名** + +环签名(Ring Signature)是一种特殊的群签名方案,但具备完全匿名性,即不存在管理员这个角色,所有成员可主动加入环,且签名无法被打开。环签名的特性包括: + +- 不可伪造性:环中其他成员不能伪造真实签名者签名; +- 完全匿名性:没有群主,只有环成员,其他人仅可验证环签名的有效性,但没有人可以获取签名者身份信息。 + +### 功能组件 + +FISCO BCOS群/环签名模块提供的功能组件包括: + +- 群/环[签名库](https://github.com/FISCO-BCOS/group-signature-lib),提供完整的群/环签名算法c++接口 + +- 群/环签名[预编译合约](#id18),供智能合约调用,提供群/环签名验证接口。 + +### 使用方式 + +有签名者身份隐匿需求的业务可借助本模块实现相关功能。签名者通过调用群/环签名库完成对数据的签名,然后将签名上链,业务合约通过调用群/环签名预编译合约完成签名的验证,并将验证结果返还回业务层。如果是群签名,那么监管方还能打开指定签名数据,获得签名者身份。具体流程如下图所示: + +![](../../images/privacy/group_sig.jpg) + +### 应用场景 + +群/环签名由于其天然的匿名性,在需要对参与者身份进行隐匿的场景中有广泛的应用前景,例如匿名投票、匿名竞拍、匿名拍卖等等,甚至在区块链UTXO模型中可用于实现匿名转账。同时,由于群签名具备可追踪性,可以用于需要监管介入的场景,监管方作为群主或者委托群主揭露签名者身份。 + +### 开发示例 + +FISCO BCOS专门为用户提供了群/环签名开发示例,包括: + +- 群/环签名服务端: 提供完整的群/环签名RPC服务。[GitHub源码](https://github.com/FISCO-BCOS/group-signature-server)、[Gitee源码](https://gitee.com/FISCO-BCOS/group-signature-server) + +- 群/环签名客户端: 调用RPC服务对数据进行签名,并提供签名上链以及链上验证等功能。[GitHub源码](https://github.com/FISCO-BCOS/group-signature-client/tree/master-2.0)、[Gitee源码](https://gitee.com/FISCO-BCOS/group-signature-client/tree/master-2.0) + +示例框架如下图所示,具体操作方法请参阅[客户端指南 Github链接](https://github.com/FISCO-BCOS/group-signature-client/tree/master-2.0)或[客户端指南 Gitee链接](https://gitee.com/FISCO-BCOS/group-signature-client/tree/master-2.0)。 + +![](../../images/privacy/demo.jpg) + +## 启用方法 + +FISCO BCOS隐私保护模块是通过预编译合约实现的,默认被启用。使用源码编译请参考[这里](../blockchain_dev/get_executable.md). + +### 搭建联盟链 + +假设当前位于`FISCO-BCOS/build`目录下,则使用下面的指令搭建本机4节点的链指令如下,更多选项[参考这里](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/build_chain.html)。 + +```bash +bash ../manual/build_chain.sh -l 127.0.0.1:4 -e bin/fisco-bcos +``` + + +## 预编译合约接口 + +隐私模块的代码和用户开发的预编译合约都位于`FISCO-BCOS/libprecompiled/extension`目录,因此隐私模块的调用方式和用户开发的预编译合约[调用流程](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html#id12)相同,不过有两点需要注意: + +1.已为隐私模块的预编译合约分配了地址,无需另行注册。隐私模块实现的预编译合约列表以及地址分配如下: + +源码可参考链接:[GitHub链接](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0/libprecompiled/extension)、[Gitee链接](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0/libprecompiled/extension) + + | 地址 | 功能 | 源码 | + | ------ | ---------- | ------------------------------------------------------------ | + | 0x5003 | 同态加密 | PaillierPrecompiled.cpp | + | 0x5004 | 群签名 | GroupSigPrecompiled.cpp | + | 0x5005 | 环签名 | RingSigPrecompiled.cpp | + +2.需要通过`solidity`合约方式声明隐私模块预编译合约的接口,合约文件需保存在控制台合约目录`console/contracts/solidity`中,各个隐私功能的合约接口如下,可直接复制使用: + +- 同态加密 + + ```solidity + // PaillierPrecompiled.sol + pragma solidity ^0.4.24; + contract PaillierPrecompiled{ + function paillierAdd(string cipher1, string cipher2) public constant returns(string); + } + ``` + +- 群签名 + + ```solidity + // GroupSigPrecompiled.sol + pragma solidity ^0.4.24; + contract GroupSigPrecompiled{ + function groupSigVerify(string signature, string message, string gpkInfo, string paramInfo) public constant returns(bool); + } + ``` + +- 环签名 + + ```solidity + // RingSigPrecompiled.sol + pragma solidity ^0.4.24; + contract RingSigPrecompiled{ + function ringSigVerify(string signature, string message, string paramInfo) public constant returns(bool); + } + ``` + +## 控制台调用 + +使用新编译出的二进制搭建节点后,部署控制台v1.0.2以上版本,将预编译合约接口声明文件拷贝到控制台合约目录。以调用同态加密为例,命令如下: + +```solidity +# 在console目录下启动控制台 +bash start.sh + +# 调用合约 +call PaillierPrecompiled 0x5003 paillierAdd "0100E97E06A781DAAE6DBC9C094FC963D73B340D99FD934782A5D629E094D3B051FBBEA26F46BB681EB5314AE98A6A63805834E26BD0154243581DD77709C5DB15357DBEC34F8D8B9D5892FDF5F5FC56B1474CF58D6AC23AA867E34653B469058DCDBDC283D493711022131FBCBCFAC639919A7C0FE45EECDBD43FA543492D3058737F567626318282C2C35027B05E901F45CB3B71479FC49FD08B3F81C82326DEF28739D6A7D090F93D1B5058CDA89134AB103DB49EA51FF14310179FF9B3284BC6C3B6BA3BB0FCB35FEA6AF1453A4AAEB3EB82E9B99875BEA89CD970905B40E6E5FC906F0959769865FF29A83CD23ACC0C832A0DE30D0C691335A7ABE2EA0782778E14DAACACD60767862D5E285E8FB7B6D62C9AABE1BE751DD68001F492D6FD4C46583B25FF1806A954E8DB5ED935C5A2CA6816C4EDB48D4A41D146E09EF1CA5AFECC38F38E4147D9C6D07429F058266CC879AF8AA88510E85608756585C8D78400DFFA32244B99DC1A533780CAEA07578AF340C3C4ABED09355A006FCE99F22BE113F5317256198ACB6CA9D8501EDF42A11CFCCF677755D081E48249B9345FA8C2F73E6CB37CB17C2A5A1EA4DC44949A63E8DA45F3DCE827654688312F399873E897CDD413C84DC0891884BEF8ECBC99F48CBB3DA2D04B40CDCB03A6CD8FDC11277A5AA5F73DB6B828AB24978480604D0143A0A5020EE985A88EEC73FD9DF205E5CD5C54C06ADD092E839B91F28887C9BF7775275552E1B673997A792683B784827078CC7BF7121318B0565739588268372EDD320B1BB2FEE8D873222C00AF93D07C0572BF3E089806EA7E3C8D334973B4BE61E31E389CB919FCEE834E1D9EBA624DE324D85425BCCDF8C3F8F3A94E33A307CAAE5922E46FFE96A521ECB6E7D681E7CF6A1900EEF0DDF23ADEC6EFA8842110FF1F266AEDA7B501DBC94D20817DD43D9EB056E3DA4DA977E85A53207F2C229F9302EB5029B5C31EE40FC7E25591CDC6B4AD206BDFB50C5F7D2DA2D6B8AB7A6B575C20FDD12A37EBECF27D60B651842DED09776218613F72628C1A3540252895A192DF51A1B7479EFC45A4B489FC" "0100E97E06A781DAAE6DBC9C094FC963D73B340D99FD934782A5D629E094D3B051FBBEA26F46BB681EB5314AE98A6A63805834E26BD0154243581DD77709C5DB15357DBEC34F8D8B9D5892FDF5F5FC56B1474CF58D6AC23AA867E34653B469058DCDBDC283D493711022131FBCBCFAC639919A7C0FE45EECDBD43FA543492D3058737F567626318282C2C35027B05E901F45CB3B71479FC49FD08B3F81C82326DEF28739D6A7D090F93D1B5058CDA89134AB103DB49EA51FF14310179FF9B3284BC6C3B6BA3BB0FCB35FEA6AF1453A4AAEB3EB82E9B99875BEA89CD970905B40E6E5FC906F0959769865FF29A83CD23ACC0C832A0DE30D0C691335A7ABE2EA07827736DDD4C285AB8C5F53DA58502BD2E312C939139E591C83D009C763836B05676CEDE46C9BFEBA7AF6242739F1E27A0AABB13F37CFF2DFEE5D14D52A660FDD012748025F9915585123FD263E211C594A0EDB7AFDA1240A2C340C44C3568FA47AB2CC00459DF31828C56CAC0284B5D0D3BC3D6F37969FACED77B03107B88F60A73E1F9FEBE6152FB00BDAECA9954AC28D4D9599FE234AF2E52748DBEB65570F2B99A638C275235494189B887FAEA39FE12CB1BAE9AE085E353D4DC01863052FE141D87D98E78C46FFD0F634D498E4E4B2F87B60D505F8401DCCC1BC0D9E32B8C5AF6A6257DB61DDD166CC17E712626218C16D00C24042D928028972816919C1CD9E1AB2F3135D798BE795D79013C3BDE507811E05D88050E7DF1BD3ED0EB7405BA21E854551A7EBD6351E0B9300428C77B1FA532DB9C5D9A0D4BB9F7E96BAFA259D419D75398141801B148C3EF9AE437A424E4E781238964C10EE39260DD0058392CD83C1DFEDAE2D557E5E7D643608B1BB0327AB92550A66F6D636F9F638A5077D721E6BD9344851E3FE288984F120C05A62DD9E283498B5AD680E91E0CBAD3093598B54E8A6964EB406068BB765945B182CD5EBC8910F2DE80C902751EEB77FCB583784DD852E4B6FF2CC1EBA44A5F750B2AD11240F7B95D87055F3CC5A837FA682117ACA1787CF107C9D4B111C8B9FBB78553452E351A8F0E3C50F536CA3304C" + +# 返回结果 +0100E97E06A781DAAE6DBC9C094FC963D73B340D99FD934782A5D629E094D3B051FBBEA26F46BB681EB5314AE98A6A63805834E26BD0154243581DD77709C5DB15357DBEC34F8D8B9D5892FDF5F5FC56B1474CF58D6AC23AA867E34653B469058DCDBDC283D493711022131FBCBCFAC639919A7C0FE45EECDBD43FA543492D3058737F567626318282C2C35027B05E901F45CB3B71479FC49FD08B3F81C82326DEF28739D6A7D090F93D1B5058CDA89134AB103DB49EA51FF14310179FF9B3284BC6C3B6BA3BB0FCB35FEA6AF1453A4AAEB3EB82E9B99875BEA89CD970905B40E6E5FC906F0959769865FF29A83CD23ACC0C832A0DE30D0C691335A7ABE2EA0782774D011D9A668B26E65506EF2E8B3EBA70B882DE36FEC5951B64B9D967EE5E05B1AF62EE569358360C43220A756E7FB610FCBD5A366D077C48342EE3025735D6590531A7E609ADE2608BB4173167F972AB860674DB89769E2D97EE3E308D3CA04802EF8F85BC6BFCD270F1FC6AEA5C09F51E8914273D8BD7833D55D9AF3D0102315880A57D531E30EDD8E777CDE8708AE7DDF83A8C5B48854FD4CD4E7372CED017C0BACD49E409C45F7071113B12494D3955BA1D7618E196A14012B11ADB63B857C9033604575FC7FF1D5833A53ACDE8877311FFE78F0CAEBAA27B0E5ADCDD809AEDCD5C7D2CA7F15E53AB7D62ADF04686E05B1F79CA91AFD2CE120AAD7D0F15C8E7B59968CE13BA10C99B50BE696C22A59109C3E6E5EDBE364FF5717443C175DEE5680908AEF67AF6261644AEEFAD42538A8686481CF0109296D1A2FF030143A0DED95F54CC158BF3A3FCD0B2278BDB6942D6E536CA45E3015B764FF5A94B57D232F86CFC66A29C55B9A78336026FFB6D8882E6F4CE2F8D007C225B6B3DE814FC60EB278B25FB0A1F6B4A34E920CA952BC3F14D121D5438E12634AD951EBD5911B281E3ADEC43410B91DC28B68F9D79D7F203245E87EE1DB3883B0C925C5A9BA157AB2F07ACD9A09F89EF211EED16358E78EDAF091FBA914225BF8A7DCDD2DD12EC0ABBC10E9E5F7DD48239B0A68CBD81637B1C0D7ED1DF89D714DFC6C1B7B6B3 +``` + +**注:** 控制台输入的密文可通过paillier库中的java库生成。源代码链接:[GitHub链接](https://github.com/FISCO-BCOS/paillier-lib/tree/master/paillierJava)、[Gitee链接](https://gitee.com/FISCO-BCOS/paillier-lib/tree/master/paillierJava) + +## solidity合约调用 + +以调用同态加密为例,通过在solidity合约中创建预编译合约对象并调用其接口,在控制台`console/contracts/solidity`创建`CallPaillier.sol`文件,文件内容如下: + +```solidity +// CallPaillier.sol +pragma solidity ^0.4.24; +import "./PaillierPrecompiled.sol"; + +contract CallPaillier { + PaillierPrecompiled paillier; + function CallPaillier() { + // 调用PaillierPrecompiled预编译合约 + paillier = PaillierPrecompiled(0x5003); + } + function add(string cipher1, string cipher2) public constant returns(string) { + return paillier.paillierAdd(cipher1, cipher2); + } +} +``` + +部署`CallPaillier`合约,然后调用`CallPaillier`合约的`add`接口,使用上面的密文作为输入,可以得到相同的结果。 diff --git a/3.x/zh_CN/docs/advanced_function/privacy/wedpr.md b/3.x/zh_CN/docs/advanced_function/privacy/wedpr.md new file mode 100644 index 000000000..12a8c309c --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/privacy/wedpr.md @@ -0,0 +1,18 @@ +# 3. WeDPR-Lab +标签: ``隐私保护`` + +------ + +WeDPR-Lab是一系列即时可用场景式隐私保护高效解决方案套件和服务,参见WeDPR白皮书,由微众银行区块链团队自主研发。方案致力于解决业务数字化中隐私不“隐”、共享协作不可控等隐私保护风险痛点,消除隐私主体的隐私顾虑和业务创新的合规壁垒,助力基于隐私数据的核心价值互联和新兴商业探索,营造公平、对等、共赢的多方数据协作环境,达成数据价值跨主体融合和数据治理的可控平衡。 + +WeDPR-Lab具备以下特色和优势: + +1. 场景式解决方案:已基于具有共性的场景需求,提炼出公开可验证密文账本、多方密文决策、多方密文排名、多方密文计算、多方安全随机数生成、选择性密文披露等高效技术方案框架模板,可应用于支付、供应链金融、跨境金融、投票、选举、榜单、竞拍、招标、摇号、抽检、审计、隐私数据聚合分析、数字化身份、数字化资质凭证、智慧城市、智慧医疗等广泛业务场景。 +2. 即时可用:高性能、高易用、跨平台跨语言实现、不依赖中心化可信服务、不依赖可信硬件、支持国密算法标准、隐私效果公开可验证,5分钟一键构建示例应用。 +3. 透明可控:隐私控制回归属主,杜绝数据未授权使用,在『数据可用而不可见』的基础上,进一步实现数据使用全程可监管、可追溯、可验证。 + +WeDPR-Lab全面拥抱开放,将陆续开源一系列核心算法组件,进一步提升系统安全性的透明度,提供更透明、更可信的隐私保护效果。WeDPR-Lab就是这一系列开源的核心算法组件的集合。 + + +- [WdDPR-Lab 用户文档](https://wedpr-lab.readthedocs.io/zh_CN/latest/index.html) +- [WdDPR-Lab github](https://github.com/WeBankBlockchain/WeDPR-Lab-Core) \ No newline at end of file diff --git a/3.x/zh_CN/docs/advanced_function/privacy/zpk.md b/3.x/zh_CN/docs/advanced_function/privacy/zpk.md new file mode 100644 index 000000000..04f0b2380 --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/privacy/zpk.md @@ -0,0 +1,3 @@ +# 零知识证明 + +----- diff --git a/3.x/zh_CN/docs/advanced_function/privacy_protect.md b/3.x/zh_CN/docs/advanced_function/privacy_protect.md new file mode 100644 index 000000000..1209fc410 --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/privacy_protect.md @@ -0,0 +1,19 @@ +# 6. 隐私保护方案 WeDPR +标签: ``隐私保护`` + +---- +WeDPR是一系列即时可用场景式隐私保护高效解决方案套件和服务,参见WeDPR白皮书,由微众银行区块链团队自主研发,支持FISCO BCOS。 + +方案致力于解决业务数字化中隐私不“隐”、共享协作不可控等隐私保护风险痛点,消除隐私主体的隐私顾虑和业务创新的合规壁垒,助力基于隐私数据的核心价值互联和新兴商业探索,营造公平、对等、共赢的多方数据协作环境,达成数据价值跨主体融合和数据治理的可控平衡。 + +WeDPR具备以下特色和优势: + +1. 场景式解决方案:已基于具有共性的场景需求,提炼出公开可验证密文账本、多方密文决策、多方密文排名、多方密文计算、多方安全随机数生成、选择性密文披露等高效技术方案框架模板,可应用于支付、供应链金融、跨境金融、投票、选举、榜单、竞拍、招标、摇号、抽检、审计、隐私数据聚合分析、数字化身份、数字化资质凭证、智慧城市、智慧医疗等广泛业务场景。 +2. 即时可用:高性能、高易用、跨平台跨语言实现、不依赖中心化可信服务、不依赖可信硬件、支持国密算法标准、隐私效果公开可验证,5分钟一键构建示例应用。 +3. 透明可控:隐私控制回归属主,杜绝数据未授权使用,在『数据可用而不可见』的基础上,进一步实现数据使用全程可监管、可追溯、可验证。 + +WeDPR全面拥抱开放,将陆续开源一系列核心算法组件,进一步提升系统安全性的透明度,提供更透明、更可信的隐私保护效果。WeDPR-Lab就是这一系列开源的核心算法组件的集合。 + +- [WdDPR白皮书]() +- [WdDPR-Lab 用户文档](https://wedpr-lab.readthedocs.io/zh_CN/latest/index.html) +- [WdDPR-Lab github](https://github.com/WeBankBlockchain/WeDPR-Lab-Core) \ No newline at end of file diff --git a/3.x/zh_CN/docs/advanced_function/safety.md b/3.x/zh_CN/docs/advanced_function/safety.md new file mode 100644 index 000000000..e214381f9 --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/safety.md @@ -0,0 +1,15 @@ +# 1. 合约安全检测 SCStudio +标签: ``合约安全`` + +------ + +FISCO BCOS与清华大学系统安全保障小组针对智能合约安全共同开发项目SCStudio。 + +具体而言,SCStudio是一款针对 Solidity 合约的安全分析工具。在Visual Studio Code(VS Code)开发环境下,开发者可通过 SCStudio 提供的 VS Code 扩展,在合约的开发过程中使用 SCStudio 进行实时安全性检查。SCStudio 由清华大学软件系统安全保障小组开发并贡献。 + +当前,本项目由fCorleone(清华大学)、renardbebe(清华大学)及 vita-dounai(微众银行)负责维护。 如果你在使用过程中遇到了任何问题,请移步至issue 区提交 issue。 + +源码与详细安装部署可参考github链接 + +- [SCStudio github主页](https://github.com/FISCO-BCOS/SCStudio) + diff --git a/3.x/zh_CN/docs/advanced_function/trusted_oracle.md b/3.x/zh_CN/docs/advanced_function/trusted_oracle.md new file mode 100644 index 000000000..f074c9589 --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/trusted_oracle.md @@ -0,0 +1,22 @@ +# 5. 可信预言机 Truora +标签: ``预言机`` ``Truora`` + +----- + +Truora是一个基于FISCO BCOS平台的预言机服务,支持FISCO BCOS2.x和3.x版本。 + +Truora通过在链下运行的Java服务,监听链上预言机合约事件,发起链下相关的资源访问和计算任务,并将结果返回到链上预言机合约,供链上使用。 + +Truora支持的特性: + +1) 获取外部数据(http/https) 并将结果写回链上,供链上合约验证和使用。 + +2) 链下生成随机数,供链上验证使用,即VRF可验证随机数。 + +3) 面向对象的实现,可扩展更多链上事件监听、链下数据获取/计算并可信验证的逻辑。 + +详细介绍请查看 + +- [Truora在线文档](https://truora.readthedocs.io/zh_CN/main/) + +- [Truora github主页](https://github.com/WeBankBlockchain/Truora-Service) \ No newline at end of file diff --git a/3.x/zh_CN/docs/advanced_function/wecross.md b/3.x/zh_CN/docs/advanced_function/wecross.md new file mode 100644 index 000000000..cec55db67 --- /dev/null +++ b/3.x/zh_CN/docs/advanced_function/wecross.md @@ -0,0 +1,15 @@ +# 2. 跨链协作平台 WeCross +标签: ``跨链`` + +------ +WeCross区块链跨链协作平台是在跨链技术方面的自主研发并完全开源的研究成果,支持FISCO BCOS。 + +WeCross基于一揽子自主研发并开源的区块链技术方案,针对不同服务形态、不同区块链平台之间无法进行可信连接与交互的行业痛点,研发区块链跨链协作平台——WeCross,以促进跨行业、机构和地域的跨区块链信任传递和商业合作。实现了一站式跨链管理、插件式跨链介入、统一跨链身份、统一跨链资源范式、保证跨链事务资产原子交换与合约跨链调用等功能。 + +WeCross着眼应对区块链行业现存挑战,不局限于满足同构区块链平行扩展后的可信数据交换需求,还进一步探索异构区块链之间因底层架构、数据结构、接口协议、安全机制等多维异构性导致无法互联互通问题的有效解决方案。作为未来区块链互联的基础设施,WeCross 秉承多方参与、共享资源、智能协同和价值整合的理念,面向公众完全开源,欢迎广大企业及技术爱好者踊跃参与项目共建。 + +WeCross详细内容介绍可参考 + +- [WeCross技术文档](https://WeCross.readthedocs.io/zh_CN/latest/index.html) + +- [WeCross github主页](https://github.com/WeBankBlockchain/WeCross) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/1_conception/distributed_system.md b/3.x/zh_CN/docs/articles/1_conception/distributed_system.md new file mode 100644 index 000000000..2958e638f --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/distributed_system.md @@ -0,0 +1,128 @@ +# 反常理,反直觉,区块链是怎样的一种“分布式系统” + +作者:张开翔|FISCO BCOS 首席架构师 + +我们经常看到“区块链是分布式系统”的说法,并推论出区块链先天具备分布式系统的优势,仿佛作为分布式系统,规模就该足够大,数据就该足够分散。 +事实上,典型区块链有很多特征和常见的分布式系统不同,甚至是相悖的,为此,区块链曾被戏称为“最慢的分布式数据库”。 +**其实区块链之所以难以理解,其中一个原因是其设计哲学的“反常理、反直觉”**。笔者本人曾多年在互联网海量服务领域里踩坑,然后转向区块链领域深入研究,也经历过一阵子的观念切换期。 + +本文不打算全面讲述分布式系统原理和历史,那能写几本书。这里打算从常见的、被人广泛认知的互联网分布式系统出发,聊聊“分布式系统”和区块链有什么异同,对技术和设计的要求有哪些路径分支。 + +经典的分布式著作《分布式系统概念与设计》中,对“分布式系统”给出的定义其实很笼统:**分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。** + +简而言之,只要不是运行在一台机器上或一个进程里的系统,都可以是分布式系统。 +比如,大型网站、APP、全民IM社交软件的支撑系统,基于X86体系的新型金融基础设施,都可以是分布式系统。 +至于这个分布式系统是属于一个机构的,还是属于多个不同机构维护的,并不是这个定义的重点。 + +## 互联网海量服务系统之道 + +提示:已经比较熟悉互联网海量设计的读者,可以直接跳过本节 + +如果要求一个互联网服务的架构师,在面对山呼海啸的请求量、保存无限增长的数据的同时,提供良好的用户体验,保证延时很短的响应表现,这位架构师脑子里蹦出来的通常是“分层设计”、“冷热分离”、“平行扩展”、“并行处理”、“分库分表”等等关键字。 +互联网海量服务的架构通常是分层的,比如接入层、服务层、数据层等。在接入层根据各种策略进行负载均衡和灵活的路由分发,服务可以按功能分组。比如: +用户要改个人资料,请求发给资料服务; +用户浏览网页,请求查询服务吐数据; +用户要发帖了,转给内容服务; +用户要下单,该交易服务器接手了,每个服务只处理一部分业务逻辑,互相之间通过远程接口互相调用,且本身通常是“无状态”的,不受自身和其他服务处理状态的牵制,这种高内聚和松耦合的设计,利于针对不同服务的特性和负载,进行特定优化和灵活部署; +最后,数据存储是“分片”的,俗称“分库分表”,根据用户标识、业务类型等规则,将数据分摊在不同的数据库实例中,每个数据库实例上只有“部分”数据,仅仅是数据的“子集”。 + +![](../../../images/articles/distributed_system/IMG_4981.PNG) + +以UGC、社交、富文本、视频内容为主的互联网服务,对“交易事务性”要求并不那么强,其“分布式”更多的是追求将计算和数据均匀分散在多台服务器上,利用更多的CPU、更大的带宽、更大的内存、更大的磁盘空间来处理请求。 +一组服务器不够了,立刻增加一组,平行扩容和多活特性表现得淋漓尽致。整个体系会有一些主备和冗余,更多是为了满足服务质量、可用性、备份方面的要求。 +电商以及一些和金融、支付相关的流程会强调ACID事务性,采用的分布式一致性算法,如Raft、Paxos等,主要是追求多模块之间的最终一致性和系统稳定性。 + +毕竟在同一个机构里的系统,对抗欺诈的要求并不会太苛刻,而且可以根据特定的业务流程将交易分类,将单个事务控制在有限的范围内(如只有用户向商户单向转账),事务和事务之间进行清晰地隔离,这样也比较容易进行平行扩展。 + +如上图所示,一个典型的多层结构的互联网服务,模块众多,计算和存储分布都比较均匀,哪个模块成为瓶颈,就去增加哪个模块的硬件资源,进行业务路由配置和必要的数据迁移就是了。 + +像分布式数据库、大数据集群、或者BT网络、CDN这些“分布式系统”,大多也是遵循“**将用户和数据分散到不同的物理设备上**”这个原则,达到简单的“堆硬件”即可平行扩展的效果。 +硬件越多,技术上的“规模效应”越显著,即存储量更大、计算能力更强、总带宽越多,能服务的用户就越多。 +最重要的是,整个服务大部分是在同一个机构里,由同一个公司的团队维护,服务和服务之间并不需要解决“信任”的问题,默认信任其他服务的接口给出的结果,简单校验后立刻继续处理,整个系统就是要“快”,要“稳”。 +如果有一些合作类的接口暴露给外部公司,只需要确保接口层的性能、安全、稳定,以及满足合作规则即可。 + +## “带着锁链跳舞”的区块链 + +再看区块链,首先**整个网络并不是只有一个机构参与,节点都可能归属不同的机构**,大家一起共同维护网络,共同对交易达成共识。 +区块链的使命是突破机构边界,解决机构之间的信任和博弈问题,如果只在一个机构内“家养”一个区块链系统,固然可以运作,但收效未必最佳。 +区块链体系里,为了保证数据可追溯和可验证,避免少数节点篡改数据影响全网,**每个节点保存全部数据**,而不是像互联网服务这样“分库分表”。 + +![](../../../images/articles/distributed_system/IMG_4982.PNG) + + +让我们算一下,如果有一千万个用户,在互联网系统里分成10个数据库实例保存,则每个数据库实例只保存100万用户的数据。 +即使每个数据库实例都是“一主两备”,那么总的数据开销也只是原始数据的3倍。 +而经典的区块链设计是,每个节点都如数保存一千万用户的所有数据,且全网节点越多,保存的数据副本就越多。 +如全网有100个节点,则全网总的数据存储开销是原始数据的100倍;如有200个节点,全网总的数据存储则达到原始数据的200倍……以此类推,挺触目惊心。 +极端情况下,如果把整个地球的数据都上链,链上有1万个节点,那么相当于我们有了1万个地球......然而我们并没有这么多资源吧。 + +区块链的数据结构本身也是很有意思的一个环节。区块之间是链式关系,新的区块必须基于旧的区块生成。 +智能合约生成状态数据是全局性的,常常用类似帕特里夏树、merkle树这种复杂的数据结构进行维护,以便全网追溯、验证和计算。 +数据环环相扣,仿佛“铁板一块”,使得按冷热特征、时间和用户等维度切分数据有相当的挑战性,既要使数据可以分布到不同的存储里,又要保证可以快速访问,保证盘根错节的追溯验证。工程难度很大。 + +交易层面,在一个互相没有强信任关系的网络里,且处理的是大概率和“价值”有关系的交易,**区块链尤其强调交易的全局事务性,保证全网一致性,且为了避免有作恶节点伪造假数据,所有的交易都会在共识机制和网络同步驱动下,在所有的节点上进行排序、运算和校验。** +在支持智能合约的区块链上,每个智能合约被交易调用时,都会在所有节点上把合约代码跑一遍,以确保在每个节点上生成数据的过程是公认的、运行结果是一致的。 + +可见,区块链并不能把计算量分摊到不同的服务器上,所有的节点都是“复读机”,这就意味着增加节点,也不会增加全网并行计算能力,就算是全网有一万台计算机,速度也跟只有一台是一样的。 +如果把这种区块链称为“世界计算机”,可算是全世界步骤最统一、冗余度最高、速度最慢的世界计算机了。 + +**区块链系统的核心是共识算法。** + +POW挖矿是矿工用算力解一个难题,以争到记账权,再进行记账,并期盼自己的记账结果成为最长链。 +POW算法是出了名的又慢又耗电; +POS权益类共识,由一批“富翁”抵押资产以获得记账权,轮流记账,不需要算力竞争,性能表现好一些,但依旧是有轮流打包出块然后全网最终确认的过程; +PBFT(实用性拜占庭)共识,需要记账者多次往返交互,大多数人参与到多阶段的确认,才能达到最终状态。 +总的来说,和互联网服务追求的“无状态”不同,共识服务是“有状态”的,每种共识算法都需要参照网络、数据、记账者参与度、链当前状态(如“区块高度”和“共识阶段”)等等多维度的信息进行决策。 + +记账节点越多,协作成本越高,尤其是典型的PBFT算法,在节点增多时,共识会越来越慢,交易延迟会越来越高。 +如果让节点内部也“集群化”,采用“多层分布式架构”,是否可以实现类似互联网海量服务系统这样的可平行扩展呢?比如,将虚拟机改为多实例,并行计算交易,这样就可以解决计算瓶颈问题。 +但计算越快,单位时间可以产生的数据越多,这样也要求硬盘存储更多的数据,而硬盘的容量和IO速度是有限的。 +同时,计算快了,节点也会向网络广播更多的数据,节点公网互联的带宽通常不会太大,延时一般也比较明显(几十毫秒起)。 +于是,节点和节点之间交互又会命中网络速度的瓶颈,共识时延和数据同步时间变长,节点们就像一串绑在绳子上的蚂蚱,谁也蹦不高。由于存储和网络这些硬条件的天花板存在,集群化的计算再快也没有用了。 +最后,节点集群化确实可以使以节点为单位的服务处理能力有一定上升,同时也会带来的架构上的额外复杂性和部署运维成本。 + +还是引用一个数钱的例子: +有一大堆钱让十个人数,有两种方法。 +方法一,可以把钱分成十份,每个人数一份,这样很快就数完了,人越多,数得越快,但是如果里面有人数错了,或者甚至偷钱,那就有问题了。 +于是,为了资金安全,改成方法二,让一个人整理出一叠钱,先数一遍,然后让其他九个人也数一遍,每个人都验算记账后,再换个人整理出下一叠钱,重复上述节奏去数,这样结果肯定是不会错的,且能得到大家的公认。但参与数钱的人增加,并不会加速计数,反而有可能因为人多手杂导致更慢。 +方法一就是常见的互联网分布式系统的做法,方法二是区块链。 +可见,目的不同,导致设计哲学、系统结构、最终效果都不同。 + +## 如何把“好钢用到刀刃上” + +综上所述,区块链这种“分布式系统”,存储成本和节点数同比线性增加,而计算效率不升反降,使整个系统显得“贵”和“重”,这和互联网服务的“轻快灵”相背而驰。最要命的是,难以通过增加硬件、带宽、节点数来显著提升并行处理能力和存储量。 +但区块链的“网络规模效应”并不体现在硬件和计算上,而是体现在因为“共识”和“信任”上。 +区块链通过复杂的算法和博弈,构建了一种可信网络,使得更多人愿意参与到网络里,共同贡献数据和维护网络,体现“协作共赢”这个价值效应。 +这样也给我们一个重要启示:既然区块链的计算和存储成本是很高的,其目的是为了达到共识,那么,我们应该让区块链干最该干的事情。 + +### 1、哪些数据可以“上链”? + +**只有多方要在交易过程中用到的、必须共享的关键数据要上链,比如公共账本的账目。** + +视频、文件、图片、大规模的业务数据,可以生成摘要与交易数据关联,其本体通过其他渠道(如FTP、分布式文件系统等)进行交换。 +比如下棋,只需要把棋局结果放到链上,或者把每一步的数据算个摘要放到链上,并不需要每一步都记录到链上(除非认为这也是非常关键的信息)。 +毕竟每一笔放到“链上”的数据,都会占用所有节点的硬盘。 + +### 2、合约里写什么逻辑? + +应该是**写多方共同参与、协作记账、必须全局共识的关键逻辑,而不是牵涉密集计算的逻辑**。 +比如,进行复杂查询或建模分析,可以把链上的数据导出来放在链下去做,而不是写在合约里。要清楚,你写的每一行代码,再不是只在自己的服务上跑一次了,而是会在链上所有参与者的节点上跑起来,多写一行代码就会多消耗大家的一点CPU。 +所以,区块链上会有类似“Gas上限”这样的机制,来控制合约的代码规模。新一代的合约引擎,更是考虑只提供有限的、可以定制化的商业规则实现,而不是完全的开放式编程。 +作为开发者,是面向“自己的电脑”编程,还是面向“大家的电脑”编程,这就是互联网海量服务系统和区块链最大的不同。 +开发者必须切换思维模式,切忌滥用区块链上宝贵的计算、存储、网络资源,避免有意或无意的“公地悲剧”,而是精打细算,从全局权衡,找出协作模式和数据共享里的“最大公约数”,把好钢用到刀刃上。 + +## 性能也不是什么大问题 + +区块链的规模化、并发能力,依旧是业界非常关注的研究方向。互联网海量分布式系统的一些思想,对区块链的优化也有很重要的参考意义,包括平行扩展、分库分表、冷热分离、服务集群、负载均衡等等。 +现在我们在研究区块链优化时,常常有一种感觉,就是把之前在互联网业里解决经典“C1000K问题(应对百万级的并发量)”的过程再来一遍。 +技术优化方案百花齐放,诸如FISCO BCOS的多群组和并行多链架构,基于DAG的交易并发模型,以及行业热议的交易分片、Layer1/2多层网络、链外通道如闪电网络等。 +因为要满足区块链苛刻的信任和安全要求,实施这些方案成为“带着锁链跳舞”的艰辛工作。在不远的未来,在力求保证“信任”、“一致性”、“事务性”、“安全”等大前提下,区块链系统也可以具备可观的可扩展性,突破或逼近“不可能三角”的极限并不是梦。 + +**目前,在保证金融级业务的正确性、稳定性的前提下,FISCO BCOS已经做到在PBFT共识、16个节点规模、采用智能合约实现业务逻辑的条件下,达到单链2万多的TPS(硬件条件比较理想的压测环境)**。 +如果开启多群组、多链跨链、点对点通道等模式,更有显著的平行扩展效果,满足当前的业务需求已经没什么问题了,只要有足够的硬件资源投入,进行合理的调度,百万千万TPS也不是梦。 + +最后总结一下,我们认为区块链是一种特殊的“分布式系统”,要透彻地理解区块链,应该清晰地、就事论事地与其他类型分布式系统进行区分,理清各自的本质和设计哲学,避免混淆和迷惑。 +说到底,“分布式系统”本身就是一门博大精深的学科,包罗万象,并不能从一而论,而是有太多的精彩和技术路径需要去学习和发掘。 + + + diff --git a/3.x/zh_CN/docs/articles/1_conception/on_and_off_the_blockchain.md b/3.x/zh_CN/docs/articles/1_conception/on_and_off_the_blockchain.md new file mode 100644 index 000000000..490ab6f38 --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/on_and_off_the_blockchain.md @@ -0,0 +1,161 @@ +# 一文说清“链上”和“链下” + +作者:张开翔|FISCO BCOS 首席架构师 + +什么是“上链”?什么数据和逻辑应该“上链”?文件能不能上链?链上能不能批量查数据?“链下”又是什么? +“链上”、“链下”诸多问题,一文说清。 + +## 什么是“链上”和“链下” + +![](../../../images/articles/on_and_off_the_blockchain/IMG_5019.PNG) + +区块“链”的链,包含“**数据链**”和“**节点链**”。数据链指用链式结构组织区块数据,构成数据校验和追溯的链条;“节点链”指多个节点通过网络连接在一起,互相共享信息,其中的共识节点则联合执行共识算法,产生并确认区块。 + +交易“上链”的简要过程如下: + +1. 记账者们收录交易,按链式数据结构打包成“区块”。 +2. 共识算法驱动大家验证新区块里的交易,确保计算出一致的结果。 +3. 数据被广播到所有节点,稳妥存储下来,每个节点都会存储一个完整的数据副本。 + +交易一旦“上链”,则意味着得到完整执行,达成了“分布式事务性”。简单地说,就像一段话经过集体核准后在公告板上公示于众,一字不错不少,永久可见且无法涂改。 +“上链”意味着“**共识**”和“**存储**”,两者缺一不可。交易不经过共识,则不能保证一致性和正确性,无法被链上所有参与者接受;共识后的数据不被多方存储,意味着数据有可能丢失或被单方篡改,更谈不上冗余可用。 +除此之外,如果仅仅是调用接口查询一下,没有改变任何链上数据,也不需要进行共识确认,则不算“上链”。 + +或者,某个业务服务本身和区块链并不直接相关,或其业务流程无需参与共识,所生成的数据也不写入节点存储,那么这个业务服务称为“**链下服务**”,无论它是否和区块链节点共同部署在一台服务器,甚至和节点进程编译在一起。 +当这个业务服务调用区块链的接口发送交易,且交易完成“共识”和“存储”后,才称为“上链”;如果这个交易没有按预期被打包处理,那么可以叫“**上链失败**”。 + +事实上,几乎所有的区块链系统,尤其是和实体经济、现实世界结合的区块链应用,都需要链上链下协同,用“混合架构“来实现,系统本身就包含丰富的技术生态。 + +*注1:交易(transaction)是区块链里的通用术语,泛指发往区块链,会改动链上数据和状态的一段指令和数据 + +*注2:本节描述的是简要的模型,在多层链、分片模型里,流程会更加复杂,事务划分更细,但“共识”和“存储”才叫上链的基本原则不变 + +## 交易之轻和“上链”之重 + +目前区块链底层平台逐步趋于成熟,性能和成本已经不是什么大问题,只是以下几个开销是因“分布式多方协作”而先天存在的: + +- **共识开销**:主流共识算法里,PoW(工作量证明,也就是挖矿)消耗电力;PoS(权益证明)要抵押资产获得记账权;PBFT(联盟链常用的拜占庭容错算法)记账者要完成多次往返投票,流程步骤繁杂。 +- **计算开销**:除了加解密、协议解析等计算之外,在支持智能合约的区块链上,为了验证合约的执行结果,所有节点都会无差别地执行合约代码,牵一发而动全身。 +- **网络开销**:与节点数呈指数级比例,节点越多,网络传播次数越多,带宽和流量开销越大,如果数据包过大,就更雪上加霜。 +- **存储开销**:和节点数成正比,所有的链上数据,都会写入所有节点的硬盘,在一个有100个节点的链上,就变成了100份副本,如果有1000个节点,那就是1000份。 + +也许有人会说:“这就是‘信任’的成本,值得的!”我同意。只是理想无法脱离现实,毕竟硬件资源总是有限的。 +想象一下,如果每个交易都是一个复杂科学计算任务,那么每个节点CPU和内存会跑满;如果每个交易都包含一个大大的图片或视频,那么全网的带宽,以及各节点存储很快被塞爆;如果大家都敞开来滥用“链上”资源,“公地悲剧”就不可避免。 +调用API发个交易是很容易的,而链上的开销就像房间里的大象,难以视而不见。作为开发者,需要正视“**交易之轻和链上之重**”,积极“上链”的同时减少不必要的开销,找到平衡之道。 + +*注1:常规联盟链节点参考配置:8核/16G内存/10m外网带宽/4T硬盘,不考虑“矿机”和其他特种配置。土豪随意,俗话说“钱能解决的问题都不是问题,问题是...” + +*注2:本节暂未讨论“局部/分片共识”,也不探讨“平行扩容”的情况,默认假定全网参与共识和存储 + +## 让“链上”归链上,“链下”归链下 + +开销只是成本问题,而本质上,应该让区块链干自己最该干的事情。链上聚焦多方协作,尽快达成共识,营造或传递信任,将好钢用到刀刃上;那些非全局性的、无需多方共识的、数据量大的、计算繁杂的...通通放到链下实现,一个好汉三个帮。 + +如何进行切割?在业务层面,识别多方协作事务和数据共享中“最大公约数”,抓住要点痛点,四两拨千斤;在技术上,合理设计多层架构,扬长避短、因地制宜地运用多种技术,避免拿着锤子看什么都是钉子、一招打天下的思维。 + +为避免过于抽象,下面给出几个例子。 + +*注:每个例子其实都有大量的细节,考虑篇幅,这里做概要介绍,聚焦链上链下的区别和有机结合 + +## 文件能不能上链? + +![](../../../images/articles/on_and_off_the_blockchain/IMG_5020.PNG) + +这是个非常高频的问题,经常被问到。这里的文件一般指图像、视频、PDF等,也可以泛指大体量的数据集,上链可信分享的目的,是使接受者可以验证文件的完整性、正确性。 +常见的场景里,文件共享一般是局部的、点对点的,而不是广播给所有人,让区块链无差别地保存海量数据,会不堪重负。所以,合理的做法是计算文件的数字指纹(MD5或HASH),并与其他一些可选信息一起上链,如作者、持有人签名、访问地址等,单个上链信息并不多。 +文件本身则保存在私有的文件服务器、云文件存储、或者IPFS系统里,这些专业方案更适合维护海量文件和大尺寸文件,容量更高、成本更低。**注意,如果文件的安全级别到了“一个字节都不能泄露给无关人等”的程度,那么应慎用IPFS这种分布式存储的方案,优选私有存储方式。** +需要分享文件给指定的朋友时,可以走专用传输通道点对点的发送文件,或者授权朋友到指定的URL下载,可以和区块链的P2P网络隔离,不占用区块链带宽。朋友获得文件后,计算文件的MD5、HASH,和链上对应的信息进行比对,验证数字签名,确保收到了正确且完整的文件。 +这种方案,文件在链上“确权”、“锚定”和“寻址”,明文在链下传输并与链上互验,无论是成本、效率、还是隐私安全都取得了平衡。 + +## 怎么批量查询和分析数据? + +![](../../../images/articles/on_and_off_the_blockchain/IMG_5021.PNG) + +对区块链上的数据进行分析是自然的需求,比如“某个账户参与哪些业务流程、完成了多少笔交易、成功率如何”,“某个记账节点在一段时间内参与了多少次区块记账、是否及时、有否作弊”,这些逻辑会牵涉到时间范围、区块高度、交易收发双方、合约地址、事件日志、状态数据等维度。 +目前区块链底层平台一般是采用“Key-Value”的存储结构,其优势是读写效率极高,但难以支持复杂查询。 +其次,复杂查询逻辑一般是在区块生成后进行,时效性略低,且并不需要进行多方共识,有一定的“离线”性。 +最后,数据一旦“上链”,就不会改变,且只增不减,数据本身有明显特征(如区块高度、互相关联的HASH值、数字签名等)可以检验数据的完整性和正确性,在链上还是链下处理并无区别,任何拥有完整数据的节点都能支持独立的复杂查询。 + +于是,我们可以将数据完整地从链上导出,包括从创世块开始到最新的所有区块、所有交易流水和回执、所有交易产生的事件、状态数据等,通通写入链外的关系型数据库(如MySQL)或大数据平台,构建链上数据的“镜像”,然后可以采用这些引擎强大的索引模型、关联分析、建模训练、并行任务能力,灵活全面地对数据进行查询分析。 +区块链浏览器、运营管理平台、监控平台、监管审计等系统,都会采用这种策略,链上出块,链下及时ETL入库,进行本地化地分析处理后,如需要和链上进行交互,再通过接口发送交易上链即可。 + +## 复杂逻辑和计算 + +![](../../../images/articles/on_and_off_the_blockchain/IMG_5022.PNG) + +和复杂查询略有不同,复杂逻辑指交易流程中关系复杂、流程繁杂的部分。 +如上所述,链上的智能合约会在所有节点上运行,如果智能合约写得过于复杂,或者包含其实不需要全网共识的多余逻辑,全网就会承担不必要的开销。极端的例子是,合约里写了个超级大的数据遍历逻辑(甚至是死循环),那么全网所有节点都会陷入这个遍历中,吭哧吭哧跑半天,甚至被拖死。 + +除了用类似GAS机制来控制逻辑的长度外,在允许的GAS范围内,我们推荐智能合约的设计尽量精简,单个合约接口里包含的代码在百行以上就算是比较复杂的了,可以考虑是否将一部分拆解出去。 +拆解的边界因不同业务而异,颇为考验对业务的熟悉程度。开发者要对业务进行庖丁解牛式地分层分模块解耦,仅将业务流程中牵涉多方协作、需要共识、共享和公示的部分放到链上,使得合约只包含“必须”“铁定”要在链上运行的逻辑,合约逻辑“小而美”。 + +一般来说,多方见证的线上协同、公共账本管理、一定要分享给全体的关键数据(或数据的HASH)都是可以放到链上的,但相关的一些前置或后续的检验、核算、对账等逻辑可以适当拆解到链下。 +一些和密集计算有关的逻辑,宜尽量将其在链下实现,如复杂的加解密算法,可以设计成链下生成证明链上快速验证的逻辑;如果业务流程中牵涉对各种数据的遍历、排序和统计,则在链下建立索引,链上仅进行Key-Value的精准读写。 +其实,现在但凡看到合约里有用到mapping或array,我都会强迫症地想想能不能把这部分放链下服务去,个人比较欣赏“**胖链下**”和“**瘦链上**”的设计取向。 +强调一下,精简链上合约逻辑,并不全是因为合约引擎的效率问题,合约引擎已经越来越快了。核心原因还是在发挥区块链最大功效的同时,避免“公地悲剧”。开发者拿出计算和存储成本最小的合约,有着“**如无必要勿增实体**”的奥卡姆剃刀式美感,更是对链上所有参与者表达尊重和负责任的态度。 + +## 即时消息:快速协商和响应 + +![](../../../images/articles/on_and_off_the_blockchain/IMG_5023.PNG) + +受队列调度、共识算法、网络广播等因素约束,“上链”的过程多少都会有一点延时。采用工作量证明共识的链,时延在十几秒到10分钟,采用DPOS、PBFT的共识,时延可缩短到秒级,此外,如果遇到网络波动、交易拥挤等特殊情况,时延表现会有抖动。 +总的来说,对照毫秒或百毫秒级响应的瞬时交互,“上链”会显得些许“迟钝”。比如去超市买瓶水,支付后肯定不能站在那里等十几秒到十分钟,链出块确认后才走吧(略尴尬)。 + +对类似场景,宜结合链上预存和链外支付,在链下的点对点通道实现高频、快速、低延时的交易,链下确保收妥和响应,最后将双方的账户余额、交易凭据汇总到链上,在链上完成妥善记账。著名的“闪电网络”就类似这种模式。 + +另外,有些商业场景会先进行多轮的订单撮合、竞价拍卖或讨价还价。一般来说,这些操作是发生在局部的交易对手方之间,未必需要全网共识,所以也可以通过链下通道完成,最后将双方的订单(包含双方磋商结果、数字签名等信息)发送到链上,完成交易事务即可。 + +举个下快棋的例子,棋手的每一步棋并不需要实时上链,双方只管啪啪地下,裁判和观众只管围观,在棋局结束时,比如总共下了一百手,那么将这一百手的记录汇总起来,连同输赢结果上链,以便记录战绩分配奖金。如果要复盘棋局详情(如视频),可以参考上文提及的链下文件存储模式,用专用的服务器或分布式存储实现。 + +针对类似需求,在FISCO BCOS底层平台中,提供了AMOP(链上信使协议),利用已经搭建起来的区块链网络,在全网范围实现点对点、实时、安全的通信。基于AMOP,可以支持即时消息、快速协商、事件通知、交换秘密、构建私有交易等,推荐。 + +*注:【AMOP】详情可参考:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/certificate_list.html + +## 链下信息如何可信上链? + +![](../../../images/articles/on_and_off_the_blockchain/IMG_5024.PNG) + +先看一个典型问题:“**智能合约运行中要使用链外信息,怎么办?**” +比如,链上有个世界杯决赛竞猜游戏,但世界杯不可能在链上踢吧;或者需要参考今天的天气,天气显然不是链上原生信息,应该从气象局获取;在跨境业务中,可能用到法定汇率,而汇率一定是来自权威机构的,不能在链上凭空生成。 +这时候就要用到“**预言机(Oracle)**”,由一个或多个链下可信机构将球赛、天气、汇率等信息写到链上的公共合约,其他合约统一使用这份经过共识确认的可信信息,不会出现歧义。考虑到安全和效率,预言机(Oracle)会有多种具体做法,实现起来相当有趣。 + +![](../../../images/articles/on_and_off_the_blockchain/IMG_5025.PNG) + +更进一步的灵魂拷问是:**“****如何保证上链的数据是真实的****?”**坦率地说,区块链并不能从根本上保证链下数据的可信性,只能保证信息一旦上链,就是全网一致且难以篡改的。而区块链跟实体经济结合时,势必要面对“如何可信上链”这个问题。 +如资产相关应用,除了进行人员管理之外,还要“**四流合一**”,即“信息流、商流、物流、资金流”互相匹配和交叉印证,会使业务流程更加可信。这些“流”常常发生在链下现实世界,要把控它们,可能会用到物联网(传感器、摄像头等)、人工智能(模式识别、联邦学习等)、大数据分析、可信机构背书等多种技术和方式,这已经远远超出了区块链的范围。 + +所以,本节的命题其实是:**区块链如何和数字世界里的技术广泛结合,更好地发挥自身多方协作、营造信任的作用**。 +随着数字世界的发展、尤其“**新基建**”的强力推动,我们相信广泛的数字化能在保护隐私的前提下,降低信息采集和校验的成本,采集的数据会越来越丰富。 +如在使用、转移、回收实体物资时,及时采集监测,甚至是多方、多路、多维度立体化的采集监控,并上链进行共识、公示、锚定,链上链下交叉验证,这样就可以逐渐逼近“**物理世界可信上链**”的效果,逻辑会更严密,更具有公信力,数据和价值流通会更可靠,协作的摩擦更低。 + +## "链上"还是“链下"治理? + +![](../../../images/articles/on_and_off_the_blockchain/IMG_5026.PNG) + +“治理”即制定行业联盟和业务运作规则,确保规则的执行,处理异常事件,奖励和惩戒参与者等。 +以理想化的标准,似乎应该实现链上治理,通过代码决策、制定和执行规则,出错时系统具有“自修复”的“超能力"。实际上,完备的链上治理过于复杂,实现起来很有挑战性,尤其在需要达成现实世界法律法规的执行力时,纯链上的治理往往力不从心。 +再多想一步:如完全依赖代码,万一代码本身有BUG、或者要“改需求”呢?链下的决策者、开发者如何发现和介入? +所以,“Code is Law”还是个理想化的目标,链下治理不可或缺。 + +联盟链参与者们组成管理委员会,在现实世界里进行民主集中制的讨论和决策,共同制定规则,采用多签、工作流的方式一起发起治理动作,调用区块链接口上链。 +在链上,包括区块链底层平台和智能合约在内,都会内置一系列的决策和控制点,如支持多方投票决策,具备从业务层穿透到底层的准入和权限控制能力,可修改业务和节点的参数,能应对异常情况的重置账户,对错账进行冲正调账等等。 +治理动作和结果经过共识确认,在链上全网生效,公开透明,接受广泛监督,彰显其合理性和公正性。必要时还可以引入监管方和司法仲裁。 +反过来,联盟链上的数据,具备身份可知、难以篡改、无法否认且可全程追溯等特点,可为链下治理决策提供完备的数据基础,也便于为链下实际执行提供可信的凭据。所以,链上和链下有机结合,有助于设计完备、可控、可持续的治理机制。 + +## 如何做到“上” “下”自如 + +或许有人会说:“这链上链下什么的太复杂了,我就想用区块链!” +我认为这个说法很对。说到底,用户就想要一条趁手的“链”。作为开发者,我们要打造灵活的、插件化的系统架构,实现各种能力,什么数据导出、文件存储和传输、密集计算、数据采集和异步上链、治理监管、一键部署......按需取舍后,打包起来开箱即用,实际上提供了“**基于区块链的一系列能力**”。 +最终呈现的“链”,除了节点之外,还有区块链浏览器、管理台、监控和审计系统、业务模板、APP/小程序等一系列交互入口,用户只需动动鼠标,点点页面,调调接口,一站式体验到一个完整的区块链应用。用户会觉得:“这就是区块链”,无需再分“链上”和“链下”,浑然一体。 + +说到这里,推荐一个我认为非常棒的设计:分布式身份标识(DID)。 +DID是一套涵盖了分布式身份管理、可信数据交换的规范。权威机构为用户完成KYC,颁发凭据。用户将身份标识的摘要公布到链上,而将自己隐私数据存在链下(这一点非常重要)。 +使用时,用户采用“**明确授权**”和“**选择性披露**”的策略,仅需出示少量的信息或加密证明,与链上数据进行对照校验,即可证明用户凭据和数据可信性,达成了“数据多跑路,用户少跑腿”、保护了用户隐私的可喜效果。 +这种设计很好地将链上链下结合起来,逻辑闭环自洽,并不因为数据存在链下,就削弱了链上的功效,反而使得链的授信模型更为重要。 +DID规范定义了语义清晰、层次分明的数据结构,以及通用的交互协议。开源项目WeIdentity完整地实现了DID协议,并提供丰富的周边支撑工具和服务,值得参考。 + +*注:【WeIdentity】详情可见:[https://fintech.webank.com/weidentity](https://fintech.webank.com/weidentity) + +## 结语 + +“链漫漫其修远兮,吾将上下而求索”在未来,“可信的”区块链将越来越多地和人们日常生活、实体经济联动,步入寻常百姓家。作为从业者,保持开放的心态,积极而创新地将区块链与更多技术结合,无论运作于链上还是链下,只要能解决问题、创造价值,就是一条好链。 diff --git a/3.x/zh_CN/docs/articles/1_conception/point_to_point.md b/3.x/zh_CN/docs/articles/1_conception/point_to_point.md new file mode 100644 index 000000000..7738e0583 --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/point_to_point.md @@ -0,0 +1,67 @@ +# 区块链上的交易真的是“点对点”吗? + +作者:张开翔|FISCO BCOS 首席架构师 + +**区块链上的交易是点对点的,不需要中心实体来维护交易**。这是很多为区块链摇旗呐喊的文章常用的开篇语,斩钉截铁,毋庸置疑,让人有种“**一入区块链,宛如面对面**”的错觉。 + +![](../../../images/articles/point_to_point/IMG_5005.JPG) + +字面上的点对点和面对面 + +其实这句话有一定的迷惑性,如果精确地将“**中心实体**”定义为类似当下的一些强中介(这里不讨论这种模式的好坏),貌似说得通,毕竟区块链上没有物理上隔断各参与方的中介存在。 + + +![](../../../images/articles/point_to_point/IMG_5006.PNG) + +星型结构和公共账本互连模式对比 + +但如果到此为止,很容易给人“区块链上的交易就是‘点对点’了”的误导,而模糊了下述事实:实际上任何区块链系统都需要**共识节点,或者称为“记账者”或“矿工”**来打包和确认交易。即使是plasma、闪电/雷电网络等方案,也只是让参与者在特定通道上,直接或间接地交换账务信息流,最终结算或者纠纷处理,还是得回到主链上进行共识完成流程。 + +“矿工”这种存在,从理念上可以说是“去中心化”的,因为矿工不止一个,所以“没有中心实体”这句话看起来对,但矿工的“去中心化”事实上是一种**不确定性**,公链上的矿工已经出现了明显的集中趋势,或者类似“**21个长老**”这种被去中心化信徒诟病的卡特尔组织已经萌芽,其去中心化程度和安全性,某种程度上取决于“社区”博弈或某个大神的运作。 + +![](../../../images/articles/point_to_point/IMG_5007.JPG) + +围绕着“矿工”的网络生态 + +而在效率和体验上,“古典”去中心化记账的服务质量很难说是可靠的,一旦出现热点交易状况,那么长达几天的网络堵塞、交易延迟、交易手续费飞涨都是常见的事情,一笔几美金的价值转换,手续费可能要上百美金。同时,做为普通小散韭菜用户,基本上没有机会去投诉或推动你期望的服务质量提升,连客服渠道都是找不到的,毕竟是“去中心化”嘛。 + +如果用户是使用区块链钱包或客户端交易,那么更别提“点对点”了,非轻客户端类型的钱包客户端,实际上是把交易发给了服务器,服务器来代理,将交易提交到区块链网络上。这还算是好的,只要钱包服务商不闹妖就问题不大。 + +如果是交易所的客户端,那很多情况就是在交易所的**业务数据库**里记一笔,连区块链网络都不碰。在缺乏监管、运营水平又参差不齐的“交易所”行业里,这种模式既“中心化”,又面临严峻的道德和安全风险,而“去中心化交易所”则是把中介角色交给了链上智能合约和矿工,理论上更加透明,但在效率、流程方面,依旧说不上是“点对点”。 + +如果用户干脆自己安装节点,直接加入到网络里,又是什么情况呢? + +物理上,因为连接模型的约束(常见的Gossip模型只连接少数“邻居”节点),仅仅从网络层面看,你和交易对手大概率也是不会直连的,而是经过多次转发后,双方才能“碰头”,这是P2P网络的基本特性,并不是“字面上”的“点对点”。如果转发链路上有什么幺蛾子,那也是不确定性的。 + +一般来说,反复广播转发的网络模型里,在严谨地选择路由、验证连接邻居的前提下,信息到达率还是可以保障的。这里的“点对点”,事实上是广义的桥接型多跳连接(雷电/闪电网络也类似),这种模型不可避免的有一定的传输冗余和延迟率。事实上,被我们熟知的“P2P下载网络”,如果要达到飞一般的速度体验,是依赖普通节点之外的中心化服务器来加速的。 + +话说回来,就算物理网络建立了点对点连接,交易事务层面上还是要等待记账者(矿工)收拢交易打包,共识确认和同步区块,一笔交易才算完成了,这个过程中“物理直连”并不涉及经济模型方面的意义。 + +![](../../../images/articles/point_to_point/IMG_5008.PNG) + +综上所述,所谓的“点对点”更像一句口号,其真实含义需要穿透表象来理解。对普通用户来说,他们理解的最朴素的“点对点”,是**面对面地把钱塞到对方手里**,一次握手即完成交易。而用户把交易发出去,无论下一步是到银行、支付公司、还是“分布式账本”,对普通用户来说,从本质上讲都是一种**委托交易**。 + +![](../../../images/articles/point_to_point/IMG_5009.JPG) + +一手交钱一手交货 + +![](../../../images/articles/point_to_point/IMG_5010.JPG) + +字面上的“点对点”交易 + +![](../../../images/articles/point_to_point/IMG_5011.JPG) + +事实上的分布式账本 + +在这种格局下,“**面对面**”是不存在的,私密一定程度上也是不存在的。信息不给到记账者,怎么记账?零知识、环签名等重武器并不是每条链都配备的,追求全面隐私保护的链,计算和架构都会更加复杂,我们会另外分析。 + +最后,想想当下移动支付各种顺畅体验,银行大额转账秒级短信通知,区块链字面上所谓的“**点对点**”,真是说得美好,而现实骨感呢。 + +所以,如果读文章时,看到以吹嘘区块链是“点对点”这个slogan为立论基准,建议读者先理清楚他这里的“点对点”究竟说的是什么语境下的“点对点”。我心目中的分布式账本,真正的意义并不在于“点对点”,而是“可靠可信可控”,通过博弈和协作,多方共同实现的价值网络,让每个参与角色在其中都有其存在感。 + + +![](../../../images/articles/point_to_point/IMG_5012.PNG) + + +当区块链系统能达到或接近现有中心化交易系统的速度和交互体验,包括**7\24高可用的多活多方记账、秒级延迟确认、快速达成最终一致性、并发处理能力又足够高、交易成本足够低、对公对私都有明确的QoS约定和兜底容灾容错方案**,而且区块链先天的分布式架构体系上有群体规模效应,可防作恶、防篡改,可监管,那么才算是**“多中心”信任背书、透明协作**的靠谱分布式交易系统。不喊口号、实干为主的联盟链目标,更贴近这个方向。 + diff --git a/3.x/zh_CN/docs/articles/1_conception/safe_and_controllable.md b/3.x/zh_CN/docs/articles/1_conception/safe_and_controllable.md new file mode 100644 index 000000000..4b45bce5f --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/safe_and_controllable.md @@ -0,0 +1,141 @@ +# 怎样让你的区块链更加安全可控 + +作者:张开翔|FISCO BCOS 首席架构师 + +随着技术和产业的发展,区块链会被用到实体行业的广泛场景,以及金融业、政务、工业等关键领域。我们更需要重视技术和运作的安全可控,以保护信息安全、财务安全,乃至社会安全。 + +## 安全稳定的技术路径 + +对比任意驰骋的“越野车”,联盟链更像安全可靠的“商旅车”。 +正所谓“道路千万条,交规第一条”,出行首先要选择对的路线,也要遵守交规;其次,安全的重要性毋庸置疑,车子硬件达到高安全标准,驾驶员审慎专业驾驶,才能保证乘客的人身和财务安全;最后,车子本身也得可靠和耐用,不能因故障频发而给旅途制造各种麻烦。 +在这些基础上,再去追求为乘客创造舒适的环境、友好的体验,并以强劲的性能,高效率地将乘客送到目的地。 +同理,联盟链的技术路径兼顾稳定和创新,优先保障“合规、安全、稳定”这三个指标,而后再追求易用友好、高性能,这两者也是很重要的加分项。 + +![](../../../images/articles/safe_and_controllable/IMG_5013.JPG) + +具体而言,**联盟链合规的第一要务是去代币**,尤其是金融业,绝不应参与虚拟代币的运作。 +在安全方面,对网络、存储、业务等进行安全加固,保证链上多方共同执行,避免出现木桶的短板。 +在稳定性方面,严格检测系统质量,遵循“两地多中心”等容灾容错要求,建立可快速反应的监控体系,都是必要的基础工作。 + +## 可信可控的几个要点 + +从系统功能看,区块链是多方参与、重视协作、用算法传递和加固“信任”的系统,针对可信和可控的要求有以下一些要点: + +![](../../../images/articles/safe_and_controllable/IMG_5014.JPG) + +#### 身份可知 + +拒绝匿名,任何加入这个系统的人或者节点,都需要经过KYC(Know Your Client)环节,依托PKI体系(公开密钥基础建设,Public Key Infrastructure)等技术,向网络认证自己。 + +#### 权限可配 + +针对不同的角色,分配不同的系统权限,避免越权访问,或者出现“既当裁判又当运动员”的情况。 + +#### 交易可控 + +交易调用的是智能合约,智能合约是用代码写成的,目前“Code is law”依旧是个理想值,交易可控的要点是,事先检查合约逻辑,执行时避免异常和错误,对不符合预期的指令进行干预,在出错后要能冲正、补账、纠正。 + +#### 隐私可保 + +个人信息、财务情况、交易明细等都属于个人隐私。机构也有自己的商业隐私,如风控规则、重大交易细节等。在多方共享数据的同时,还需要保护隐私不会泄露。 + +#### 历史可验 + +区块链先天是一种“只增不删”的数据库。所有历史交易以及产生的数据都可以记录在区块链上,需要妥善管理链上海量数据,对导出到链外的数据,也要有方法和链上对照,确保数据是完整的、可验证的。 + +#### 监管可达 + +许多行业都有对应的监管部门,金融更是强监管行业。区块链系统要做到的是,为监管者提供相关功能接口、访问权限,并提供完整的、可校验的数据以供审计分析。 + +## 联盟链角色和治理 + +联盟链治理模式目前也是正在探讨的热点,总的来说,联盟链是由联盟一起建设、使用和管理的,下面将按这三个维度角色进行梳理归纳。 + +![](../../../images/articles/safe_and_controllable/IMG_5015.JPG) + +运营委员会可以由联盟里的部分或全部机构一起组成,其本身是“多中心化”的,并不是独家管理。 +运营委员会共同对联盟链的各种事务进行讨论和决策,包括联盟链的准入审批、规则制定和执行、日常运营等。比如,目前有的联盟链会把“部署合约”的权限收敛到委员会,这样可以保障链上交易规则的有效性和合理性。 + +监管方则独立于运营委员会之外,可以由主管部门、权威机构、行业协会等角色承担,运营委员会制定的规则,本身应该符合监管要求。 + +在链上进行交易、参与共识记账、负责清结算等事务的角色,都归纳为链的“使用者”。他们遵循运营委员会制定的规则加入联盟链,用自己的私钥对区块和交易签名,基于链上智能合约和共识机制驱动,高效的完成协作。 + +开发者负责研究和开发联盟链的底层平台,根据业务需求构建应用系统和编写智能合约,这些内容经过运营委员会审核之后,再由运维团队发布上线。 + +运维团队还负责配置软硬件环境的参数,关注监控告警,进行版本升级,长期维护系统的稳定性和可持续性。 + +可见,“建设”和“管理”的角色,都不会直接参与到业务交易流程中,而“使用”角色基于健壮高效的平台进行协作,并接受运营委员会和监管方的管理监督。 +同时,无论对哪一个角色,都会进行权限控制和操作审计,如果账号丢失、私钥泄露,也能通过链上治理的方式进行找回和重置。 +这样的治理体系是职责清晰、各司其职、安全可控的,既能保证链上治理的合理性、有效性、安全性,也能保护参与者的权益,使得大家可以高效协作。 + +## 贯通全程的安全、可控、合规 + +![](../../../images/articles/safe_and_controllable/IMG_5016.JPG) + +**从业务流程上看,区块链上的业务参与方众多、流程复杂、资产的生命周期漫长,应该确保端到端的业务可控**,否则到了承兑结算时,才发现资产是无价值的,那就难以挽回了。 + +首先,来自实体世界的人、物、资产,要经过严格鉴定才能上链。 +这个环节还是要依靠有公信力的权威机构把关,如中国公民的身份来自公安认证,房产的产权则需要国土局认证,以此类推。还可以依托物联网、基因技术、人工智能分析等技术,对数据进行交叉比对、深度分析,提升鉴别效率和准确度。 +资产发行上链后,要检查这笔资产的权责是否明确,定价是否公允,资产的交易规则是否公开透明,这个步骤需要由多方共同完成并达成共识。 +对刚上链的资产设置一个“预发布”的状态,链上多方检验后才能使资产“生效”,同时结合链下措施,锁定资产防“双花”,不失为一种好的实践。 + +然后,资产可以进入“点对点交易”的高效流转环节,交易过程可以采用多方签名、拜占庭容错等机制,避免少数人作恶。 + +同时,设置关键检测点,对交易进行实时监测,如发现可能的异常,如高频交易、异常出价、违反交易规则的行为等,则由权限的管理者调用管理接口及时制止和纠正。 + +当交易正常完成,即进入了清结算和承兑环节,在没有原生代币的联盟链上,需要稳妥的对接链下支付系统,以及物理世界的执行体系等,以保证承兑和执行。 +即使前面的环节都顺利完成,因为各种复杂的因素,业务还是有小概率会出现错误或纠纷,那么监管审计和司法仲裁就可以发挥作用了,目前基于区块链实现业务的存证、司法仲裁也是很常见的方式。 +可见,端到端地进行设计,并重视链上链下的结合,有助于完整、闭环地管理资产生命周期。 + +## 可监管,可干预 + +关于“区块链业务难以监管”的说法,其实说的是匿名和跨监管主体运作的公链。 +部分公链参与者是匿名的,其网络遍布全世界,链上发行虚拟代币且没有稳妥的治理方式,常常只能靠硬分叉治理,使得难以定位链上行为人、难以套用对应的法律法规、也无法针对某一个节点实施监管。 + +![](../../../images/articles/safe_and_controllable/IMG_5017.JPG) + +而具备一系列可信可控特性的联盟链,因为身份可知,使得参与者在链上的行为具有确定性,诚实合规的行为可以在业务合作中获得回报,而恶意不轨的行为则无法否认抵赖。区块链特有的链式数据结构具有很强的自校验性,数据难以篡改,可以全程追溯。监管机构可以安装节点接入业务链,或用数据同步的方式获得区块链上的数据,得到完整无错漏的数据集合。 + +然后,将这些数据纳入大数据挖掘分析,可以实现端到端的、跨机构和交易全流程的监管审计。同时,进行风控建模,预判业务风险,以便识别和裁决恶意行为。 + +联盟链通过权限配置和业务智能合约的设计,可以实现细粒度的控制功能,如将合约的发布权限收拢到委员会或监管方。合约在运行时置入监管规则检查,发现违规交易立刻终止或回滚,针对用户和节点制定黑名单,采取冻结违规账号、踢掉恶意节点、进行冲正补账等措施。区块链具有全网事务一致性的特点,所有节点基于共识机制协同工作,监管措施可以一点接入,全网生效,这为全网协同的稳健运营、反洗钱等提供了行之有效的可操作性,可以达成“穿透式监管”的效果。 + +所以,为区块链加入可信可控特性的联盟链,和公链相比,可以呈现截然不同的可监管效果。 + +## 技术中立,风控优先 + +作为区块链和金融从业者,我们在研究技术之余,也应该关注政策的走向。2017年七部委发文禁止“虚拟货币以及代币融资”以来,国际国内都相继出台一系列的规定,对“冒区块链之名行违规之实”的行为明确说不。 + +![](../../../images/articles/safe_and_controllable/IMG_5018.JPG) + +“技术中立”和“风控优先”可说是非常经典的总结,这两个词来自工信部给人大代表的答复函,摘录如下:“银保监会督促指导银行机构坚持‘技术中立’和‘风控优先’原则,在厘清金融业务本质特征的基础上,遵循同等的业务规则和风险管理要求,积极推动区块链等金融科技在银行业的应用,采取有效措施防控区块链技术风险。”不同行业都有各自的本质规律和基本守则,如互联网积分,虽然看起来不是“钱”,但其实在业务上积分是有清晰的会计核算规则的,监管部门也对积分的运营提出了“三条底线”要求(如上图),并不会因为用了区块链,运作上就可以突破这三条底线。 + +再如,有关部门已经发布的“隐私保护标准”,以及欧洲的GDPR等条例,定义了清晰的隐私保护要求,技术运用和管理规范,让隐私保护有法可依。无论采用什么技术,最终都要回到业务本质上。技术运用的初衷,应该是使业务更加健康和可持续发展,并严控和降低其中的风险,而不是带来新的风险,尤其是金融业,有句话说的很好:**“金融不只是经营资金,更多是在经营风险。”** + +总结一下,在区块链技术和应用探索的过程中,我们一直遵循几个基本原则: + +**技术过硬**:深耕关键核心技术,持续创新的同时追求安全可控。 + +**广泛开源**:开源社区本身有茂盛的生命力,而且还能通过开放源代码,获得社区协助,提升安全性。 + +**善良规范**:当我们把技术用于实体领域时,就有可能牵涉国计民生,影响人们身家性命,所以,有着善良的意图和规范合规运作,能使世界因为创新而变得更好一点。 + +------ + +#### FISCO BCOS开源实现参考: + +[《FISCO BCOS权限控制一览》](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485317&idx=1&sn=4a7cf90cc727382af2099d11f67d8b0e&chksm=9f2ef599a8597c8f4116f5f3fa51570df9d71bfc4a4c11e1fe9878ad518337b3649bc4cd1270&token=1692289815&lang=zh_CN#rd) + +[FISCO BCOS安全控制](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/security_control/index.html) + +#### 行业规范参考: + +[《商业银行数据中心监管指引》](https://baike.baidu.com/item/%E5%95%86%E4%B8%9A%E9%93%B6%E8%A1%8C%E6%95%B0%E6%8D%AE%E4%B8%AD%E5%BF%83%E7%9B%91%E7%AE%A1%E6%8C%87%E5%BC%95) + +[《商业银行信息科技风险管理指引》](https://baike.baidu.com/item/%E5%95%86%E4%B8%9A%E9%93%B6%E8%A1%8C%E4%BF%A1%E6%81%AF%E7%A7%91%E6%8A%80%E9%A3%8E%E9%99%A9%E7%AE%A1%E7%90%86%E6%8C%87%E5%BC%95) + +[《中华人民共和国密码法》](https://baike.baidu.com/item/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E5%AF%86%E7%A0%81%E6%B3%95/22860972?fromtitle=%E5%AF%86%E7%A0%81%E6%B3%95&fromid=24078179) + +[《工信部隐私保护规范》](http://www.cbdforum.cn/bcweb/index/bz/1-6.html) + +[《WeDPR隐私保护白皮书》](https://mp.weixin.qq.com/s/fYCHWb2SwWu-9ySLibrI0w) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/1_conception/simplify_blockchain.md b/3.x/zh_CN/docs/articles/1_conception/simplify_blockchain.md new file mode 100644 index 000000000..e86640725 --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/simplify_blockchain.md @@ -0,0 +1,31 @@ +# 联盟链要对区块链做减法 + +作者:梁永甫|区块链架构师 + +当前联盟链平台在公有链的基础上,对共识机制做调整,去掉公有属性,使得准入可控、效率提升,这实际上是对区块链在做减法。但这是否足够呢? + +我们在应用中很快发现,联盟链的使用比较受限制,一条链基本上只能做一项业务,而且成员的扩展会面临很多问题,这个扩展并不是在技术上增加一个节点,而是在业务上增加一个参与方。 + +问题是新增加的成员能看哪些数据,不能看哪些数据,有时候他可能只需要了解其中很少数据就可以了,大部分数据不需让他看到。试问当前的联盟链平台怎么解决?可能会说,再建一条链,然后做跨链。 + +跨链也是现在大家重点在做的事情,就是因为看到了这样的问题。但是我们为什么不能从另一个角度思考,区块链本身是否就可以做到,毕竟使用跨链就意味着承认区块链在创建新的信息孤岛。只是以前“孤”在一个地方,现在“孤”在一个圈子, 这其实并没有解决让信息顺畅流通和共享的问题。 + +中本聪创建比特币的时候想到了区块链这种天才的解决方案,但这并不意味着它是唯一的解决方案。 + +既然是解决方案,那它要解决的是什么问题?明确了问题,然后再思考下去也许能找到新的解决方法呢。或者对区块链做一些改良让他更适合当下的商业需求。 + +为什么说要对区块链做减法?因为现在区块链设计得实在是太极致了,对不可篡改、可追溯有极致要求,在其他方面就会有所牺牲,比如隐私保护、性能。所以需要做减法,降低对这两个特性的支持,来提升对其他需求的满足度, 比如去掉历史状态数据,去掉merkle树。 + +那么,区块链的哪些方面还可以做减法呢? + +现在全局唯一链这种形式是否也有改良的可能呢?为什么要全局唯一的链?为什么区块链网络里面不可以有多条链?每条链只跟踪一个事件的过程是否可行?在链产生的过程中增加一些防篡改机制,甚至是不用增加,因为联盟链不用像公有链那样完全自治,完全去中心化。 + +联盟链是商业链,是在当下商业规则下运行的,如果有些商业规则已经解决的问题,我们是否还要在技术层面去解决呢?如果有政府机构+第三方商业在里面背书,我们还需要花很大精力去解决防篡改的问题吗? + +我们讲区块链的时候都是在讲区块链网络,我一直的观点是区块链有两个重要的属性,一个是存储,一个是网络。然而现在大部分的平台这两者之间是没有界限的,区块链网络就是要存储数据,或者每个节点都是全量数据。 + +那么存储和网络的功能是否可以更明确的区分出来呢?网络做成一个开放的网络,任何机构都可以接入,但网络节点并不存储数据,不感知数据,只转发数据,并通过应用层协议,对数据传输过程进行背书。数据节点才会存储数据,但也并不是存储网络中传输的所有数据,每个数据可以通过网络路由到需要存储的数据节点。 + +结合上面提到的减掉全局唯一链,是否可以构建一个开放的区块链网络,参与机构可以任意自由的选择数据的传输路径和存储节点?从而形成一个开放性的可信存储网络。只有这样,区块链才能作为一个基础设施存在,就像5G一样 + +技术对某一方面过于追求,往往会使得其他方面有所缺失。联盟链对区块链做减法的同时,其实也是在其他方面做加法,不让区块链做一个太偏科的学生。 diff --git a/3.x/zh_CN/docs/articles/1_conception/the_truth_of_tampering.md b/3.x/zh_CN/docs/articles/1_conception/the_truth_of_tampering.md new file mode 100644 index 000000000..08bb7fe47 --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/the_truth_of_tampering.md @@ -0,0 +1,98 @@ +# 如何解释“我篡改了区块链”这个问题 + +作者:张开翔|FISCO BCOS 首席架构师 + +区块链数据“**全局一致**”、“**难以篡改**”这两个特性已经广为人知,是区块链营造“信任”的基石。为了达到这两个效果,区块链的共识、同步、校验等技术细节足可大书特书,而本文要从“**我篡改了区块链数据**”讲起。 + +## “我篡改了区块链数据” + +FISCO BCOS开源联盟链社区现在相当活跃,每天都会产生大量的讨论,大家也会饶有兴趣地研究和挑战区块链如何做到“难以篡改”。我们注意到,尤其在FISCO BCOS支持MySQL数据库作为数据存储引擎后,隔一阵子就有同学在群里问:“我手动修改了我节点连接的数据库里某个状态数据,**这是不是就是篡改了区块链数据呢**?” + +直观地举个例,如链上有个智能合约,管理特定资产余额,在数据库合约表里,经过共识的Alice的余额本来是**100**,这时有人打开MySQL客户端,找到那个合约对应的Table,把Alice的余额update成**10000**。 + +这时他表示:“你看,我调用合约的查询接口,查出来Alice的余额确实是10000,这就不对了嘛,而且,链还在出块,**根本不防篡改嘛**!”。 + +## 初步分析和解答 + +为何这类问题最近多起来了?我们分析了下,猜想主要是由于MySQL数据库用户基础良好,体系比较成熟,给用户提供友好的命令行或图形化交互工具,FISCO BCOS提供了一种Table风格的合约开发模式,表结构设计得清晰直观,对于用户来说,一方面理解和管理起来更容易了,另一方面顺手update甚至delete一下都是小意思。 + +下图仅为示例数据,采用KVTable合约方式,创建了名为t_kv_node的合约表,系统自动加了“u_”前缀,可见,这个表结构和数据一目了然。 + +![](../../../images/articles/the_truth_of_tampering/IMG_5027.PNG) + +而之前只采用LevelDB或RocksDB作为存储引擎,这两个文件型数据库交互工具比较少,在用户面前的存在感不强,操作相对晦涩,主要通过API编程访问,数据用肉眼难以辨别的Hash key寻址,动手修改数据库的case就少了一些(但也不是不可能)。 + +所以,热点问题浮出水面,前提是用户可以更方便地修改底层数据了,而不是这个问题之前不存在。这时我们会建议用户试一下,针对Alice的余额,发起一个交易,比如给Alice充值,或者让Alice转账操作,这时,修改过数据的节点将无法参与共识。因为该节点上算出来的Alice的余额和其他节点结果不同,其他节点依旧按100的余额进行计算,而不是**10000**,显然结果是对不齐的。 + +![](../../../images/articles/the_truth_of_tampering/IMG_5028.PNG) + + +复习下PBFT的容错模型:定义“f”为可容错节点数,网络中共识节点总数应等于或多于3f+1。即链上有4个共识节点时,可容错的f=1,共识节点总数为7个时,f=2,以此类推。 + +如果未修改过数据的节点数满足PBFT要求的2f+1的数量,链依旧可以出块。但被修改过的节点,一旦有交易涉及脏数据,就像踩到了雷一样,从此再无法与链共识、同步,相当于被抛弃了。这种节点可以称为“拜占庭节点”,即作恶或出错的节点,具备节点准入控制能力的联盟链甚至会将拜占庭节点隔离出去。 + +还有一种可能性是,手动修改了数据库里的数据,但节点内存里还刚好缓存了一份副本,并没有被修改,所以通过节点对这个数据的查询、交易还是正常的,甚至会用正确的结果把数据库里被篡改过的数据覆盖掉,不过这是概率性事件,取决于缓存的大小和当时包含的数据项。 + +*注:对于采用PoW或其他共识机制的链来说,容错模型有所不同,但在容错范围内的少数节点被篡改,也不会影响链的共识。 + +## “能否篡改整个联盟链” + +有的同学可能会继续刨根问底:“**那我多修改几个节点的数据是不是就篡改了**?”,一般提出这个问题的同学是面向他自己部署的开发测试环境,所有节点都在他手上,所以可以随便改。 + +在真实的联盟链环境上,节点分别掌握在不同机构手里,要修改,首先得侵入他人的网络、获得服务器和数据库权限、发起修改再全身而退。事实上,在注重安全防护的商业化环境里,这是非常艰难、几乎不可能做到的事情。 + +![](../../../images/articles/the_truth_of_tampering/IMG_5029.PNG) + +从机构粒度来看,单个机构掌握的节点数,应该低于共识算法可容错的数量。比如,链上总共有7个共识节点,那么单个机构掌握的共识节点不应多于2个,这样可以避免机构内部强行修改自己掌握的节点数据,或一个机构的所有节点都意外出错、掉线(比如机房光纤都被挖断了),导致链无法出块。 + +![](../../../images/articles/the_truth_of_tampering/IMG_5030.PNG) + +## 真的没有办法防“本地篡改”吗? + +考虑区块链数据本地验证的机制,比如区块之间的Hash关系、状态的Merkle树结构、共识节点的签名等,按数据的互验关系顺藤摸瓜进行检测,似乎有一定概率可以本地检测出数据异常。 + +但进一步想,对某个数据的查询,区块链的本地校验范围是有限的,一般不会超出单个区块或者一棵merkle树,所以如果篡改者比较熟悉区块链数据的结构和本地校验逻辑,也可以顺着数据校验关系,从状态值开始,把merkle树、区块Hash等关键数据全部改掉。 + +甚至更彻底地,从创世块开始,把所有的区块、系统配置(对于PoW,可以修改挖矿难度以加速出块)、PBFT的共识者列表等等,都按他的逻辑改一遍,这样这条本地数据链依旧是校验自洽的,只是无法和其他节点共识了。 + +这种改法,听起来需要不少力气活,但对于一个有决心、有能力的篡改者来说,改改本地数据这个事情其实并不难,难的只是去改别的机构数据而已。 + +![](../../../images/articles/the_truth_of_tampering/IMG_5031.PNG) + +到了这个份上,就相当于一个人铁了心要“骗自己”,那神仙都没有办法了。一旦把本地数据修改的权限交给了不适当的人,最坏情况下,整条链没有一个字节是对的。 + +但是,本地数据再错,也只会影响自己,影响不了别人,一旦和其他节点进行共识,就会被发现,甚至被惩戒,整个效果会有一点掩耳盗铃的意思。 + +## "为什么区块链不拦住我篡改数据?” + +再进一步,那位同学又会问:“**为什么区块链不能立刻发现、并且阻止我篡改数据?也许我只是无意手误呢**”。坦率说,这有点对区块链期望过高了。区块链系统并非无所不能,也不会包办一切,区块链并不会阻止用户对自己的服务器、软件、数据库等施加操作,就像法律不能也不应去阻止你打碎家里的杯子一样。 + +本质上,区块链的一致性、难以篡改性是面向“**全局**”的,是由多方博弈和协作达成的,当链上交易牵涉错误数据时,共识机制可以检测并拒绝已被篡改的数据,保证链上剩余的大多数健康节点继续共识出块。而节点本地不参与共识的数据,共识机制鞭长莫及。 + +那么,区块链为什么不能主动检测和纠正错误,保证每个节点上的数据一致性?首先,链上的数据非常庞杂,用户直接登入数据库手动修改少量数据,区块链节点并不知道哪一条数据被修改了,无法触发检查。 + +如果区块链系统定期巡检所有数据,并将所有数据和其他节点进行比对,可想而知,这样做的话,网络、磁盘和计算开销会非常大。关键是,这并不解决问题,因为从数据被篡改后到检测出来的时间窗里,哪怕脏数据只存在了几十毫秒,但这时如果不幸有应用来查询数据,依旧会得到篡改后的结果。对要求苛刻的业务来说,事后检测未必是最佳选项,因为有可能已经造成了业务损失,届时能做的最多就是告警和冲正了。 + +当然,也可以结合数据库的操作监控、binlog等辅助机制,加速响应速度和检测效率。方法还是有的,如上所述,只是性价比较低,也不彻底解决问题,只有对数据修改极其敏感,且业务上接受延时发现和修订的特定场景,才会考虑将其作为补救措施。我们把这部分归类到运营管理工具里,根据场景需求来实现。 + +还有一种方法,可以部分解决查询问题:**f+1查询**。即查询数据时,无论是查区块数据,还是合约的状态数据,不妨多查几个节点,查询节点数多于 f 即可。如链上有个7个节点时,f=2,用户查询自己节点之外,继续发出网络请求去查询其他机构的2个节点,共查询3个节点,如果得到的数据都是一致的,则表示数据一定是正确的,反之,一定是这3个节点里出了问题。 + +![](../../../images/articles/the_truth_of_tampering/IMG_5032.PNG) + +但是,要执行f+1查询,前提是其他机构开了查询接口权限,让你连接上去查询。在很多安全防护严密的联盟链上,一般只打开节点之间P2P互联的网络端口,不会轻易给其他机构提供数据查询权限。再则,在网络上发起多次查询,其异步性、时效性、成功率和性能表现都会带来更多变数。 + +综上所述,对节点本地的数据,就像打地鼠,冒头的(发出交易参与共识,或进行f+1查询),区块链全局共识和容错机制能发现,没有冒头仅蹲在用户硬盘里的,只能用户自己负责了。 + +## 结语 + +区块链通过网络博弈、多方校验实现了全网的容错防作恶,而区块链同步给到各节点的本地数据,需要用户自行妥善管理保存。 + +从信任传递来看,首先用户得“信自己”,如果连自己都无法相信,说明系统和数据管理有漏洞,莫说是修改数据了,在本地系统的整个链路上,包括区块链软件、SDK、业务服务都有可能出错和篡改作假,这样的环境有何信任可言? + +节点持有者必须非常审慎,首先不要手痒或手误去改数据,然后关键是要建立周全的制度,包括管理策略和技术防护,比如,主机访问控制、数据库登录和操作权限控制、操作审计、日志审计等,以避免本机构内有人越权访问监守自盗,或者被外部渗透。 + +万一数据出错,区块链比中心化系统好一点的就是,还有可能通过与其他节点互相校验检测出来,这时则应该进行告警、查证、补正和追责,以及在有条件和有必要的前提下,善用f+1查询方法,给查询操作加一点点保险。 + +另外,建议定期备份节点数据到安全的离线设备上,这样无论是出现意外还是人为的数据问题,依旧可以从冷数据里快速恢复,保证一定的RTO(复原时间目标)和RPO(恢复点目标)。 + +而区块链的健壮性在于,无论单个角色怎么折腾自己的节点和数据,对全局是没有影响的,只有修改者自己受损。任凭窝里翻天覆地,链上依旧云淡风轻,其“**全局一致**”、“**难以篡改**”的定律依旧成立,链仍然是信任的锚点,这就是区块链的魅力。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/1_conception/understandable_blockchain.md b/3.x/zh_CN/docs/articles/1_conception/understandable_blockchain.md new file mode 100644 index 000000000..b785de607 --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/understandable_blockchain.md @@ -0,0 +1,69 @@ +# 亲朋好友都能看懂的区块链 + +作者:张开翔|FISCO BCOS 首席架构师 + +据新华社10月25日晚消息,中共中央政治局10月24日下午就区块链技术发展现状和趋势进行第十八次集体学习。中共中央总书记习近平在主持学习时强调,区块链技术的集成应用在新的技术革新和产业变革中起着重要作用。 + +随后“什么是区块链”、“区块链有什么用”、“怎么掌握区块链”这几个问题响不绝耳。这里尽量用通俗易懂的语句回答这些问题,期望即使是从没接触过区块链的人也能搞懂这项已经成为国家级现象的神奇技术。 + +## 什么是区块链? + +专业解释里,一般都会带上“分布式网络”、“密码学”、“共识算法”、“智能合约”这些有点晦涩的术语,这里打算举一个例子。 + +要理解区块链,首先要接受一个设定:有个账本,要记录的是一群人之间的公共账目(比如班费、物业费、公益捐款的收支),这个账本由大家一起来记账。选一个人,在账本的某一页,一行一行的记录明细,当一页记满后,大家都去核对账目,正确的话,大家签字认可这一页的所有账目。记满一页后,再选另一个人开始记接下来的一页。现在有意思的事情来了,新的一页首先要把上一页的一些摘要特征(比如页码、余额、人数、条数什么的...)抄写下来放在页首以供对照,免得前一页被改了或丢了还无据可查。然后,再一条条记账,记满一页后,核对、签名确认...依次反复。这样,账本的一页和一页之间就形成了“证据链”。 + +更重要的是,账本上已经签名确认的每一页,所有人都会一字不漏地复制一份,放到自己家里,以免少数人篡改、污损、丢失账目。这样,账本的每一页是一个“区块(Block)”,一页一页之间形成前后连贯的证据链,每个人之间构成了多点的网络,这就是“区块链”的概要原型了。这里面的关键点在于,这个账本一定是一群人的账,并不是一个人的账。如果是一个人的账,自己拿个小本本记就好了,为什么要整这么麻烦。就是因为这一群人互相之间并不完全信任,记账过程可能出纰漏,所以必须用这么繁琐的步骤,让大家平等参与,一起保证账目的准确和公允性,产生的结果大家保存,永远不会丢也不会错。 + +上面的举例看起来步骤繁琐,还要求每个人都一字不差地复刻和保存,那么就需要技术手段来帮助大家记账。这又回到技术环节,随着计算机科技的发展,无论是网络、密码学、数据结构、分布式算法等技术都趋于成熟,区块链领域把这些技术组合在一起,一揽子完成了从记账到分发到验证到保存的整个过程。运用技术服务整个群体,这就是神奇的区块链技术。 + +## 区块链是比特币吗? + +首先,可以肯定地回答:不是。比特币确实是早期的一种区块链技术的应用,它提供了一种价格波动不定的虚拟代币,之后还有许多“山寨币”效仿比特币运作,这些虚拟代币风险都很高,不被法律法规所容。现在国家提倡的“区块链”,已经和虚拟代币明确划清界限,更强调研究核心技术,加固系统安全,控制业务风险,也更强调区块链技术和具体实体经济融合,如合规合法的金融业务、政务、智慧城市、农业工业等,用技术去解决实际的问题,发掘创新场景。区块链并不是发币割韭菜的工具,不是资金盘的幌子,而是越来越成熟和规范的创新技术,即将像互联网、APP等常见的技术服务一样,潜移默化地影响大家的日常生活。 + +## 区块链只是一种技术吗? + +如果只是谈技术,可能还没参透区块链的魅力。上面说到,区块链的记录一定是多人参与的,那么大家为什么要花精力参与到记账这个麻烦的事情里,为什么要出成本买本子和笔去记账?这就牵涉到“多方协作”了。现代社会很多事情是很难一个人完成的,必须大家一起合作才能达到1+1>2的效应,但是人多了,账就复杂,可能出现类似“信息不对称”之类的问题,那么就需要把大家组织成联盟,共同记账,共享数据,使一切都发生在阳光下,这就消除了“信息不对称”。这样的协作环境,是可信任和高效的,每个人的利益都得到了保护,营商环境得以良性发展。这就是更重要的“区块链思维”,让更多人参与进来按规则运作:诚实做事将获得应有的收益,如果作弊自然就会路人皆知,千夫所指。技术就是帮助实现这种模式的基础。 + +## 区块链能做什么? + +综合区块链技术和区块链思维,只要是牵涉到多方参与的,有着复杂的账目来往和数据共享要求的场景,都可以考虑使用区块链。区块链不但能记账,也能记录人和物的信息,并通过共同对信息进行验证,固化下来,而变得可信。 + +在**传统金融场景**中,金融机构每天都需要进行大量的对账清算工作,如果交易发生在区块链上,那么就可以起到“交易即对账”的作用,极大提升运营效率。更进一步,在供应链、跨境支付、票据等典型的金融业务中,都可以用区块链在合作伙伴之间构建公众账本,海量的资金和资产在链上记录、核验、交易,账本可信、准确、高效,可以极大扩大金融业务规模、提升运作效率、降低成本和风险,能更好地解决小微企业融资难、银行风控难、监管接入难等一系列问题。另外,合规且标准化数字资产也可以在区块链链上定义、流转、承兑,可以构建创新的商业模式。 + +在**司法存证领域**,如合同的签署过程被全部记录在区块链上,并且由包括司法机构在内的参与方共同见证,那么发生纠纷时,司法机构就可以一键从链上提取证据进行核验,证明合同从诞生到取证时都没有修改过。由于链上有司法机构参与,这样的证据已经具备一定的司法效力,大大减少了司法成本。 + +在**政务服务**方面,区块链用于身份认证,可以让人们的身份证明在一处验证,处处可用。用区块链连接多个部门,就能做到“办事时数据多跑腿,用户少跑腿”,并且“证明我是我,我妈是我妈”的事情就不复存在,还能保护用户数据隐私。 + +此外,区块链技术还可以被运用到版权、物业、物联网、智慧城市、新能源、文娱、人才交流等海量领域。正确地将区块链技术和区块链思维,与国计民生相关的事务深入融合,能够大幅提升智能化、精准化水平,使得产业之间互联互通,保障生产要素在区域内有序高效流动。 + +[点击查看区块链应用案例精编(附高清PDF全本下载)](https://mp.weixin.qq.com/s/cUjuWf1eGMbG3AFq60CBUA) + +## 为什么国家这么重视区块链? + +区块链有巨大的发展潜力,本身蕴含着极密集的技术含量,对技术有足够研究和把控,才能使自身发展不受外界影响和制约。区块链技术将会被用到与国计民生有关的广泛场景里,牵涉到许多人的财务和个人信息,甚至是金融行业、政务民生等关键领域的重要信息,重视技术和运作的安全可控,才能保护财务安全、信息安全,乃至社会安全。所以,当下国家给我们提出了明确的要求:“注意区块链技术发展现状和趋势,提高运用和管理区块链技术能力”,这样才能更好地建设网络强国、发展数字经济、助力经济社会发展。 + +## 我国的区块链发展现状如何? + +我国产业界在区块链领域投入很早、力度很大,诸多大型金融企业、互联网公司、科技公司都在进行区块链研究,在过去几年中,已经逐步解决或接近解决了区块链领域的一系列核心问题,如性能、安全、易用性、合规等,在这个过程中也积累了大量的知识产权和专利。 + +我们重点发展的区块链领域是“联盟链”,联盟链和匿名的、有虚拟代币的“公有链”(诸如比特币、以太坊等)有极大不同,联盟链不发币不挖矿,摈弃了野蛮运作的弊端,能更规范、合法的运作,可有效服务于实体经济。 + +由微众银行、深圳市金融科技协会等国内机构共同发起成立的区块链联盟——金链盟,掌握多项核心技术,于2017年开源发布了以FISCO BCOS为代表的区块链底层平台和系列解决方案。这一系列开源项目都安全可控、性能优异、免费且易用,致力于服务实体经济,在大量关系国计民生的产业中已广泛落地,技术和模式得到了大量实际案例的验证。 + +另外值得一提的是,FISCO BCOS采用技术开源的路径加速行业发展,孵化拓展了国内最大和最活跃的行业生态社区,在推进中重视人才培养,在高校、社会、产业机构中培养了大量的区块链专业人才,帮助区块链技术和产业发展加速人才方面的突破。 + +## 我该如何切入区块链领域? + +如果您是一位**对区块链感兴趣的非工科人士**,那么可以多关注这个领域里正规和权威的公众号、主流媒体,多了解区块链相关的新闻动态、产业趋势,建立正确的区块链概念,消除来自虚拟币和资金盘的噪声,并逐步将诸如“多方对等协作”、“公开透明”等“区块链思维”对照到当前的工作生活中来。 + +如果您是一位**工科、信息学方面的学生**,那么建议您在学校打好学业基础,比如数学、算法和数据结构、概率论、博弈论、密码学等,掌握一两门主要的计算机语言,向经验丰富的教授和老师请教,积极参与学校的区块链社团活动,也可以参加到FISCO BCOS区块链开源技术社区和学校联合开展的课程中来,三天上手区块链应用。 + +如果您是**商科、文科背景**,可以重点关注分布式商业的趋势,善用人文、经管、经济理论和博弈论方面的经验和知识,应对多方协作的种种挑战,用创新思维开拓可服务实体经济、人民生活的新场景。 + +如果您是**在IT界工作的专业人士**,需要区块链技术的加持,欢迎您加入FISCO BCOS区块链开源技术社区。这里有活跃的微信群讨论技术和产业问题,有公众号定期推送技术解析文章、活动通知等。更重要的是,您可以获得全面开源且免费的区块链解决方案,从区块链底层平台到身份、物联网、图形化工具、云服务应有尽有,有丰富的文档和专业的线上线下课程帮助您快速学习,从入门到精通。区块链技术可以连接多项技术,包括人工智能、物联网、大数据、金融科技等,技术界人士和区块链的结合,将大有可为。 + +如果您已经是**硬核区块链专业人士**,且愿意参与到开源社区里来,欢迎您关注FISCO BCOS区块链开源技术社区,互通有无,共同深入研究核心技术,为开源社区添砖加瓦,进行代码优化、文档编著等,一起实现更多的功能,共同打造最好用的区块链技术平台。 + +如果您已经面对各种实际场景,**希望用区块链解决您的具体问题**,FISCO BCOS区块链开源技术社区有诸多的金融机构、科技公司和产业专家,可以与您一起整合资源,进行业务合作,完成系统建设和业务运营。 + +区块链已经触达当下,更将影响未来,和一个具备无限潜力的趋势共同成长,现在,就是最好的时节。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/1_conception/what_should_not_trust.md b/3.x/zh_CN/docs/articles/1_conception/what_should_not_trust.md new file mode 100644 index 000000000..01fb8accf --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/what_should_not_trust.md @@ -0,0 +1,99 @@ +# 区块链世界里不能信什么? + +作者:张开翔|FISCO BCOS 首席架构师 + +上一篇分享了“[信任区块链时究竟在信任什么?](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485345&idx=1&sn=eab5bbcf45ec46bd7f69cb48de1db4b3&chksm=9f2ef5bda8597cab2f0c938251cb876d3920915f8faef1f0c60857ed44f4c8865fc355f00709&token=1692289815&lang=zh_CN#rd)”(还没看的童鞋,点击标题可直达),这次换个角度,漫步月之暗面,谈谈在**区块链系统和业务设计**时,不信任什么。 + +先讲结论: 几乎什么都不能信!建立Don't Trust,Just Verify的理念,才是通往区块链世界的正确态度。——By我随口说的 + +## 不信任其他节点 + +区块链节点和其他节点会建立P2P通信,共同组成网络,传递区块、交易、共识信令等各种信息。其他节点可能是由不同的机构、不同的人持有,持有节点的人可能是善意,也可能是恶意。即使在善意假设时,节点运行存活的健康度也会受运维水平和资源影响,比如处于一个不稳定的网络里,会偶尔挂掉,会抽风乱发消息,或者硬盘满等原因导致数据存储失败,以及出现其他可能的故障。在恶意假设时,要预设其他节点可能会骗自己或伤害自己,比如传递过来错误的协议包,或者用诡异的指令寻找漏洞进行攻击,或者发起高频垃圾请求,频繁连接然后断开,又或者海量连接占用资源等。 + +所以节点应该是把自己看成在黑暗丛林里孤身求生存的猎人,必须有“独立自主”、“自给自足”的态度,摆出“不相信其他任何节点”的姿势保护自己。在节点准入时,需要采用证书技术来认证节点身份;在连接控制上,拒绝有异常的连接;采用频率控制对连接次数、请求量等做限制;在协议包格式和指令正确性等方面做验证。自己发出去的信息,不应暴露自己的私有信息,也不期望其他节点一定会给出立刻和正确的响应,必须采用异步处理和校验容错的设计。 + +## 节点和客户端互相不信任 + +客户端,指在区块链网络外,向区块链发起请求的模块,如业务使用的java sdk、钱包客户端等。客户端和节点通过网络端口通信。如果客户端掌握在不受控的人手里,有可能会向节点发起大量的请求,或发送一堆垃圾信息,使节点疲于应对,甚至巧妙地构建漏洞攻击信息,试图越权访问,窃取信息或使节点出错。 + +同时,从客户端的角度看,节点有可能不响应或响应缓慢,或者返回错误的数据,包括格式错误、状态错误、表示收妥但其实不处理等,甚至别有用心的人会设置一个“假”节点和客户端通信,欺骗客户端。节点做出这些与期望不符的反应,可能使客户端运行出错,功能受损。 + +为提升节点和客户端的互信,可以为双方分配数字证书,必须通过证书进行双向握手,客户端经过私钥签名才能对节点发起交易类请求,节点应对客户端进行权限控制,拒绝高危的接口调用,不要轻易开放节点管理接口、系统配置接口等。双方对每次通信的数据格式、数据有效性都进行严密校验。双方在交互时也应该进行频率控制,异步处理,对每一个交互进行结果校验,不能预设对方正确处理,必须获取交易回执和处理结果进行确认。 + +当认为只和一个节点通信并不能保证安全时,客户端可以采用“f+1查询”的思路,尽可能多地和几个节点通信。如果当前链的共识安全模型是“3f+1”,那么,如果从f+1个节点读到的信息是一致的,结果是可以确认的。 + + + +## 不信任区块高度 + +区块高度是一个非常关键的信息,代表整个链当前的状态。向区块链发送交易、节点间进行共识、对区块和状态的校验等操作都会依赖区块高度。 + +某个节点在断网或处理速度缓慢时,其区块高度有可能落后于整个链,又或者某个节点恶意伪造数据时,其高度又可能超过整个链。在链出现分叉时,如某一个分叉上的区块高度被另一个分叉超越,落后的分叉就会变得毫无意义。即使在正常的情况下,节点依旧有可能间歇性地落后于整个链一到几个区块,然后在一定时间内才可能追上最新高度。 + +如在PBFT共识模型里,总数2/3以上节点在同一个高度时,全链就有机会达成共识继续出块。余下的1/3的节点有可能和参与共识的节点高度不同,这时意味着从这个节点读取到的数据,并不是全网最新的数据,只能代表链在该高度时的一个快照。 + +业务逻辑可以把区块高度做为一个参考值,基于高度做一些判定逻辑,在确定性共识(如PBFT)的链上,采用f+1查询等方法确认链的最新高度,在可能分叉的链上,需要参考“6个区块确认”的逻辑,审慎选取可信的区块高度。 + +## 不信任交易数据 + +交易(Transaction)代表一方向另一方发起了一个事务请求,交易可能导致资产的转移、改变帐户状态或系统配置,区块链系统通过共识后确认交易,使相关的事务生效。交易必须带上发送者的数字签名,交易里所有数据字段都必须包含在签名里,未经签名的字段存在被伪造的可能,不予采信。交易数据在网络上广播时,可以被其他人读取,如交易数据里包含隐私数据,发送者则必须对数据进行脱敏或加密保护。交易可能因为网络原因被重发,或者被其他人保存下来刻意再次发送,造成交易的“重放”,所以区块链系统必须对交易进行防重,避免出现“双花”。 + +## 不信任状态数据 + +区块链的状态(State)数据是由智能合约运行后生成的,理想情况下,每个节点的合约引擎一致、输入一致、规则一致,那么输出的状态就应该一致。但不同的节点可能安装了不同的软件版本,或者合约引擎的沙盒机制不够严密引入了不确定性因素,甚至被侵入、篡改,或者存在其他莫名其妙的bug,都可能导致合约运行输出结果不一致,那么一致性和事务性就无法得到保障。 + +状态的校验是成本很高的事情,典型的校验方法是使用MPT(Merkle Patricia Tree)树,把所有状态都塞到树里管理起来。MPT树可以把所有的状态归结为一个Merkleroot Hash,节点之间在共识过程中确认交易运行后生成的状态树Merkleroot,确保状态一致。 + +这棵树结构复杂,数据量大,消耗不少的计算和存储资源,很容易就成为了性能瓶颈。所以对状态的校验需要有更快、更简单,且又稳妥的方案,如结合版本验证、增量Hash验证等算法,辅以数据缓存,可减少重复计算和优化IO次数,能在保证一致性、正确性的同时,有效地提升验证效率。 + +## 不信任私钥持有者 + +采用私钥对交易以及其他关键操作进行签名,再使用公钥验签,是区块链上最基础的验证逻辑。只要私钥被正确使用,这个逻辑是安全的。 + +但私钥仅仅是一段数据,只依赖私钥则用户是匿名的。在联盟链面对的场景里,需要使用许可型的身份,首先通过KYC、尽调、权威认证等现实世界的验证方式确认身份,然后将身份和公钥绑定并公示,或者结合PKI体系的数字证书发放公私钥,这样私钥对应的身份是可知、可信、可控的。 + +私钥可能会因丢失、泄漏而被他人盗用,或者因被遗忘导致资产损失。所以在私钥的保存上,需要考虑采用周全的保护方案,如加密存储、TEE环境、密码卡、USBkey、软硬加密机等方案。在私钥的管理上,则需要考虑密钥丢失后如何安全的重置、找回。 + +加强版的私钥使用思路有几个,比如使用多签、门限签名等方式,每次交易时必须用多个私钥进行签名,私钥可以保管在不同的地方,安全性高,但技术方案和使用体验复杂。 + +还有一种是交易私钥和管理私钥分离。交易私钥用于管理资产,管理私钥用于管理个人资料,交易私钥可以被管理私钥重置,管理私钥本身则通过门限、分片等算法,分开存储保管,以备重置或找回。 + +## 不信任其他链 + +在跨链的场景里,每条链有自己的资产、共识,链之间的安全模型变得非常复杂,比如一条链上的记账者串通造假,或者链出现了分叉、区块高度回滚,这时如果链外的其他模块和链有不够严谨的交互,都会造成数据不一致或资产损失。如果不同的链采用的还是不一样的平台架构,那么在工程上会更加复杂。 + +跨链、侧链目前依旧是业界在研究和逐步实现的课题,主要目的是解决链和链之间的通信,进行资产锁定和资产交换,保证整个过程的全局一致性、交易事务性,以及抗欺诈。从A链往B链转移一个资产,必须要确保A链上的资产被锁定或销毁,且B链上一定能增加对应的一笔资产,在双方可能分别出现分叉、回滚的时间窗里,要有机制确保双向的资产安全。 + +在现有跨链的方案里,存在中继、链间HUB等方式,这些系统的设计本身也要达到高度可信可靠的标准,安全等级应不低于甚至高于所对接的链,同样也应采用多中心、群体共识的体系设计,整体复杂度可算是链的N次方了。 + +## 不信任网络层 + +区块链节点需要和其他节点发生通信,所以必须在网络上暴露自己的通信端口,如果通过公网通信,那么相当于在公网上暴露了自己,很容易遭到类似渗透、DDOS这样的网络攻击。节点必须在网络层保护自己,包括在网关上设置IP黑白名单、设置端口策略、进行DDOS流量防护,且对网络流量、网络状态进行监测,如果突发网络流量或连接数暴增,说不定,就是被人当肉鸡或者正在脱库进行时了。非必要端口,切忌对公网开放,如用于做管理监控的RPC端口,只能对机构内部开放,在进行网络策略设定之前,一定要慎之又慎。 + +## 不信任代码 + +“Code is law”确实是一句响亮的口号,但是在程序员头发掉光之前,他写的代码都可能有bug,只是看写bug快还是修bug快而已。 + +无论是底层的代码还是智能合约代码,都可能存在技术性或逻辑性的坑,但凡代码产生的数据和指令行为,都需要另一段代码对其进行严格地校验,代码本身也需要进行静态和动态扫描,包括采用形式化证明等技术进行全面地审核验证,以检测可能的逻辑错误、安全漏洞或是否有信息泄露。前段时间有一份公布到github上的某酒店系统的代码,居然包括了mysql的连接用户名密码,且数据库端口居然是向公网开放的,这种坑简直不可想象。 + +开放出去的开源代码,固然可以被人审查、反馈以提升安全性,也可能被人翻找漏洞、随意修改,甚至恶意埋雷。但总的来说,开源还是利大于弊。在开源社区中,开发者会向项目提交PR(Pull Request)。审核PR是很关键也很繁重的工作,值得安排专家并分配大量时间去做审核。有开源项目的老司机透露,其项目核心模块的PR的审核时间长达经年,否则“加了个功能引入两个bug”那真是得不偿失,更别说如果被植入漏洞埋雷了。 + +## 不信任记账者 + +共识的流程大致可以抽象为,选出记账者,记账者发布区块,其他节点校验和确认。公链里记账可以用“挖矿”的方式进行(如比特币),矿工用大量的算力代价为它自己的诚信背书,又或者是用大量的资产权益抵押获得记账权(Pos和DPos等共识)。在联盟链常用的PBFT/Raft等算法里,记账者列表可以是随机或轮换产生,记账者给出提案,其他投票人多步提交,收集投票。按少数服从多数的原则,一般是2/3以上共识节点同意,共识才能达成。 + +从系统可用性角度看,记账者有可能出错、崩溃,或者运行缓慢,影响整个链的出块。又或者记账者可以只收录手续费高的交易,抛弃一些交易,导致有些交易总是不能达成。有的记账者还可以凭借算力或暗箱运作,进行“预挖”或者“扣块攻击”,破坏博弈关系…… + +记账者故障或作恶,超越了共识的安全阈值的话,将直接伤害整条链的价值基础。根据不同的记账模式,记账者需要设计不同的容错、校验、抗欺诈算法,执行激励和惩罚机制,在运行过程中定期检查记账者的健康度,对于无力记账或者作恶的记账节点,全网不接受他们的记账结果,并对其进行惩戒,甚至是踢出网络。 + +------ + +罗列起来还有很多,包括合约、证书、同步等等,每一个模块都有自己的功用和风险点,简直罄竹难书。总之,区块链做为分布式的多方协作的体系,接入了形形色色参与者,整个体系绝不是单个开发者或运营者所能单点把控,“善意推测”在这个领域已经不尽适用,整个世界步步惊心,处处冷箭,只能通过周密的算法和繁杂的流程维系共识和安全,简而言之,没有经过验证的信息,一个字节都不能相信。 + +比起单一环境里的软件设计,区块链领域的设计思路确实存在颠覆性,开发者要从“做功能,只容错,不防骗”的思维模式里跳出来,带着“怀疑一切”的态度进行设计。 + +开发者在面向区块链领域时,不能只是思考怎么实现一个功能,而更要去思考整个流程会不会有出错,会不会被人篡改数据、发掘漏洞、攻击系统、欺诈其他参与者。要换位思考自己所实现的功能,会被别人用什么方式使用,在不同的环境会有什么表现,可能造成什么后果。任何收到的信息,任何流程输入、输出,都必须经过严格地校验才能采信,开发者能做到这一点,才算是打开了区块链新世界的大门,才能在连续剧里至少活到第二集。 + +分布式算法、对称非对称加密、HASH、证书、安全和隐私等技术在区块链领域大行其道,都是为了在保护信息的同时,给信息加上一层又一层的证明和可验证因子,这使得整个系统变得复杂、繁琐,但这是值得的,因为这样才能共同验证,构建“安全”和“信任”。 + +以上,写给准备跳坑,或已经在坑里的程序员。共勉。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/1_conception/what_to_trust.md b/3.x/zh_CN/docs/articles/1_conception/what_to_trust.md new file mode 100644 index 000000000..e857e31d3 --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/what_to_trust.md @@ -0,0 +1,130 @@ +# 说信任区块链时究竟在信任什么? + +作者:张开翔|FISCO BCOS 首席架构师 + +当前,“区块链,信任的机器(Blockchain:The trust machine)”已经成为了一句口号,紧接着就是“去中心化、群体共识、不可篡改、高一致性、安全和保护隐私”等一系列听起来很厉害的术语。究竟区块链具有多大的魔力能让人如此信任,或者说,我们在说“**信**”的时候究竟信的是什么。 + +信息,指身份、资产、价格、地理位置等自然属性和行为信息,它并不是先天可信任的,因为信息散乱、不完整,可能虚假,甚至可能会有人利用信息的不对称性牟利。 + + +把信息整理成结构化数据,通过数据校验的方式,保证其在传播中可保持完整性、全网一致性、可追溯性,不会被恶意篡改;通过冗余存储的方式,保证其公开、共享、可访问,保证数据一直有效。那么,这信息本身就可以被“信任”,从而成为大家的“公共知识”,成为全网参与者都认可的“**最大公约数**”。 + +如果信息体现着价值,且这些价值被大家认知、认可,能被量化,具有可交易的等价物属性,或可能随着时间增值,甚至得到司法背书承认,这些信息才具有商业意义上的“信用”。 + +好比我们认识一个人,但不代表我们信任他。然而这个人一贯表现不错,在社群里言行一致,渐渐地获得了大家的信任。这时的信任依旧不等于信用,除非这个人拥有可观的资产,或者其个人历史上有盈利和偿还的能力,未来也大概率能持续持有资产和承兑债务,那么这个人才具备了“**信用**”。 + + +区块链体系基于算法而不是人治,有望通过其独特的分布式架构、加密算法、数据结构、共识机制等,把信息固化成大家的**信任**锚点;有望通过技术手段把各种现实世界的资源转换成可兑付的数字资产,并展开一系列多方商业协作的活动,这就是所谓的 “信息到信任到信用”,甚至于因为区块链这个黑科技的、行之有效且难以理解的玄妙,这个“信”字仿佛升华成了“**信仰**”。 + +那么我们说信区块链时,信的是什么呢? + +## 信密码学算法 + +区块链是用算法达成信任的,其中最重要的算法之一,就是密码学。区块链中最基本的密码学应用是HASH摘要、对称加密和非对称加密算法,以及相关的签名验签算法。 + +**HASH算法**的旧版本已经被证明可破解而被抛弃了,目前在用的SHA256等算法依旧坚不可破。HASH算法的特性是把一堆数据单向生成一段定长的数据,基本不会发生碰撞,可起到原始数据的“指纹”作用,其单向性不可逆,推不出原始数据,具有一定的抗量子性,是能隐藏原始数据又能在必要时提供校验凭据的最佳方式。 + +**数字签名**一般基于公私钥体系,用私钥签名,公钥验签或者反之。数字签名源自密码学的牢靠性,使得不可能有人能伪造别人的私钥签名,所以一个拥有私钥的人可以通过数字签名,对他的资产签名确权,或者在双方交易时,采用对手方的公钥发起交易,将资产转移给对方,对方用自己的私钥才能验签解开,以获得所有权。 + +**AES、RSA、ECC椭圆曲线**等几种对称和非对称算法广泛地用于数据加解密、安全通信等场景,其安全级别取决于算法本身和密钥长度,当AES使用128~512位密钥,RSA/ECC采用1024甚至2048位密钥时,其保护的数据理论上需要普通计算机上亿年的计算时间才能暴力破解。这些算法在商业、科学、军事领域都经受了考验。 + +加密学领域里还有同态加密、零知识证明、环签名群签名、格密码等新的方向,目前都处于从理论发展到工程的阶段,都在功能、安全强度、效率方面快速优化中,已经可以看到落地使用的可能性了。同时我们也意识到,密码学通常需要经过长期的发展、验证,稳定后才能获得广泛认可,要么实践中经历了大量考验,要么经过权威机构的审核和认证,才能在生产领域大放异彩。密码学里的理论到工程,常常有很长的时间周期。 + +加密算法的一个基本哲学是**计算成本**,当一个算法保护的资产价值,远低于攻破该算法所需的成本时,就是安全的。但如果用一个算法保护一个无价之宝,自然就会有人不计成本地去攻击获利,所以,密码学的安全,也是辩证的、需要量化的。 + +随着量子计算机等学说的兴起,经典密码学可能会经受一些挑战,但量子计算机的理论完善和工程实现还有待时日,目前来看,基本上我们可以近乎“无条件”相信区块链里已经采用的密码学算法,同时,区块链领域的实践者也在陆续引入各种抗量子的密码学算法,这是一场持续的博弈。 + +## 信数据 + +区块链的数据结构,无非是区块+链。新区块将自己的区块高度、交易列表,和上一个区块的HASH,共同再生成一个HASH做为新区块的标识,如此循环,形成了一个环环相扣的数据链。这个链条里的任何一个字节甚至一个Bit被修改,都会因为HASH算法的特性被校验发现。 + + +同时,区块数据被广播给全网所有参与者,参与者越多,规模效应越强。少数人即使强行修改、删剪自己的区块数据,也很容易被其他人校验出异常并不予采纳,只有多数人认可的数据得以留存和流传。也就是说,数据是大家人盯人的形态盯着的,且存在多份副本,一旦落地,只要链还在,数据就可以永远留存。 + +基于容易验证的链式数据结构、群体冗余保存、共同鉴证,区块链数据是“难以篡改”的,所有人拿到的数据也都是一致的,信息公开透明,公共知识得以彰显和固化。 + +从另一个角度看,数据达到信任,但能否达到“信用”还要看数据的价值,也就是数据本身携带的信息,是否能代表有价的资产、有用的信息,诸如身份、交易关系、交易行为、大数据等等,都能代表一定的商业价值。这些数据如果分享出来,足以构建完整的商业基础。 + + +但如果是在过于强调隐私的场景里,大家愿意分享的信息本来就很少,那样就很难达到信用的“最大公约数”。然而,在当前的商业环境里,信息隔离和隐私保护是硬诉求,信息共享和隐私保护成了严峻的矛和盾的关系,除非整个商业关系和商业逻辑出现了革新。 + + +所以,隐私保护相关的研究被大量关注,诸如“多方安全计算”、“零知识证明”的理论大行其道。理论上讲,确实可以做到公布很少的信息就能做到可验证,但其复杂性和计算开销,又是工程层面要去解决的事情了。 + +## 信博弈论 + +区块链中最玄妙的部分是“共识算法”。共识算法的定义是在一个群体中,用一种机制协调大家共同或轮流记账,得出无争议的、唯一性的结果,且保证这个机制可以持续下去。 + + + +换句话说,大家一起维护一个账本,选择谁做为记账者?凭什么相信记账者的动作是正确的?怎么防止记账者作恶?如果记账者正确记账如何得到激励?共识机制完整地回答了这些问题。 + +共识的逻辑是发生在线上的,但实际上,背后是现实世界的竞争博弈。 + +POW(工作量证明)采用算力去竞争记账者的席位和获得记账者的奖励。现实生活中,为了构建具有竞争力的算力工厂,矿工通常需要研发或购买大量的新型号矿机,运输到有稳定和便宜电力供应地区,消耗大量的电费、网费以及其他运营费用,在被监管时又得举家搬迁,浪迹全球,实际上投入了大量(现实世界的)资金、精力以及背着巨大的风险。如果要在POW竞争中获得稳定可观的收益,投入的资金动辄以亿计,并不亚于办一家企业。 + +POS和DPOS用权益证明代替了算力消耗,看起来是环保多了。而代表权益的token,除了创始团队自己发行的之外,“矿工们”一般需要通过币币兑换,或者直接法币购买数字币的方式获得,即使是币币兑换,掏出来的币也常常是采用法币购买的,或者至少这些权益都能以法币进行标价,这其实也是现实世界里的财富注入和背书。 + +然而,和现实的商业关系对比,POW和POS等共识并没有法律和监管机制兜底,也容易受不断变化的博弈形势所影响,比如社群的规模、矿工的更迭、核心技术运营团队的变化。慢慢地,本来有钱和有能力的人,或许会更加有钱和有权力,去中心化的网络可能逐渐变成了卡特尔组织,矿工和技术社区的瓜葛也会不停地掀起波澜,造成分叉、回滚、价格倾轧、对韭当割等现象。 + +总的来说,人们还是信任区块链上的“自治”,在这种分布式自治里,单个事件(如一笔交易)具有“概率性”,同时全网又追求“最终一致性”(公共账本的一致)。这种短期的概率性和长期的确定性,一定程度上可以达成动态的“**纳什均衡**”,支撑起链的生态,给人演化出一种玄妙的“信仰”感。 + + +另一方面,联盟链的记账者一般是机构级的角色。联盟链要求记账者身份可知,参与者们经过许可才能接入网络,他们之间是一种**合作博弈**。联盟链引入了现实世界里的身份信息作为**信用背书**,如工商注册信息、商业声誉、承兑信用、周转资金,或者行业地位、执业牌照、法律身份等,参与者在链上的一切行为均可审计、追查,也让相关的监管部门在必要时可以有的放矢,精准惩戒,强制执行,具有很高的威慑力。 + +在这种环境里,联盟链的参与者一起协作维护网络,共享必要的信息,在平等透明、安全可信的网络里开展交易,只需要防止少量记账者的恶意操作风险,避免系统上的可用性风险。因引入了现实世界里必要的信任背书,即使联盟链业务逻辑非常复杂,而信任模型却更直观。 + +所以,所谓的共识机制,背后依旧是现实世界里财力物力的竞争和信用背书,以及相应行之有效的激励和惩戒机制。 + +天下并没有免费的午餐,也没有平白无故的爱恨。“信”一个记账者,是信他在现实世界里所投入的成本、付出的代价,以及考虑到整个机制有震慑他的惩罚,相信记账者为了持续的收益和增值,不会无故破坏这个网络。 + +## 信智能合约 + +智能合约是由多产的跨领域法律学者尼克·萨博(Nick Szabo)提出来的。他在发表于自己的网站的几篇文章中提到了智能合约的理念,定义如下: + +“一个智能合约是一套以数字形式定义的承诺(promises),包括合约参与方可以在上面执行这些承诺的协议"。 + +简单地说,可以理解为纸质合约的电子版,用代码实现,无差别地运行在区块链网络的每一个节点上,在共识的作用下执行既定的合约规则。 + +智能合约一般基于一个特制的虚拟机,使用沙盒模式运行,屏蔽掉可能导致不一致性的一些功能。比如获取系统时间这个操作,在不同的机器上,时钟都可能不同,这就可能导致依赖时间的业务逻辑出现问题。再比如随机数,以及外部文件系统、外部网站输入等,这些都可能导致虚拟机执行结果不同,都会被虚拟机沙盒环境隔离。 + +如果要采用java语言写合约,要么裁减掉jdk里的相关函数(系统时间、随机数、网络、文件等),要么放到一个有严密权限管控和隔离设定的docker里运行。或者干脆设计一门新的语言,如以太坊的Solidity,只实现特定的指令。又或者放弃掉一些“智能”特性,用简单的堆栈指令序列完成关键的验证判断逻辑。 + +所以,在区块链上执行智能合约,基于沙盒机制控制,凭借区块链的共识算法,达到全网一致、难以篡改、不可否认等特性,运行结果输出就是全网认可的一份合同,江湖人称“Code is Law”。 + +然而,只要是代码,就一定有出现bug或漏洞的概率,可能来自底层虚拟机和网络漏洞,更多的可能来自逻辑实现。随便搜一下“智能合约 安全 漏洞”,就有一堆搜索结果,包括溢出、重入、权限错误等,甚至就是低级错误。近年来,这些漏洞已经造成各种资产损失,最著名的是DAO项目代码漏洞、Parity的多签钱包漏洞、某互联网公司的代币交易过程溢出归零…… + +技术文章可以参考:[https://paper.seebug.org/601/](https://paper.seebug.org/601/) + + +目前,行业里对智能合约的安全也是各出奇招,包括安全公司和白帽子审查、形式化证明、众测等,对安全问题会有一定地改善。如果再出问题,要么是黑客太厉害,或者只能抓程序员祭天了:) + +所以,信智能合约,是有条件的,是要信经过严格测试、长时间稳定运行、万一出错还有办法补救(而不是绝望的只能等分叉大招)的合约。联盟链里的智能合约一般是经过严格测试的,上线时会执行灰度验证流程,运营中监控运行过程,且根据治理规则设计事后追责、补救(冲正,调账,冻结...)等措施,还是比较可信的。 + +## 信中间人(?) + +注意本小节标题打了问号,区块链推崇“去中心或多中心,去中介或弱中介”的运作模式,但是由于目前发展尚未完善,很多场景实际上还是引入了中介,如币币兑换通常需要经过交易所,尤其是中心化的交易所。其交易原理是要求用户把资产存入交易所的帐户里,交易时其实是在交易所的数据库里进行记账,只有在存币或提币时,才会和区块链网络发生交互。 + +交易所的信任模型和区块链某种程度上是脱钩了,这时,交易所本身的资质,运营方的技术能力、安全防护能力、资产信用和承兑能力,才是用户最需要关心的。一旦交易所出了问题,比如跑路、破产、暗盘操作、监守自盗,基本上散户就只能做韭菜了。 + +多的不说,参见著名的“门头沟事件”:[https://baike.baidu.com/item/Mt.Gox/3611884](https://baike.baidu.com/item/Mt.Gox/3611884) + +所以,相信一个托管者,是一个见仁见智的事情,只是现行的模式里,类似交易所这样的角色还在某些区域运作着。2018年,全球虚拟数字资产交易所有1万多家,其中多少能做到高规格的安全,运营规范,干净……那就看情况了。 + +最后提一点:联盟链默认是没有公链那种虚拟数字资产交易所的。 + +------ + +区块链领域的细节还有很多,以上先罗列主要的几个点,信任技术,信任共识机制,信任规模化的社群博弈,超过了信任“人”。“人”是一种不确定因素,你可以信任一个你很熟悉很老铁的人,也可以信任一大群有共同理念且有完善机制协作的人,但你不能信任某一小撮居心叵測的人,要不分分钟变成韭菜:) + +总结一下,在区块链世界中,人们可以建立以下基本的信心: + +- 我持有的资产和信息,只有我能动用或披露 +- 我可以按公允的规则参与交易,分享信息,转入转出资产 +- 别人给我转过来的资产一定是有效的,不会被重复花费而失效 +- 一旦交易完成,就是板上钉钉的事情 +- 一切已经发生的事情都可验证,可追溯 +- 违反规则的人会损失更大 +- 维护网络的人付出了劳动会有恰当的回报,整个模式可持续 + +基于这些信心和信任,在合法合规的前提下,人们给网络注入各种资产,开展互补互利、规则透明、公开公平公正的商业行为,将会是一种理想的状态。 diff --git a/3.x/zh_CN/docs/articles/1_conception/why_blockchain_slow.md b/3.x/zh_CN/docs/articles/1_conception/why_blockchain_slow.md new file mode 100644 index 000000000..e2ee5b188 --- /dev/null +++ b/3.x/zh_CN/docs/articles/1_conception/why_blockchain_slow.md @@ -0,0 +1,91 @@ +# 区块链的速度困境:“贵”在信任,“慢”得其所 + +作者:张开翔|FISCO BCOS 首席架构师 + +### 举个例子 + +数钱,比如数一个亿(是不是好刺激~) + +1、如果一个人数,慢,但好在专注,全力以赴,在可见的时间内可以数完。这叫单线程密集计算。 + +2、如果N个人一起数,每人平分,分头同时数,最后汇总总数,所用时间基本上是第一种情况的1/N,参与的人越多,所需时间就越少,TPS就越高。这叫并行计算和MapReduce。 + +3、如果N个人一起数,但由于这N个人互相不信任,得彼此盯着,首先抽签选一个人,这个人捡出一叠钱(比如一万块一叠)数一遍,打上封条,签名盖章,然后给另外几个人一起同时重新数一遍,数好的人都签名盖章,这叠钱才算点好了。然后再抽签换个人检出下一叠来数,如此循环。因为一个人数钱时别人只是盯着,而且一个人数完且打上封条和签名的一叠钱,其他人要重复数一遍再签名确认,那么可想而知,这种方式肯定是最慢的。**这就叫区块链。** + +但换个角度,方式1,一个人数有可能会数错,这个人有可能生病或休假,导致没有人干活,更坏的结果是,这个人可能调换假币或者私藏一部分钱,报一个错的总数。 + +方式2,N个人中会有一定比例数错,也可能其中一个人休假或者怠工,导致最终结果出不来,更可能因为人多手杂,出现部分人偷钱、换假钱、报假数…… + +方式3,很慢,但是很安全,因为所有人都会盯着全过程进行验算,所以肯定不会数错。如果其中有人掉线,可以换人捡出新的一叠钱继续数,工作不会中断。所有数过的钱上面都有封条和签名,不会被做手脚,万一出错了也可以找到责任人进行追责。这种情况下,资金安全是完全得到保障的,除非所有的参与者都串通一气了。该模式下,参与的人越多,资金安全性就越高。 + +**所以,区块链方案致力追求的是,在缺乏互相信任的分布式网络环境下,实现交易的安全性、公允性,达成数据的高度一致性,防篡改、防作恶、可追溯,付出的代价之一就是性能。** + +最著名的比特币网络,平均每秒只能处理5~7笔交易,10分钟出1个块,达到交易的最终确定性需要6个块也就是1个小时,且出块过程相当损耗算力(POW挖矿)。号称“全球计算机”的以太坊,每秒能处理的交易数也仅是2位数的量级,十几秒出1个块。以太坊目前也是采用损耗算力的共识机制POW挖矿,会逐步迁移到POS共识机制。这两个网络在粉丝们爆炸性地进行交易时,可能会陷入拥堵状态,大量的交易发出后,一两天甚至更长的时间才会被打包确认。 + +**但在资金安全就是命的场景下,有些事情是“必须”的,所以,即使慢,还是会考虑选择区块链。** + +### 区块链为什么慢 + +分布式系统里有一个著名的理论叫CAP理论:2000年,Eric Brewer教授提出一个猜想:一致性、可用性和分区容错性三者,无法在分布式系统中被同时满足,并且最多只能满足其中两个。 + +**CAP的大致解释** + +Consistency(一致性) :数据一致更新,所有数据变动都是同步的 + +Availability(可用性):好的响应性能 + +Partition tolerance(分区容错性): 可靠性 + +这个理论虽然有一些争议,但从工程实践中看,和光速理论一样,可以无限逼近极致但是难以突破。区块链系统能把一致性和可靠性做到极致,但是“好的响应性能”方面一直有点被人诟病。 + +我们面向的“联盟链”领域,因为在准入标准,系统架构、参与节点数、共识机制等方面都和公链不同,其性能表现远高于公有链,但是目前几个主流的区块链平台,在常规PC级服务器硬件上实测,TPS一般是在千级的样子,交易延迟一般在1秒到10秒这个级别。(听说TPS十几万级和百万级千万级区块链已经做出来了?好吧,期待) + +笔者曾在大型互联网公司工作多年,在海量服务领域,面对C10K问题(concurrent 10000 connection,万级并发)已经有轻车熟路的解决方案,对一般的电商业务或内容浏览服务,普通pc级服务器单机达到几万TPS,且平均延时在500毫秒以内,飞一般的体验已经是常态,毕竟互联网产品卡一下说不定就会导致用户流失。对于快速增长的互联网项目,通过平行扩容、弹性扩容、立体扩容的方式,几乎能无底线、无上限地面对山呼海啸的海量流量。 + +**相比而言,区块链的性能比互联网服务慢,而且难以扩容,根因还是在其“用计算换信任”的设计思路上。** + +### 具体哪里慢呢? + +从“古典”区块链的系统内部来看 + +**1、为了安全防篡改防泄密可追溯**,引入了加密算法来处理交易数据,增加了CPU计算开销,包括HASH、对称加密、椭圆曲线或RSA等算法的非对称加密、数据签名和验签、CA证书校验,甚至是目前还慢到令人发指的同态加密、零知识证明等。在数据格式上,区块链的数据结构本身包含了各种签名、HASH等交易外的校验性数据,数据打包解包、传输、校验等处理起来较为繁琐。 + +对比互联网服务,也会有数据加密和协议打包解包的步骤,但是越精简越好,优化到了极致,如无必要,绝不增加累赘的计算负担。 + +**2、为了保证交易事务性**,交易是串行进行的,而且是彻底的串行,先对交易排序,然后用单线程执行智能合约,以避免乱序执行导致的事务混乱、数据冲突等。即使在一个服务器有多核的CPU,操作系统支持多线程多进程,以及网络中有多个节点、多台服务器的前提下,所有交易也是有条不紊地、严格地按单线程在每台计算机上单核地进行运算,这个时候多核CPU其他的核可能完全是空闲的。 + +而互联网服务则是能用多少服务器的多少个核,采用全异步处理、多进程、多线程、协程、缓存、优化IOWAIT等等,一定会把硬件计算能力跑满。 + +**3、为了保证网络的整体可用性**,区块链采用了P2P网络架构以及类似Gossip的传输模式,所有的区块和交易数据,都会无差别地向网络广播,接收到的节点继续接力传播,这种模式可以使数据尽可能地传达给网络中的所有人,即使这些人在不同的区域或子网里。代价是传输冗余度高,会占用较多的带宽,且传播的到达时间不确定,可能很快,也可能很慢(中转次数很多)。 + +对比互联网服务,除非出错重传,否则网络传输一定是最精简的,用有限的带宽来承载海量的数据,且传输路径会争取最优,点对点传输。 + +**4、为了支持智能合约特性**,类似以太坊等区块链解决方案,为了实现沙盒特性,保证运行环境的安全和屏蔽不一致性因素,其智能合约引擎要么是解释型的EVM,或者是采用docker封装的计算单元,智能合约核心引擎的启动速度,指令执行速度,都没有达到最高水平,消耗的内存资源也没有达到最优。 + +而用常规计算机语言如C++、JAVA、go、rust语言直接实现海量互联网服务,在这方面常常没有限制。 + +**5、为了达到可容易校验防篡改的效果**,除了第一条提到的,区块数据结构里携带数据较多之外,针对交易输入和输出,会采用类似merkle树、帕特里夏(Patricia )树等复杂的树状结构,通过层层计算得到数据证明,供后续流程快速校验。树的细节这里不展开,可以通过网络上的资料来学习其机制。 + +基本上,生成和维护这种树的过程是非常非常非常非常繁琐的,既占用CPU的计算量,又占用存储量,使用了树后,整体有效数据承载量(即客户端发起的交易数据和实际存储下来的最终数据对比)急剧下降到百分之几,极端情况下,可能接受了10m的交易数据后,在区块链磁盘上可能实际需要几百兆的数据维护开销),因为存储量的几何级数增加,对IO性能要求也会更高。 + +互联网服务因为基本不考虑分布式互验互信的问题,很少有使用这种树的证明结构,了不起算下MD5和HASH做为协议校验位。 + +**6、为了达到全网一致性和公信力**,在区块链中所有的区块和交易数据,都会通过共识机制框架驱动,在网络上广播出去,由所有的节点运行多步复杂的验算和表决,大多数节点认可的数据,才会落地确认。 + +在网络上增加新的节点,并不会增加系统容量和提升处理速度,这一点彻底颠覆了“性能不足硬件补”的常规互联网系统思维,其根因是区块链中所有节点都在做重复的验算以及生成自己的数据存储,并不复用其他节点数据,且节点计算能力参差不齐,甚至会使最终确认的速度变慢。 + +在区块链系统中增加节点,只会增加可容错性和网络的公信力,而不会增强性能表现,使得在同一个链中,平行扩展的可能性基本缺失了。 + +而互联网服务大多是无状态的,数据可缓存可复用,请求和返回之间的步骤相对简单,容易进行平行扩展,可以快速调度更多的资源参与服务,拥有无限的弹性。 + +**7、因为区块数据结构和共识机制特性**,导致交易到了区块链之后,会先排序,然后加入到区块里,以区块为单位,一小批一小批数据的进行共识确认,而不是收到一个交易立刻进行共识确认,比如:每个区块包含1000个交易,每3秒共识确认一次,这个时候交易有可能需要1~3秒的时间才能被确认。 + +更坏的情况是,交易一直在排队,而没有被打包进区块(因为队列拥堵),导致确认时延更长。这种交易时延一般远大于互联网服务500ms响应的标准。所以区块链其实并不适合直接用于追求快速响应的实时交易场景,行业通常说的“提高交易效率”是把最终清结算的时间都算在内的,比如把T+1长达一两天的对账或清计算时延,缩短到几十秒或几分钟,成为一个“准实时”的体验。 + +综上所述,区块链系统天生就背着几座大山,包括单机内部计算开销和存储较大,背着串行计算的原罪,网络结构复杂冗余度高,区块打包共识的节奏导致时延较长,而在可扩展性上又难以直接增加硬件来平行扩容,导致scale up和scale out两方面,都存在明显瓶颈。 + +**Scale Out(等同scale horizontally)**:横向扩展,向外扩展,如:向原有系统添加一组独立的新机器,用更多的机器来增加服务容量 + +**Scale Up(等同Scale vertically)**:纵向扩展,向上扩展,如向原有的机器添加CPU、内存,在机器内部增加处理能力 + +直面区块链的速度困境,FISCO BCOS的开发者发挥“愚公移山”的精神,努力优化。经过一段时间的努力,已经移山倒海,修出了一条又一条高速通道,使区块链找到了迈向极速时代的路子(详见下篇),这就是我们系列文章要深入解析的内容。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/2_required/entry_to_master.md b/3.x/zh_CN/docs/articles/2_required/entry_to_master.md new file mode 100644 index 000000000..1e8293018 --- /dev/null +++ b/3.x/zh_CN/docs/articles/2_required/entry_to_master.md @@ -0,0 +1,103 @@ +# 排除万难,从入门到精通区块链 + +作者:张开翔|FISCO BCOS 首席架构师 + +目前越来越多的人已经进入或准备进入区块链领域,过程中不免抱着各样的疑虑和问题。想起自己之前用几年时间,从“略懂”区块链到all in,同样也经历着类似的心路历程,这个领域确实是有一些门槛的,但万事开头难,摸索路上还远不止八十一难,这里梳理几个概要性的困难和感悟,谨作分享。 + +## 方向之难 + +我是谁”、“我在哪”、“我要去哪儿”,一切都源于这么一个哲学三问。区块链是什么?区块链究竟能做什么?为什么区块链这么火?不用区块链行不行?这些问题都充满了终极拷问的意味。 + +其实很难彻底回答这些问题,因为,并没有标准答案。所有创新的前沿的事物大抵如此,在质疑和动荡中发展,在黑暗和荒芜中摸索,精华和糟粕齐飞,绿洲与韭菜一色,直到引爆点迸发。如果因为充满疑虑而左右摇摆,或者裹足不前,那么在从事相关工作研究的过程,体验会很糟糕,结果也不会好。 + +分享一点个人体会:区块链领域从一开始就吸引了全世界无数的聪明人,不乏极客、学者、大师, 他们进行了大量的技术和社会实践。这个领域蕴含着数学、计算机、密码学、博弈论、经济学、社会学等学科的精华,这是一个智力飞扬、思想激荡的世界。目前,整个行业更是获得前所未有的关注,包括政府、各行业巨头都在关注,大量注意力和资源持续涌入,区块链迎来了“最好的时节”。 + +在持续进化、结构多元的现代社会里,分布式商业的理念已经成为现实。人和人、机构和机构之间会产生更多的联系和协作,信息和价值在新型网络模式中快速流转,作为分布式技术代表之一的区块链,很有机会成为新一代基础设施和创新的据点。 + +所以,方向并不是问题。即使你不把区块链当做“信仰”,只看这个充满魅力的技术本身,以及区块链与实体经济深度融合的机遇,还是可以给我们带来信心。 + +## 概念之难 + +在哲学三问中,“区块链是什么”是最晦涩的问题,区块、交易、账户、共识、智能合约、双花...这都是什么?!我自己在刚接触区块链时,也有一种被颠覆了认知的感觉。有一些介绍区块链的文章,往往着眼在区块链的社会和经济效能,从价值理念讲起,这些固然是必要的,但俗话说“科学要定性更要定量”,作为工程技术人员,我们更应该关注的是,区块链里的知识点、基本原理,进而澄清术语、把握架构、处理逻辑和程序流程。 + +前面提到,区块链蕴含着大量学科的精华,同时,行业也有一句俗语:“**区块链并没有发明什么新技术,都是成熟技术的组合**”。 + +- 这些成熟的技术包括数据结构,诸如链表、树、图、过滤器等,是大学里数据结构的基础知识; +- 基础密码学,包括HASH和对称非对称加密、数字签名等等,已经是几十年的经典技术,而事关隐私保护等领域的新一代密码学,更给密码学专业人士开拓了一片广阔的发挥空间; +- 分布式网络和系统这门学科本身包罗万象,覆盖了海量服务的知识范畴,许多从事过海量互联网服务技术的同学,都会对区块链的P2P网络和共识算法、并行计算模型、事务性一致性原理如数家珍; +- 博弈论和激励相容是协作方面的知识点,是“区块链思维”的重要组成部分,工科学生可能需要翻翻书,社科经管背景的同学估计会似曾相识吧; +- 至于智能合约,比如solidity语言、WebAssembly等,很少听说吗?其实这些语言以及编程模式学习曲线未必有javascript高,有几年程序基础的同学基本上一周就可以上手,写出顺溜的智能合约来。 + +区块链让人觉得认知困难,是因为它就像个“筐”,什么都可以往里装,牵涉的技术繁杂,组合方式却和常规技术套路不同。所以学习者一定程度上先要放空自己,避免让自己在原有领域的思维定势干扰了学习,在丰富自己知识面的同时,接受区块链的“群体共识”、“防止篡改”、“不可否认”、“高度一致性”等神奇逻辑,然后潜心进去看每一个独立的概念时,并不会觉得高不可攀。 + +突破概念之难的要点,是排除来自各种渠道的噪声,有些信息似是而非,或者是各说各话,把同一件事用N种话术讲出来,混淆了定义,模糊了本质,于事无补的同时还带来更多疑问。靠谱的方法是着重阅读权威媒体的正规内容,关注一些主流区块链项目的文档库,认真地、全面地通读技术文档,然后找一个自己感兴趣的领域(如共识算法),结合自身经验知识进行对照研究。 + +同时,也可以加入活跃的开源社区和技术圈子,和有经验的人多讨论,勇于把问题抛出来,挨个术语,挨个流程讨论透彻。我们在研究区块链的初期,团队经常就一个概念的定义咬文嚼字地争论很久,最后愉快地达成共识时,大家都觉得神清气爽。 + +在概念阶段,切忌求全责备,不要变成资料收集机,一口吃不成胖子,基于靠谱的学习资料,澄清基本概念,在实践中去验证和发掘新的概念,建立发现问题、解决问题的方法论,慢慢就能举一反三,说不定某一天就能醍醐灌顶了。 + +## 上手之难 + +好吧,哲学和概念问题终于不会阻碍我们学习的脚步了,那么怎么继续“二十一天入门到精通”之路。作为技术人员,遇到新的技术平台、软件体系、编程语言...那当然是:“不要怂,就是干!” + +几年前,我们刚开始研究区块链时,通读过几个国外流行的开源区块链项目代码,并搭建测试网进行试验剖析,分析如何让这些平台能在复杂的金融业务上用起来。当时有个困惑,如果直接基于底层平台开发应用,当需要实现更多功能时,是不是就得直接修改底层平台代码。 + +而当看到“智能合约”这个东西时,思路一下就打开了:采用智能合约作为中间层,在合约里编写业务逻辑,并为调用者定义清晰的功能接口,这样,业务可以很好和底层解耦,而底层平台则定位成强大的引擎,通过架构的解耦,使得整个开发过程变得清晰合理、轻松愉快,感觉就像是从“C/S”架构到“B/S”架构的演变,多年互联网海量服务开发的手感又回来了。 + +另外,我们觉得当时的开源项目主要是公链形态,在安全可控以及合规方面考虑没有那么周全,并不适合金融场景使用。 + +那么,没有趁手的平台,就想办法造一个。从此,深耕底层技术、迭代应用验证的漫漫之路开启了。这个过程也和开源社区一众伙伴建立了紧密的合作,正是“来自开源并回馈开源”,经过开源工作组几年的打磨,FISCO BCOS已经是一个全面开源、安全可控、高速稳定、易用友好的金融级底层技术平台,面向金融和广大的产业领域,提供丰富的功能和各种操作工具。丰富全面的文档和便捷易用的体验,可以帮助开发者从快速入门到精通,整体的技术门槛和开发成本变得前所未有的低。 + +有了基础的底层平台之后,下载、安装、配置、运行、阅读使用手册、写hello world和业务应用、Debug和分析日志...都是step by step的工作了。 + +我们目标是,用户在几分钟内,用一键安装、docker、云服务等方式顺畅无错地搭建出自己的区块链网络,在一周内通过学习就可以写出完整的智能合约,基于支持多款语言的SDK(Java、Node.js、Python、Go...还在增补中)实现业务逻辑,将业务发布上线,保持稳定运行。 + +为了这个目标,我们一直在持续优化使用文档、开发手册,以及部署和运维工具。众所周知,“码农”们喜欢写代码,而写注释和文档就比较痛苦了,为了向社区交出一份漂亮的作业,大家倾尽了有生以来的语文水平,一次又一次修订,硬是写出了数十万字的文档库。 + +同时,开源社区推出了一系列的线下线上沙龙、培训,用社区的方式,进行广泛交流和技术支持。在多次的现场学习和黑客松大赛中,我们欣喜地看到,开发者用两三天时间,就能基于FISCO BCOS实现他们精巧的项目设计,而且有开发者将其中和开源项目相关的优化贡献到Github上。 + +到这个程度,即使是对没有区块链研发经验的开发人员,快速上手已经没有什么问题,即便区块链底层还像一个黑盒子有待探索,但就像在电脑上安装App、使用mysql、tomcat之类的软件一样,足可以用起来,感受区块链的魅力了。 + +## 深入之难 + +对技术人员来说,探索技术的内涵永无止境:参与到区块链底层开发,实现大型的区块链应用,为区块链生态增加更多有用的特性、工具,对现有功能性能进行极致优化,这些都是进入“深水区”的路线。 + +之前提到,区块链系统知识点和框架涉猎广泛,无论是知识面还是深度都有相当的规模。量化一下的话,可以套用一万小时理论:如果每天学习工作8-10小时,一个月足以上手,一年可得小成,两年轻车熟路,三年可成老司机...但老司机要行的前路依旧漫漫。我们希望通过持续的科普、交流、实践,去缩短这个过程,但毕竟学习就是一种最基本的“工作量证明”,并没有什么其他捷径。 + +学习方法,首先是大量的泛读,每天早上一睁眼到晚上,都可以看到持续更新的行业新闻、公众号文章、技术大咖博客、邮件组讨论组、开源项目......阅读的过程或许会遇到不同观点的碰撞,需要去伪存真,在心态开放的同时,也保持自己的立场和方向。 + +然后是深入的精读,先选定一两个感兴趣的方向,研读诸如密码学、分布式理论等方面的一些经典论文。FISCO BCOS的核心共识算法使用的PBFT和RAFT算法,是基于对原版论文的研究解读,有了深入的理解再去做的实现和优化。区块链里广泛用到密码学原理,场景和逻辑多变,其原理有可能来自某一篇“顶会”论文。精读深度原理剖析文章和学术论文,基于扎实的理论,才能根据自己的需要进行发挥,创造性地解决工程问题。 + +其实我们的在线文档已经有数十万字的规模,各种信息应有尽有,技术社区会定期对热点知识进行解读,只要读者认真阅读在线技术文档,接受公众号的体贴推送,并动手进行更多的实践,随着时间推移,必能深度理解区块链的技术原理,参透架构设计的来龙去脉,建立起巩固的知识体系。 + +最后,精读的对象,自然也包括源代码,毕竟“Talk is cheap, show me the code”,区块链开源项目代码大多是几万到几十万行的级别,阅读代码是达成庖丁解牛水准最直接的方法。在研究区块链的历程里,我们有许多长夜漫漫review代码的日子,当读到一眯眼,眼前都是代码在飞,各种接口和对象翩翩起舞,既优雅又有规律,脉络清晰,那种愉悦简直难以名状。这种体验,之前有,之后也会继续有。 + +如果已经深入到了这个程度,领域门槛已经基本越过,考验的就是开发者的脑力和体力了吧。 + +## 持续之难 + +在过去几年因为鱼目混珠、政策法规、技术障碍等等一系列情况,区块链会遇到市场波动、应用落地延缓等挑战。未来如何,虽然没有预言家告诉我们,但现在大家已经看到了趋势。这又回到了第一个问题:“方向”,明确清晰的方向,不但能回答“要不要进入这个领域”,同样也能回答“要不要坚持下去”。我们一直在分布式商业模式中开拓场景,为公众提供优质的服务,为行业提供完备和好用的开源技术,这是从开始到现在,乃至未来坚持的方向,从未改变。 + +再具体一点,如果我们已经用区块链部署上线了业务系统,那么影响系统生命周期和持续性的问题还有:可运维性、可升级性、兼容性、数据容量、业务性能容量等等。 + +多次和社区朋友交流的过程,他们会提起一些问题,例如,新版本是否能兼容旧版本?随着业务发展,越来越多的数据是否可以迁移和重用?这都是用户的真实声音。我们所构建的平台,一定要走可持续发展的路线,重视软件体系的兼容性,有合理的版本发布节奏,以及周全的数据迁移维护策略,可以更好地保护社区用户利益,也使得用户愿意长期与社区共同发展。 + +另外,区块链领域还在高速发展中,各种新技术、新思潮、新模式、新政策还在层出不穷,这个领域集结了世界上大量的聪明人,他们不但聪明而且努力,从来都不闲着。于是在这个领域工作,每天都会有新的知识、新的刺激,这一方面是一种幸运,另一方面,也会让人极其焦虑。 + +如何去消化这么海量的信息,如何去探索和掌握前沿的知识,如何更好满足高速发展带来的用户需求和新挑战,如何做出卓有成效的突破性创新,这真的是一个创新和焦虑并存的世界,让人欲罢不能。 + +作为从业者,必须持续进行大量阅读,在各种信息流里过滤和吸收,不断地归纳/总结/思考/开拓;每一个需求和用户ISSUE反馈都是一个小目标,每发布一个新版本都会是下一个版本的新起点。区块链的世界和其他技术领域没有什么不同,都必须保持敏锐和奔跑,保持好奇和谦逊,不断学习和实践,修订短板寻求突破,将成果分享给社区。正如系统需要极大的弹性,人也需要极大的韧性。共勉。 + +#### 推荐链接 + +[《亲朋好友都能看懂的区块链》](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485270&idx=1&sn=5a4a5990cd3229df132da6ecc6cd241d&chksm=9f2ef54aa8597c5cfa558ceb65283488fff972bab6cebcb1cf0c2e8155695f628f6958c7fd58&token=705851025&lang=zh_CN#rd) + +[FISCO BCOS开源项目github地址](https://www.github.com/fisco-bcos) + +[FISCO BCOS开源项目gitee地址](https://gitee.com/fisco-bcos) + +[关键概念阅读](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/key_concepts.html) + +[《FISCO BCOS零基础入门,五步轻松构建应用》](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485305&idx=1&sn=5a8dc012880aac6f5cd3dacd7db9f1d9&chksm=9f2ef565a8597c73b87fd248c41d1a5b9b0e6a6c6c527baf873498e351e3cb532b77eda9377a&token=705851025&lang=zh_CN#rd) + +[深入区块链底层平台FISCO BCOS](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/index.html) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/2_required/go_through_sourcecode.md b/3.x/zh_CN/docs/articles/2_required/go_through_sourcecode.md new file mode 100644 index 000000000..a649cb823 --- /dev/null +++ b/3.x/zh_CN/docs/articles/2_required/go_through_sourcecode.md @@ -0,0 +1,120 @@ +# 带你读源码:四大视角多维走读区块链源码 + +作者:李辉忠|FISCO BCOS 高级架构师 + +## 引子 + +区块链作为「新基建」的重要组成部分,越来越受技术爱好者关注。区块链极客信奉“code is law”,相信通过代码可以构筑一个可信的世界。 + +而作为一门综合学科技术,区块链建立在数学、密码学、计算机原理、分布式网络和博弈论等众多基础学科之上,底层代码动辄数十万行,如果没有摸清门道,要完全掌握这些代码是极具挑战的。 + +本文希望给读者一个走读区块链源码的方法,让读者面对区块链底层项目时可以从容地说出“show me the code”。 + +## 基础知识储备 + +区块链是一门综合学科,涉及多个专业领域,涵括多方面的基础知识,在深度研究区块链之前需要做一定广度的知识储备。注意,这里说的是广度,并非深度,也就是说你只需要大概知道这些基础知识的基本原理与作用即可。 + +- 密码学相关:理解哈希、对称加密、非对称加密以及数字签名的基本原理和作用; +- 计算机操作系统相关:理解多进程、多线程、互斥、并行等相关概念和作用; +- 数据结构相关:理解队列、堆栈、树等基本数据结构和使用场景; +- 计算机网络相关:理解TCP/IP、心跳包、消息流等基本概念; +- 数据库相关:理解数据库基本概念,了解KV数据库的基本原理; +- 计算机原理相关:理解程序编译、解析、执行和字节码、虚拟机等概念; +- 分布式系统相关:理解点对点网络、分布式一致性、CAP等相关概念和基本原理; +- 程序开发相关:掌握相关的编程语言、构建工具等,理解项目构建基本流程。 + +## 多维走读 + +在储备了相关的基础知识之后,你就可以打开一份真正的区块链底层代码了,一般通过git clone可以快速下载到项目代码。 + +但是,面对数十万行的代码,该从何看起呢? + +一个优秀的区块链底层项目,必然有一份优秀的工程代码,这份代码有其合理的组织结构与纹理逻辑。走读代码应效仿庖丁解牛,先摸清区块链的基本结构和逻辑,再开始走读,可以达到事半功倍的效果。 + +本文推荐要从四个不同视角进行走读,站在自己的需求角度出发去看代码,而不要被巨量的代码所左右。这四个角度为功能视角、系统视角、用户视角和开发视角,分别从逻辑层面、运行层面、使用层面和开发层面厘清代码架构和关键算法。 + +## 功能视角 + +在深入一份区块链底层代码之前,首先要通过其官网、技术文档、github wiki等渠道获取项目设计文档,了解其基本功能设计。 + +一般每个项目都会提供核心功能列表、总体架构图、功能模块图等介绍文档,通过这些介绍可以掌握项目基本功能。即使你真的找不到也不打紧,大部分区块链底层项目在功能设计层面的差异较小,核心功能模块也大致相同。 + +![](../../../images/articles/go_through_sourcecode/IMG_5076.PNG) + +以FISCO BCOS为例,基础层代码如下: + +![](../../../images/articles/go_through_sourcecode/IMG_5077.PNG) + +核心层核心代码如下: + +![](../../../images/articles/go_through_sourcecode/IMG_5078.PNG) + +接口层核心代码如下: + +![](../../../images/articles/go_through_sourcecode/IMG_5079.PNG) + +从功能视角出发,先定位核心功能模块的代码位置,再仔细深入各个功能代码,从单个功能模块内,也可继续递归采用功能视角拆分法,广度遍历直至了解全貌。 + +## 系统视角 + +系统视角从整个区块链网络运行角度,关注区块链节点全生命周期所参与的系统行为。 + +关注点包括从敲下启动节点的命令开始,节点经历了哪些初始化环节,之后又是如何与其他节点建立点对点网络,以及完成分布式协作的。 + +由于不同区块链在部署架构上略有差异,系统运行方式也有所不同,但万变不离其宗,系统视角来看,每个区块链系统都要经历节点初始化、建立点对点网络、完成分布式交互的过程。 + +从系统视角看区块链,首先要关注初始化工作。以FISCO BCOS为例,区块链节点启动从main函数入口进入,通过libinitializer模块初始化并启动各模块,启动顺序如下: + +![](../../../images/articles/go_through_sourcecode/IMG_5080.PNG) + +通过启动顺序可以知道FISCO BCOS的一个重要特性——支持多群组账本,每个群组是一个独立的Ledger模块,每个Ledger具有独立的存储、同步、共识处理功能。 + +完成初始化工作同时,系统将会启动若干线程(或者进程、协程,原理类似),这些线程包括网络监听、共识、消息同步等,可以结合代码分析与系统命令查看运行节点配合确定有哪些关键线程,搞清楚关键线程的工作机制就可以基本掌握区块链系统运行机制。 + +以FISCO BCOS为例,节点启动之后的关键线程以及他们之间的关系如下: + +![](../../../images/articles/go_through_sourcecode/IMG_5081.PNG) + +初始化完成之后,网络模块的Host线程将根据配置列表,主动与其他节点建立连接,并且持续监听来自其他节点的连接;Sync线程开始相互发送区块高度,发现高度低于其他节点则开启下载逻辑;RPC与Channel线程等待客户端发送请求,将收到的交易塞入txpool;Sealer线程从txpool获取交易,Consensus线程则开始处理共识消息包。 + +如此,整个区块链系统有条不紊地运转,完成客户端请求与分布式协作。 + +## 用户视角 + +用户视角关注操作接口和交易生命周期,关注访问区块链的接口和协议设计、编解码方式、核心数据结构、错误码规范等,还会关注如何发送一笔交易到链上,交易在链上又经历了哪些处理流程,直到达成全网共识。 + +一般区块链底层项目都会给出交互协议的说明文档,通常实现包括JsonRPC、gRPC、Restful等不同类型的交互协议。 + +不同项目的交互接口会有所不同,但大都会包含发送交易、部署合约、调用合约、查看区块、查看交易以及回执、查看区块链状态等接口。不同项目的数据编码也会有所不同,有些采用Json,有些采用protobuf等。 + +当从技术文档中了解清楚交互协议、接口、编解码和错误码等设计细节之后,接下来最重要的是通过发送交易、部署合约、调用合约这些关键接口,对代码进行抽丝剥茧,贯穿交易整个生命周期,从而搞清楚区块链底层最核心的逻辑。 + +以FISCO BCOS为例,通过多个模块相互协作,完成交易整个生命周期的处理: + +![](../../../images/articles/go_through_sourcecode/IMG_5082.PNG) + +## 开发视角 + +开发视角关注的是整个代码工程,包括第三方依赖,源码模块之间的相互关系,单元测试框架和测试用例,编译和构建方式,持续集成和benchmark,以及如何参与社区源码贡献等等。 + +不同语言都有相应推荐的编译构建方式以及单测框架,通常在区块链项目源码目录可以快速定位到第三方依赖库,比如以cmake构建的C++项目有CmakeLists.txt文件,go项目有go.mod文件,rust项目有cargo.toml文件等。 + +以FISCO BCOS为例,从CmakeLists.txt可以看到依赖库包括: + +![](../../../images/articles/go_through_sourcecode/IMG_5083.PNG) + +项目核心源码包括fisco-bcos程序入口代码,以及libxxx的各模块代码,根据模块的名字可以快速识别其对应功能,这里也体现了一个项目源码质量的高低,高质量的代码应该是“代码即注释”。 + +单元测试代码在test目录,采用boost的单元测试框架,子目录unittests中单测代码与源码目录一一对应,非常容易找到源码对应的单元测试代码。 + +构建和持续集成工具代码在tools目录,子目录ci中维护了多个不同场景的持续集成用例,在github提交的每一个pr(pull request)都会触发这些持续集成用例,当且仅当每个用例成功通过方可允许合入pr。 + +关于FISCO BCOS的代码规范和贡献方式,在CODING_STYLE.md和CONTRIBUTING.md文件中有详细描述,鼓励社区用户积极参与贡献。 + +## 总结 + +区块链涉及领域和知识较多,需要深入源码细节,才能真正完全掌握区块链核心技术。所谓“重剑无锋,大巧不工”,掌握源码走读的基本方法论,才能在巨量代码前,面不改色心不跳。 + +本文提出从功能、系统、用户和开发四个不同视角进行区块链底层代码走读的方法,一般来说,依次选择不同视角进行走读是比较推荐的方式,也可以根据个人喜好和能力模型选择视角顺序。 + +最后,本文所举示例皆为FISCO BCOS,但这套走读方法可以适用于任何其他区块链底层项目,希望本文对你有所帮助。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/2_required/practical_skill_tree.md b/3.x/zh_CN/docs/articles/2_required/practical_skill_tree.md new file mode 100644 index 000000000..506d7081d --- /dev/null +++ b/3.x/zh_CN/docs/articles/2_required/practical_skill_tree.md @@ -0,0 +1,192 @@ +# 新人必读:区块链实用型技能树 + +作者:张开翔|FISCO BCOS 首席架构师 + +随着新一波的区块链热潮,许多同学怀着巨大的热情进入了这个领域,同时也会遇到不少疑惑,区块链开发需要哪些知识?怎么学习?从哪里学习?遇到问题怎么办?本文将试图给区块链领域新人一个快速实用的指引。 + +## 一、基本IT技能 + +区块链堪称“黑科技”,本身具有大量的技术元素,有志于从技术角度切入区块链的人,应该具备或掌握基本的IT技能,达到至少是常规级别“程序员”或“系统管理员”的技能水平。 + +![](../../../images/articles/practical_skill_tree/IMG_4890.PNG) + +**首先需要熟练的Linux操作系统知识。** + +大多数区块链系统是可以跑在Linux上的,包括CentOS和Ubuntu等,你至少要会一些基本的Linux操作指令,比如ls查看目录、ps或top查看进程、find查找文件、netstat查看网络、ulimit检查系统参数限制、df/du查看磁盘空间、用apt/yum安装软件等等,如果这些基本命令都不掌握,在Linux上操作肯定是举步维艰的。 + +这方面的书和资料都很多,相信一星期就能上手。另外,善于Linux的man指令,可以获得每个命令的详细帮助。如果学会写shell脚本,那更如虎添翼,可以把大量的繁琐操作给自动化了。 + +**要有清晰的网络概念。** + +区块链本来是分布式系统,节点之间一定是通过网络相连的,只是跑起来的话,不需要多高深的网络知识,只需要了解什么是TCP/IP;公网、内网、本地地址的区别;端口如何配置;节点和节点、SDK和节点之间的互联是否会被防火墙和网络策略挡住;采用ifconfig、telnet、ping、netstat等命令检查网络信息和进行探测、定位网络问题。一般来说,Linux书籍也都会介绍这部分内容。 + +区块链周边的支持,如浏览器、中间件、业务应用,会依赖一些第三方基础软件,如MySQL/MariaDB数据库、Nginx服务、Tomcat服务等,至少懂得怎么去安装指定版本的软件,掌握修改这些软件的配置文件并使之生效的基本操作,了解各款软件的密码、权限配置和网络安全策略,以保护自身安全。 + +如果是基于云、docker或者k8s等容器环境构建,需要了解使用的服务商或容器的功能、性能、配置方式,包括对资源的分配:CPU、内存、带宽、存储等,以及安全和权限的配置、网络策略配置、运维方式,达到轻松分发构建的同时,还能保持其稳定性和可用性。 + +各种云服务商和容器解决方案都有周全的文档和客服服务渠道,可以帮助用户顺畅地使用。 + +**到编程语言阶段,可以根据自己的学习路径,选择不同的语言。** + +如果是使用Java语言,那就应该熟练掌握Eclipse、IntelliJ IDEA等集成IDE,熟悉Gradle为主的工程管理软件,熟悉Spring、Springboot等java的基础开发组件,熟悉在IDE或命令行下对资源路径如ApplicationContext等路径的定义,或许还有myBatis等流行的组件,这些都可以在java相关的社区和网站找到资料和书籍。 + +在熟练使用Java语言的情况下,采用Java SDK接入到区块链,跑起一个Demo Sample,将是非常轻松写意的事情。 + +如果是采用其他语言,我们也提供了Python、Node.js、Golang等语言的区块链SDK。 + +不同的语言,其安装包有不同的稳定版本,会采用不同的环境和依赖安装配置方法,会有不同的IDE和调试方法,就不在本文一一罗列,相信学习和使用语言这件事本身,于程序员已经是最基本的技能了。 + +**最后,作为在开源世界里冲浪的玩家,“全球最大同性交友网站”——github一定是要上的了。** + +注册github账号,掌握git版本管理工具的基本操作,clone和pull开源软件代码,提交issue,commit自己的修改,给开源项目提交pull request,再顺手点个star,激情而有范儿,在开源世界里留下你的姓名。 + +## 二、区块链领域的基础知识栈 + +以下部分的知识和区块链或区块链某一个平台更加相关,从底到上依次如下: + +![](../../../images/articles/practical_skill_tree/IMG_4891.JPG) + +### HASH(哈希算法)、签名、证书 + +严格来说,这并不是区块链领域的专有知识,只是必须具备的基础知识,包括SHA3/SHA256/RIPEMD160等摘要算法,以及这些算法和“区块链地址”的关系,基于公私钥的数字签名和验证方法,数字证书的概念和格式,比如X.509证书,以及保存证书/公私钥的文件格式,如PEM文件、keystore文件等。 + +### 基础应用密码学 + +基础应用密码学其实范围很广,作为入门者,至少要了解对称和非对称加密的常见算法,如AES对称加密,RSA、ECDSA椭圆曲线等非对称加密算法,以及这些算法在签名验签、数据加密、通信协商和保护方面的作用。如果要使用国密,那么需要了解SM2~SM9一系列算法的概念和使用。 + +### 分布式网络结构 + +区块链是先天的“分布式网络系统”,节点和节点通过网络的P2P端口互连,客户端、SDK通过RPC/Channel端口互连,首先要保证网络之间是互通的,监听的地址和端口是对的,端口是开放的,防火墙和网络策略是正确的,用于安全连接的证书已经到位,才能保证区块链的“通则不痛”。 + +这也要求使用者具备基本的网络知识、网络工具,同时了解区块链特有的节点类型(共识节点、观察节点、轻节点等)、互连方式(点对点双向连接、JSON RPC的HTTP短连接、Channel长连接等)。详情点击参考[《FISCO BCOS网络端口讲解》](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485319&idx=1&sn=b1fb98d27a0f34f5824a876ba8fa5fe6&chksm=9f2ef59ba8597c8d09eac31ccf0be07910e53f2d88afc5f58347247ba045c63736cc74133524&token=942411972&lang=zh_CN#rd)。 + +### 智能合约 + +智能合约可说是应用开发者直面区块链的一道大门,入得此门,精彩无穷。流行的智能合约语言是Solidity语言,这门源自以太坊,从诞生开始就是为区块链而来的。 + +Solidity语言更新活跃、文档完备,具有良好的一致性和事务性,功能足够实现中型的商业应用。 + +当然,它在实时调试、第三库支持、运行速度等方面还比不上成熟的语言,如果开发者想要用C++等语言编写智能合约,那就要对区块链上的计算范式进行深入了解,避免写出无法共识的智能合约来,一般是建议有深入的了解后再采用Solidity之外的其他语言编写合约。 + +要掌握Solidity合约,当然是通读文档,并动手尝试。具体参考以下文:[https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html) + +### ABI接口原理 + +在采用EVM作为虚拟机的区块链上,EVM执行的是Solidity语言的合约。合约编译会生成后缀名为ABI的文件,其实里面就是该合约接口定义的JSON文本,可以用文本查看器查阅,了解你写的合约如何翻译成ABI里的接口,接口返回类型,参数列表,参数类型等,只要有合约的ABI文件,就可以调用区块链SDK的接口,解析这个合约相关的交易、返回值、回执等。 + +### 区块数据结构 + +区块(Block)有区块头和区块体。区块体有交易列表,交易列表里的每个交易(Transaction或Tx)有发起方、目标地址、调用方法和参数,以及发送者签名。交易的结果会生成一个“回执(Receipt)”,回执里包含被调用方法的返回值、运行过程生成的EventLog等…… + +了解这些,基本上就掌握了区块链数据的脉络,还可以继续深究数据结构里的merkle root以及对应的merkle tree是如何生成的,有什么作用(如用于SPV:Simplified PaymentVerification)。具体参考以下文档:[https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/protocol_description.html](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/protocol_description.html) + +### RPC接口 + +这里把区块链节点暴露的功能接口统称为“RPC接口”。查看链上数据,包括区块、交易、回执、系统信息、配置信息,向链上发起交易,以调用智能合约、修改系统配置等,或者通过AMOP协议发送消息、监听事件,都是通过RPC接口。 + +几十个RPC接口建议一一走读,或善用搜索,以发现自己想要的接口。 + +接口通信采用的协议可能是JSON RPC,或者是FISCO BCOS独创的Channel协议,SDK基本上已经对接口和协议进行了良好的包装,也可以在深入理解ABI和RLP等编码模式前提下自行开发接口客户端。具体参考以下文档:[https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/api.html](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/api.html) + +### 准入和权限模型 + +联盟链强调安全可控,节点准入是第一步,在链初始化后,其他节点或者SDK配置了相应的证书,才能接入到既有的联盟链上。 + +链上的角色用权限模型控制,包括管理员权限、发布合约的权限、创建表的权限、参数配置权限等,以避免角色之间操作混淆,某些角色既当运动员又当裁判员。 + +初学者需要仔细阅读区块链平台提供的技术文档了解原理,遵循操作手册的步骤进行操作。具体参考以下文档:[https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/permission_control.html](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/permission_control.html) + +### 数据存储模型 + +区块链节点会采用文件数据库(LevelDB或RocksDB),或者关系型数据库如MySQL保存数据,所以,链上是真的有“数据库”的。 + +写入数据库的数据包括区块、交易、回执、合约产生的状态数据等,是否写入“调用合约产生的历史数据”根据不同的平台而定,FISCO BCOS默认只保存最新的状态值,可以选择性地将修改记录写入“回执”或“历史表”里进行追踪。 + +FISCO BCOS还提供方案,将历史数据导出到链下数据库进行关联分析。具体参考以下文档:[https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/storage/index.html](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/storage/index.html) + +### 共识机制原理 + +联盟链通常采用插件化共识机制实现,FISCO BCOS提供PBFT和RAFT两种高效共识算法,而不会采用“挖矿”这些高耗能低效率的共识。 + +共识机制是区块链的灵魂,对共识机制进行深入学习,才可以深入理解区块链通过多方协作、达成高度一致性、支持交易事务性、防篡改防作恶的功效。具体参考以下文档:[https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/consensus/index.html](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/consensus/index.html) + +区块链的知识包罗万象,更深层次的知识还有分布式系统理论、博弈论、前沿密码学、经济学、社会学等,掌握以上的基础知识,再深入学习,举一反三,用场景去验证和探索创新式应用,方可发挥技术的潜力,感受分布式商业的魅力。 + +## 三、做一个怎样的学习者 + +在这个过程中,希望学习者做到: + +### 读文档的耐心 + +我们的开源项目文档足有20万字以上的篇幅,公众号里还有大量的技术解析和科普文章,这都是程序员们在coding之外,用尽自己仅有的语文储备,码出的海量文字,是一笔巨大的技术财富,涵盖了相关开源项目的方方面面。如果能通读,或者记住文档结构和标题,需要时快速打开,足以解惑且深入。 + +### 搜资料的能力 + +文档、公众号都有搜索功能,当想起和开源社区有关的问题时,可以随手用关键字搜索,一般都能找到答案。如果有语言不详之处,可以向开源项目团队提出,或者根据自己的理解进行补充。通用的知识点,如操作系统、网络等,通过公网搜索引擎,一般都能找到答案。 + +### 排查环境和依赖问题的能力 + +开源软件牵涉的系统环境、第三方软件、软件的版本等常常有错综复杂的依赖关系,太高或太低的版本都可能会有一些问题,请注意阅读项目文档对软硬件环境和依赖的描述,保证自己的环境符合要求,并善用配置管理工具、软件安装工具获取和设置合适的版本。 + +### 调试能力 + +如上所述,Solidity语言的调试工具完善程度尚未达到完美,但可以善用合约的返回值、EventLog等方式,通过WeBASE、控制台等趁手的工具进行调试,并查阅Solidity文档,了解问题可能出在哪里。 + +区块链节点的日志开启debug级别后,也会打印详细的信息,可以查阅运行日志,获取运行信息和可能的错误信息,将这些信息与自己所做的操作比如发交易的流程结合起来进行分析,提高调试效率。 + +同时,目前的开源软件通常会在屏幕上打印错误原因和解决问题的提示,仔细查看操作反馈,大概率能了解错误原因和解决方案。 + +### 代码阅读能力 + +开源软件的最大效能是把代码毫无遗漏的摊到了开发者和学习者面前,了解代码结构,查阅代码里的关键流程,用关键字去搜索代码里的对应实现,都可以深入系统细节,挖掘设计思想,定位问题,寻找优化方法。一个好学且硬核的程序员,足可通过代码,和世界对话。 + +### 问问题的方式方法 + +“一个好问题,比答案还重要”。我们的社区非常活跃,大家都很热情地答复和解决问题。我们鼓励在社区里公开提出问题,一方面使大家都可以分享问题,找到解决方案,另一方面提问者也可以得到更多人的帮助。同时,希望提问者提出问题时,一次性描述详尽,把相关的操作步骤、系统环境、软件版本、出错提示以及希望得到的解决方案都提出来。 + +如果是通用性的问题,可以先搜索再提问,有利于培养独立解决问题的能力。希望提问者能向社区反馈更深层次的问题,以帮助社区快速优化。对很多典型问题,社区也积累了一些行之有效的解决方案,我们会整理和公布出来,以便查阅。 + +从新人到老鸟的路也许漫漫,如果能参考这篇小文的一些方法,可以少踩许多坑,多写一些应用。Enjoy blockchain,社区与你共同进步。 + +------ + +### 资源链接: + +[各项开源组件索引](https://fintech.webank.com/) + +[FISCO BCOS开源文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/) + +**新人请注重阅读:** + +[关键概念](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/key_concepts.html) + +[以及使用手册](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/blockchain_dev/index.html) + +[FISCO BCOS公众号的开发教程仓库](http://mp.weixin.qq.com/mp/homepage?__biz=MzU5NTg0MjA4MA==&hid=9&sn=7edf9a62a2f45494671c91f0608db903&scene=18#wechat_redirect) + +[《麻雀虽小五脏俱全 | 从Python-SDK谈谈FISCO BCOS多语言SDK》](https://mp.weixin.qq.com/s/YZdqf3Wxsnj8hY2770CuQA),此文详细讲解了从客户端的应用出发,去理解区块链接口的方法。 + +[Solidity智能合约(中文)](https://solidity-cn.readthedocs.io/)(注意选择对应版本) + +[Solidity智能合约(英文)](https://solidity.readthedocs.io/()注意选择对应版本) + +[《如何优雅地写智能合约》](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485277&idx=1&sn=c3703ab72802dc3de893eddb1e7c2c36&chksm=9f2ef541a8597c570865119298693bf2fbe18d57c03293ce721bf625271e7f75deaece6f8c0c&token=942411972&lang=zh_CN#rd) + +[《WeBASE数据导出:助力区块链大数据场景快速落地》](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485297&idx=1&sn=52b44667551f6ebe6eb41cc192e07486&chksm=9f2ef56da8597c7b937decd777a0c38cb0bb15c885bd84900497fbc3fa9432281a7ef2238a05&token=942411972&lang=zh_CN#rd),区块链数据导出到链外,采用海量数据存储。 + +[图形化的区块链,WeBase文档](https://webasedoc.readthedocs.io/zh_CN/latest/index.html) + +------ + +**推荐书目:** + +[《鸟哥的linux私房菜》(系列)](https://book.douban.com/subject/2208530/) + +[《UNIX网络编程》(系列)](https://book.douban.com/subject/1500149/) + +[《java核心技术》(系列)](https://book.douban.com/subject/26880667/) + +[《Springboot实战》](https://book.douban.com/subject/26857423/) + +[《Spring实战》](https://book.douban.com/subject/26767354/) + diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/dag-based_parallel_transaction_execution_engine.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/dag-based_parallel_transaction_execution_engine.md new file mode 100644 index 000000000..66a19edf4 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/dag-based_parallel_transaction_execution_engine.md @@ -0,0 +1,190 @@ +# 区块链性能腾飞:基于DAG的并行交易执行引擎 + +作者:李陈希|FISCO BCOS 核心开发者 + +在区块链世界中,交易是组成事务的基本单元。交易吞吐量很大程度上能限制或拓宽区块链业务的适用场景,愈高的吞吐量,意味着区块链能够支持愈广的适用范围和愈大的用户规模。当前,反映交易吞吐量的TPS(Transaction per Second,每秒交易数量)是评估性能的热点指标。为了提高TPS,业界提出了层出不穷的优化方案,殊途同归,各种优化手段的最终聚焦点,均是尽可能提高交易的并行处理能力,降低交易全流程的处理时间。 + +在多核处理器架构已经成为主流的今天,利用并行化技术充分挖掘CPU潜力是行之有效的方案。FISCO BCOS 2.0 中设计了一种基于DAG模型的并行交易执行器(PTE,Parallel Transaction Executor)。 + +PTE能充分发挥多核处理器优势,使区块中的交易能够尽可能并行执行;同时对用户提供简单友好的编程接口,使用户不必关心繁琐的并行实现细节。基准测试程序的实验结果表明:相较于传统的串行交易执行方案,理想状况下4核处理器上运行的PTE能够实现约200%~300%的性能提升,且计算方面的提升跟核数成正比,核数越多性能越高。 + +PTE为助力FISCO BCOS性能腾飞奠定了坚实基础,本文将全面介绍PTE的设计思路及实现方案,主要包括以下内容: + +- **背景**:传统方案的性能瓶颈与DAG并行模型的介绍 +- **设计思路**:PTE应用到FISCO BCOS中时遇到的问题以及解决方案 +- **架构设计**:应用PTE后FISCO BCOS的架构及核心流程 +- **核心算法**:介绍主要用到的数据结构与主要算法 +- **性能测评**:分别给出PTE的性能与可扩展性测试结果 + +## 背景 + +FISCO BCOS交易处理模块可以被抽象为一个基于交易的状态机。在FISCO BCOS中,『状态』即是指区块链中所有账户的状态,而『基于交易』即是指FISCO BCOS将交易作为状态迁移函数,并根据交易内容从旧的状态更新为新的状态。FISCO BCOS从创世块状态开始,不断收集网络上发生的交易并打包为区块,并在所有参与共识的节点间执行区块中的交易。当一个区块内的交易在多个共识节点上执行完成且状态一致,则我们称在该块上达成了共识,并将该区块永久记录在区块链中。 + +从上述区块链的打包→共识→存储过程中可以看到,执行区块中的所有交易是区块上链的必经之路。传统交易执行方案是:执行单元从待共识的区块逐条读出交易,执行完每一笔交易后,状态机都会迁移至下一个状态,直到所有交易都被串行执行完成,如下图所示: + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5175.PNG) + +显而易见,这种交易执行方式对性能并不友好。即使两笔交易没有交集,也只能按照先后顺序依次执行。就交易间的关系而言,既然一维的『线』结构有这般痛点,那何不把目光投向二维的『图』结构呢? + +在实际应用中,根据每笔交易执行时需要使用的互斥资源(互斥意味着对资源的排他性使用,比如在上述转账问题互斥资源中,指的就是各个账户的余额状态), 我们可以组织出一张交易依赖关系图,为防止交易依赖关系在图中成环,我们可以规定交易列表中牵涉到相同的互斥资源,且排序靠后的交易,必须等待靠前的交易完成后才被执行,由此得到的输出便是一张反映交易依赖关系的有向无环图,即交易DAG。 + +如下图所示,左侧的6笔转账交易可以组织为右侧的DAG形式: + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5176.PNG) + + +在交易DAG中,入度为0的交易是没有任何依赖项、可以被立即投入运行的就绪交易。当就绪交易的数量大于1时,就绪交易可以被分散至多个CPU核心上并行执行。当一笔交易执行完,依赖于该交易的所有交易的入度减1,随着交易不断被执行,就绪交易也源源不断被产生。在极限情况下,假如构造出的交易DAG层数为1 (即所有交易均是没有依赖项的独立交易),则交易整体执行速度的提升倍数将直接取决于处理器的核心数量n,此时若n大于区块内的交易数,则区块内所有交易的执行时间与单笔交易执行的时间相同。 + +理论上拥有如此让人无法拒绝的优美特性的交易DAG模型,该如何应用至FISCO BCOS中? + +## 设计思路 + +**要应用交易DAG模型,我们面临的首要问题便是:对于同一个区块,如何确保所有节点执行完后能够达到同一状态,这是一个关乎到区块链能否正常出块的关键问题。** + +FISCO BCOS采用验证(state root, transaction root, receipt root)三元组是否相等的方式,来判断状态是否达成一致。transaction root是根据区块内的所有交易算出的一个哈希值,只要所有共识节点处理的区块数据相同,则transaction root必定相同,这点比较容易保证,因此重点在于如何保证交易执行后生成的state和receipt root也相同。 + +众所周知,对于在不同CPU核心上并行执行的指令,指令间的执行顺序无法提前预测,并行执行的交易也存在同样情况。在传统的交易执行方案中,每执行一笔交易,state root便发生一次变迁,同时将变迁后的state root写入交易回执中,所有交易执行完后,最终的state root就代表了当前区块链的状态,同时再根据所有交易回执计算出一个receipt root。 + +可以看出,在传统的执行方案中,state root扮演着一个类似全局共享变量的角色。当交易被并行且乱序执行后,传统计算state root的方式显然不再适用,这是因为在不同的机器上,交易的执行顺序一般不同,此时无法保证最后的state root能够一致,同理,receipt root也无法保证一致。 + +在FISCO BCOS中,我们采用的解决方案是先执行交易,将每笔交易对状态的改变历史记录下来,待所有交易执行完后,再根据这些历史记录再算出一个state root,同时,交易回执中的state root,也全部变为所有交易执行完后最终的state root,由此就可以保证即使并行执行交易,最后共识节点仍然能够达成一致。 + +**搞定状态问题后,下一个问题便是:如何判断两笔交易之间是否存在依赖关系?** + +若两笔交易本来无依赖关系但被判定为有,则会导致不必要的性能损失;反之,如果这两笔交易会改写同一个账户的状态却被并行执行了,则该账户最后的状态可能是不确定的。因此,依赖关系的判定是影响性能甚至能决定区块链能否正常工作的重要问题。 + +在简单的转账交易中,我们可以根据转账的发送者和接受者的地址,来判断两笔交易是否有依赖关系,比如如下3笔转账交易:A→B,C→D,D→E,可以很容易看出,交易D→E依赖于交易C→D的结果,但是交易A→B和其他两笔交易没有什么关系,因此可以并行执行。 + +这种分析在只支持简单转账的区块链中是正确的,但是一旦放到图灵完备、运行智能合约的区块链中,则可能不那么准确,因为我们无法准确知道用户编写的转账合约中到底有什么操作,可能出现的情况是:A->B的交易看似与C、D的账户状态无关,但是在用户的底层实现中,A是特殊账户,通过A账户每转出每一笔钱必须要先从C账户中扣除一定手续费。在这种场景下,3笔交易均有关联,则它们之间无法使用并行的方式执行,若还按照先前的依赖分析方法对交易进行划分,则必定会掉坑。 + +我们能否做到根据用户的合约内容自动推导出交易中实际存在哪些依赖项?答案是不太靠谱。我们很难去追踪用户合约中到底操作了什么数据,即使做到也需要花费不小的成本,这和我们优化性能的目标相去甚远。 + +综上,我们决定在FISCO BCOS中,将交易依赖关系的指定工作交给更熟悉合约内容的开发者。具体地说,交易依赖的互斥资源可以由一组字符串表示,FISCO BCOS暴露接口给到开发者,开发者以字符串形式定义交易依赖的资源,告知链上执行器,执行器则会根据开发者指定的交易依赖项,自动将区块中的所有交易排列为交易DAG。比如在简单转账合约中,开发者仅需指定每笔转账交易的依赖项是{发送者地址+接收者地址}。进一步地,如开发者在转账逻辑中引入了另一个第三方地址,那么依赖项就需要定义为{发送者地址+接受者地址+第三方地址}了。 + +这种方式实现起来较为直观简单,也比较通用,适用于所有智能合约,但也相应增加了开发者肩上的责任,开发者在指定交易依赖项时必须十分小心,如果依赖项没有写正确,后果无法预料。指定依赖项的相关接口会在后续文章中给出使用教程,本文暂且假定所有谈论到的交易依赖项都是明确无误的。 + +**解决完上面两个比较重要的问题后,还剩下一些较为细节的工程问题:比如并行交易能否和非并行交易混合到一起执行?怎么保证资源字符串的全局唯一性?** + +答案也不复杂,前者可通过将非并行交易作为屏障(barrier)插入到交易DAG中——即我们认为,它即依赖于它的所有前序交易,同时又被它的所有后序交易依赖——来实现;后者可以通过在开发者指定的交易依赖项中,加入标识合约的特殊标志位解决。由于这些问题并不影响PTE的根本设计,本文暂不展开。 + +万事俱备,带着全新交易执行引擎PTE的FISCO BCOS已经呼之欲出。 + +## 架构设计 + +**搭载PTE的FISCO BCOS架构图:** + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5177.PNG) + +**整个架构的核心流程如下:** + +用户通过SDK等客户端将交易发送至节点,此处的交易既可以是可并行执行的交易,也可以是不能并行执行的交易。随后交易在节点间同步,同时拥有打包权的节点调用打包器(Sealer),从交易池(Tx Pool)中取出一定量交易并将其打包成一个区块。此后,区块被发送至共识单元(Consensus)准备进行节点间共识。 + +共识前需要执行区块中的交易,此处便是PTE施展威力之处。从架构图中可以看到,PTE首先按序读取区块中的交易,并输入到DAG构造器(DAG Constructor)中,DAG构造器会根据每笔交易的依赖项,构造出一个包含所有交易的交易DAG,PTE随后唤醒工作线程池,使用多个线程并行执行交易DAG。汇合器(Joiner)负责挂起主线程,直到工作线程池中所有线程将DAG执行完毕,此时Joiner负责根据各个交易对状态的修改记录计算state root及receipt root,并将执行结果返回至上层调用者。 + +在交易执行完成后,若各个节点状态一致,则达成共识,区块随即写入底层存储(Storage),被永久记录于区块链上。 + +## 核心算法 + +### 1.交易DAG的数据结构 + +交易DAG的数据结构如下图所示: + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5178.PNG) + +**Vertex类**为最基础里的类型,在交易DAG中,每一个Vertex实例都表征一笔交易。Vertex类包含: + +- **inDegree**:表示该顶点的入度 +- **outEdges**:用于存储该节点的出边信息,即所有出边所连顶点的ID列表 + +**DAG类**用于对DAG的顶点与边关系进行封装,并提供操作DAG的接口,其包含: + +- **vtxs**:Vertex数组 +- **topLevel**:包含所有入度为0的顶点的队列,由于在执行过程中topLevel会动态变化且会被多个线程访问,因此其需要一个能够支持线程安全访问的容器 +- **void init(int32_t size)接口**:根据传入的size初始化一个包含相应数量顶点的DAG结构 +- **addEdge(ID from, ID to)接口**:用于在顶点from和顶点to之间建立边关系,具体地说,将顶点to的ID加入顶点from的outEdges中 +- **void generate()接口**:当所有的边关系录入完毕后,调用该方法以初始化topLevel成员 +- **ID waitPop()接口**:从topLevel中获取一个入度为0的顶点ID + +**TxDAG类**是DAG类更上一层的封装,是DAG与交易之间建立联系的桥梁,其包含: + +- **dag**:持有的DAG类实例 +- **exeCnt**:已执行过的交易总数 +- **totalTxs**:交易总数 +- **txs**:区块中的交易列表 + +### 2. 交易DAG的构造流程 + +DAG构造器在构造交易DAG时,会首先将totalTxs成员的值设置为区块中的交易总数,并依据交易总数对dag对象进行初始化,dag会在vtxs中为每笔交易生成一个位置关系一一对应的顶点实例。随后,初始化一个空的资源映射表criticalFields,并按序逐个扫描每笔交易。 + +对于某笔交易tx,DAG构造器会在其解析出该交易的所有依赖项,对于每个依赖项均会去criticalFields中查询,如果对于某个依赖项d,有前序交易也依赖于该依赖项,则在这两笔交易间建边,并更新criticalFields中d的映射项为tx的ID。 + +交易DAG构造流程的伪代码如下所示: + +``` +criticalFields ← map(); +totalTxs ← txs.size(); +dag.init(txs.size()); +for id ← 0 to txs.size() by 1 do + tx ← txs[id]; + dependencies ← 解析出tx的依赖项; + for d in dependencies do + if d in criticalFields then + dag.addEdge(id, criticalFields[d]); + end + criticalFields[d] = id; + end + end +end +dag.generate(); +``` + +### 3.交易DAG的执行流程 + +PTE在被创建时,会根据配置生成一个用于执行交易DAG的工作线程池,线程池的大小默认等于CPU的逻辑核心数,此线程池的生命周期与PTE的生命周期相同。工作线程会不断调用dag对象的waitPop方法以取出入度为0的就绪交易并执行,执行后该交易的所有后序依赖任务的入度减1,若有交易的入度被减至0,则将该交易加入到topLevel中。循环上述过程,直到交易DAG执行完毕。 + +交易DAG执行流程的伪代码如下所示: + +``` +while exeCnt < totalTxs do + id ← dag.waitPop(); + tx ← txs[id]; + 执行tx; + exeCnt ← exeCnt + 1; + for txID in dag.vtxs[id].outEdges do + dag.vtxs[txID].inDegree ← dag.vtxs[txID].inDegree - 1; + if dag.vtxs[txID].inDegree == 0 then + dag.topLevel.push(txID) + end + end +end +``` + +## 性能测评 + +我们选用了2个基准测试程序,用以测试PTE给FISCO BCOS的性能带来了怎样的变化,它们分别是基于预编译框架实现的转账合约和基于Solidity语言编写的转账合约,两份合约代码的路径分别为: + +FISCO-BCOS/libprecompiled/extension/DagTransferPrecompiled.cpp + +web3sdk/src/test/resources/contract/ParallelOk.sol + +我们使用一条单节点链进行测试,因为我们主要关注PTE的交易处理性能,因此并不考虑网络、存储的延迟带来的影响。 + +**测试环境的基本硬件信息如下表所示**: + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5179.PNG) + +### 1.性能测试 + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5180.JPG) + +性能测试部分,我们主要测试PTE和串行交易执行方式(Serial)在各个测试程序下的交易处理能力。可以看到,相对于串行执行方式,PTE从左至右分别实现了2.91和2.69倍的加速比。无论是对于预编译合约还是Solidity合约,PTE均有着不俗的性能表现。 + +### 2.可扩展性测试 + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5181.JPG) + +可扩展性测试部分,我们主要测试PTE在不同CPU核心数下的交易处理能力,使用的基准测试程序是基于预编译框架实现的转账合约。可以看到,随着核数增加,PTE的交易吞吐量呈近似线性递增。但是同时也能看到,随着核数在增加,性能增长的幅度在放缓,这是因为随着核数增加线程间调度及同步的开销也会增大。 + +#### 写在最后 + +从列表到DAG,PTE赋予了FISCO BCOS新的进化。更高的TPS会将FISCO BCOS带至更加广阔的舞台。予以长袖,FISCO BCOS必能善舞! \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/distributed_storage_design.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/distributed_storage_design.md new file mode 100644 index 000000000..8ff2cdd93 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/distributed_storage_design.md @@ -0,0 +1,135 @@ +# FISCO BCOS 2.0原理解析篇2: 分布式存储架构设计 + +作者:莫楠|FISCO BCOS 高级架构师 + +FISCO BCOS 2.0新增对分布式数据存储的支持,克服了本地化数据存储的诸多限制。 + +在FISCO BCOS 1.0中,节点采用MPT数据结构,通过LevelDB将数据存储于本地,这种模式受限于本地磁盘大小,当业务量增大时数据会急剧膨胀,要进行数据迁移也非常复杂,给数据存储带来较大的成本和维护难度。 + +为了突破性能的瓶颈,我们在FISCO BCOS 2.0中,对底层的存储进行了重新设计,实现了分布式存储,使用不同于MPT的方式来实现追溯,带来了性能上的提升。 + +先夸夸分布式存储方案的优点: + +- 支持多种存储引擎,选用高可用的分布式存储系统,可以支持数据简便快速地扩容; +- 将计算和数据隔离,节点故障不会导致数据异常; +- 数据在远端存储,数据可以在更安全的隔离区存储,这在很多场景中非常有意义; +- 分布式存储不仅支持Key-Value形式,还支持SQL方式,使得业务开发更为简便; +- 世界状态的存储从原来的MPT存储结构转为分布式存储,避免了世界状态急剧膨胀导致性能下降的问题; +- 优化了数据存储的结构,更节约存储空间。 + +## 从MPT存储到分布式存储 + +### MPT存储 + +**MPT(Merkle Paricia Trie)**,来自以太坊,对外接口为Key-Value,使用前缀树来存储数据,是FISCO BCOS 1.0的存储模式。 + +MPT是前缀树结构,树中的每个叶子节点允许有最多16个子叶子节点,叶子节点有一个HASH字段,由该叶子的所有子叶子节点HASH运算得出。树根有唯一的HASH值,标识整棵树的HASH。 + +![](../../../../images/articles/distributed_storage_design/IMG_5088.JPG) + +图片来自以太坊白皮书 + +以太坊的全局状态数据,保存在MPT树中,状态数据由账号组成。账号在MPT中是一个叶子节点,账号数据包括Nonce、Balance、CodeHash和StorageRoot。任意一个账号字段发生变化时,会导致该账号所在的叶子的HASH发生变化,从该叶子直到顶部的所有叶子的HASH都会变化,最后导致顶部的StateRoot变化。 + +由此可见,任何账户的任意字段变化,都会导致StateRoot的变化,StateRoot能唯一标识以太坊的全局状态。 + +![](../../../../images/articles/distributed_storage_design/IMG_5089.JPG) + +图片来自以太坊白皮书 + +MPT可以实现轻客户端和数据追溯,通过StateRoot可以查询到区块的状态。MPT带来了大量HASH的计算,打散了底层数据存储的连续性。在性能方面,MPT State存在着天然的劣势。可以说,MPT State追求极致的可证明性和可追溯性,对性能和可扩展性做了一定的妥协。 + +### 分布式存储 + +FISCO BCOS 2.0在保持存储接口兼容性的同时,引入了高扩展性、高吞吐量、高可用、高性能的分布式存储。**分布式存储(Advanced Mass Database,AMDB)**:重新抽象了区块链的底层存储模型,实现了类SQL的抽象存储接口,支持多种后端数据库,包括KV数据库和关系型数据库。 引入了分布式存储后,数据读写请求不经过MPT,直接访问存储,结合缓存机制,存储性能相比基于MPT的存储有大幅提升。MPT数据结构仍然保留,仅做为可选方案。 + +![](../../../../images/articles/distributed_storage_design/IMG_5090.JPG) + +分布式存储支持MySQL等关系型数据库,支持MySQL集群、分库分表等平行扩展方式,理论上存储容量无限。 + +## 分布式存储架构 + +![](../../../../images/articles/distributed_storage_design/IMG_5091.JPG) + +#### State层(State) + +抽象了智能合约的存储访问接口,由EVM调用,分为StorageState和MPTState。StorageState为分布式存储的适配层,MPTState为老的MPT适配层,FISCO BCOS默认使用StorageState。 + +#### 分布式存储层(Table) + +抽象了分布式存储的类SQL接口,由State层和Precompiled调用。分布式存储层抽象了存储的增删改查接口,把区块链的核心数据分类存储到不同的表中。 + +#### 驱动层(Storage) + +实现具体的数据库访问逻辑,包括LevelDB和MySQL。 + +### **分布式存储名词解释** + +#### Table + +存储表中的所有数据。Table中存储分布式存储主key到对应Entries的映射,可以基于分布式存储主key进行增删改查,支持条件筛选。 + +#### Entries + +Entries中存放主Key相同的Entry,数组。分布式存储的主Key与Mysql中的主key不同,分布式存储主key用于标示Entry属于哪个key,相同key的Entry会存放在同一个Entries中。 + +#### Entry + +对应于表中的一行,每行以列名作为key,对应的值作为value,构成KV结构。每个Entry拥有自己的分布式存储主key,不同Entry允许拥有相同的分布式存储主key。 + +#### Condition + +Table中的“删改查”接口可传入条件,支持“等于”“大于”“小于”等过滤逻辑,接口根据条件对数据进行筛选后进行相应操作,返回结果数据。如果条件为空,则不做任何筛选。 + +##### 举例 + +以某公司员工领用物资登记表为例,解释上述名词 + +![](../../../../images/articles/distributed_storage_design/IMG_5092.PNG) + +- 表中Name是分布式存储主key。 +- 表中的每一行为一个Entry。一共有4个Entry,每个Entry有三个字段。 +- Table中以Name为主key,存有3个Entries对象。第1个Entries中存有Alice的2条记录,第2个Entries中存有Bob的1条记录,第3个Entries中存有Chris的一条记录。 +- 调用Table类的查询接口时,查接口需要指定分布式存储主key和条件,设置查询的分布式存储主key为Alice,条件为price > 40,会查询出Entry1。 + +### 分布式存储表分类 + +表中的所有entry,都会有_status_,_num_,_hash_内置字段。 + +#### 系统表 + +系统表默认存在,由存储驱动保证系统表的创建。 + +![](../../../../images/articles/distributed_storage_design/IMG_5093.JPG) + + +#### 用户表 + +用户CRUD合约所创建的表,以_user_为表名,底层自动添加_user_前缀。 + +#### StorageState账户表 + +_contract_data_+Address+_作为表名。表中存储外部账户相关信息。表结构如下: + +![](../../../../images/articles/distributed_storage_design/IMG_5094.PNG) + +## 总结 + +FISCO BCOS发布至今,历经大量真实业务实践。分布式存储在持续改进的过程中,总结出适合于金融业务、高性能、高可用性和高可扩展的存储模型,架构愈发稳定成熟,未来分布式存储将继续作为区块链系统的基石,支持区块链系统的发展。 + +下篇文章,我会提供分布式存储的体验流程,敬请持续锁定FISCO BCOS开源社区。 + +### 系列精选 + +[FISCO BCOS 2.0发布](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485340&idx=1&sn=310a442382c879aecaa0cb37c1bce289&chksm=9f2ef580a8597c96cada2526ad2df2e65c00c62a50bcebbd41d84c36aadfac2526f6a12aa2ec&token=705851025&lang=zh_CN#rd):(附新特性解读) + +#### 原理解析 + +[群组架构的设计](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485338&idx=1&sn=9ce03340c699a8527960a0d0b26d4923&chksm=9f2ef586a8597c9003192718c1f60ed486570f6a334c9713cc7e99ede91c6f3ddcd7f438821f&token=705851025&lang=zh_CN#rd):使企业间建立多方协作的商业关系像拉群聊天一样简便。 + +#### 使用教程 + +[群组架构实操演练](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485337&idx=1&sn=622e88b631ae1bfe5789b2fe21576779&chksm=9f2ef585a8597c9311c972eb67174b3638f7b69d87d6eea243fc327bf515159fb53f216a5fec&token=705851025&lang=zh_CN#rd):以搭建仲裁链为例,并演示如何向该链发送交易。 + + + diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/distributed_storage_experience.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/distributed_storage_experience.md new file mode 100644 index 000000000..e06384138 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/distributed_storage_experience.md @@ -0,0 +1,141 @@ +# FISCO BCOS 2.0使用教程: 分布式存储体验 + +作者:莫楠|FISCO BCOS 高级架构师 + +《分布式存储架构设计》一文发布后,社区成员对技术内核及使用非常关注。团队和社区热心小伙伴、业内专家针对分布式存储,进行了一箩筐地讨论。在此,跟大家分享交流心得,或有助你更好地理解和使用分布式存储: + +- FISCO BCOS 2.0的分布式存储采用库表风格,CRUD操作符合业务习惯。 +- 不用合约存储变量模式,解构了合约和数据的内嵌式耦合,合约升级更容易。 +- 存储访问引擎逻辑和数据结构更直观,容易适配各种存储引擎,扩展空间大。 +- 数据本身行列式存储,没有MPT树那般盘根错节的关系,更容易打快照和切割迁移。 +- 表加主键的结构索引数据,存取效率高,并发访问更容易。 +- 存储开销更少,容量模型和交易数、状态数线性相关,更容易预测业务容量,对海量服务非常有意义。 +- 细节方面,弱化状态MPT,但保留了交易和回执MPT,依旧可支持轻客户端,采用过程证明和存在证明,而不依赖易变的状态,不影响实现跨链。 +- 状态由增量HASH检验,每块交易产生的状态集会全网严格检验以保证一致性。 +- 一开始是面向SQL类型构建的,可支持MySQL和Oracle等引擎,然后适配到NoSQL类型,如LevelDB等。后续还会适配更多高速和海量存储引擎,在【单次io延迟/并发效率/容量扩展】这个三角关系中,探索出最优解。 + +分布式存储虽说是个大工程(团队几个快枪手撸了小一年才敢拿出来见人),但使用非常简单,本文就讲讲分布式存储的体验流程。初步接触用户,建议先从上篇入手(点标题可直接跳转)→ [分布式存储架构设计](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485336&idx=1&sn=ea3a7119634c1c27daa4ec2b9a9f278b&chksm=9f2ef584a8597c9288f8c5000c7def47c3c5b9dc64f25221985cd9e3743b9364a93933e51833&token=705851025&lang=zh_CN#rd) + +## 配置分布式存储 + +分布式存储支持多种存储引擎,根据业务需求和部署环境灵活选择,可以配置为不同的存储引擎。 + +区块链的区块、交易等基础数据采用库表结构保存,状态数据的存储方式可配为库表结构或MPT,满足不同场景的需求。 + +分布式存储的配置项位于群组的配置文件中,各个群组可以使用单独的存储策略,群组配置文件位于区块链节点中名为conf/group.[群组号].genesis的路径下,如group.1.genesis,一旦群组启动,该群组的分布式存储的相关配置不能再改变。 + +**分布式存储配置项示例如下:** + +[storage] + +type=LevelDB:分布式存储的DB引擎类型 + +[state] + +type=storage:state类型,目前支持storage state和MPT state,默认为storage state + +**推荐使用 storage state**, **除非必须使用MPT来追溯全局历史状态**,**不建议使用MPT State**。 + +## 使用CRUD智能合约开发 + +分布式存储提供了专用的CRUD接口,支持合约直接访问底层的存储表。 + +访问CRUD需要引用分布式存储专用的智能合约Table.sol接口,该接口是数据库合约,可以创建表,并对表进行增删改查操作。 + +**引用Table.sol** + +``` +import "./Table.sol"; +``` + +**Table.sol的接口包括**: + +- createTable //创建表 +- select(string, Condition) //查询数据 +- insert(string, Entry) //插入数据 +- update(string, Entry, Condition) //更新数据 +- remove(string, Condition) //删除数据 + +**每个接口的用法如下**: + +**创建表** + +``` +// TableFactory的地址固定为0x1001 +TableFactory tf = TableFactory(0x1001); + +// 创建t_test表,表的key_field为name,value_field为item_id,item_name +// key_field表示分布式存储主key value_field表示表中的列,可以有多列,以逗号分隔 +int count = tf.createTable("t_test", "name", "item_id,item_name"); +``` + +**查询数据** + +``` +TableFactory tf = TableFactory(0x1001); +Table table = tf.openTable("t_test"); + +// 条件为空表示不筛选 也可以根据需要使用条件筛选 +Condition condition = table.newCondition(); + +Entries entries = table.select(name, condition); +``` + +**插入数据** + +``` +TableFactory tf = TableFactory(0x1001); +Table table = tf.openTable("t_test"); + +Entry entry = table.newEntry(); +entry.set("name", name); +entry.set("item_id", item_id); +entry.set("item_name", item_name); + +int count = table.insert(name, entry); +``` + +**更新数据** + +``` +TableFactory tf = TableFactory(0x1001); +Table table = tf.openTable("t_test"); + +Entry entry = table.newEntry(); +entry.set("item_name", item_name); + +Condition condition = table.newCondition(); +condition.EQ("name", name); +condition.EQ("item_id", item_id); + +int count = table.update(name, entry, condition); +``` + +**删除数据** + +``` +TableFactory tf = TableFactory(0x1001); +Table table = tf.openTable("t_test"); + +Condition condition = table.newCondition(); +condition.EQ("name", name); +condition.EQ("item_id", item_id); + +int count = table.remove(name, condition); +``` + +#### PS + +存储架构的优化是个基础工程,也是个大工程。实现的转变,其实是架构世界观的一种进化,影响会比看到的功能点更深远。此二文所讲述的,仅是分布式存储的冰山一角。更多原理和使用案例,请参考:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html + +### 系列精选 + +[FISCO BCOS 2.0发布](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485340&idx=1&sn=310a442382c879aecaa0cb37c1bce289&chksm=9f2ef580a8597c96cada2526ad2df2e65c00c62a50bcebbd41d84c36aadfac2526f6a12aa2ec&token=705851025&lang=zh_CN#rd):(附新特性解读) + +#### 原理解析 + +[群组架构的设计](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485338&idx=1&sn=9ce03340c699a8527960a0d0b26d4923&chksm=9f2ef586a8597c9003192718c1f60ed486570f6a334c9713cc7e99ede91c6f3ddcd7f438821f&token=705851025&lang=zh_CN#rd):使企业间建立多方协作的商业关系像拉群聊天一样简便。 + +#### 使用教程 + +[群组架构实操演练](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485337&idx=1&sn=622e88b631ae1bfe5789b2fe21576779&chksm=9f2ef585a8597c9311c972eb67174b3638f7b69d87d6eea243fc327bf515159fb53f216a5fec&token=705851025&lang=zh_CN#rd):以搭建仲裁链为例,并演示如何向该链发送交易。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/group_architecture_design.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/group_architecture_design.md new file mode 100644 index 000000000..573ba6fcc --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/group_architecture_design.md @@ -0,0 +1,152 @@ +# FISCO BCOS 2.0原理解析篇1: 群组架构的设计 + +作者:陈宇杰|FISCO BCOS 核心开发者 + +为了方便企业、开发者更深入理解FISCO BCOS 2.0诸多新特性,更快速地运用FISCO BCOS搭建联盟链应用,我们启动了FISCO BCOS 2.0系列剖析的计划。在后续的推送中,我们将陆续推出《FISCO BCOS 2.0原理解析》、《FISCO BCOS 2.0使用教程》、《FISCO BCOS 2.0源码分析》等文章系列,抽丝剥茧地将FISCO BCOS 2.0进行全面拆解。 + +本文是原理解析系列第一篇,介绍FISCO BCOS 2.0众多新特性中的主线——群组架构。主要包括群组架构的整体架构设计,群组架构包括哪些组件,各组件的主要功能以及组件间的交互。 + +## 设计目标 + +理解群组架构的设计目标,可以从人人都熟悉的群聊模式说起。 + +#### 灵活扩展:保证业务接入和扩展像拉群聊天一样方便 + +群的建立非常灵活,几个人就可以快速拉个主题群进行交流。同一个人可以参与到自己感兴趣的多个群里,并行地收发信息。现有的群也可以继续增加成员。 + +看回群组架构,采用群组架构的网络中,根据业务场景的不同,可存在多个不同的账本,区块链节点可以根据业务关系选择群组加入,参与到对应账本的数据共享和共识过程中。群组架构具有良好的扩展性,一个机构一旦参与到这样的联盟链里,有机会灵活快速地丰富业务场景和扩大业务规模,而系统的运维复杂度和管理成本也线性下降。 + +#### 隐私保护:各群组之间解除耦合独立运作 + +回想一下群聊场景:群聊用户都在你的通信录中,都是经过验证才添加的,且不在群里的用户看不到群聊信息。这与联盟链准入机制不谋而合,所有参与者的机构身份可知。 + +另一方面,群组架构中各群组独立执行共识流程,各组独立维护自己的交易事务和数据,不受其他群组影响。这样的好处是,可以使得各群组之间解除耦合独立运作,从而达成更好的隐私隔离。在跨群组之间的消息互通,则会带上验证信息,是可信和可追溯的。 + +## 架构设计 + +### 架构设计全景 + +![](../../../../images/articles/group_architecture_design/IMG_4892.PNG) + +▲ 图为群组架构设计全景 + +如上图所示,群组架构自底向下主要划分为网络层、群组层,网络层主要负责区块链节点间通信,群组层主要负责处理群组内交易,每个群组均运行着一个独立的账本。 + +### 网络层 + +群组架构中,所有群组共享P2P网络,群组层传递给网络层的数据包中含有群组ID信息,接收节点根据数据包中的群组ID,将收到的数据包传递给目标节点的相应群组。为了做到群组间通信数据隔离,群组架构引入了**账本白名单**机制,下图展示了群组架构下群组间收发消息的流程: + +![](../../../../images/articles/group_architecture_design/IMG_4893.PNG) + +#### 账本白名单 + +每个群组均持有一个账本白名单,用于维护该群组的节点列表。为了保证账本白名单群组内一致性,仅可通过发交易共识的方式修改账本白名单。 + +#### 发包流程 + +以node0的第一组向node1的第一组发送消息packetA为例: + +(1) group1将消息packetA传递到网络层; + +(2) 网络层模块对packetA进行编码,在packetA包头加上本群组ID,记为{groupID(1) + packetA}; + +(3) 网络层访问账本白名单,判断node0是否是group1的节点,若非group1节点,则拒绝数据包;若是group1节点,则将编码后的包发送给目标节点node1。 + +#### 收包流程 + +node1接收到node0 group1的数据包{groupID(1) + packetA}后: + +(1) 网络层访问账本白名单,判断源节点node0是否是group1节点,若非group1节点,则拒绝数据包,否则将数据包传递给解码模块; + +(2) 解码模块从数据包中解码出group ID=1和数据包packetA,将数据包packetA发送到group1。 + +通过账本白名单,可以有效地防止群组节点获取其他群组通信消息,保障了群组网络通信的隐私性。 + +### 群组层 + +群组层是群组架构的核心。为了实现群组间账本数据的隔离,每个群组持有单独的账本模块。群组层自下向上一次分为核心层、接口层和调度层:核心层提供底层存储和交易执行接口;接口层是访问核心层的接口;调度层包括同步和共识模块,负责处理交易、同步交易和区块。 + +#### 核心层 + +主要包括存储(AMDB/storage/state)和执行(EVM)两大模块。存储负责从底层数据库中存储或读取群组账本的区块数据、区块执行结果、区块信息以及系统表等。执行(EVM)模块主要负责执行交易。 + +#### 接口层 + +接口层包括交易池(TxPool)、区块链(BlockChain)和区块执行器(BlockVerifier)三个模块。 + +##### 模块1:交易池(TxPool) + +交易池是客户端与调度层交互的接口,负责从客户端或者其他节点收到的新交易,共识模块会从中取出交易打包处理,同步模块从中取出新交易进行广播。 + +##### 模块2:区块链(BlockChain) + +区块链模块是核心层与调度层交互的接口,是调度层访问底层存储和执行模块的唯一入口,调度层可通过该模块提交新区块和区块执行结果,查询历史区块等信息。区块链模块也是RPC模块与核心层的接口,RPC模块通过区块链模块可获取区块、块高以及交易执行结果等信息。 + +##### 模块3:区块执行器(BlockVerifier) + +与调度层交互,负责执行从调度层传入的区块,并将区块执行结果返回给调度层。 + +#### 调度层 + +调度层包括共识模块(Consensus)和同步模块(Sync)。 + +##### 模块1:共识(Consensus)模块 + +共识模块主要负责执行客户端提交的交易,并对交易执行结果达成共识。 + +如下图,共识模块包括打包(Sealer)线程和共识(Engine)线程,Sealer线程负责从交易池获取未执行交易,并将交易打包成区块;Engine线程负责对区块执行结果进行共识,目前主要支持PBFT和Raft共识算法。 + +![](../../../../images/articles/group_architecture_design/IMG_4894.PNG) + + +共识模块主要流程包括: + +(1) 客户端提交的交易缓存到TxPool后,会唤醒共识节点的Sealer线程,Sealer线程从交易池中获取最新交易,并基于当前最高区块,打包产生一个新区块blockI; + +(2) Sealer线程将打包产生的新区块blockI传递到Engine线程,用于共识; + +(3) Engine线程收到新区块blockI后,启动共识流程,共识过程中,会调用区块执行器BlockVerifier执行区块blockI内的每笔交易,并对执行结果达成一致共识; + +(4) 若共识成功,则调用BlockChain将新区块blockI以及区块执行结果等提交到底层数据库; + +(5) 新区块blockI上链成功后,触发交易池删除以上链的所有交易,并将交易执行结果以回调的形式推送到客户端。 + +##### 模块2:同步(Sync)模块 + +考虑到共识过程中,需要尽可能保证每个群组节点拥有全量的交易,FISCO BCOS 2.0引入了同步模块来保证客户端的交易尽可能发送到每个共识节点。 + +同步模块主要包括交易同步和区块同步: + +##### 交易同步 + +客户端通过RPC向指定群组交易池提交新交易时,会唤醒相应群组同步模块的交易同步线程,该线程将所有新收到的交易广播到其他群组节点,其他群组节点将最新交易插入到交易池,保证每个群组节点拥有全量的交易。 + +如下图,客户端将交易tx_j发送到group1, tx_i发送到group2后,交易同步线程会将tx_i广播到所有群组节点的group1,将tx_j广播到所有群组节点的group2。 + +![](../../../../images/articles/group_architecture_design/IMG_4895.PNG) + +#### 区块同步 + +考虑到区块链网络中机器性能不一致或者新节点加入都会导致部分节点区块高度落后于其他节点,同步模块提供了区块同步功能,该模块向其他节点发送自己节点的最新块高,其他节点发现块高落后于其他节点后,会主动下载最新区块。 + +以三节点区块链系统为例,区块同步流程如下图: + + +![](../../../../images/articles/group_architecture_design/IMG_4896.PNG) + + +(1) Node0, Node1和Node2的区块同步线程定期广播最新区块高度信息; + +(2) Node1收到Node0和Node2的最新区块高度后,发现自身块高3低于Node0和Node2最新块高6; + +(3)本着负载均衡的原则, Node1向Node2请求第4个区块,向Node0请求区块5和区块6; + +(4) Node0和Node2接收到Node1的区块请求后,分别将第{5,6}和第{4}个区块返回给Node1; + +(5) Node1按照区块高度执行第4、5、6个区块,并将最新区块按次序提交到底层存储。 + +------ + +**下篇预告**:群组架构的使用教程 + +下一篇文章,我会以搭建群组区块链为例,向大家提供群组架构的实操课程,敬请持续锁定FISCO BCOS开源社区。 diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/group_architecture_practice.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/group_architecture_practice.md new file mode 100644 index 000000000..aeffadf32 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/group_architecture_practice.md @@ -0,0 +1,146 @@ +# FISCO BCOS 2.0使用教程篇1: 群组架构实操演练 + +作者:陈宇杰|FISCO BCOS 核心开发者 + +如果说,上篇是带你潜入团队的大脑,看清群组架构诞生的由来和架构设计(还没看的伙伴可以点标题直接进入:[群组架构的设计](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485338&idx=1&sn=9ce03340c699a8527960a0d0b26d4923&chksm=9f2ef586a8597c9003192718c1f60ed486570f6a334c9713cc7e99ede91c6f3ddcd7f438821f&token=705851025&lang=zh_CN#rd)。 + +那么下篇,即本文,视线则聚焦到团队的双手,看看群组架构如何在跳动的十指中轻快飞舞。 + +本文是高能实操攻略,全程硬核干货,我将**以搭建仲裁链为例**,并演示如何向该链发送交易。 + +**课程知识点**: + +- 使用build_chain创建多群组区块链安装包 +- 如何启动区块链节点、查看节点共识状态和出块状态 +- 搭建控制台,向多个群组部署合约 + +## 仲裁链组织结构 + +下图是一个仲裁链示例: + +![](../../../../images/articles/group_architecture_practice/IMG_5084.PNG) + +企业A、企业B和企业C分别和仲裁机构合作,采用区块链搭建仲裁服务。在群组架构下,搭链方式为:**仲裁机构**配置两个节点,分别加入三个群组;**企业A**配置两个节点,加入群组1;**企业B**配置两个节点,加入群组2;**企业C**配置两个节点,加入群组3。 + +## 仲裁链组网详情 + +上节介绍了仲裁链组织结构,这里在一台机器的环境下模拟仲裁链组网环境。仿真的组网环境如下: + +- **仲裁机构**:包括两个节点,节点IP均为127.0.0.1,同时属于群组1,群组2和群组3 +- **企业A**:包括两个节点,节点IP均为127.0.0.1,仅属于群组1 +- **企业B**:包括两个节点,节点IP均为127.0.0.1,仅属于群组2 +- **企业C**:包括两个节点,节点IP均为127.0.0.1,仅属于群组3 + +**温馨提示** : + +实际应用场景中,不建议将多个节点部署在同一台机器,建议根据机器负载选择部署节点数目。本例中仲裁机构节点归属于所有群组,负载较高,建议单独部署于性能较好的机器。 + +## 仲裁链搭建关键流程 + +如下图所示,使用FISCO BCOS 2.0快速建链脚本搭建仲裁链(以及所有其他区块链系统)主要包括五个步骤: + +![](../../../../images/articles/group_architecture_practice/IMG_5085.PNG) + +- step1:安装依赖软件,主要是openssl和build_chain.sh脚本 +- step2: 使用build_chain.sh生成区块链节点配置 +- step3: 启动所有机构区块链节点 +- step4: 启动控制台 +- step5: 使用控制台发送交易 + +下面我将就这五个步骤详细叙述构建仲裁链的关键流程。 + +### 安装依赖软件 + +搭建FISCO BCOS 2.0区块链节点需要准备如下依赖软件: + +- openssl:FISCO BCOS 2.0的网络协议依赖openssl +- build_chain.sh脚本:主要用于构建区块链节点配置,可从https://raw.githubusercontent.com/FISCO-BCOS/FISCO-BCOS/master-2.0/manual/build_chain.sh下载 + +```eval_rst +.. note:: + - 如果因为网络问题导致长时间无法下载build_chain.sh脚本,请尝试 `curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master-2.0/tools/build_chain.sh && chmod u+x build_chain.sh` +``` + +### 生成区块链节点配置 + +FISCO BCOS 2.0提供的build_chain.sh可快速生成区块链节点配置,按照【仲裁链组网详情】介绍的节点组织结构,先生成区块链配置文件ip_list: + +``` +#ip_list文件内容格式:[ip]:[节点数] [机构名] [所属群组列表] +$ cat > ipconf << EOF +127.0.0.1:2 arbitrator 1,2,3 +127.0.0.1:2 agencyA 1 +127.0.0.1:2 agencyB 2 +127.0.0.1:2 agencyC 3 +EOF +``` + +调用build_chain.sh脚本构建仿真的本机仲裁链: + +``` +$ bash build_chain.sh -f ipconf -p 30300,20200,8545 +``` + +区块链节点配置成功后,会看到[INFO] All completed.的输出。 + +### 启动节点 + +生成区块链节点后,需要启动所有节点,节点提供start_all.sh和stop_all.sh脚本启动和停止节点。 + +``` +# 启动节点 +$ bash start_all.sh + +# 查看节点进程 +$ ps aux | grep fisco-bcos +``` + +不发交易时,共识正常的节点会输出+++日志,使用tail -f node*/log/* | grep "++"查看各节点是否共识正常。 + +### 启动控制台 + +控制台是用户与FISCO BCOS 2.0区块链节点交互的重要工具,实现查询区块链状态、部署调用合约等功能,能够快速获取用户到所需要信息。 + +启动控制台前需获取并配置控制台: + +- **获取控制台**:从https://github.com/FISCO-BCOS/console/releases/download/v1.0.0/console.tar.gz下载控制台 + +```eval_rst +.. note:: + - 如果因为网络问题导致长时间无法下载控制台脚本,请尝试从gitee下载:https://gitee.com/FISCO-BCOS/console/attach_files/420303/download/console.tar.gz +``` + +- **配置控制台:**主要拷贝证书、配置conf/applicationContext.xml所连接节点的IP和端口信息,控制台关键配置如下: + +![](../../../../images/articles/group_architecture_practice/IMG_5086.PNG) + +当然,控制台也支持连接多个群组,并提供了switch命令来切换群组,连接多个群组时,需要在groupChannelConnectionsConfig bean id中配置多个连接,分别连接到对应群组的区块链节点。 + +**注:**控制台依赖于Java 8以上版本,Ubuntu 16.04系统安装openjdk 8即可。CentOS请安装Oracle Java 8以上版本。 + +使用start.sh脚本启动控制台,控制台启动成功会输出如下界面: + +![](../../../../images/articles/group_architecture_practice/IMG_5087.PNG) + +### 向群组发交易 + +控制台提供了deploy HelloWorld指令向节点发交易,发完交易后,区块链节点块高会增加 + +``` +# ... 向group1发交易... +$ [group:1]> deploy HelloWorld +0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744 +# 查看group1当前块高,块高增加为1表明出块正常,否则请检查group1是否共识正常 +$ [group:1]> getBlockNumber +1 +# ... 向group2发交易... +# 切换到group2 +$ [group:1]> switch 2 +Switched to group 2 +[group:2]deploy Helloworld +... +``` + +## 总结 + +本文介绍了搭建仲裁链的关键过程,FISCO BCOS 2.0的操作文档step by step介绍了如何部署多群组区块链,详细流程可以参考[多群组部署](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/group_use_cases.html) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/index.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/index.md new file mode 100644 index 000000000..bf46d49c1 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/index.md @@ -0,0 +1,37 @@ +### 整体架构 + + +架构模型:一体两翼多引擎 + +群组架构:支持链内动态扩展多群组 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + group_architecture_design.md + group_architecture_practice.md +``` + +分布式存储:支持海量数据存储 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + distributed_storage_design.md + distributed_storage_experience.md +``` + +并行计算:支持块内交易并行执行 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + dag-based_parallel_transaction_execution_engine.md + parallel_transformation.md + parallel_contract_development_framework_with_tutorials.md + transaction_lifetime.md + transaction_pool_optimization_strategy.md +``` \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/parallel_contract_development_framework_with_tutorials.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/parallel_contract_development_framework_with_tutorials.md new file mode 100644 index 000000000..70af33815 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/parallel_contract_development_framework_with_tutorials.md @@ -0,0 +1,417 @@ +# FISCO BCOS可并行合约开发框架(附实操教程) + +作者:石翔|FISCO BCOS 核心开发者 + +本专题系列文章追到现在,也许你会想问,FISCO BCOS的并行到底怎么用?作为专题的完结篇,本文就来揭晓“庐山真面目”,并教你上手使用FISCO BCOS的并行特性!FISCO BCOS提供了可并行合约开发框架,开发者按照框架规范编写的合约,能够被FISCO BCOS节点并行地执行。并行合约的优势有: + +- **高吞吐**:多笔独立交易同时被执行,能最大限度利用机器的CPU资源,从而拥有较高的TPS +- **可拓展**:可以通过提高机器的配置来提升交易执行的性能,以支持不断扩大业务规模 + +接下来,我将介绍如何编写FISCO BCOS并行合约,以及如何部署和执行并行合约。 + +## 预备知识 + +### 并行互斥 + +两笔交易是否能被并行执行,依赖于这两笔交易是否存在**互斥**。互斥,是指两笔交易各自**操作合约存储变量的集合存在交集**。 + +例如,在转账场景中,交易是用户间的转账操作。用transfer(X, Y) 表示从X用户转到Y用户的转账接口。互斥情况如下: + +![](../../../../images/articles/parallel_contract_development_framework_with_tutorials/IMG_5187.PNG) + +此处给出更具体的定义: + +- **互斥参数:**合约**接口**中,与合约存储变量的“读/写”操作相关的参数。例如转账的接口transfer(X, Y),X和Y都是互斥参数。 + +- **互斥对象**:一笔**交易**中,根据互斥参数提取出来的、具体的互斥内容。例如转账的接口transfer(X, Y), 一笔调用此接口的交易中,具体的参数是transfer(A, B),则这笔操作的互斥对象是[A, B];另外一笔交易,调用的参数是transfer(A, C),则这笔操作的互斥对象是[A, C]。 + +**判断同一时刻两笔交易是否能并行执行,就是判断两笔交易的互斥对象是否有交集。相互之间交集为空的交易可并行执行。** + +## 编写并行合约 + +FISCO BCOS提供了**可并行合约开发框架**,开发者只需按照框架的规范开发合约,定义好每个合约接口的互斥参数,即可实现能被并行执行的合约。当合约被部署后,FISCO BCOS会在执行交易前,自动解析互斥对象,在同一时刻尽可能让无依赖关系的交易并行执行。 + +目前,FISCO BCOS提供了solidity与预编译合约两种可并行合约开发框架。 + +### solidity合约的并行框架 + +编写并行的solidity合约,开发流程与开发普通solidity合约流程相同。在此基础上,只需将ParallelContract 作为需要并行的合约基类,并调用registerParallelFunction(),注册可以并行的接口即可。 + +先给出完整的举例。例子中的ParallelOk合约实现了并行转账的功能: + +``` +pragma solidity ^0.4.25; +import "./ParallelContract.sol"; // 引入ParallelContract.sol +contract ParallelOk is ParallelContract // 将ParallelContract 作为基类 +{ + // 合约实现 + mapping (string => uint256) _balance; + + function transfer(string from, string to, uint256 num) public +{ + // 此处为简单举例,实际生产中请用SafeMath代替直接加减 + _balance[from] -= num; + _balance[to] += num; + } +​ + function set(string name, uint256 num) public +{ + _balance[name] = num; + } +​ + function balanceOf(string name) public view returns (uint256) +{ + return _balance[name]; + } + + // 注册可以并行的合约接口 + function enableParallel() public +{ + // 函数定义字符串(注意","后不能有空格),参数的前几个是互斥参数(设计函数时互斥参数必须放在前面 + registerParallelFunction("transfer(string,string,uint256)", 2); // 冲突参数: string string + registerParallelFunction("set(string,uint256)", 1); // 冲突参数: string + } +​ + // 注销并行合约接口 + function disableParallel() public +{ + unregisterParallelFunction("transfer(string,string,uint256)"); + unregisterParallelFunction("set(string,uint256)"); + } +} +``` + +具体步骤如下: + +#### step1 将ParallelContract作为合约的基类 + +``` +pragma solidity ^0.4.25; +​ +import "./ParallelContract.sol"; // 引入ParallelContract.sol +​ +contract ParallelOk is ParallelContract // 将ParallelContract 作为基类 +{ + // 合约实现 + + // 注册可以并行的合约接口 + function enableParallel() public; + + // 注销并行合约接口 + function disableParallel() public; +} +``` + +#### step2 编写可并行的合约接口 + +合约中的public函数,是合约的接口。编写可并行的合约接口,是根据一定的规则,实现一个合约中的public函数。 + +##### 确定接口是否可并行 + +可并行的合约接口,必须满足: + +- 无调用外部合约 +- 无调用其它函数接口 + +##### 确定互斥参数 + +在编写接口前,先确定接口的互斥参数,接口的互斥即是对全局变量的互斥,互斥参数的确定规则为: + +- 接口访问了全局mapping,mapping的key是互斥参数 +- 接口访问了全局数组,数组的下标是互斥参数 +- 接口访问了简单类型的全局变量,所有简单类型的全局变量共用一个互斥参数,用不同的变量名作为互斥对象 + +##### 确定参数类型和顺序 + +确定互斥参数后,根据规则确定参数类型和顺序,规则为: + +- 接口参数仅限:string、address、uint256、int256(未来会支持更多类型) +- 互斥参数必须全部出现在接口参数中 +- 所有互斥参数排列在接口参数的最前 + +``` +mapping (string => uint256) _balance; // 全局mapping +​ +// 互斥变量from、to排在最前,作为transfer()开头的两个参数 +function transfer(string from, string to, uint256 num) public +{ + _balance[from] -= num; // from 是全局mapping的key,是互斥参数 + _balance[to] += num; // to 是全局mapping的key,是互斥参数 +} +​ +// 互斥变量name排在最前,作为set()开头的参数 +function set(string name, uint256 num) public +{ + _balance[name] = num; +} +``` + +#### step3 在框架中注册可并行的合约接口 + +在合约中实现 enableParallel() 函数,调用registerParallelFunction()注册可并行的合约接口。同时也需要实现disableParallel()函数,使合约具备取消并行执行的能力。 + +``` +// 注册可以并行的合约接口 +function enableParallel() public +{ + // 函数定义字符串(注意","后不能有空格),参数的前几个是互斥参数 + registerParallelFunction("transfer(string,string,uint256)", 2); // transfer接口,前2个是互斥参数 + registerParallelFunction("set(string,uint256)", 1); // transfer接口,前1个四互斥参数 +} +​ +// 注销并行合约接口 +function disableParallel() public +{ + unregisterParallelFunction("transfer(string,string,uint256)"); + unregisterParallelFunction("set(string,uint256)"); +} +``` + +#### step4 部署/执行并行合约 + +用控制台或Web3SDK编译和部署合约,此处以控制台为例: + +部署合约 + +``` +[group:1]> deploy ParallelOk.sol +``` + +调用 enableParallel()接口,让ParallelOk能并行执行 + +``` +[group:1]> call ParallelOk.sol 0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744 enableParallel +``` + +发送并行交易 set() + +``` +[group:1]> call ParallelOk.sol 0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744 set "jimmyshi" 100000 +``` + +发送并行交易 transfer() + +``` +[group:1]> call ParallelOk.sol 0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744 transfer "jimmyshi" "jinny" 80000 +``` + +查看交易执行结果 balanceOf() + +``` +[group:1]> call ParallelOk.sol 0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744 balanceOf "jinny"80000 +``` + +用SDK发送大量交易的例子,将在下文的例子中给出。 + +### 预编译合约的并行框架 + +编写并行的预编译合约,开发流程与开发普通预编译合约流程相同。普通的预编译合约以Precompile为基类,在这之上实现合约逻辑。基于此,Precompile的基类还为并行提供了两个虚函数,继续实现这两个函数,即可实现并行的预编译合约。 + +#### step1 将合约定义成支持并行 + +``` +bool isParallelPrecompiled() override { return true; } +``` + +#### step2 定义并行接口和互斥参数 + +注意,一旦定义成支持并行,所有的接口都需要进行定义。若返回空,表示此接口无任何互斥对象。互斥参数与预编译合约的实现相关,此处涉及对FISCO BCOS存储的理解,具体的实现可直接阅读代码或询问相关有经验的程序员。 + +``` +// 根据并行接口,从参数中取出互斥对象,返回互斥对象 +std::vector getParallelTag(bytesConstRef param) override +{ + // 获取被调用的函数名(func)和参数(data) + uint32_t func = getParamFunc(param); + bytesConstRef data = getParamData(param); +​ + std::vector results; + if (func == name2Selector[DAG_TRANSFER_METHOD_TRS_STR2_UINT]) // 函数是并行接口 + { + // 接口为:userTransfer(string,string,uint256) + // 从data中取出互斥对象 + std::string fromUser, toUser; + dev::u256 amount; + abi.abiOut(data, fromUser, toUser, amount); + + if (!invalidUserName(fromUser) && !invalidUserName(toUser)) + { + // 将互斥对象写到results中 + results.push_back(fromUser); + results.push_back(toUser); + } + } + else if ... // 所有的接口都需要给出互斥对象,返回空表示无任何互斥对象 + + return results; //返回互斥 +} +``` + +#### step3 编译,重启节点 + +手动编译节点的方法,[参考FISCO BCOS技术文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/get_executable.html#id2)。编译之后,关闭节点,替换掉原来的节点二进制文件,再重启节点即可。 + +## 举例:并行转账 + +此处分别给出solidity合约和预编译合约的并行举例。 + +#### 配置环境 + +该举例需要以下执行环境: + +- Web3SDK客户端 +- 一条FISCO BCOS链 + +若需要压测最大的性能,至少需要: + +- 3个Web3SDK,才能产生足够多的交易 +- 4个节点,且所有Web3SDK都配置了链上所有的节点信息,让交易均匀发送到每个节点上,才能让链接收足够多的交易 + +### 并行Solidity合约:ParallelOk + +基于账户模型的转账,是一种典型的业务操作。ParallelOk合约,是账户模型的一个举例,能实现并行的转账功能。ParallelOk合约已在上文中给出。 + +FISCO BCOS在Web3SDK中内置了ParallelOk合约,此处给出用Web3SDK来发送大量并行交易的操作方法。 + +#### step1 用SDK部署合约、新建用户、开启合约的并行能力 + +``` +# 参数: add <创建的用户数量> <此创建操作请求的TPS> <生成的用户信息文件名> +java -cp conf/:lib/*:apps/* org.fisco.bcos.channel.test.parallel.parallelok.PerformanceDT 1 add 10000 2500 user +# 在group1上创建了 10000个用户,创建操作以2500TPS发送的,生成的用户信息保存在user中 +``` + +执行成功后,ParallelOk被部署到区块链上,创建的用户信息保存在user文件中,同时开启了ParallelOk的并行能力。 + +#### step2 批量发送并行转账交易 + +注意:在批量发送前,请将SDK的日志等级调整为ERROR,才能有足够的发送能力。 + +``` +# 参数: transfer <总交易数量> <此转账操作请求的TPS上限> <需要的用户信息文件> <交易互斥百分比:0~10> +java -cp conf/:lib/*:apps/* org.fisco.bcos.channel.test.parallel.parallelok.PerformanceDT 1 transfer 100000 4000 user 2 +​ +# 向group1发送了 100000比交易,发送的TPS上限是4000,用的之前创建的user文件里的用户。 +``` + +#### step3 验证并行正确性 + +并行交易执行完成后,Web3SDK会打印出执行结果。TPS 是此SDK发送的交易在节点上执行的TPS。validation 是转账交易执行结果的检查。 + +``` +Total transactions: 100000 +Total time: 34412ms +TPS: 2905.9630361501804 +Avg time cost: 4027ms +Error rate: 0% +Return Error rate: 0% +Time area: +0 < time < 50ms : 0 : 0.0% +50 < time < 100ms : 44 : 0.044000000000000004% +100 < time < 200ms : 2617 : 2.617% +200 < time < 400ms : 6214 : 6.214% +400 < time < 1000ms : 14190 : 14.19% +1000 < time < 2000ms : 9224 : 9.224% +2000 < time : 67711 : 67.711% +validation: + user count is 10000 + verify_success count is 10000 + verify_failed count is 0 +``` + +可以看出,本次交易执行的TPS是2905。执行结果校验后,无任何错误(verify_failed count is 0)。 + +#### step4 计算总TPS + +单个Web3SDK无法发送足够多的交易以达到节点并行执行能力的上限。需要多个Web3SDK同时发送交易。在多个Web3SDK同时发送交易后,单纯将结果中的TPS加和得到的TPS不够准确,需要直接从节点处获取TPS。 + +用脚本从日志文件中计算TPS + +``` +cd tools +sh get_tps.sh log/log_2019031821.00.log 21:26:24 21:26:59 # 参数:<日志文件> <计算开始时间> <计算结束时间> +``` + +得到TPS(3 SDK、4节点,8核,16G内存) + +``` +statistic_end = 21:26:58.631195 +statistic_start = 21:26:24.051715 +total transactions = 193332, execute_time = 34580ms, tps = 5590 (tx/s) +``` + +### 并行预编译合约:DagTransferPrecompiled + +与ParallelOk合约的功能一样,FISCO BCOS内置了一个并行预编译合约的例子(DagTransferPrecompiled),实现了简单的基于账户模型的转账功能。该合约能够管理多个用户的存款,并提供一个支持并行的transfer接口,实现对用户间转账操作的并行处理。 + +**注意:DagTransferPrecompiled仅做示例使用,请勿直接运用于生产环境。** + +#### step1 生成用户 + +用Web3SDK发送创建用户的操作,创建的用户信息保存在user文件中。命令参数与parallelOk相同,不同的仅仅是命令所调用的对象是precompile。 + +``` +java -cp conf/:lib/*:apps/* org.fisco.bcos.channel.test.parallel.precompile.PerformanceDT 1 add 10000 2500 user +``` + +#### step2 批量发送并行转账交易 + +用Web3SDK发送并行转账交易。 + +**注意:在批量发送前,请将SDK的日志等级请调整为ERROR,才能有足够的发送能力。** + +``` +java -cp conf/:lib/*:apps/* org.fisco.bcos.channel.test.parallel.precompile.PerformanceDT 1 transfer 100000 4000 user 2 +``` + +#### step3 验证并行正确性 + +并行交易执行完成后,Web3SDK会打印出执行结果。TPS 是此SDK发送的交易在节点上执行的TPS。validation 是转账交易执行结果的检查。 + +``` +Total transactions: 80000 +Total time: 25451ms +TPS: 3143.2949589407094 +Avg time cost: 5203ms +Error rate: 0% +Return Error rate: 0% +Time area: +0 < time < 50ms : 0 : 0.0% +50 < time < 100ms : 0 : 0.0% +100 < time < 200ms : 0 : 0.0% +200 < time < 400ms : 0 : 0.0% +400 < time < 1000ms : 403 : 0.50375% +1000 < time < 2000ms : 5274 : 6.592499999999999% +2000 < time : 74323 : 92.90375% +validation: + user count is 10000 + verify_success count is 10000 + verify_failed count is 0 +``` + +可以看出,本次交易执行的TPS是3143。执行结果校验后,无任何错误(verify_failed count is 0)。 + +#### step4 计算总TPS + +单个Web3SDK无法发送足够多的交易以达到节点并行执行能力的上限。需要多个Web3SDK同时发送交易。在多个Web3SDK同时发送交易后,单纯将结果中的TPS加和得到的TPS不够准确,需要直接从节点处获取TPS。 + +用脚本从日志文件中计算TPS + +``` +cd tools +sh get_tps.sh log/log_2019031311.17.log 11:25 11:30 # 参数:<日志文件> <计算开始时间> <计算结束时间> +``` + +得到TPS(3 SDK、4节点,8核,16G内存) + +``` +statistic_end = 11:29:59.587145 +statistic_start = 11:25:00.642866 +total transactions = 3340000, execute_time = 298945ms, tps = 11172 (tx/s) +``` + +## 结果说明 + +本文举例中的性能结果,是在3SDK、4节点、8核、16G内存、1G网络下测得。每个SDK和节点都部署在不同的VPS中,硬盘为云硬盘。实际TPS会根据你的硬件配置、操作系统和网络带宽有所变化。 + +**如您在部署过程中遇到阻碍或有问题需要咨询,可以进入FISCO BCOS官方技术交流群寻求解答。**(进群请长按下方二维码识别添加小助手) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/parallel_transformation.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/parallel_transformation.md new file mode 100644 index 000000000..6f358876d --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/parallel_transformation.md @@ -0,0 +1,204 @@ +# 让木桶没有短板,FISCO BCOS全面推进并行化改造 + +作者:李陈希|FISCO BCOS 核心开发者 + +## 背景 + +PTE(Parallel Transaction Executor,一种基于DAG模型的并行交易执行器)的引入,使FISCO BCOS具备了并行执行交易的能力,显著提升了节点交易处理的效率。对这个阶段性结果,我们并不满足,继续深入挖掘发现,FISCO BCOS的整体TPS仍有较大提升空间。 用木桶打个比方:如果参与节点的交易处理所有模块构成木桶,交易执行只是组成整个木桶的一块木板,根据短板理论,一只木桶能盛多少水取决于桶壁上最矮的那块,同理,**FISCO BCOS的性能也由速度最慢的组件决定**。 尽管PTE取得了理论上极高的性能容量,但是FISCO BCOS的整体性能仍然会被其他模块较慢的交易处理速度所掣肘。**为了能够最大化利用计算资源以进一步提高交易处理能力,在FISCO BCOS中全面推进并行化改造势在必行。** + +## 数据分析 + +根据并行程序设计的『分析→分解→设计→验证』四步走原则,首先需定位出系统中仍存在的性能瓶颈的精确位置,才能更深入地对任务进行分解,并设计相应的并行化策略。**使用自顶向下分析法,我们将交易处理流程分为四个模块进行性能分析**,这四个模块分别是: + +**区块解码(decode)**:区块在节点间共识或同步时需要从一个节点发送至另一个节点,这个过程中,区块以RLP编码的形式在网络间传输。节点收到区块编码后,需要先进行解码,将区块还原为内存中的二进制对象,然后才能做进一步处理。 + +**交易验签(verify)**:交易在发送之前由发送者进行签名,签名得到的数据可以分为(v, r, s)三部分,验签的主要工作便是在收到交易或交易执行前,从(v, r, s)数据中还原出交易发送者的公钥,以验证交易发送者的身份。 + +**交易执行(execute)**:执行区块中的所有交易,更新区块链状态。 + +**数据落盘(commit)**:区块执行完成后,需要将区块及相关数据写入磁盘中,进行持久化保存。 + +以包含2500笔预编译转账合约交易的区块为测试对象,在我们的测试环境中,各阶段的平均耗时分布如下图所示: + +![](../../../../images/articles/parallel_transformation/IMG_5182.JPG) + +从图中可以看出,2500笔交易的执行时间已经被缩短到了50毫秒以内,可以证明PTE对FISCO BCOS交易执行阶段的优化是行之有效的。但图中也暴露出了非常明显的问题:其他阶段的用时远远高于交易执行的用时,导致交易执行带来的性能优势被严重抵消,PTE无法发挥出其应有的价值。 + +早在1967年,计算机体系结构领域的元老Amdahl提出的以他名字命名的定律,便已经向我们阐明了衡量处理器并行计算后效率提升能力的经验法则: + +![](../../../../images/articles/parallel_transformation/IMG_5183.PNG) + +其中,SpeedUp为加速比,Ws是程序的串行分量,Wp是程序中的并行分量,N为CPU数量。可以看出,在工作总量恒定的情况下,可并行部分代码占比越多,系统的整体性能越高。我们需要把思维从线性模型中抽离出来,继续细分整个处理流程,找出执行时间最长的程序热点,对这些代码段进行并行化从而将所有瓶颈逐个击破,这才是使通过并行化获得最大性能提升的最好办法。 + +## 根因拆解 + +### 1.串行的区块解码 + +区块解码主要性能问题出在RLP编码方法本身。RLP全称是递归的长度前缀编码,是一种用长度作为前缀标明编码对象中元素个数的编码方法。如下图所示,RLP编码的开头即是此编码中的对象个数(Object num)。在个数后,是相应个数的对象(Object)。递归地,每个对象,也是RLP编码,其格式也与下图相同。 + +需要特别注意的是,在RLP编码中。每个Object的字节大小是不固定的,Object num只表示Object的个数,不表示Object的字节长度。 + +![](../../../../images/articles/parallel_transformation/IMG_5184.JPG) + +RLP通过一种长度前缀与递归结合的方式,理论上可编码任意个数的对象。下图是一个区块的RLP编码,在对区块进行编码时,先递归至最底层,对多个sealer进行编码,多个sealer被编码并加上长度前缀后,编码成为一串RLP编码(sealerList),此编码又作为一个对象,被编入上层的一串RLP编码(blockHeader)中。此后层层递归,最后编码成为区块的RLP编码。由于RLP编码是递归的,在编码前,无法获知编码后的长度。 + +![](../../../../images/articles/parallel_transformation/IMG_5185.JPG) + +解码时,由于RLP编码中每个对象的长度不确定,且RLP编码只记录了对象的个数,没记录对象的字节长度,若要获取其中的一个编码对象,必须递归解码其前序的所有对象,在解码前序的对象后,才能访问到需要访问的编码对象的字节位置。例如在上图中,若需要访问区块中的第0笔交易,即tx0,必须先将blockHeader解码,而blockHeader的解码,需要再次递归,把parentHash,stateRoot直至sealerList都解码出来。 + +解码区块最重要的目的是解码出包含在区块中的交易,而交易的编码都是互相独立的,但在RLP特殊的编码方式下,解码一笔交易的必要条件是解码出上一笔交易,交易的解码任务之间环环相扣,形成了一种链式的依赖关系。需要指出的是,这种解码方式并不是RLP的缺陷,RLP的设计目标之一本就是尽量减少空间占用,充分利用好每一个字节,虽然编解码变得低效了些,但编码的紧凑度却是有目共睹,因此这种编码方式本质上还是一种时间换空间的权衡结果。 + +由于历史原因,FISCO BCOS中使用了RLP编码作为多处信息交换协议,贸然换用其他并行化友好的序列化方案可能会带来较大的开发负担。基于这一考虑,我们决定在原有的RLP编解码方案稍作修改,通过为每个被编码的元素添加额外的位置偏移信息,便可以做到并行解码RLP的同时不会改动大量原有代码。 + +### 2.交易验签&数据落盘开销大 + +通过对交易验签和数据落盘部分的代码进行拆解,我们发现两者的主要功能都集中在一个耗时巨大的for循环。交易验签负责按序取出交易,然后从交易的签名数据中取出(v, r, s)数据,并从中还原出交易发送者的公钥,其中,还原公钥这一步,由于涉及密码学算法,因此耗时不少;数据落盘负责从缓存中逐个取出交易相关数据,将其编码为JSON字符串后写入磁盘,由于JSON编码过程本身效率比较低,因此也是性能损失的重灾区。 + +两者代码分别如下所示: + +``` +// 交易验签 +for(int i = 0; i < transactions.size(); ++i) +{ + tx = transactions[i]; + v, r, s = tx.getSignature(); + publicKey = recover(v, r, s); // 从(v, r, s)中复原出发送者公钥 + ... +} +``` + +``` +// 数据落盘 +for(int i = 0; i < datas.size(); ++i) +{ + data = datas[i]; + jsonStr = jsonEncode(data); // 将数据编码为JSON字符串进行存储 + db.commit(jsonStr); + ... +} +``` + +两个过程共有的特点是,它们均是将同样的操作应用到数据结构中不同的部分,对于这种类型的问题,可以直接使用数据级并行进行改造。所谓数据级并行,即是将数据作为划分对象,通过将数据划分为大小近似相等的片段,通过在多个线程上对不同的数据片段上进行操作,达到并行处理数据集的目的。 + +数据级并行唯一的附加要求是任务之间彼此独立,毫无疑问,在FISCO BCOS的实现中,交易验签和数据落盘均满足这一要求。 + +## 优化实践 + +### 1.区块解码并行化 + +改造过程中,我们在系统中使用的普通RLP编码的基础上,加入了offset字段,用以索引每个Object的位置。如下图所示,改造后编码格式的开头,仍然是对象的个数(Object num),但是在个数字段后,是一个记录对象偏移量的数组(Offsets)。 + +![](../../../../images/articles/parallel_transformation/IMG_5186.JPG) + +数组中的每个元素有着固定的长度。因此要读取某个Offset的值,只需向访问数组一样,根据Offset的序号直接索引便可以进行随机访问。在Offsets后,是与RLP编码相同的对象列表。相应序号的Offset,指向相应序号的对象的RLP编码字节位置。因此,任意解码一个对象,只需要根据对象的序号,找到其偏移量,再根据偏移量,就可定位到相应对象的RLP编码字节位置。 + +编码流程也进行了重新设计。流程本身仍然基于递归的思路,对于输入的对象数组,首先将对象数组的大小编码在输出编码的开头处,若数组大小超过1,则按序逐个取出待编码对象并缓存其递归编码,并在Offsets数组中记录该对象的偏移位置,待数组遍历完后,将缓存的对象编码第一次性取出并附加至输出编码末尾;若数组大小为1,则递归对其编码并写入输出编码的末尾,结束递归。 + +**编码流程的伪代码如下:** + +``` +Rlps = RLP(); // Output,初始时为空 +void encode(objs) //Input: objs = 待编码对象的数组 +{ + offset = 0; + codes = []; + + objNum = objs.size() + Rlps.push(objNum) + if objNum > 1 + { + for obj in objs + { + rlp = encode(obj); // 递归调用编码方法 + Rlps.push(offset); + offset += rlp.size(); + codes.add(rlp); // 缓存递归编码的结果 + } + for x in codes + { + Rlps.push(x); + } + } + else + { + rlp = encode(objs[0]); + Rlps.push(rlp); + } +} +``` + +偏移量的引入使解码模块能够对元素编码进行随机访问。Offsets的数组范围可以在多个线程间均摊,从而每个线程可以并行访问对象数组的不同部分,分别进行解码。由于是只读访问,这种并行方式是线程安全的,仅需最后再对输出进行汇总即可。 + +**解码流程的伪代码如下:** + +``` +Objs decode(RLP Rlps) +{ + objNum = Rlps.objNum; // 获取对象个数 + outputs = [] // 输出的对象数组 + if objNum > 1 + { + parallel for i = 0 to objNum + { + offset = Rlps.offsets[i]; + code = Rlps.objs[offset]; + x = decode(code); + outputs.add(x); // 有序插入outputs + } + } + else + { + outputs.add(decode(Rlps.objs[0])); + } + return outputs; +} +``` + +## 2.交易验签 & 数据落盘并行化 + +对于数据级并行,业内已有多种成熟的多线程编程模型。虽然Pthread这类显式的多线程编程模型能够提供对线程进行更精细的控制,但是需要我们对线程通信、同步拥有娴熟的驾驭技巧。实现的复杂度越高,犯错的几率越大,日后代码维护的难度也相应增加。我们的主要目标仅仅对密集型循环进行并行化,因此在满足需求的前提下,Keep It Simple & Stupid才是我们的编码原则,因此我们使用隐式的编程模型来达成我们的目的。 + +经过再三权衡,我们在市面上众多隐式多线程编程模型中,选择了来自Intel的线程构建块(Thread Building Blocks,TBB)开源库。在数据级并行方面,TBB算是老手,TBB运行时系统不仅屏蔽了底层工作线程的实现细节,还能够根据任务量自动在处理器间平衡工作负载,从而充分利用底层CPU资源。 + +**使用TBB后,交易验签和数据落盘的代码如下所示:** + +``` +// 并行交易验签 +tbb::parallel_for(tbb::blocked_range(0, transactions.size()), +[&](const tbb::blocked_range& _range) +{ + for(int i = _range.begin(); i != _range.end(); ++i) + { + tx = transactions[i]; + v, r, s = tx.getSignature(); + publicKey = recover(v, r, s); // 从(v, r, s)中复原出发送者公钥 + ... + } +}); +``` + +``` +// 并行数据落盘 +tbb::parallel_for(tbb::blocked_range(0, transactions.size()), +[&](const tbb::blocked_range& _range) +{ + for(int i = _range.begin(); i != _range.end(); ++i) + { + data = datas[i]; + jsonStr = jsonEncode(data); // 将数据编码为JSON字符串进行存储 + db.commit(jsonStr); + ... + } +}); +``` + +可以看到,除了使用TBB提供的tbb::parallel_for进行并行循环和tbb::blocked_range引用数据分片外,循环体内的代码几乎没有任何变化,接近C++原生语法正是TBB的特点。TBB提供了抽象层级较高的并行接口,如parallel_for、parallel_for_each这类泛型并行算法,从而使得改造能够较为容易地进行。同时,TBB不依赖任何语言或编译器,只要有能支持ISO C++标准的编译器,便有TBB的用武之地。 + +当然,使用TBB并不是完全没有额外负担,比如线程间安全还是需要开发人员的仔细分析来保证,但TBB考虑周到,提供了一套方便的工具来辅助我们解决线程间互斥的问题,如原子变量、线程局部存储和并行容器等,这些并行工具同样被广泛地应用在FISCO BCOS中,为FISCO BCOS的稳定运行保驾护航。 + +#### 写在最后 + +经过一套并行优化的组合拳,FISCO BCOS的性能表现更上层楼。压力测试的结果表明,FISCO BCOS的交易处理能力,相较于并行化改造之前,成功提升了1.74倍,基本达到了这个环节的预期效果。 + +但是我们也深深明白,性能优化之路漫漫,木桶最短的一板总是交替出现,并行之道在于,通过反复的分析、拆解、量化和优化,使得各模块互相配合齐头并进,整个系统达到优雅的平衡,而最优解总是在“跳一跳”才能够得着的地方。 + diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/transaction_lifetime.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/transaction_lifetime.md new file mode 100644 index 000000000..153442ede --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/transaction_lifetime.md @@ -0,0 +1,56 @@ +# FISCO BCOS中交易的一生 + +作者:李陈希|FISCO BCOS 核心开发者 + +交易——区块链系统的核心,负责记录区块链上发生的一切。区块链引入智能合约后,交易便超脱『价值转移』的原始定义,其更加精准的定义应该是区块链中一次事务的数字记录。无论大小事务,都需要交易的参与。 + +交易的一生,贯穿下图所示的各个阶段。本文将梳理交易的整个流转过程,一窥FISCO BCOS交易完整生命周期。 + +![](../../../../images/articles/transaction_lifetime/IMG_5188.PNG) + +## 交易生成 + +用户的请求给到客户端后,客户端会构建出一笔有效交易,交易中包括以下关键信息: + +1. 发送地址:即用户自己的账户,用于表明交易来自何处。 +2. 接收地址:FISCO BCOS中的交易分为两类,一类是部署合约的交易,一类是调用合约的交易。前者,由于交易并没有特定的接收对象,因此规定这类交易的接收地址固定为0x0;后者,则需要将交易的接收地址置为链上合约的地址。 +3. 交易相关的数据:一笔交易往往需要一些用户提供的输入来执行用户期望的操作,这些输入会以二进制的形式被编码到交易中。 +4. 交易签名:为了表明交易确实是由自己发送,用户会向SDK提供私钥来让客户端对交易进行签名,其中私钥和用户账户是一一对应的关系。 + +之后,区块链客户端会再向交易填充一些必要的字段,如用于防交易重放的交易ID及blockLimit。交易的具体结构和字段含义可以参考[编码协议文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/protocol_description.html),交易构造完成后,客户端随后便通过Channel或RPC信道将交易发送给节点。 + +![](../../../../images/articles/transaction_lifetime/IMG_5189.PNG) + +## 交易池 + +区块链交易被发送到节点后,节点会通过验证交易签名的方式来验证一笔交易是否合法。若一笔交易合法,则节点会进一步检查该交易是否重复出现过,若从未出现过,则将交易加入交易池缓存起来。若交易不合法或交易重复出现,则将直接丢弃交易。 + +![](../../../../images/articles/transaction_lifetime/IMG_5190.PNG) + +## 交易广播 + +节点在收到交易后,除了将交易缓存在交易池外,节点还会将交易广播至该节点已知的其他节点。 + +为了能让交易尽可能到达所有节点,其他收到广播过来的交易节点,也会根据一些精巧的策略选择一些节点,将交易再一次进行广播,比如:对于从其他节点转发过来的交易,节点只会随机选择25%的节点再次广播,因为这种情况一般意味着交易已经开始在网络中被节点接力传递,缩减广播的规模有助于避免因网络中冗余的交易太多而出现的广播风暴问题。 + +## 交易打包 + +为了提高交易处理效率,同时也为了确定交易之后的执行顺序保证事务性,当交易池中有交易时,Sealer线程负责从交易池中按照先进先出的顺序取出一定数量的交易,组装成待共识区块,随后待共识区块会被发往各个节点进行处理。 + +![](../../../../images/articles/transaction_lifetime/IMG_5191.JPG) + +## 交易执行 + +节点在收到区块后,会调用区块验证器把交易从区块中逐一拿出来执行。如果是预编译合约代码,验证器中的执行引擎会直接调用相应的C++功能,否则执行引擎就会把交易交给EVM(以太坊虚拟机)执行。 + +交易可能会执行成功,也可能因为逻辑错误或Gas不足等原因执行失败。交易执行的结果和状态会封装在交易回执中返回。 + +![](../../../../images/articles/transaction_lifetime/IMG_5192.JPG) + +## 交易共识 + +区块链要求节点间就区块的执行结果达成一致才能出块。FISCO BCOS中一般采用PBFT算法保证整个系统的一致性,其大概流程是:各个节点先独立执行相同的区块,随后节点间交换各自的执行结果,如果发现超过2/3的节点都得出了相同的执行结果,那说明这个区块在大多数节点上取得了一致,节点便会开始出块。 + +## 交易落盘 + +在共识出块后,节点需要将区块中的交易及执行结果写入硬盘永久保存,并更新区块高度与区块哈希的映射表等内容,然后节点会从交易池中剔除已落盘的交易,以开始新一轮的出块流程。用户可以通过交易哈希等信息,在链上的历史数据中查询自己感兴趣的交易数据及回执信息。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/30_architecture/transaction_pool_optimization_strategy.md b/3.x/zh_CN/docs/articles/3_features/30_architecture/transaction_pool_optimization_strategy.md new file mode 100644 index 000000000..ac745ca51 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/30_architecture/transaction_pool_optimization_strategy.md @@ -0,0 +1,100 @@ +# FISCO BCOS中交易池及其优化策略 + +作者:陈宇杰|FISCO BCOS 核心开发者 + +**作者语** + +FISCO BCOS区块链系统中,交易上链之前,均存储在交易池中。交易池是区块链小能手,一方面担任质检员的职务,将所有非法交易拒之门外;一方面担任供应商的职责,向共识模块输送合法交易;还负责向客户端推送上链通知。可以说,FISCO BCOS区块链系统的交易池异常忙碌,其性能会直接影响区块链系统性能。本文就带领大家揭开交易池面纱,了解交易池多重身份,并一起领会FISCO BCOS区块链系统中的交易池如何在多重角色间游刃有余。 + +------ + +## 初识交易池 + +![](../../../../images/articles/transaction_pool_optimization_strategy/IMG_5193.PNG) + +如上图所示,FISCO BCOS区块链系统中,接收存储客户端发送的交易是交易池基本职责,这些交易是共识模块打包交易和同步模块广播交易的“原材料”。交易池需要保证这些交易“原材料”的质量,对交易合法性进行验证。当然,为了防止DOS攻击,FISCO BCOS对交易池容量进行了限制,当交易池内交易数目超过容量限制后,会拒绝客户端发送的新交易。 + +## 交易池的重要性 + +FISCO BCOS区块链系统中,交易池作为关键系统模块,同时肩负着和SDK以及后端多个模块的交互,本节就以交易池的多重职责为切入点,和大家一起看看交易池有多忙。 + +### 交易池的四重职责 + +![](../../../../images/articles/transaction_pool_optimization_strategy/IMG_5194.PNG) + +上图展示了交易从客户端发出到上链整个生命周期里,交易池所扮演的多重角色: + +- **交易质量检测员**:交易放入交易池前,检测交易的有效性,有效的交易必须满足:①签名有效;② 非重复交易;③ 非已上链交易。 +- **交易供应商**:存储合法交易,为后端模块提供交易“原材料”。 +- **验签防重小助手**:为共识模块提供区块验签接口,仅验证在交易池内未命中交易,提升共识区块验证效率。 +- **交易上链通知员**:交易上链成功后,将交易执行结果通知到客户端。 + +交易池作为区块链核心模块,身兼四职,每笔交易处理流程中,均需与后端三个模块、内部四个模块以及客户端进行多达八次交互,确实是异常忙碌。 + +### 交易池的作用 + +下面就以区块链节点交易处理生命周期为例,详细了解交易池各重角色在其中所起的作用。 + +![](../../../../images/articles/transaction_pool_optimization_strategy/IMG_5195.PNG) + +如上图,客户端发送的交易到节点会被流水线式处理,每条流水均需有五个处理流程: + +- **交易检测**:客户端发送的交易发送到节点后,首先要经过交易池的质量检测员的检验,交易池仅会把签名有效、不重复、未上链的交易放入交易池内。 +- **交易存储**:交易过了“质量检测”后,被存储交易池内,此时交易池身负“供应商”的角色,共识模块从交易池内获取新交易用于打包成区块;同步模块从交易池内获取新增交易,广播给所有其他共识节点。 +- **交易打包&&交易共识**:共识模块从交易池内获取合法交易,打包成新区块,并广播到所有其他共识节点,其他共识节点收到打包的新区块后,为了保证区块的合法性,会验证区块内每笔交易签名。考虑到交易验签是非常耗时的操作,且新区块内交易有极大概率在其他节点交易池内命中,为了提升共识验证效率,交易验签防重小助手此时派上了用场,它会仅验证新区块中未在本地交易池命中的交易签名。 +- **交易提交**:交易共识达成后,会调用存储模块,将交易及其执行结果提交到区块链数据库。 +- **交易通知**:交易上链成功后,交易池的上链通知员将交易执行结果通知给客户端。 + +在交易从发出到上链的整个生命周期里,每个过程都有交易池的参与,因此交易池对于整个区块链系统非常重要,交易池每个处理过程都直接影响了区块链系统性能。 + +## 交易池优化 + +通过前面介绍,我们了解到FISCO BCOS区块链系统的交易池异常忙碌,并且直接影响了区块链系统性能,本节就来详细说说交易池的优化历程和优化方法。 + +### 优化交易处理流水线效率 + +通过上面交易处理流水线示意图可看出,交易池参与了交易处理的每个流程,因此交易池每个处理流程都对系统性能影响很大。FISCO BCOS区块链系统采用拆分且并行执行交易验证任务、交易异步通知策略来优化交易流水线处理效率。 + +### 优化交易验证效率 + +FISCO BCOS rc2引入并行交易后,FISCO BCOS开发者们发现压测过程中共识模块每个区块经常无法打满交易,偶尔还会出现共识模块出空块、等待交易池提供新交易的现象。排查发现,交易池作为交易检测员任务太重,既要验证交易签名,又要检查交易是否重复、是否已上链,导致向交易供应商提供交易效率非常低,经常出现交易供不应求的情况,严重影响了区块链系统TPS。 + +下图描述了这种供不应求的现象: + +![](../../../../images/articles/transaction_pool_optimization_strategy/IMG_5196.PNG) + +为了打破交易池供不应求的困局,优化交易流水线处理效率,FISCO BCOS区块链系统引入专门的交易验签模块,并将“交易检测员”的“验证签名”职责分担给了这个新模块,且为了进一步提升交易存储效率,交易验签模块并行对交易进行验证。优化交易处理流水线后,“交易检测员”的工作负担轻了很多,交易供应商完全能满足共识模块的交易需求,而且还留有部分存货。 + +![](../../../../images/articles/transaction_pool_optimization_strategy/IMG_5197.PNG) + +优化处理流水线后,"交易检测员"的重活被"人力充足"的"验签模块"分担了,系统性能显著提升:采用并行交易压测,FISCO BCOS区块链系统性能突破了1W。 + +### 交易异步通知 + +通过前面的介绍,大家了解到交易池还承担着交易通知的职责,"交易通知员"也是个忙碌的角色,它需要在收到区块落盘信号后,将所有上链交易通知给客户端,当且仅当共识模块确认上一轮共识的上链交易都会被通知到后,共识模块才会开始下一轮共识,交易同步推送无疑会拖慢共识流程。为了进一步优化流水线处理效率,FISCO BCOS区块链系统采用了交易异步通知策略:存储模块将交易通知结果放置于交易通知队列后直接返回,共识模块直接开始下一轮共识流程,与此同时,交易通知模块将交易执行结果依次返回给客户端。 + +如下图所示: + +![](../../../../images/articles/transaction_pool_optimization_strategy/IMG_5198.PNG) + +采用交易异步通知策略后,交易通知不会阻塞共识流程,大约能提升10%的系统性能。 + +### 双缓存队列 + +FISCO BCOS 2.1之后,FISCO BCOS团队认真统计了每个区块的处理时间,觉得系统性能还有继续上升的空间,于是决定继续优化性能,进一步提升FISCO BCOS区块链系统的处理能力。 + +当存储模块和执行模块性能优化到极致后,可是最终的压测结果总是不符合预期。经过排查发现交易池又出现了供不应求的情况,只是这种供不应求是客户端引起的,客户端发送交易后,大量线程阻塞在等待交易验证通过,返回交易哈希,无法空出更多线程发送新交易。 + +为了提升节点对客户端的响应速度,从而提升客户端交易发送速率,FISCO BCOS区块链系统在“交易供应商”持有的交易储存队列基础上,引入了交易预缓冲区,存放客户端发送到节点的交易,并直接对客户端进行响应。 + +交易预缓冲区会持续将缓存的交易送到"验签模块"和"交易检测员"处进行验证,验证通过的交易最终会被放入到真正的交易队列供交易供应商调度,如下图所示: + +![](../../../../images/articles/transaction_pool_optimization_strategy/IMG_5199.PNG) + +这种双缓存队列机制,大大提升了交易池对客户端的响应速度,客户端也可以持续腾出线程继续发送新交易,优化后,客户端发送性能更高,交易池供大于求。 + +## 小结 + +交易池很忙,FISCO BCOS区块链系统中,交易池更忙,它被用来验证交易、存储交易、防止交易重复验签、向客户端推送交易执行结果等。交易池很重要,FISCO BCOS区块链系统中,交易池更重要,任务繁重的"交易检测员"会大大降低交易插入速率,导致交易供不应求;没有"交易预缓冲区"的交易池会阻塞客户端交易发送线程,降低客户端交易发送速率;交易同步推送,会损耗10%左右的系统性能... ... + +在性能优化的道路上,交易池性能优化一直会被排在重要的位置。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/cachedstorage_deadlock_debug.md b/3.x/zh_CN/docs/articles/3_features/31_performance/cachedstorage_deadlock_debug.md new file mode 100644 index 000000000..6c7e0b6e6 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/cachedstorage_deadlock_debug.md @@ -0,0 +1,75 @@ +# 记一次CachedStorage中死锁的调试经历 + +作者:李陈希|FISCO BCOS 核心开发者 + +在整合FISCO BCOS非国密单测与国密单测的工作中,我们发现CachedStorage的单测偶然会陷入卡死的状态,且可在本地持续复现。复现方式为循环执行CachedStorage单测200次左右,便会发生一次所有线程均陷入等待状态、单测无法继续执行的情况,我们怀疑在CachedStroage中发生了死锁,故对此进行调试。 + +## Debug思路 + +中医治病讲究望闻问切,调试bug同样需要遵循寻找线索、合理推断、验证解决的思路。 + +### 观察线程栈 + +在死锁发生时,使用/usr/bin/sample工具(mac平台环境下)将所有的线程的栈打印出来,观察各线程的工作状态。从所有线程的线程栈中观察到有一个线程(此处称为T1)卡在CachedStorage.cpp的第698行的touchCache函数中,点击参考[具体的代码实现](https://github.com/FISCO-BCOS/FISCO-BCOS/blob/release-2.3.0-bsn/libstorage/CachedStorage.cpp)。 + +![](../../../../images/articles/cachedstorage_deadlock_debug/IMG_5257.PNG) + +从代码片段中可以看到,T1在第691行已经获得了m_cachesMutex的读锁:代码RWMutexScoped(some_rw_mutex, false)的意思是获取某个读写锁的读锁;相应地,代码RWMutexScoped(some_rw_mutex, true)的意思是获取某个读写锁的写锁,这里的RWMutex是一个Spin Lock。 + +随后在第698行处尝试获取某个cache的写锁。除了T1,还有另外一个线程(此处称为T2)卡在CachedStorage.cpp的第691行的touchCache函数中: + +![](../../../../images/articles/cachedstorage_deadlock_debug/IMG_5258.PNG) + +从代码片段中可以看到,T2在第681行已经获得了某个cache的写锁,随后在第691行处尝试获取m_cachesMutex的读锁。 继续观察后还发现若干线程卡在CachedStorage.cpp第673行的touchCache函数中: + +![](../../../../images/articles/cachedstorage_deadlock_debug/IMG_5259.PNG) + +最后还有一个Cache清理线程(此处称为T3)卡在CachedStorage.cpp的第734行的removeCache函数中: + +![](../../../../images/articles/cachedstorage_deadlock_debug/IMG_5260.PNG) + +从代码片段中可以看到,这些线程均没有持任何锁资源,只是在单纯地尝试获取m_cachesMutex的写锁。 + +### 读写饥饿问题 + +初期分析问题时,最诡谲的莫过于:在T1已经获取到m_cachesMutex读锁的情况下,其他同样试图获取m_cachesMutex读锁的线程竟然无法获取到。但是看到T3线程此时正努力尝试获取m_cachesMutex写锁,联想到读写锁饥饿问题,我们认为其他线程获取不到读锁的问题根源很可能就在T3。 + +所谓读写锁饥饿问题是指,在多线程共用一个读写锁的环境中,如果设定只要有读线程获取读锁,后续想获取读锁的读线程都能共享此读锁,则可能导致想获取写锁的写线程永远无法获得执行机会(因为读写锁一直被其他读线程抢占)。为了解决饥饿问题,部分读写锁会在某些情况下提高写线程的优先级,即由写线程先占用写锁,而其他读线程只能在写线程后乖乖排队直到写线程将读写锁释放出来。 + +在上述问题中, T1已经获取了m_cachesMutex的读锁,若此时T3恰好获得时间片并执行到CachedStorage.cpp的第734行,会因获取不到m_cachesMutex的写锁而卡住,随后其他线程也开始执行并到了获取m_cachesMutex读锁的代码行。若读写防饥饿策略真的存在,那这些线程(包括T2)的确会在获取读锁阶段卡住,进而导致T2无法释放cache锁,从而T1无法获取到cache锁,此时所有线程均会陷入等待中。 + +在这个前提下,似乎一切都能解释得通。上述流程的时序图如下所示: + +![](../../../../images/articles/cachedstorage_deadlock_debug/IMG_5261.JPG) + +我们找到了TBB中Spin RW Lock的实现代码,如下图所示: + +获取写锁: + +![](../../../../images/articles/cachedstorage_deadlock_debug/IMG_5262.JPG) + +获取读锁: + +![](../../../../images/articles/cachedstorage_deadlock_debug/IMG_5263.PNG) + +在获取写锁的代码中,可以看到写线程如果没有获取到写锁,会置一个WRITER_PENDING标志位,表明此时正有写线程在等待读写锁的释放,其他线程请勿打扰。 + +而获取的读锁代码中,也可以看到,如果读线程发现锁上被置了WRITER_PENDING标志位,就会老实地循环等待,让写线程优先去获取读写锁。这里读写锁的行为完美符合之前对读写锁防饥饿策略的推测,至此真相大白。既然找到了问题起因,那解决起来就容易多了。在CachedStorage的设计中,Cache清理线程优先级很低,调用频率也不高(约1次/秒),因此给予它高读写锁优先级是不合理的,故将removeCache函数获取m_cachesMutex写锁方式做如下修改: + +![](../../../../images/articles/cachedstorage_deadlock_debug/IMG_5263.PNG) + +修改后,获取写锁方式跟获取读锁类似:每次获取写锁时,先try_acquire,如果没获取到就放弃本轮时间片下次再尝试,直到获取到写锁为止,此时写线程不会再去置WRITER_PENDING标志位,从而能够不影响其他读线程的正常执行。 + +相关代码已提交至2.5版本中,该版本将很快与大家见面,敬请期待。 + +### 实现效果 + +修改前循环执行CachedStorage单测200次左右便会发生死锁;修改后循环执行2000+次仍未发生死锁,且各个线程均能有条不紊地工作。 + +## 经验总结 + +从这次调试过程中,总结了一些经验与大家分享。 + +首先,分析死锁问题最有效的仍然是“两步走”方法,即通过pstack、sample、gdb等工具看线程栈,推测导致发生死锁的线程执行时序。这里的第二步需要多发挥一点想象力。以往的死锁问题往往是两个线程间交互所导致,教科书上也多以两个线程来讲解死锁四要素,但在上述问题中,由于读写锁的特殊性质,需要三个线程按照特殊时序交互才可以引发死锁,算是较为少见的情况。 + +其次,『只要有线程获取到读锁,那其他想获取读锁的线程一定也能获取读锁』的思维定势是有问题的。至少在上面的问题中,防饥饿策略的存在导致排在写线程后的读线程无法获取读锁。但本文的结论并非放之四海而皆准,要不要防饥饿、怎么防饥饿在各个多线程库的实现中有着不同的取舍。有的文章提到过某些库的实现就是遵循『读线程绝对优先』规则,那这些库就不会遇到这类问题,所以仍然需要具体问题具体分析。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/consensus_and_sync_process_optimization.md b/3.x/zh_CN/docs/articles/3_features/31_performance/consensus_and_sync_process_optimization.md new file mode 100644 index 000000000..0abbb1209 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/consensus_and_sync_process_optimization.md @@ -0,0 +1,111 @@ +# 《新摩登时代》:卓别林演绎共识与同步流程优化 + +作者:石翔|FISCO BCOS 核心开发者 + +共识与同步的流程优化,是FISCO BCOS性能优化迈开的第一步。**仅依靠这一流程优化,就给系统TPS带来可观的1.75倍提升。**但这不是目的,其目的在于**确定了共识的主导地位,排除了同步给共识带来的性能影响,让之后的性能分析更好地聚焦在共识流程中。** + +## 基础讲解 + +在卓别林的电影《摩登时代》里,卓别林扮演一个工人,日复一日地重复着拧螺丝的动作:提起扳手,找到零件,对准螺丝,拧紧,再提起扳手,再找到下一个零件,再对准螺丝,再拧紧...... 在FISCO BCOS的设计里,共识和同步也在干着这样重复的事情。 + +## 共识与同步是个啥? + +共识与同步,是FISCO BCOS节点中的两个核心流程。它们相互配合,实现了区块链的核心功能:生产出一条在每个节点上都一致的区块链。在FISCO BCOS节点的实现里,共识和同步的实体,我们称为共识模块和同步模块。 + +- **共识模块**:负责生产区块,让节点产生的区块都是一模一样的 + +- **同步模块**:负责广播交易,让用户发出的交易尽可能地到达每个节点 + +## 共识与同步在干啥? + +我们来看看共识模块和同步模块的工作环境: +- **交易池**:节点中缓存未被处理交易的容器 +- **网络模块**:接收其它节点发来的消息包,也可向其它节点发送消息包 那么,共识模块与同步模块在干啥? + +### 共识模块 + +不断进行共识消息的处理和发送,让所有节点上的区块达到一致,此处以PBFT的共识为例。 + +1. **打包区块**:从交易池拿取出交易,打包成区块广播出去,或处理从网络模块拿到的其它节点的区块 +2. **执行区块**:解码区块,验证区块,执行区块,将区块的执行结果签个名广播出去 +3. **收集签名**:收集其它节点执行结果的签名,如果收集到的签名达到一定数量,就向其它节点广播“commit消息” +4. **收集commit**:收集其它节点的commit消息,当收集到的commit消息达到一定数量,说明区块已经一致,可以落盘了 +5. **落盘**:把区块连接到现有区块链的末端,形成区块链,存储到DB中 + +![](../../../../images/articles/consensus_and_sync_process_optimization/IMG_5231.JPG) + +### 同步模块 + +不断进行交易的收发,让每一笔交易尽可能地到达每个节点。 + +1. **取交易**:从交易池中取出未发送的交易 +2. **发交易**:把未发送的交易广播给其它节点 +3. **收交易**:从网络模块收取其它节点的交易 +4. **验交易**:对交易进行解码和验签 +5. **存交易**:把验签通过的交易存到交易池中 + +![](../../../../images/articles/consensus_and_sync_process_optimization/IMG_5232.JPG) + +## 问题与优化 + +卓别林和他的伙伴各司其职,井然有序,看似非常和谐。可当工厂落后的生产力跟不上旺盛的市场需求,即便是卓别林这种熟练工,加班加点也干不完。这个时候,卓别林不得不开始思考自己和伙伴在生产关系上的问题。 + +在以往的设计中,共识模块和同步模块并没有优先级的区分,导致它们在争夺资源时浪费了大量的时间。同时,共识模块和同步模块中还有很多重复的操作,也浪费了时间。因此,应该将共识模块和同步模块的执行流程一并考虑,优化流程,提高效率。在经过详细分析和缜密验证后,FISCO BCOS将共识模块和同步模块流程进行了优化。优化基于以下思想: + +**共识模块负责主导整个区块链出块的节奏,应让共识模块先行。而同步模块,理应扮演好配合的角色,辅佐共识模块更快出块。** + +基于上述思想,我们来看看其中几个问题的优化方法。 + +### 问题1:工作阻塞 + +共识模块与同步模块都是从网络模块中获取消息包,再根据相应消息包进行下一步操作。但是,由于网络回调线程数量的限制,同步模块在处理消息包时,占用了网络的回调线程,导致共识模块无法及时处理其它节点发来的共识消息,共识流程被阻塞。 + +![](../../../../images/articles/consensus_and_sync_process_optimization/IMG_5233.JPG) + +### 如何解决?——将同步消息的处理操作从网络回调线程中剥离 + +基于共识模块先行的思想,应让共识模块更及时地收到共识消息,不能让同步模块占用网络回调线程太久。因此,同步模块在拿到消息时,不是直接在回调线程中对交易进行解码和验签,而是将同步消息包缓存起来,用另外一个线程“私下”慢慢处理。这样一来,同步消息的处理不会长时间占用网络回调线程,能让共识消息响应得更快。 + +![](../../../../images/articles/consensus_and_sync_process_optimization/IMG_5234.JPG) + +### 问题2:编解码冗余 + +同步模块收到同步消息中的交易,是经过编码的,同步模块需将其解码成节点代码中的数据结构,再存入交易池中。共识模块打包区块时,把交易从交易池中取出,将交易进行编码,打包成区块,再将区块发送出去。在这个过程中,交易先被解码,又被编码,操作存在冗余。 + +![](../../../../images/articles/consensus_and_sync_process_optimization/IMG_5235.JPG) + +### 如何解决?——交易编码缓存 + +共识优先级高于同步,应尽量减少共识模块中不必要的操作。因此,在同步模块存交易时,一并将交易的编码存入交易池。共识模块取交易时,直接从交易池中拿出编码好的交易,免去了编码操作。 + +![](../../../../images/articles/consensus_and_sync_process_optimization/IMG_5236.JPG) + +### 问题3:重复验签 + +同步模块在收到交易后,需对交易的签名进行验证(简称“验签”),共识模块在收到区块后,也需要对区块中的交易进行验签。同步模块和共识模块所验签的交易,有很大概率是重复的。验签是一个非常耗时的操作,每进行一次额外的验签,都会消耗大量的时间。 + +![](../../../../images/articles/consensus_and_sync_process_optimization/IMG_5237.JPG) + +### 如何解决?——验签去重 + +无论是同步模块还是共识模块,在验签前,都去交易池里查询该笔交易是否存在。如果存在,就省略验签操作。如此一来,一笔交易只验签一次,减少了不必要的验签开销。 + +![](../../../../images/articles/consensus_and_sync_process_optimization/IMG_5238.JPG) + +### 解决方案可否更优?——尽量让同步验签,减少共识模块验签的次数 + +仍然是共识模块优先的思想,尽量减少共识模块验签的操作。因此,同步模块必须比共识模块跑得快,在共识模块处理一笔交易前,同步模块先拿到交易,优先对交易验签。 + +![](../../../../images/articles/consensus_and_sync_process_optimization/IMG_5239.JPG) + +FISCO BCOS在此处对同步模块采取的策略是:**对交易进行全量的广播**。 + +在一个打包节点拿到交易时,其它节点的同步模块也收到了相应的交易。在其它节点收到打包节点发过去的区块时,区块中所包含的交易早已被同步模块验签后写入交易池中。同时,为了让同步模块在相同操作的处理速度上不低于共识模块,同步模块的交易编解码,也采用了和共识模块一样的“并行编解码”和“交易编码缓存”。 + +## 结果如何? + +共识与同步的流程优化,一定程度上也提高了交易处理的TPS。经测试,交易处理的TPS提高至原来的1.75倍!更重要的是,通过流程优化,确定了共识的主导地位,排除了同步给共识带来的性能影响,让之后的性能分析更好地聚焦在共识流程中! + +消除了阻塞,消除了编码冗余,消除了重复验签,卓别林和他的伙伴工作得更轻松,更顺畅了! + +下篇文章,我们将集中阐述并行优化,让可并行的操作都并行起来!敬请期待《**全方位的并行处理**》。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/dag-based_parallel_transaction_execution_engine.md b/3.x/zh_CN/docs/articles/3_features/31_performance/dag-based_parallel_transaction_execution_engine.md new file mode 100644 index 000000000..66a19edf4 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/dag-based_parallel_transaction_execution_engine.md @@ -0,0 +1,190 @@ +# 区块链性能腾飞:基于DAG的并行交易执行引擎 + +作者:李陈希|FISCO BCOS 核心开发者 + +在区块链世界中,交易是组成事务的基本单元。交易吞吐量很大程度上能限制或拓宽区块链业务的适用场景,愈高的吞吐量,意味着区块链能够支持愈广的适用范围和愈大的用户规模。当前,反映交易吞吐量的TPS(Transaction per Second,每秒交易数量)是评估性能的热点指标。为了提高TPS,业界提出了层出不穷的优化方案,殊途同归,各种优化手段的最终聚焦点,均是尽可能提高交易的并行处理能力,降低交易全流程的处理时间。 + +在多核处理器架构已经成为主流的今天,利用并行化技术充分挖掘CPU潜力是行之有效的方案。FISCO BCOS 2.0 中设计了一种基于DAG模型的并行交易执行器(PTE,Parallel Transaction Executor)。 + +PTE能充分发挥多核处理器优势,使区块中的交易能够尽可能并行执行;同时对用户提供简单友好的编程接口,使用户不必关心繁琐的并行实现细节。基准测试程序的实验结果表明:相较于传统的串行交易执行方案,理想状况下4核处理器上运行的PTE能够实现约200%~300%的性能提升,且计算方面的提升跟核数成正比,核数越多性能越高。 + +PTE为助力FISCO BCOS性能腾飞奠定了坚实基础,本文将全面介绍PTE的设计思路及实现方案,主要包括以下内容: + +- **背景**:传统方案的性能瓶颈与DAG并行模型的介绍 +- **设计思路**:PTE应用到FISCO BCOS中时遇到的问题以及解决方案 +- **架构设计**:应用PTE后FISCO BCOS的架构及核心流程 +- **核心算法**:介绍主要用到的数据结构与主要算法 +- **性能测评**:分别给出PTE的性能与可扩展性测试结果 + +## 背景 + +FISCO BCOS交易处理模块可以被抽象为一个基于交易的状态机。在FISCO BCOS中,『状态』即是指区块链中所有账户的状态,而『基于交易』即是指FISCO BCOS将交易作为状态迁移函数,并根据交易内容从旧的状态更新为新的状态。FISCO BCOS从创世块状态开始,不断收集网络上发生的交易并打包为区块,并在所有参与共识的节点间执行区块中的交易。当一个区块内的交易在多个共识节点上执行完成且状态一致,则我们称在该块上达成了共识,并将该区块永久记录在区块链中。 + +从上述区块链的打包→共识→存储过程中可以看到,执行区块中的所有交易是区块上链的必经之路。传统交易执行方案是:执行单元从待共识的区块逐条读出交易,执行完每一笔交易后,状态机都会迁移至下一个状态,直到所有交易都被串行执行完成,如下图所示: + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5175.PNG) + +显而易见,这种交易执行方式对性能并不友好。即使两笔交易没有交集,也只能按照先后顺序依次执行。就交易间的关系而言,既然一维的『线』结构有这般痛点,那何不把目光投向二维的『图』结构呢? + +在实际应用中,根据每笔交易执行时需要使用的互斥资源(互斥意味着对资源的排他性使用,比如在上述转账问题互斥资源中,指的就是各个账户的余额状态), 我们可以组织出一张交易依赖关系图,为防止交易依赖关系在图中成环,我们可以规定交易列表中牵涉到相同的互斥资源,且排序靠后的交易,必须等待靠前的交易完成后才被执行,由此得到的输出便是一张反映交易依赖关系的有向无环图,即交易DAG。 + +如下图所示,左侧的6笔转账交易可以组织为右侧的DAG形式: + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5176.PNG) + + +在交易DAG中,入度为0的交易是没有任何依赖项、可以被立即投入运行的就绪交易。当就绪交易的数量大于1时,就绪交易可以被分散至多个CPU核心上并行执行。当一笔交易执行完,依赖于该交易的所有交易的入度减1,随着交易不断被执行,就绪交易也源源不断被产生。在极限情况下,假如构造出的交易DAG层数为1 (即所有交易均是没有依赖项的独立交易),则交易整体执行速度的提升倍数将直接取决于处理器的核心数量n,此时若n大于区块内的交易数,则区块内所有交易的执行时间与单笔交易执行的时间相同。 + +理论上拥有如此让人无法拒绝的优美特性的交易DAG模型,该如何应用至FISCO BCOS中? + +## 设计思路 + +**要应用交易DAG模型,我们面临的首要问题便是:对于同一个区块,如何确保所有节点执行完后能够达到同一状态,这是一个关乎到区块链能否正常出块的关键问题。** + +FISCO BCOS采用验证(state root, transaction root, receipt root)三元组是否相等的方式,来判断状态是否达成一致。transaction root是根据区块内的所有交易算出的一个哈希值,只要所有共识节点处理的区块数据相同,则transaction root必定相同,这点比较容易保证,因此重点在于如何保证交易执行后生成的state和receipt root也相同。 + +众所周知,对于在不同CPU核心上并行执行的指令,指令间的执行顺序无法提前预测,并行执行的交易也存在同样情况。在传统的交易执行方案中,每执行一笔交易,state root便发生一次变迁,同时将变迁后的state root写入交易回执中,所有交易执行完后,最终的state root就代表了当前区块链的状态,同时再根据所有交易回执计算出一个receipt root。 + +可以看出,在传统的执行方案中,state root扮演着一个类似全局共享变量的角色。当交易被并行且乱序执行后,传统计算state root的方式显然不再适用,这是因为在不同的机器上,交易的执行顺序一般不同,此时无法保证最后的state root能够一致,同理,receipt root也无法保证一致。 + +在FISCO BCOS中,我们采用的解决方案是先执行交易,将每笔交易对状态的改变历史记录下来,待所有交易执行完后,再根据这些历史记录再算出一个state root,同时,交易回执中的state root,也全部变为所有交易执行完后最终的state root,由此就可以保证即使并行执行交易,最后共识节点仍然能够达成一致。 + +**搞定状态问题后,下一个问题便是:如何判断两笔交易之间是否存在依赖关系?** + +若两笔交易本来无依赖关系但被判定为有,则会导致不必要的性能损失;反之,如果这两笔交易会改写同一个账户的状态却被并行执行了,则该账户最后的状态可能是不确定的。因此,依赖关系的判定是影响性能甚至能决定区块链能否正常工作的重要问题。 + +在简单的转账交易中,我们可以根据转账的发送者和接受者的地址,来判断两笔交易是否有依赖关系,比如如下3笔转账交易:A→B,C→D,D→E,可以很容易看出,交易D→E依赖于交易C→D的结果,但是交易A→B和其他两笔交易没有什么关系,因此可以并行执行。 + +这种分析在只支持简单转账的区块链中是正确的,但是一旦放到图灵完备、运行智能合约的区块链中,则可能不那么准确,因为我们无法准确知道用户编写的转账合约中到底有什么操作,可能出现的情况是:A->B的交易看似与C、D的账户状态无关,但是在用户的底层实现中,A是特殊账户,通过A账户每转出每一笔钱必须要先从C账户中扣除一定手续费。在这种场景下,3笔交易均有关联,则它们之间无法使用并行的方式执行,若还按照先前的依赖分析方法对交易进行划分,则必定会掉坑。 + +我们能否做到根据用户的合约内容自动推导出交易中实际存在哪些依赖项?答案是不太靠谱。我们很难去追踪用户合约中到底操作了什么数据,即使做到也需要花费不小的成本,这和我们优化性能的目标相去甚远。 + +综上,我们决定在FISCO BCOS中,将交易依赖关系的指定工作交给更熟悉合约内容的开发者。具体地说,交易依赖的互斥资源可以由一组字符串表示,FISCO BCOS暴露接口给到开发者,开发者以字符串形式定义交易依赖的资源,告知链上执行器,执行器则会根据开发者指定的交易依赖项,自动将区块中的所有交易排列为交易DAG。比如在简单转账合约中,开发者仅需指定每笔转账交易的依赖项是{发送者地址+接收者地址}。进一步地,如开发者在转账逻辑中引入了另一个第三方地址,那么依赖项就需要定义为{发送者地址+接受者地址+第三方地址}了。 + +这种方式实现起来较为直观简单,也比较通用,适用于所有智能合约,但也相应增加了开发者肩上的责任,开发者在指定交易依赖项时必须十分小心,如果依赖项没有写正确,后果无法预料。指定依赖项的相关接口会在后续文章中给出使用教程,本文暂且假定所有谈论到的交易依赖项都是明确无误的。 + +**解决完上面两个比较重要的问题后,还剩下一些较为细节的工程问题:比如并行交易能否和非并行交易混合到一起执行?怎么保证资源字符串的全局唯一性?** + +答案也不复杂,前者可通过将非并行交易作为屏障(barrier)插入到交易DAG中——即我们认为,它即依赖于它的所有前序交易,同时又被它的所有后序交易依赖——来实现;后者可以通过在开发者指定的交易依赖项中,加入标识合约的特殊标志位解决。由于这些问题并不影响PTE的根本设计,本文暂不展开。 + +万事俱备,带着全新交易执行引擎PTE的FISCO BCOS已经呼之欲出。 + +## 架构设计 + +**搭载PTE的FISCO BCOS架构图:** + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5177.PNG) + +**整个架构的核心流程如下:** + +用户通过SDK等客户端将交易发送至节点,此处的交易既可以是可并行执行的交易,也可以是不能并行执行的交易。随后交易在节点间同步,同时拥有打包权的节点调用打包器(Sealer),从交易池(Tx Pool)中取出一定量交易并将其打包成一个区块。此后,区块被发送至共识单元(Consensus)准备进行节点间共识。 + +共识前需要执行区块中的交易,此处便是PTE施展威力之处。从架构图中可以看到,PTE首先按序读取区块中的交易,并输入到DAG构造器(DAG Constructor)中,DAG构造器会根据每笔交易的依赖项,构造出一个包含所有交易的交易DAG,PTE随后唤醒工作线程池,使用多个线程并行执行交易DAG。汇合器(Joiner)负责挂起主线程,直到工作线程池中所有线程将DAG执行完毕,此时Joiner负责根据各个交易对状态的修改记录计算state root及receipt root,并将执行结果返回至上层调用者。 + +在交易执行完成后,若各个节点状态一致,则达成共识,区块随即写入底层存储(Storage),被永久记录于区块链上。 + +## 核心算法 + +### 1.交易DAG的数据结构 + +交易DAG的数据结构如下图所示: + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5178.PNG) + +**Vertex类**为最基础里的类型,在交易DAG中,每一个Vertex实例都表征一笔交易。Vertex类包含: + +- **inDegree**:表示该顶点的入度 +- **outEdges**:用于存储该节点的出边信息,即所有出边所连顶点的ID列表 + +**DAG类**用于对DAG的顶点与边关系进行封装,并提供操作DAG的接口,其包含: + +- **vtxs**:Vertex数组 +- **topLevel**:包含所有入度为0的顶点的队列,由于在执行过程中topLevel会动态变化且会被多个线程访问,因此其需要一个能够支持线程安全访问的容器 +- **void init(int32_t size)接口**:根据传入的size初始化一个包含相应数量顶点的DAG结构 +- **addEdge(ID from, ID to)接口**:用于在顶点from和顶点to之间建立边关系,具体地说,将顶点to的ID加入顶点from的outEdges中 +- **void generate()接口**:当所有的边关系录入完毕后,调用该方法以初始化topLevel成员 +- **ID waitPop()接口**:从topLevel中获取一个入度为0的顶点ID + +**TxDAG类**是DAG类更上一层的封装,是DAG与交易之间建立联系的桥梁,其包含: + +- **dag**:持有的DAG类实例 +- **exeCnt**:已执行过的交易总数 +- **totalTxs**:交易总数 +- **txs**:区块中的交易列表 + +### 2. 交易DAG的构造流程 + +DAG构造器在构造交易DAG时,会首先将totalTxs成员的值设置为区块中的交易总数,并依据交易总数对dag对象进行初始化,dag会在vtxs中为每笔交易生成一个位置关系一一对应的顶点实例。随后,初始化一个空的资源映射表criticalFields,并按序逐个扫描每笔交易。 + +对于某笔交易tx,DAG构造器会在其解析出该交易的所有依赖项,对于每个依赖项均会去criticalFields中查询,如果对于某个依赖项d,有前序交易也依赖于该依赖项,则在这两笔交易间建边,并更新criticalFields中d的映射项为tx的ID。 + +交易DAG构造流程的伪代码如下所示: + +``` +criticalFields ← map(); +totalTxs ← txs.size(); +dag.init(txs.size()); +for id ← 0 to txs.size() by 1 do + tx ← txs[id]; + dependencies ← 解析出tx的依赖项; + for d in dependencies do + if d in criticalFields then + dag.addEdge(id, criticalFields[d]); + end + criticalFields[d] = id; + end + end +end +dag.generate(); +``` + +### 3.交易DAG的执行流程 + +PTE在被创建时,会根据配置生成一个用于执行交易DAG的工作线程池,线程池的大小默认等于CPU的逻辑核心数,此线程池的生命周期与PTE的生命周期相同。工作线程会不断调用dag对象的waitPop方法以取出入度为0的就绪交易并执行,执行后该交易的所有后序依赖任务的入度减1,若有交易的入度被减至0,则将该交易加入到topLevel中。循环上述过程,直到交易DAG执行完毕。 + +交易DAG执行流程的伪代码如下所示: + +``` +while exeCnt < totalTxs do + id ← dag.waitPop(); + tx ← txs[id]; + 执行tx; + exeCnt ← exeCnt + 1; + for txID in dag.vtxs[id].outEdges do + dag.vtxs[txID].inDegree ← dag.vtxs[txID].inDegree - 1; + if dag.vtxs[txID].inDegree == 0 then + dag.topLevel.push(txID) + end + end +end +``` + +## 性能测评 + +我们选用了2个基准测试程序,用以测试PTE给FISCO BCOS的性能带来了怎样的变化,它们分别是基于预编译框架实现的转账合约和基于Solidity语言编写的转账合约,两份合约代码的路径分别为: + +FISCO-BCOS/libprecompiled/extension/DagTransferPrecompiled.cpp + +web3sdk/src/test/resources/contract/ParallelOk.sol + +我们使用一条单节点链进行测试,因为我们主要关注PTE的交易处理性能,因此并不考虑网络、存储的延迟带来的影响。 + +**测试环境的基本硬件信息如下表所示**: + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5179.PNG) + +### 1.性能测试 + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5180.JPG) + +性能测试部分,我们主要测试PTE和串行交易执行方式(Serial)在各个测试程序下的交易处理能力。可以看到,相对于串行执行方式,PTE从左至右分别实现了2.91和2.69倍的加速比。无论是对于预编译合约还是Solidity合约,PTE均有着不俗的性能表现。 + +### 2.可扩展性测试 + +![](../../../../images/articles/dag-based_parallel_transaction_execution_engine/IMG_5181.JPG) + +可扩展性测试部分,我们主要测试PTE在不同CPU核心数下的交易处理能力,使用的基准测试程序是基于预编译框架实现的转账合约。可以看到,随着核数增加,PTE的交易吞吐量呈近似线性递增。但是同时也能看到,随着核数在增加,性能增长的幅度在放缓,这是因为随着核数增加线程间调度及同步的开销也会增大。 + +#### 写在最后 + +从列表到DAG,PTE赋予了FISCO BCOS新的进化。更高的TPS会将FISCO BCOS带至更加广阔的舞台。予以长袖,FISCO BCOS必能善舞! \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/flow_control.md b/3.x/zh_CN/docs/articles/3_features/31_performance/flow_control.md new file mode 100644 index 000000000..b2ad38998 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/flow_control.md @@ -0,0 +1,159 @@ +# FISCO BCOS流量控制实现 + +作者:陈宇杰|FISCO BCOS 核心开发者 + +## 引言 + +区块链系统作为分布式系统,面对大数据量突发请求场景,暴涨的请求容易引起区块链服务或接口不可用,严重时可能导致整个区块链系统陷入雪崩状态。 + +为了提供更稳定可靠、柔性可用的服务,FISCO BCOS v2.5版本引入了流量控制功能,从节点和群组两个维度进行限流,一方面,面对大数据量突发请求时对区块链系统进行保护,保证系统能正常运行,提升系统可用性;另一方面降低区块链节点间、群组间的资源干扰,提升区块链系统的服务质量。 + +## 为什么引入流量控制 + +FISCO BCOS引入流量控制,旨在: + +- 应对大数据量突发请求 +- 降低区块链节点间、群组间的资源干扰 +- 降低模块间的相互影响 + +### 应对大数据量突发请求 + +![](../../../../images/articles/flow_control/IMG_5265.PNG) + +上图对比了**无流量控制功能**和**带有流量控制功能**的区块链系统面对大数据量突发请求时的处理情况。 + +假设该区块链系统处理能力为2W,当业务以20W请求速率访问区块链节点时: + +- **无流量控制**的场景下,系统对业务请求**照单全收**,导致内部积压的请求数目越来越多,区块链节点响应速度越来越慢,若业务持续以高于系统处理能力的速率发起请求,最终整个系统可能会陷入雪崩状态,无法响应任何业务请求。 +- 加入了**流量控制功能**后,流量控制模块会**根据****系统处理能力过滤业务请求**。在业务请求速率超出系统处理能力时,流量控制模块会拒绝剩余的处理请求,使系统维持"收支平衡"的健康状态;并将请求过载的信息返回给业务,业务可根据该信息自适应地调整请求速率,对区块链系统进行保护。 + +简而言之,引入流量控制模块就是给区块链系统加上一层安全保护罩,让系统在接收大数据量突发请求的场景下可以健壮工作,正常响应业务请求。 + +### 降低区块链节点间/群组间资源干扰 + +![](../../../../images/articles/flow_control/IMG_5266.PNG) + +注:图中两个节点属于两条不同的链,接入了两个不同服务 + +如上图,当多个区块链节点部署于同一台机器时,会出现资源竞争的问题,某些节点占用过多系统资源会影响到其他节点的正常服务。 + +- t1时刻,业务1持续以1W的请求速率请求左边节点,该节点流量激增,系统接收并处理请求后,使用了90%的CPU +- 经过t时间间隔,业务2以5000的请求速率请求右边节点,该节点资源匮乏,只能抢占到10%的CPU,响应速度很慢 + +上述场景中,左边节点因占用过多系统资源影响了右边节点的服务质量。引入流量控制后,可限制每个节点接收请求的速率,控制每个区块链节点的资源占用,避免因区块链节点资源竞争导致的服务质量下降或服务不可用问题。 + +仍以上图为例: + +- t1时刻,业务1持续以1W的请求速率请求节点1,节点1流量控制模块根据配置的请求阈值拒绝多余的请求(这里设阈值为5000),机器CPU占用率维持在50% +- 业务1收到"流量过载"的响应后,可将其请求速率调整到5000 +- 经过t时间间隔,业务2以5000的请求速率请求节点2,此时机器还剩余50%的 CPU,足以处理5000个请求,业务2的请求得到正常响应 + +类似于一台机器上运行多个区块链节点时会发生资源竞争,多群组架构下,群组间也存在资源竞争,某个群组占用过多资源同样会影响到其他群组的服务质量,采用群组级别的流量控制是解决群组间资源竞争的良方。 + +### 降低模块间相互影响 + +同一个节点或群组内的不同模块,也存在资源竞争问题,主要是网络资源竞争,存在网络资源竞争的模块包括: + +- 共识模块 +- 交易同步模块 +- 区块同步模块 +- AMOP模块 + +其中共识模块、交易同步模块是决定区块链系统服务质量的关键模块,其他模块过多占用网络资源,会影响这些关键模块,进而影响系统可用性。FISCO BCOS实现了模块级别的流量控制,通过控制非关键的网络流量,优先保证关键模块服务质量,提升系统健壮性。 + +## 流量控制的功能 + +FISCO BCOS从节点和群组两个维度实现了业务到节点的请求速率限制和模块粒度的网络流量限制。前者限制业务到节点的请求速率,以应对大数据量突发请求,保证区块链节点的柔性服务;后者通过限制区块同步、AMOP等非关键模块的网络流量,优先保证共识、交易同步等关键模块的性能和稳定性。 + +![](../../../../images/articles/flow_control/IMG_5267.PNG) + +- **节点级别请求速率限制**:限制业务到节点的总请求速率,当请求速率超过指定阈值后,节点会拒绝业务请求,避免节点过载,防止过多的请求导致节点异常;控制节点资源使用量,降低区块链节点之间的资源竞争 +- **节点级别的流量控制**:限制节点的平均出带宽,当节点平均出带宽超过设置阈值后,节点收到区块同步请求后会暂缓发送区块、拒绝收到的AMOP请求,避免区块同步、AMOP消息包发送对节点共识的影响 + +群组维度上,主要功能包括: + +- **群组级别请求速率限制**:限制业务到群组的请求速率,当请求速率超过阈值后,群组会拒绝业务请求,该功能可在大数据量突发请求的场景下保护区块链节点,控制群组资源使用量,降低群组间的资源竞争 +- **群组级别的流量控制**:限制每个群组的平均出带宽,当群组平均出带宽流量超过设置阈值后,该群组会暂停区块发送和AMOP请求包转发逻辑,优先将网络流量提供给共识模块使用 + +**当节点和群组都开启请求速率限制时:** + +节点收到业务发送的请求包时,首先调用节点级别请求速率限制模块判断是否接收该请求,如请求被接收,则进入群组级别请求速率限制模块,通过该模块检查后的请求才会被转发到相应群组,进行处理。 + +**当节点和群组都开启网络流量控制功能时:** + +1、节点收到客户端AMOP请求,首先调用节点级流量控制模块判断是否接收该AMOP请求 + +2、当某个群组收到其他节点对应群组的区块请求后,群组在回复区块之前,需要: + +- 调用节点级流量控制模块,判断节点平均出带宽是否超过设置阈值 +- 调用群组级流量控制模块,判断群组出带宽是否超过设置阈值,当且仅当节点级和群组级平均出带宽均未超过设置阈值时,该群组才会回复区块请求 + +## 如何使用流量控制功能 + +流量控制配置分别位于config.ini和group.i.ini配置文件的[flow_control]配置项中,分别对应为节点级别流量控制配置和群组级别流量控制。这里向大家介绍如何启用、关闭、配置流量控制。 + +### 节点级流量控制 + +节点级别的网络流量控制配置项均位于config.ini配置文件中,主要包括: + +### 请求速率限制 + +节点级别的请求速率限制位于配置项[flow_control].limit_req中,用于限制业务每秒到节点的最大请求数目,当请求数目超过设置阈值时,请求会被拒绝。**该配置项默认关闭**,若要开启,请将limit_req配置项前面的;去掉。 + +打开请求速率限制并设计节点每秒可接受2000个业务请求的示例如下: + +``` +[flow_control] + ; restrict QPS of the node + limit_req=2000 +``` + +### 网络流量限制 + +- [flow_control].outgoing_bandwidth_limit:节点出带宽限制,单位为Mbit/s,当节点出带宽超过该值时,会暂缓区块发送,也会拒绝客户端发送的AMOP请求,但不会限制区块共识和交易广播的流量。**该配置项默认关闭**,若要开启,请将outgoing_bandwidth_limit配置项前面的;去掉。 + +打开节点出带宽流量限制,并将其设置为5MBit/s的配置示例如下: + +``` +[flow_control] + ; Mb, can be a decimal + ; when the outgoing bandwidth exceeds the limit, the block synchronization operation will not proceed + outgoing_bandwidth_limit=5 +``` + +### 群组级流量控制 + +群组级别的网络流量控制配置项均位于group.i.ini配置文件中,主要包括: + +### 请求速率限制 + +群组i的请求速率限制位于group.i.ini的配置项[flow_control].limit_req中,限制业务每秒到群组的最大请求数目,当请求数目超过配置项的值时,请求会被拒绝。该配置项默认关闭,若要开启,请将limit_req配置项前面的;去掉。 + +打开请求速率限制并配置群组每秒可接受1000个业务请求的示例如下: + +``` +[flow_control] + ; restrict QPS of the group + limit_req=1000 +``` + +### 群组内网络流量限制 + +[flow_control].outgoing_bandwidth_limit:群组出带宽限制,单位为Mbit/s,当群组出带宽超过该值时,会暂缓发送区块,但不会限制区块共识和交易广播的流量。**该配置项默认关闭**,若要开启,请将outgoing_bandwidth_limit配置项前面的;去掉。 + +打开群组出带宽流量限制,并将其设置为2MBit/s的配置示例如下: + +``` +[flow_control] + ; Mb, can be a decimal + ; when the outgoing bandwidth exceeds the limit, the block synchronization operation will not proceed + outgoing_bandwidth_limit=2 +``` + +## 总结 + +随着区块链技术的发展,越来越多应用部署于区块链系统中,对区块链系统服务质量的要求也日渐提升,区块链系统的柔性可用、稳定健壮变得更加重要。 + +FISCO BCOS v2.5引入流量控制功能,是FISCO BCOS对区块链柔性服务探索的重要一步。 + +社区将持续打磨,优化区块链系统服务质量,希望未来能为海量业务场景提供更好的、高可用的柔性服务。如何做好流量控制的同时,又不影响原本系统性能?敬请关注社区后续文章,为您详解流量控制策略的具体实现原理。欢迎大家共同探讨交流,积极反馈使用的体验与改进建议。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/index.md b/3.x/zh_CN/docs/articles/3_features/31_performance/index.md new file mode 100644 index 000000000..41459fc86 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/index.md @@ -0,0 +1,22 @@ +### FISCO BCOS性能 + +峰值TPS:2万+ TPS(PBFT) + +交易确认时延:秒级 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + performance_optimization.md + dag-based_parallel_transaction_execution_engine.md + consensus_and_sync_process_optimization.md + parallel_transformation.md + performance_optimization_tools.md + parallel_contract_development_framework_with_tutorials.md + sync_and_its_performance_optimization.md + sync_optimization.md + cachedstorage_deadlock_debug.md + flow_control.md +``` + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/parallel_contract_development_framework_with_tutorials.md b/3.x/zh_CN/docs/articles/3_features/31_performance/parallel_contract_development_framework_with_tutorials.md new file mode 100644 index 000000000..70af33815 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/parallel_contract_development_framework_with_tutorials.md @@ -0,0 +1,417 @@ +# FISCO BCOS可并行合约开发框架(附实操教程) + +作者:石翔|FISCO BCOS 核心开发者 + +本专题系列文章追到现在,也许你会想问,FISCO BCOS的并行到底怎么用?作为专题的完结篇,本文就来揭晓“庐山真面目”,并教你上手使用FISCO BCOS的并行特性!FISCO BCOS提供了可并行合约开发框架,开发者按照框架规范编写的合约,能够被FISCO BCOS节点并行地执行。并行合约的优势有: + +- **高吞吐**:多笔独立交易同时被执行,能最大限度利用机器的CPU资源,从而拥有较高的TPS +- **可拓展**:可以通过提高机器的配置来提升交易执行的性能,以支持不断扩大业务规模 + +接下来,我将介绍如何编写FISCO BCOS并行合约,以及如何部署和执行并行合约。 + +## 预备知识 + +### 并行互斥 + +两笔交易是否能被并行执行,依赖于这两笔交易是否存在**互斥**。互斥,是指两笔交易各自**操作合约存储变量的集合存在交集**。 + +例如,在转账场景中,交易是用户间的转账操作。用transfer(X, Y) 表示从X用户转到Y用户的转账接口。互斥情况如下: + +![](../../../../images/articles/parallel_contract_development_framework_with_tutorials/IMG_5187.PNG) + +此处给出更具体的定义: + +- **互斥参数:**合约**接口**中,与合约存储变量的“读/写”操作相关的参数。例如转账的接口transfer(X, Y),X和Y都是互斥参数。 + +- **互斥对象**:一笔**交易**中,根据互斥参数提取出来的、具体的互斥内容。例如转账的接口transfer(X, Y), 一笔调用此接口的交易中,具体的参数是transfer(A, B),则这笔操作的互斥对象是[A, B];另外一笔交易,调用的参数是transfer(A, C),则这笔操作的互斥对象是[A, C]。 + +**判断同一时刻两笔交易是否能并行执行,就是判断两笔交易的互斥对象是否有交集。相互之间交集为空的交易可并行执行。** + +## 编写并行合约 + +FISCO BCOS提供了**可并行合约开发框架**,开发者只需按照框架的规范开发合约,定义好每个合约接口的互斥参数,即可实现能被并行执行的合约。当合约被部署后,FISCO BCOS会在执行交易前,自动解析互斥对象,在同一时刻尽可能让无依赖关系的交易并行执行。 + +目前,FISCO BCOS提供了solidity与预编译合约两种可并行合约开发框架。 + +### solidity合约的并行框架 + +编写并行的solidity合约,开发流程与开发普通solidity合约流程相同。在此基础上,只需将ParallelContract 作为需要并行的合约基类,并调用registerParallelFunction(),注册可以并行的接口即可。 + +先给出完整的举例。例子中的ParallelOk合约实现了并行转账的功能: + +``` +pragma solidity ^0.4.25; +import "./ParallelContract.sol"; // 引入ParallelContract.sol +contract ParallelOk is ParallelContract // 将ParallelContract 作为基类 +{ + // 合约实现 + mapping (string => uint256) _balance; + + function transfer(string from, string to, uint256 num) public +{ + // 此处为简单举例,实际生产中请用SafeMath代替直接加减 + _balance[from] -= num; + _balance[to] += num; + } +​ + function set(string name, uint256 num) public +{ + _balance[name] = num; + } +​ + function balanceOf(string name) public view returns (uint256) +{ + return _balance[name]; + } + + // 注册可以并行的合约接口 + function enableParallel() public +{ + // 函数定义字符串(注意","后不能有空格),参数的前几个是互斥参数(设计函数时互斥参数必须放在前面 + registerParallelFunction("transfer(string,string,uint256)", 2); // 冲突参数: string string + registerParallelFunction("set(string,uint256)", 1); // 冲突参数: string + } +​ + // 注销并行合约接口 + function disableParallel() public +{ + unregisterParallelFunction("transfer(string,string,uint256)"); + unregisterParallelFunction("set(string,uint256)"); + } +} +``` + +具体步骤如下: + +#### step1 将ParallelContract作为合约的基类 + +``` +pragma solidity ^0.4.25; +​ +import "./ParallelContract.sol"; // 引入ParallelContract.sol +​ +contract ParallelOk is ParallelContract // 将ParallelContract 作为基类 +{ + // 合约实现 + + // 注册可以并行的合约接口 + function enableParallel() public; + + // 注销并行合约接口 + function disableParallel() public; +} +``` + +#### step2 编写可并行的合约接口 + +合约中的public函数,是合约的接口。编写可并行的合约接口,是根据一定的规则,实现一个合约中的public函数。 + +##### 确定接口是否可并行 + +可并行的合约接口,必须满足: + +- 无调用外部合约 +- 无调用其它函数接口 + +##### 确定互斥参数 + +在编写接口前,先确定接口的互斥参数,接口的互斥即是对全局变量的互斥,互斥参数的确定规则为: + +- 接口访问了全局mapping,mapping的key是互斥参数 +- 接口访问了全局数组,数组的下标是互斥参数 +- 接口访问了简单类型的全局变量,所有简单类型的全局变量共用一个互斥参数,用不同的变量名作为互斥对象 + +##### 确定参数类型和顺序 + +确定互斥参数后,根据规则确定参数类型和顺序,规则为: + +- 接口参数仅限:string、address、uint256、int256(未来会支持更多类型) +- 互斥参数必须全部出现在接口参数中 +- 所有互斥参数排列在接口参数的最前 + +``` +mapping (string => uint256) _balance; // 全局mapping +​ +// 互斥变量from、to排在最前,作为transfer()开头的两个参数 +function transfer(string from, string to, uint256 num) public +{ + _balance[from] -= num; // from 是全局mapping的key,是互斥参数 + _balance[to] += num; // to 是全局mapping的key,是互斥参数 +} +​ +// 互斥变量name排在最前,作为set()开头的参数 +function set(string name, uint256 num) public +{ + _balance[name] = num; +} +``` + +#### step3 在框架中注册可并行的合约接口 + +在合约中实现 enableParallel() 函数,调用registerParallelFunction()注册可并行的合约接口。同时也需要实现disableParallel()函数,使合约具备取消并行执行的能力。 + +``` +// 注册可以并行的合约接口 +function enableParallel() public +{ + // 函数定义字符串(注意","后不能有空格),参数的前几个是互斥参数 + registerParallelFunction("transfer(string,string,uint256)", 2); // transfer接口,前2个是互斥参数 + registerParallelFunction("set(string,uint256)", 1); // transfer接口,前1个四互斥参数 +} +​ +// 注销并行合约接口 +function disableParallel() public +{ + unregisterParallelFunction("transfer(string,string,uint256)"); + unregisterParallelFunction("set(string,uint256)"); +} +``` + +#### step4 部署/执行并行合约 + +用控制台或Web3SDK编译和部署合约,此处以控制台为例: + +部署合约 + +``` +[group:1]> deploy ParallelOk.sol +``` + +调用 enableParallel()接口,让ParallelOk能并行执行 + +``` +[group:1]> call ParallelOk.sol 0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744 enableParallel +``` + +发送并行交易 set() + +``` +[group:1]> call ParallelOk.sol 0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744 set "jimmyshi" 100000 +``` + +发送并行交易 transfer() + +``` +[group:1]> call ParallelOk.sol 0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744 transfer "jimmyshi" "jinny" 80000 +``` + +查看交易执行结果 balanceOf() + +``` +[group:1]> call ParallelOk.sol 0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744 balanceOf "jinny"80000 +``` + +用SDK发送大量交易的例子,将在下文的例子中给出。 + +### 预编译合约的并行框架 + +编写并行的预编译合约,开发流程与开发普通预编译合约流程相同。普通的预编译合约以Precompile为基类,在这之上实现合约逻辑。基于此,Precompile的基类还为并行提供了两个虚函数,继续实现这两个函数,即可实现并行的预编译合约。 + +#### step1 将合约定义成支持并行 + +``` +bool isParallelPrecompiled() override { return true; } +``` + +#### step2 定义并行接口和互斥参数 + +注意,一旦定义成支持并行,所有的接口都需要进行定义。若返回空,表示此接口无任何互斥对象。互斥参数与预编译合约的实现相关,此处涉及对FISCO BCOS存储的理解,具体的实现可直接阅读代码或询问相关有经验的程序员。 + +``` +// 根据并行接口,从参数中取出互斥对象,返回互斥对象 +std::vector getParallelTag(bytesConstRef param) override +{ + // 获取被调用的函数名(func)和参数(data) + uint32_t func = getParamFunc(param); + bytesConstRef data = getParamData(param); +​ + std::vector results; + if (func == name2Selector[DAG_TRANSFER_METHOD_TRS_STR2_UINT]) // 函数是并行接口 + { + // 接口为:userTransfer(string,string,uint256) + // 从data中取出互斥对象 + std::string fromUser, toUser; + dev::u256 amount; + abi.abiOut(data, fromUser, toUser, amount); + + if (!invalidUserName(fromUser) && !invalidUserName(toUser)) + { + // 将互斥对象写到results中 + results.push_back(fromUser); + results.push_back(toUser); + } + } + else if ... // 所有的接口都需要给出互斥对象,返回空表示无任何互斥对象 + + return results; //返回互斥 +} +``` + +#### step3 编译,重启节点 + +手动编译节点的方法,[参考FISCO BCOS技术文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/get_executable.html#id2)。编译之后,关闭节点,替换掉原来的节点二进制文件,再重启节点即可。 + +## 举例:并行转账 + +此处分别给出solidity合约和预编译合约的并行举例。 + +#### 配置环境 + +该举例需要以下执行环境: + +- Web3SDK客户端 +- 一条FISCO BCOS链 + +若需要压测最大的性能,至少需要: + +- 3个Web3SDK,才能产生足够多的交易 +- 4个节点,且所有Web3SDK都配置了链上所有的节点信息,让交易均匀发送到每个节点上,才能让链接收足够多的交易 + +### 并行Solidity合约:ParallelOk + +基于账户模型的转账,是一种典型的业务操作。ParallelOk合约,是账户模型的一个举例,能实现并行的转账功能。ParallelOk合约已在上文中给出。 + +FISCO BCOS在Web3SDK中内置了ParallelOk合约,此处给出用Web3SDK来发送大量并行交易的操作方法。 + +#### step1 用SDK部署合约、新建用户、开启合约的并行能力 + +``` +# 参数: add <创建的用户数量> <此创建操作请求的TPS> <生成的用户信息文件名> +java -cp conf/:lib/*:apps/* org.fisco.bcos.channel.test.parallel.parallelok.PerformanceDT 1 add 10000 2500 user +# 在group1上创建了 10000个用户,创建操作以2500TPS发送的,生成的用户信息保存在user中 +``` + +执行成功后,ParallelOk被部署到区块链上,创建的用户信息保存在user文件中,同时开启了ParallelOk的并行能力。 + +#### step2 批量发送并行转账交易 + +注意:在批量发送前,请将SDK的日志等级调整为ERROR,才能有足够的发送能力。 + +``` +# 参数: transfer <总交易数量> <此转账操作请求的TPS上限> <需要的用户信息文件> <交易互斥百分比:0~10> +java -cp conf/:lib/*:apps/* org.fisco.bcos.channel.test.parallel.parallelok.PerformanceDT 1 transfer 100000 4000 user 2 +​ +# 向group1发送了 100000比交易,发送的TPS上限是4000,用的之前创建的user文件里的用户。 +``` + +#### step3 验证并行正确性 + +并行交易执行完成后,Web3SDK会打印出执行结果。TPS 是此SDK发送的交易在节点上执行的TPS。validation 是转账交易执行结果的检查。 + +``` +Total transactions: 100000 +Total time: 34412ms +TPS: 2905.9630361501804 +Avg time cost: 4027ms +Error rate: 0% +Return Error rate: 0% +Time area: +0 < time < 50ms : 0 : 0.0% +50 < time < 100ms : 44 : 0.044000000000000004% +100 < time < 200ms : 2617 : 2.617% +200 < time < 400ms : 6214 : 6.214% +400 < time < 1000ms : 14190 : 14.19% +1000 < time < 2000ms : 9224 : 9.224% +2000 < time : 67711 : 67.711% +validation: + user count is 10000 + verify_success count is 10000 + verify_failed count is 0 +``` + +可以看出,本次交易执行的TPS是2905。执行结果校验后,无任何错误(verify_failed count is 0)。 + +#### step4 计算总TPS + +单个Web3SDK无法发送足够多的交易以达到节点并行执行能力的上限。需要多个Web3SDK同时发送交易。在多个Web3SDK同时发送交易后,单纯将结果中的TPS加和得到的TPS不够准确,需要直接从节点处获取TPS。 + +用脚本从日志文件中计算TPS + +``` +cd tools +sh get_tps.sh log/log_2019031821.00.log 21:26:24 21:26:59 # 参数:<日志文件> <计算开始时间> <计算结束时间> +``` + +得到TPS(3 SDK、4节点,8核,16G内存) + +``` +statistic_end = 21:26:58.631195 +statistic_start = 21:26:24.051715 +total transactions = 193332, execute_time = 34580ms, tps = 5590 (tx/s) +``` + +### 并行预编译合约:DagTransferPrecompiled + +与ParallelOk合约的功能一样,FISCO BCOS内置了一个并行预编译合约的例子(DagTransferPrecompiled),实现了简单的基于账户模型的转账功能。该合约能够管理多个用户的存款,并提供一个支持并行的transfer接口,实现对用户间转账操作的并行处理。 + +**注意:DagTransferPrecompiled仅做示例使用,请勿直接运用于生产环境。** + +#### step1 生成用户 + +用Web3SDK发送创建用户的操作,创建的用户信息保存在user文件中。命令参数与parallelOk相同,不同的仅仅是命令所调用的对象是precompile。 + +``` +java -cp conf/:lib/*:apps/* org.fisco.bcos.channel.test.parallel.precompile.PerformanceDT 1 add 10000 2500 user +``` + +#### step2 批量发送并行转账交易 + +用Web3SDK发送并行转账交易。 + +**注意:在批量发送前,请将SDK的日志等级请调整为ERROR,才能有足够的发送能力。** + +``` +java -cp conf/:lib/*:apps/* org.fisco.bcos.channel.test.parallel.precompile.PerformanceDT 1 transfer 100000 4000 user 2 +``` + +#### step3 验证并行正确性 + +并行交易执行完成后,Web3SDK会打印出执行结果。TPS 是此SDK发送的交易在节点上执行的TPS。validation 是转账交易执行结果的检查。 + +``` +Total transactions: 80000 +Total time: 25451ms +TPS: 3143.2949589407094 +Avg time cost: 5203ms +Error rate: 0% +Return Error rate: 0% +Time area: +0 < time < 50ms : 0 : 0.0% +50 < time < 100ms : 0 : 0.0% +100 < time < 200ms : 0 : 0.0% +200 < time < 400ms : 0 : 0.0% +400 < time < 1000ms : 403 : 0.50375% +1000 < time < 2000ms : 5274 : 6.592499999999999% +2000 < time : 74323 : 92.90375% +validation: + user count is 10000 + verify_success count is 10000 + verify_failed count is 0 +``` + +可以看出,本次交易执行的TPS是3143。执行结果校验后,无任何错误(verify_failed count is 0)。 + +#### step4 计算总TPS + +单个Web3SDK无法发送足够多的交易以达到节点并行执行能力的上限。需要多个Web3SDK同时发送交易。在多个Web3SDK同时发送交易后,单纯将结果中的TPS加和得到的TPS不够准确,需要直接从节点处获取TPS。 + +用脚本从日志文件中计算TPS + +``` +cd tools +sh get_tps.sh log/log_2019031311.17.log 11:25 11:30 # 参数:<日志文件> <计算开始时间> <计算结束时间> +``` + +得到TPS(3 SDK、4节点,8核,16G内存) + +``` +statistic_end = 11:29:59.587145 +statistic_start = 11:25:00.642866 +total transactions = 3340000, execute_time = 298945ms, tps = 11172 (tx/s) +``` + +## 结果说明 + +本文举例中的性能结果,是在3SDK、4节点、8核、16G内存、1G网络下测得。每个SDK和节点都部署在不同的VPS中,硬盘为云硬盘。实际TPS会根据你的硬件配置、操作系统和网络带宽有所变化。 + +**如您在部署过程中遇到阻碍或有问题需要咨询,可以进入FISCO BCOS官方技术交流群寻求解答。**(进群请长按下方二维码识别添加小助手) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/parallel_transformation.md b/3.x/zh_CN/docs/articles/3_features/31_performance/parallel_transformation.md new file mode 100644 index 000000000..6f358876d --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/parallel_transformation.md @@ -0,0 +1,204 @@ +# 让木桶没有短板,FISCO BCOS全面推进并行化改造 + +作者:李陈希|FISCO BCOS 核心开发者 + +## 背景 + +PTE(Parallel Transaction Executor,一种基于DAG模型的并行交易执行器)的引入,使FISCO BCOS具备了并行执行交易的能力,显著提升了节点交易处理的效率。对这个阶段性结果,我们并不满足,继续深入挖掘发现,FISCO BCOS的整体TPS仍有较大提升空间。 用木桶打个比方:如果参与节点的交易处理所有模块构成木桶,交易执行只是组成整个木桶的一块木板,根据短板理论,一只木桶能盛多少水取决于桶壁上最矮的那块,同理,**FISCO BCOS的性能也由速度最慢的组件决定**。 尽管PTE取得了理论上极高的性能容量,但是FISCO BCOS的整体性能仍然会被其他模块较慢的交易处理速度所掣肘。**为了能够最大化利用计算资源以进一步提高交易处理能力,在FISCO BCOS中全面推进并行化改造势在必行。** + +## 数据分析 + +根据并行程序设计的『分析→分解→设计→验证』四步走原则,首先需定位出系统中仍存在的性能瓶颈的精确位置,才能更深入地对任务进行分解,并设计相应的并行化策略。**使用自顶向下分析法,我们将交易处理流程分为四个模块进行性能分析**,这四个模块分别是: + +**区块解码(decode)**:区块在节点间共识或同步时需要从一个节点发送至另一个节点,这个过程中,区块以RLP编码的形式在网络间传输。节点收到区块编码后,需要先进行解码,将区块还原为内存中的二进制对象,然后才能做进一步处理。 + +**交易验签(verify)**:交易在发送之前由发送者进行签名,签名得到的数据可以分为(v, r, s)三部分,验签的主要工作便是在收到交易或交易执行前,从(v, r, s)数据中还原出交易发送者的公钥,以验证交易发送者的身份。 + +**交易执行(execute)**:执行区块中的所有交易,更新区块链状态。 + +**数据落盘(commit)**:区块执行完成后,需要将区块及相关数据写入磁盘中,进行持久化保存。 + +以包含2500笔预编译转账合约交易的区块为测试对象,在我们的测试环境中,各阶段的平均耗时分布如下图所示: + +![](../../../../images/articles/parallel_transformation/IMG_5182.JPG) + +从图中可以看出,2500笔交易的执行时间已经被缩短到了50毫秒以内,可以证明PTE对FISCO BCOS交易执行阶段的优化是行之有效的。但图中也暴露出了非常明显的问题:其他阶段的用时远远高于交易执行的用时,导致交易执行带来的性能优势被严重抵消,PTE无法发挥出其应有的价值。 + +早在1967年,计算机体系结构领域的元老Amdahl提出的以他名字命名的定律,便已经向我们阐明了衡量处理器并行计算后效率提升能力的经验法则: + +![](../../../../images/articles/parallel_transformation/IMG_5183.PNG) + +其中,SpeedUp为加速比,Ws是程序的串行分量,Wp是程序中的并行分量,N为CPU数量。可以看出,在工作总量恒定的情况下,可并行部分代码占比越多,系统的整体性能越高。我们需要把思维从线性模型中抽离出来,继续细分整个处理流程,找出执行时间最长的程序热点,对这些代码段进行并行化从而将所有瓶颈逐个击破,这才是使通过并行化获得最大性能提升的最好办法。 + +## 根因拆解 + +### 1.串行的区块解码 + +区块解码主要性能问题出在RLP编码方法本身。RLP全称是递归的长度前缀编码,是一种用长度作为前缀标明编码对象中元素个数的编码方法。如下图所示,RLP编码的开头即是此编码中的对象个数(Object num)。在个数后,是相应个数的对象(Object)。递归地,每个对象,也是RLP编码,其格式也与下图相同。 + +需要特别注意的是,在RLP编码中。每个Object的字节大小是不固定的,Object num只表示Object的个数,不表示Object的字节长度。 + +![](../../../../images/articles/parallel_transformation/IMG_5184.JPG) + +RLP通过一种长度前缀与递归结合的方式,理论上可编码任意个数的对象。下图是一个区块的RLP编码,在对区块进行编码时,先递归至最底层,对多个sealer进行编码,多个sealer被编码并加上长度前缀后,编码成为一串RLP编码(sealerList),此编码又作为一个对象,被编入上层的一串RLP编码(blockHeader)中。此后层层递归,最后编码成为区块的RLP编码。由于RLP编码是递归的,在编码前,无法获知编码后的长度。 + +![](../../../../images/articles/parallel_transformation/IMG_5185.JPG) + +解码时,由于RLP编码中每个对象的长度不确定,且RLP编码只记录了对象的个数,没记录对象的字节长度,若要获取其中的一个编码对象,必须递归解码其前序的所有对象,在解码前序的对象后,才能访问到需要访问的编码对象的字节位置。例如在上图中,若需要访问区块中的第0笔交易,即tx0,必须先将blockHeader解码,而blockHeader的解码,需要再次递归,把parentHash,stateRoot直至sealerList都解码出来。 + +解码区块最重要的目的是解码出包含在区块中的交易,而交易的编码都是互相独立的,但在RLP特殊的编码方式下,解码一笔交易的必要条件是解码出上一笔交易,交易的解码任务之间环环相扣,形成了一种链式的依赖关系。需要指出的是,这种解码方式并不是RLP的缺陷,RLP的设计目标之一本就是尽量减少空间占用,充分利用好每一个字节,虽然编解码变得低效了些,但编码的紧凑度却是有目共睹,因此这种编码方式本质上还是一种时间换空间的权衡结果。 + +由于历史原因,FISCO BCOS中使用了RLP编码作为多处信息交换协议,贸然换用其他并行化友好的序列化方案可能会带来较大的开发负担。基于这一考虑,我们决定在原有的RLP编解码方案稍作修改,通过为每个被编码的元素添加额外的位置偏移信息,便可以做到并行解码RLP的同时不会改动大量原有代码。 + +### 2.交易验签&数据落盘开销大 + +通过对交易验签和数据落盘部分的代码进行拆解,我们发现两者的主要功能都集中在一个耗时巨大的for循环。交易验签负责按序取出交易,然后从交易的签名数据中取出(v, r, s)数据,并从中还原出交易发送者的公钥,其中,还原公钥这一步,由于涉及密码学算法,因此耗时不少;数据落盘负责从缓存中逐个取出交易相关数据,将其编码为JSON字符串后写入磁盘,由于JSON编码过程本身效率比较低,因此也是性能损失的重灾区。 + +两者代码分别如下所示: + +``` +// 交易验签 +for(int i = 0; i < transactions.size(); ++i) +{ + tx = transactions[i]; + v, r, s = tx.getSignature(); + publicKey = recover(v, r, s); // 从(v, r, s)中复原出发送者公钥 + ... +} +``` + +``` +// 数据落盘 +for(int i = 0; i < datas.size(); ++i) +{ + data = datas[i]; + jsonStr = jsonEncode(data); // 将数据编码为JSON字符串进行存储 + db.commit(jsonStr); + ... +} +``` + +两个过程共有的特点是,它们均是将同样的操作应用到数据结构中不同的部分,对于这种类型的问题,可以直接使用数据级并行进行改造。所谓数据级并行,即是将数据作为划分对象,通过将数据划分为大小近似相等的片段,通过在多个线程上对不同的数据片段上进行操作,达到并行处理数据集的目的。 + +数据级并行唯一的附加要求是任务之间彼此独立,毫无疑问,在FISCO BCOS的实现中,交易验签和数据落盘均满足这一要求。 + +## 优化实践 + +### 1.区块解码并行化 + +改造过程中,我们在系统中使用的普通RLP编码的基础上,加入了offset字段,用以索引每个Object的位置。如下图所示,改造后编码格式的开头,仍然是对象的个数(Object num),但是在个数字段后,是一个记录对象偏移量的数组(Offsets)。 + +![](../../../../images/articles/parallel_transformation/IMG_5186.JPG) + +数组中的每个元素有着固定的长度。因此要读取某个Offset的值,只需向访问数组一样,根据Offset的序号直接索引便可以进行随机访问。在Offsets后,是与RLP编码相同的对象列表。相应序号的Offset,指向相应序号的对象的RLP编码字节位置。因此,任意解码一个对象,只需要根据对象的序号,找到其偏移量,再根据偏移量,就可定位到相应对象的RLP编码字节位置。 + +编码流程也进行了重新设计。流程本身仍然基于递归的思路,对于输入的对象数组,首先将对象数组的大小编码在输出编码的开头处,若数组大小超过1,则按序逐个取出待编码对象并缓存其递归编码,并在Offsets数组中记录该对象的偏移位置,待数组遍历完后,将缓存的对象编码第一次性取出并附加至输出编码末尾;若数组大小为1,则递归对其编码并写入输出编码的末尾,结束递归。 + +**编码流程的伪代码如下:** + +``` +Rlps = RLP(); // Output,初始时为空 +void encode(objs) //Input: objs = 待编码对象的数组 +{ + offset = 0; + codes = []; + + objNum = objs.size() + Rlps.push(objNum) + if objNum > 1 + { + for obj in objs + { + rlp = encode(obj); // 递归调用编码方法 + Rlps.push(offset); + offset += rlp.size(); + codes.add(rlp); // 缓存递归编码的结果 + } + for x in codes + { + Rlps.push(x); + } + } + else + { + rlp = encode(objs[0]); + Rlps.push(rlp); + } +} +``` + +偏移量的引入使解码模块能够对元素编码进行随机访问。Offsets的数组范围可以在多个线程间均摊,从而每个线程可以并行访问对象数组的不同部分,分别进行解码。由于是只读访问,这种并行方式是线程安全的,仅需最后再对输出进行汇总即可。 + +**解码流程的伪代码如下:** + +``` +Objs decode(RLP Rlps) +{ + objNum = Rlps.objNum; // 获取对象个数 + outputs = [] // 输出的对象数组 + if objNum > 1 + { + parallel for i = 0 to objNum + { + offset = Rlps.offsets[i]; + code = Rlps.objs[offset]; + x = decode(code); + outputs.add(x); // 有序插入outputs + } + } + else + { + outputs.add(decode(Rlps.objs[0])); + } + return outputs; +} +``` + +## 2.交易验签 & 数据落盘并行化 + +对于数据级并行,业内已有多种成熟的多线程编程模型。虽然Pthread这类显式的多线程编程模型能够提供对线程进行更精细的控制,但是需要我们对线程通信、同步拥有娴熟的驾驭技巧。实现的复杂度越高,犯错的几率越大,日后代码维护的难度也相应增加。我们的主要目标仅仅对密集型循环进行并行化,因此在满足需求的前提下,Keep It Simple & Stupid才是我们的编码原则,因此我们使用隐式的编程模型来达成我们的目的。 + +经过再三权衡,我们在市面上众多隐式多线程编程模型中,选择了来自Intel的线程构建块(Thread Building Blocks,TBB)开源库。在数据级并行方面,TBB算是老手,TBB运行时系统不仅屏蔽了底层工作线程的实现细节,还能够根据任务量自动在处理器间平衡工作负载,从而充分利用底层CPU资源。 + +**使用TBB后,交易验签和数据落盘的代码如下所示:** + +``` +// 并行交易验签 +tbb::parallel_for(tbb::blocked_range(0, transactions.size()), +[&](const tbb::blocked_range& _range) +{ + for(int i = _range.begin(); i != _range.end(); ++i) + { + tx = transactions[i]; + v, r, s = tx.getSignature(); + publicKey = recover(v, r, s); // 从(v, r, s)中复原出发送者公钥 + ... + } +}); +``` + +``` +// 并行数据落盘 +tbb::parallel_for(tbb::blocked_range(0, transactions.size()), +[&](const tbb::blocked_range& _range) +{ + for(int i = _range.begin(); i != _range.end(); ++i) + { + data = datas[i]; + jsonStr = jsonEncode(data); // 将数据编码为JSON字符串进行存储 + db.commit(jsonStr); + ... + } +}); +``` + +可以看到,除了使用TBB提供的tbb::parallel_for进行并行循环和tbb::blocked_range引用数据分片外,循环体内的代码几乎没有任何变化,接近C++原生语法正是TBB的特点。TBB提供了抽象层级较高的并行接口,如parallel_for、parallel_for_each这类泛型并行算法,从而使得改造能够较为容易地进行。同时,TBB不依赖任何语言或编译器,只要有能支持ISO C++标准的编译器,便有TBB的用武之地。 + +当然,使用TBB并不是完全没有额外负担,比如线程间安全还是需要开发人员的仔细分析来保证,但TBB考虑周到,提供了一套方便的工具来辅助我们解决线程间互斥的问题,如原子变量、线程局部存储和并行容器等,这些并行工具同样被广泛地应用在FISCO BCOS中,为FISCO BCOS的稳定运行保驾护航。 + +#### 写在最后 + +经过一套并行优化的组合拳,FISCO BCOS的性能表现更上层楼。压力测试的结果表明,FISCO BCOS的交易处理能力,相较于并行化改造之前,成功提升了1.74倍,基本达到了这个环节的预期效果。 + +但是我们也深深明白,性能优化之路漫漫,木桶最短的一板总是交替出现,并行之道在于,通过反复的分析、拆解、量化和优化,使得各模块互相配合齐头并进,整个系统达到优雅的平衡,而最优解总是在“跳一跳”才能够得着的地方。 + diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/performance_optimization.md b/3.x/zh_CN/docs/articles/3_features/31_performance/performance_optimization.md new file mode 100644 index 000000000..2ae5c88ff --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/performance_optimization.md @@ -0,0 +1,79 @@ +# FISCO BCOS的速度与激情:性能优化方案最全解密 + + +作者:石翔|FISCO BCOS 核心开发者 + + +上篇文章说到,区块链的速度困境是“贵”在信任,“慢”得其所,说到底,根因还是在其“用计算换信任”的设计思路上。业内普遍赞誉区块链是信任的机器,为了实现信任,区块链不得不做很多复杂而繁琐的操作,同步、验签、执行、共识等,都是区块链中必不可少的环节。 + +这就像行车时的“交规”,时刻在告诉我们开发者,为了安全,请按规定速度行驶!然而,社区里大家还是有着共同的心声:真的太慢了! + +那么,能不能对这台信任的机器来一次装备升级,让它既安全又快速呢?经过团队深入的探索和实践,我们打通了多条迈向极速时代的路子。回看整个过程,恰如打造了一台性能卓越的汽车。 + +- 高功率发动机☞**基于DAG的交易并行执行引擎** +- 燃料输送装置☞**分布式存储** +- 前排与后座☞**共识与同步的流程优化** +- 传动装置☞**全方位并行处理** +- 氢燃料☞**预编译合约** +- 监控仪表☞**全面的性能分析工具** +- 专属的方向盘☞**可并行合约开发框架** + +### 高功率发动机:基于DAG的交易并行执行引擎——极尽所能让交易并行执行 + +传统的交易执行引擎,采用串行的方式执行交易,交易只能被一条条依次执行。一个区块中无论有多少交易,都需要一条条依次执行完。这就好比一个低功率的发动机,纵使给它装上巨无霸油箱,仍然无法输出强大的动力。1个气缸不够,改成4个气缸,8个气缸,行不行? + +FISCO BCOS实现了一种交易并行执行引擎(PTE),能够让一个区块内的多个交易同时被执行。若机器有4个核,最大限度能支持4笔交易同时执行,如果有8个核,则能支持8笔交易同时执行。当然,在“交规”管控下,并行执行的正确性需要得到保证,也就是说,并行执行的结果和串行执行的结果需要一致。为了保证并行执行的一致性,FISCO BCOS的交易并行执行引擎(PTE)引入了DAG(有向无环图)这个数据结构。 + +执行引擎在执行区块中的交易之前,会根据交易相互间的互斥关系,自动构建交易间的依赖关系。这种依赖关系是一种DAG,在引擎执行时,会根据DAG让可并行的交易并行执行。这样一来,交易执行的一致性得以保证,交易执行的吞吐量也得到数量级的提升。 + +### 燃料输送装置:分布式存储——为引擎提供足够的燃料 + +传统的区块链存储模式,是一棵参天的MPT树。区块链上所有的数据,都汇聚到这棵树上来。对数据的每一次写或读,都是一次从树枝到树根(或者从树根到树枝)的漫长旅行。随着链上的数据越来越多,树也越来越高,树枝到树根的路程会变得越来越长。更麻烦的是,虽然树枝有很多个,但是树根只有一个。对海量链上数据的写或读,就像千军万马抢过独木桥一样悲壮,惨烈程度可想而知。所以传统的区块链,选择了一个个来,一个数据一个数据地读,一条交易一条交易地执行。形象地说,就是用一根输油管为引擎输送燃料。 + +这样肯定不行!我们需要多个输油管为引擎输送燃料!这一次,FISCO BCOS不是粗暴地为引擎接上多个输油管(MPT树),因为用输油管输油(用MPT存数据)实在是太慢了。我们干脆抛弃输油管,直接把引擎泡进油箱里!这样的比喻也许欠妥当,但理解了FISCO BCOS的执行引擎和存储设计,相信你会和我有一样的感慨。 + +我们抛弃MPT树,采用“表”的方式组织数据。执行引擎读写数据,无需再对MPT树进行树根到树枝的遍历,直接在“表”上读写。这样一来,每一条数据的读写,都不依赖于一个全局的操作,可以分开独立进行。这就为交易并行执行引擎(PTE)提供了并发数据读写的基础,类似于泡在油箱里的发动机,汽油直接流入气缸,谁也不共用谁的输油管。 + +分布式存储详细解析请点击:[分布式存储架构设计](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485336&idx=1&sn=ea3a7119634c1c27daa4ec2b9a9f278b&chksm=9f2ef584a8597c9288f8c5000c7def47c3c5b9dc64f25221985cd9e3743b9364a93933e51833&token=942411972&lang=zh_CN#rd) + +### 前排与后座:共识与同步的流程优化——不搞平均主义,先富带动后富 + +在区块链节点中,同步模块和共识模块,是一对形影不离的双胞胎,有时相互帮助,有时也为争夺资源大打出手。在以往的设计中,同步模块和共识模块并没有优先级的区分。好比坐车,谁坐前排,谁坐后排,没个规定,导致这对双胞胎经常在争夺先后顺序上浪费大量的时间。 + +一切从实际出发,先富带动后富! + +共识模块负责主导整个区块链出块的节奏,应让共识模块先行。而同步模块,理应扮演好配合的角色,辅佐共识模块更快出块。基于此思想,FISCO BCOS对共识与同步的流程进行了优化: + +- 第一,将同步模块中交易验签的操作,从P2P的回调线程中剥离出来,让共识模块能够更加顺畅地收到共识消息,以便更快进行共识。 +- 第二,对交易验签进行去重,并对交易的二进制进行缓存。一笔交易只进行一次验签和解码,为共识模块中区块的执行腾出更多的CPU资源。 +- 第三,优化同步流程,在交易同步之前,尽可能地让同步模块跑在共识模块之前,从而使得同步模块优先把交易写入交易池中,优先进行解码和验签,让共识模块拿到交易时,免去解码和验签的过程,更快进入区块打包阶段。 + +总而言之,言而总之。一切的目的,都是为共识的流程服务,让其更快更顺畅地打包、执行、共识、出块。 + +### 传动装置:全方位并行处理——让功率有效地输出 + +若不搭配合适的传动装置,再高功率的引擎也无法将功率有效输出。签名验证、编解码、数据落盘,是区块链中除开交易以外,其他耗时占用较高的部分。在以往的设计中,签名验证、编解码、数据落盘,都是串行执行的。就算交易被并行执行,这台信任机器的性能,也受制于这三个环节的性能。 + +这三个环节的性能问题一日不绝,性能永无抬头之日!那就给高功率发动机配上一个高性能传动装置,释放出它的威力来。 + +FISCO BCOS引入了并行容器,让数据的读写天然支持并发访问。在此基础上,对于交易的验签,直接让交易的验签并行执行,交易与交易间的验签流程互不影响;对于编解码,改造了RLP的编码格式,使原来只能按顺序读写的RLP格式支持并行的编解码;对于区块落盘,对状态的改变进行并行编码。 + +不仅如此,FISCO BCOS在可并行之处都进行了并行处理,让系统CPU资源得到最大化利用。交易不仅在进入合约引擎时能并行执行,在诸如签名验证、编解码、数据落盘等环节中也都是被并行处理的。强大的发动机,配合上高性能的传动装置,果然效果显著啊! + +### 氢燃料:预编译合约 ——高效率的轻量级合约框架 + +众所周知,区块链上跑的是智能合约,智能合约用solidity语言编写。solidity合约部署到链上,烧掉Gas,得到结果。但是,有没有想过换一种燃料,一种成本更低却又让车跑得更快的燃料? + +且看FISCO BCOS自研的“氢燃料”——预编译合约! + +FISCO BCOS为机构提供了一种高性能、定制化、轻量级合约框架。机构可按照自身业务需求,将自己实现的预编译合约内置于FISCO BCOS节点中。预编译合约用C++编写,其性能高于solidity引擎,而且启动速度更快、指令更精简、内存使用更少。正如“氢燃料”一般,成本更低,热值更高,让汽车跑得更快!当然,提取“氢燃料”需要下一点小功夫,预编译合约的实现相对复杂,门槛比较高。了解预编译合约请点击:[预编译合约架构设计](http://mp.weixin.qq.com/s?__biz=MzU5NTg0MjA4MA==&mid=2247484055&idx=1&sn=2f33d5231784147ed61cb6da85e6d74d&chksm=fe6a87d8c91d0ece832d34c0345d1795c4b88daf9b4af815e94987d4f7abd899a464d0075e09&scene=21#wechat_redirect) + +### 监控仪表:多维度性能分析工具——给人全局在握的踏实感 + +FISCO BCOS在开发过程中使用了大量的性能分析工具,就像汽车上安装了诸多指数清晰的监控仪表。我们采用了主流的性能分析工具,如perf,systemtap,对程序的热点、锁、内存等进行了分析,还根据区块链的程序流程特点,开发了定制化的性能分析工具,以便在共识,区块验证、存储模块和流程中更好地评估数据。工具能够对程序中各个阶段的时间占比、时间变化进行分析。有了可靠的量化工具,开发者在做每一处优化时,都能做到心中有数。 + +专属的方向盘:可并行合约开发框架——给开发者流畅的操作体验 + +一切准备就绪,上车!坐上驾驶位,你手中掌控的,将是FISCO BCOS为你提供的专属方向盘——可并行合约开发框架!如何合理操作这台机器,全靠这个方向盘。“手握”并行合约开发框架,在开发并行合约时,合约开发者无需关心具体的底层逻辑,而是将更多注意力集中在自己的合约逻辑上。当合约部署成功后,并行合约会被底层代码自动识别,自动并行地执行! + +现在,终于开上了车。没过瘾?没关系,接下来的几篇,请接好,是真正的硬核干货!我们将在下一篇文章中,系统介绍FISCO BCOS中基于DAG模型的并行交易执行器(PTE),敬请期待~ \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/performance_optimization_tools.md b/3.x/zh_CN/docs/articles/3_features/31_performance/performance_optimization_tools.md new file mode 100644 index 000000000..cf1eda352 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/performance_optimization_tools.md @@ -0,0 +1,247 @@ +# FISCO BCOS性能优化——工具篇 + +作者:李陈希|FISCO BCOS 核心开发者 + +We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%. ——Donald Knuth + +**『过早的优化是万恶之源』** + +说出这句话的计算机科学先驱Donald Knuth并不是反对优化,而是强调要对系统中的关键位置进行优化。假设一个for循环耗时0.01秒,即使使用循环展开等各种奇技淫巧将其性能提升100倍,把耗时降到0.00001秒,对于用户而言,也基本无法感知到。对性能问题进行量化测试之前,在代码层面进行各种炫技式优化,可能不仅提升不了性能,反而会增加代码维护难度或引入更多错误。 + +**『没有任何证据支撑的优化是万恶之源』** + +在对系统施展优化措施前,一定要对系统进行详尽的性能测试,从而找出真正的性能瓶颈。奋战在FISCO BCOS性能优化的前线上,我们对如何使用性能测试工具来精确定位性能热点这件事积累了些许经验心得。本文将我们在优化过程中使用到的工具进行了整理汇总,以飨读者。 + +------ + +## 1.Poor Man's Profiler + +穷人的分析器,简称PMP。尽管名字有些让人摸不着头脑,但人家真的是一种正经的性能分析手段,甚至有自己的官方网站https://poormansprofiler.org/。PMP的原理是Stack Sampling,通过调用第三方调试器(比如gdb),反复获取进程中每个线程的堆栈信息,PMP便可以得到目标进程的热点分布。 + +**第一步**,获取一定数量的线程堆栈快照: + +``` +pid=$(pidof fisco-bcos) +num=10 +for x in $(seq 1 $(num)) + do + gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid + sleep 0.5 +done +``` + +**第二步**,从快照中取出函数调用栈信息,按照调用频率排序: + +``` +awk ' + BEGIN { s = ""; } + /^Thread/ { print s; s = ""; } + /^\#/ { if (s != "" ) { s = s "," $4} else { s = $4 } } + END { print s }' | \ +sort | uniq -c | sort -r -n -k +``` + +最后得到输出,如下图所示: + +![](../../../../images/articles/performance_optimization_tools/IMG_5240.PNG) + +从输出中可以观察到哪些线程的哪些函数被频繁采样,进而可按图索骥找出可能存在的瓶颈。上述寥寥数行shell脚本便是PMP全部精华之所在。极度简单易用是PMP的最大卖点,除了依赖一个随处可见的调试器外,PMP不需要安装任何组件,正如PMP作者在介绍中所言:『**尽管存在更高级的分析技术,但毫无例外它们安装起来都太麻烦了……Poor man doesn't have time. Poor man needs food.**。 + +PMP的缺点也比较明显:gdb的启动非常耗时,限制了PMP的采样频率不能太高,因此一些重要的函数调用事件可能会被遗漏,从而导致最后的profile结果不够精确。但是在某些特殊场合,PMP还是能发挥作用的,比如在一些中文技术博客中,就有开发人员提到使用PMP成功定位出了线上生产环境中的死锁问题,PMP作者也称这项技术在Facebook、Intel等大厂中有所应用。不管怎样,这种闪烁着程序员小智慧又带点小幽默的技术,值得一瞥。 + +## 2.perf + +perf的全称是Performance Event,在2.6.31版本后的Linux内核中均有集成,是Linux自带的强力性能分析工具,使用现代处理器中的特殊硬件PMU(Performance Monitor Unit,性能监视单元)和内核性能计数器统计性能数据。perf的工作方式是对运行中的进程按一定频率进行中断采样,获取当前执行的函数名及调用栈。如果大部分的采样点都落在同一个函数上,则表明该函数执行的时间较长或该函数被频繁调用,可能存在性能问题。 + +使用perf需要首先对目标进程进行采样: + +``` +$ sudo perf record -F 1000 -p `pidof fisco-bcos` -g -- sleep 60 +``` + +在上述命令中, 我们使用perf record指定记录性能的统计数据;使用-F指定采样的频率为1000Hz,即一秒钟采样1000次;使用-p指定要采样的进程ID(既fisco-bcos的进程ID),我们可以直接通过pidof命令得到;使用-g表示记录调用栈信息;使用sleep指定采样持续时间为60秒。待采样完成后,perf会将采集到的性能数据写入当前目录下的perf.data文件中。 + +``` +$ perf report -n +``` + +上述命令会读取perf.data并统计每个调用栈的百分比,且按照从高到低的顺序排列,如下图所示: + +![](../../../../images/articles/performance_optimization_tools/IMG_5241.JPG) + +信息已足够丰富,但可读性仍然不太友好。尽管示例中perf的用法较为简单,但实际上perf能做的远不止于此。配合其他工具,perf采样出的数据能够以更加直观清晰的方式展现在我们面前,这便是我们接下来要介绍的性能分析神器——火焰图。 + +## 3.火焰图 + +火焰图,即Flame Graph,藉由系统性能大牛 Brendan Gregg提出的动态追踪技术而发扬光大,主要用于将性能分析工具生成的数据进行可视化处理,方便开发人员一眼就能定位到性能问题所在。火焰图的使用较为简单,我们仅需将一系列工具从github上下载下来,置于本地任一目录即可: + +``` +wget https://github.com/brendangregg/FlameGraph/archive/master.zip && unzip master.zip +``` + +### 3.1CPU火焰图 + +当我们发现FISCO BCOS性能较低时,直觉上会想弄清楚到底是哪一部分的代码拖慢了整体速度,CPU是我们的首要考察对象。 + +首先使用perf对FISCO BCOS进程进行性能采样: + +``` +sudo perf record -F 10000 -p `pidof fisco-bcos` -g -- sleep 60 +# 对采样数据文件进行解析生成堆栈信息 +sudo perf script > cpu.unfold +``` + +生成了采样数据文件后,接下来调用火焰图工具生成火焰图: + +``` +# 对perf.unfold进行符号折叠 +sudo ./stackcollapse-perf.pl cpu.unfold > cpu.folded +# 生成SVG格式的火焰图 +sudo ./flamegraph.pl cpu.folded > cpu.svg +``` + +最后输出一个SVG格式图片,用来展示CPU的调用栈,如下图所示: + +![](../../../../images/articles/performance_optimization_tools/IMG_5242.JPG) + +**纵轴表示调用栈**。每一层都是一个函数,也是其上一层的父函数,最顶部就是采样时正在执行的函数,调用栈越深,火焰就越高。**横轴表示抽样数**。注意,并不是表示执行时间。若一个函数的宽度越宽,则表示它被抽到的次数越多,所有调用栈会在汇总后,按字母序列排列在横轴上。 + +火焰图使用了SVG格式,可交互性大大提高。在浏览器中打开时,火焰的每一层都会标注函数名,当鼠标悬浮其上,会显示完整的函数名、被抽样次数和占总抽样字数的百分比,如下: + +![](../../../../images/articles/performance_optimization_tools/IMG_5243.JPG) + +点击某一层时,火焰图会水平放大,该层会占据所有宽度,并显示详细信息,点击左上角的『Reset Zoom』即可还原。下图展示了PBFT模块在执行区块时,各个函数的抽样数占比: + +![](../../../../images/articles/performance_optimization_tools/IMG_5244.JPG) + +从图中可以看出,在执行区块时,主要开销在交易的解码中,这是由于传统的RLP编码在解码时,RLP编码中每个对象的长度不确定,且RLP编码只记录了对象的个数,没记录对象的字节长度,若要获取其中的一个编码对象,必须递归解码其前序的所有对象。 + +因此,RLP编码的解码过程是一个串行的过程,当区块中交易数量较大时,这一部分的开销将变得十分巨大。对此,我们提出了一种并行解码RLP编码的优化方案,具体实现细节可以参考上一篇文章[《FISCO BCOS中的并行化实践 》](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485324&idx=1&sn=94cdd4e7944f1058ee01eadbb7b3ec98&source=41#wechat_redirect)。 + +有了火焰图,能够非常方便地查看CPU的大部分时间开销都消耗在何处,进而也能针对性进行优化了。 + +### 3.2 Off-CPU火焰图 + +在实现FISCO BCOS的并行执行交易功能时,我们发现有一个令人困惑的现象:有时即使交易量非常大,区块的负载已经打满,但是通过top命令观察到CPU的利用率仍然比较低,通常4核CPU的利用率不足200%。在排除了交易间存在依赖关系的可能后,推测CPU可能陷入了I/O或锁等待中,因此需要确定CPU到底在什么地方等待。 + +使用perf,我们可以轻松地了解系统中任何进程的睡眠过程,其原理是利用perf static tracer抓取进程的调度事件,并通过perf inject对这些事件进行合并,最终得到诱发进程睡眠的调用流程以及睡眠时间。 + +我们要通过perf分别记录sched:sched_stat_sleep、sched:sched_switch、sched:sched_process_exit三种事件,这三种事件分别表示进程主动放弃 CPU 而进入睡眠的等待事件、进程由于I/O和锁等待等原因被调度器切换而进入睡眠的等待事件、进程的退出事件。 + +``` +perf record -e sched:sched_stat_sleep -e sched:sched_switch \ +-e sched:sched_process_exit -p `pidof fisco-bcos` -g \ +-o perf.data.raw sleep 60 +perf inject -v -s -i perf.data.raw -o perf.data +# 生成Off-CPU火焰图 +perf script -f comm,pid,tid,cpu,time,period,event,ip,sym,dso,trace | awk ' + NF > 4 { exec = $1; period_ms = int($5 / 1000000) } + NF > 1 && NF <= 4 && period_ms > 0 { print $2 } + NF < 2 && period_ms > 0 { printf "%s\n%d\n\n", exec, period_ms }' | \ +./stackcollapse.pl | \ +./flamegraph.pl --countname=ms --title="Off-CPU Time Flame Graph" --colors=io > offcpu.svg +``` + +在较新的Ubuntu或CentOS系统中,上述命令可能会失效,出于性能考虑,这些系统并不支持记录调度事件。好在我们可以选择另一种profile工具——OpenResty的SystemTap,来替代perf帮助我们收集进程调度器的性能数据。我们在CentOS下使用SystemTap时,只需要安装一些依赖kenerl debuginfo即可使用。 + +``` +wget https://raw.githubusercontent.com/openresty/openresty-systemtap-toolkit/master/sample-bt-off-cpu +chmod +x sample-bt-off-cpu +​ +./sample-bt-off-cpu -t 60 -p `pidof fisco-bcos` -u > out.stap +./stackcollapse-stap.pl out.stap > out.folded +./flamegraph.pl --colors=io out.folded > offcpu.svg +``` + +如果因为网络问题出现`sample-bt-off-cpu`脚本长时间下载失败,可尝试以下命令: + +```bash +https://gitee.com/mirrors/openresty-systemtap-toolkit/raw/master/sample-bt-off-cpu +``` + +得到的Off-CPU火焰图如下图所示: + +![](../../../../images/articles/performance_optimization_tools/IMG_5245.JPG) + +展开执行交易的核心函数后,位于火焰图中右侧的一堆lock_wait很快引起了我们的注意。分析过它们的调用栈后,我们发现这些lock_wait的根源,来自于我们在程序中有大量打印debug日志的行为。 + +在早期开发阶段,我们为了方便调试,添加了很多日志代码,后续也没有删除。虽然我们在测试过程中将日志等级设置得较高,但这些日志相关的代码仍会产生运行时开销,如访问日志等级状态来决定是否打印日志等。由于这些状态需要线程间互斥访问,因此导致线程由于竞争资源而陷入饥饿。 + +我们将这些日志代码删除后,执行交易时4核CPU的利用率瞬间升至300%+,考虑到线程间调度和同步的开销,这个利用率已属于正常范围。这次调试的经历也提醒了我们,在追求高性能的并行代码中输出日志一定要谨慎,避免由于不必要的日志而引入无谓的性能损失。 + +### **3.3** 内存火焰图 + +在FISCO BCOS早期测试阶段,我们采取的测试方式是反复执行同一区块,再计算执行一个区块平均耗时,我们发现,第一次执行区块的耗时会远远高于后续执行区块的耗时。从表象上看,这似乎是在第一次执行区块时,程序在某处分配了缓存,然而我们并不知道具体是在何处分配的缓存,因此我们着手研究了内存火焰图。 + +内存火焰图是一种非侵入式的旁路分析方法,相较于模拟运行进行内存分析的Valgrid和统计heap使用情况的TC Malloc,内存火焰图可以在获取目标进程的内存分配情况的同时不干扰程序的运行。 + +制作内存火焰图,首先需要向perf动态添加探针以监控标准库的malloc行为,并采样捕捉正在进行内存申请/释放的函数的调用堆栈: + +``` +perf record -e probe_libc:malloc -F 1000 -p `pidof fisco-bcos` -g -- sleep 60 +``` + +然后绘制内存火焰图: + +``` +perf script > memory.perf +./stackcollapse-perf.pl memory.perf > memory.folded +./flamegraph.pl --colors=mem memory.folded > memory.svg +``` + +得到的火焰图如下图所示: + +![](../../../../images/articles/performance_optimization_tools/IMG_5246.JPG) + +我们起初猜想,这块未知的缓存可能位于LevelDB的数据库连接模块或JSON解码模块中,但通过比对第一次执行区块和后续执行区块的内存火焰图,我们发现各个模块中malloc采样数目的比例大致相同,因此很快便将这些猜想否定掉了。直到结合Off-CPU火焰图观察,我们才注意到第一次执行区块时调用sysmalloc的次数异常之高。联想到malloc会在首次被调用时进行内存预分配的特性,我们猜想第一次执行区块耗时较多可能就是由此造成的。 + +为验证猜想,我们将malloc的预分配空间上限调低: + +``` +export MALLOC_ARENA_MAX=1 +``` + +然后再次进行测试并绘制Off-CPU火焰图,发现虽然性能有所降低,但是第一次执行区块的耗时和sysmalloc调用次数,基本无异于之后执行的区块。据此,我们基本可以断定这种有趣的现象是由于malloc的内存预分配行为导致。 + +当然,这种行为是操作系统为了提高程序整体性能而引入的,我们无需对其进行干涉,况且第一个区块的执行速度较慢,对用户体验几乎也不会造成负面影响,但是再小的性能问题也是问题,作为开发人员我们应当刨根问底,做到知其然且知其所以然。 + +虽然这次Memory火焰图并没有帮我们直接定位到问题的本质原因,但通过直观的数据比对,我们能够方便地排除错误的原因猜想,减少了大量的试错成本。面对复杂的内存问题,不仅需要有敏锐的嗅觉,更需要Memory火焰图这类好帮手。 + +## 4.DIY工具 + +尽管已经有如此多优秀的分析工具,帮助我们在性能优化前进的道路上披荆斩棘,但强大的功能有时也会赶不上性能问题的多变性,这种时候就需要我们结合自身的需求,自给自足地开发分析工具。 + +在进行FISCO BCOS的稳定性测试时,我们发现随着测试时间的增长,FISCO BCOS节点的性能呈现衰减趋势,我们需要得到所有模块的性能趋势变化图,以排查出导致性能衰减的元凶,但现有的性能分析工具基本无法快速、便捷地实现这一需求,因此我们选择另寻他路。 + +首先,我们在代码中插入大量的桩点,这些桩点用于测量我们感兴趣的代码段的执行耗时,并将其附加上特殊的标识符记录于日志中: + +``` +auto startTime = utcTime(); +/* +...code to be measured... +*/ +auto endTime = utcTime(); +auto elapsedTime = endTime - startTime; +LOG(DEBUG) << MESSAGE("timeCost: ") \ + << MESSAGE(to_string(elspasedTime)); +``` + +当节点性能已经开始明显下降后,我们将其日志导出,使用自己编写的Python脚本将日志以区块为单位进行分割,随后读取每个区块在执行时产生的桩点日志,并解析出各个阶段的耗时,然后由脚本汇总到一张大的Excel表格中,最后再直接利用Excel自带的图表功能,绘制出所有模块的性能趋势变化图,如下图所示: + +![](../../../../images/articles/performance_optimization_tools/IMG_5247.JPG) + +其中,横坐标为区块高度,纵坐标为执行耗时(ms),不同颜色曲线代表了不同模块的性能变化。 + +从图中可以看出,只有由红色曲线代表的区块落盘模块的执行耗时明显地随着数据库中数据量的增大而迅速增加,由此可以判断节点性能衰减问题的根源就出在区块落盘模块中。使用同样的方式,对区块落盘模块的各个函数进一步剖析,我们发现节点在向数据库提交新的区块数据时,调用的是LevelDB的update方法,并非insert方法。 + +两者的区别是,由于LevelDB以K-V的形式存储数据,update方法在写入数据前会进行select操作,因为待update的数据可能在数据库中已存在,需要先按Key查询出Value的数据结构才能进行修改,而查询的耗时与数据量成正比,insert方法则完全不需要这一步。由于我们写入的是全新的数据,因此查询这一步是不必要的,只需改变数据写入的方式,节点性能衰减的问题便迎刃而解。 + +相同的工具稍微变换一下用法,就能衍生出其他的用途,比如:将两批桩点性能数据放入同一张Excel表格中,便能够通过柱状图工具清晰地展现两次测试结果的性能变化。 + +下图展示的是我们在优化交易解码及验签流程时,优化前后性能柱状对比图: + +![](../../../../images/articles/performance_optimization_tools/IMG_5248.JPG) + +从图中可以看出,交易解码和验签流程优化后的耗时的确比优化前有所降低。借由柱状对比图,我们能够轻松地检查优化手段是否行之有效,这一点在性能优化的过程中起到了重要的指导作用。 + +综上可见,DIY工具并不一定需要有多复杂,但一定可以最快地满足我们的定制化需求。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/sync_and_its_performance_optimization.md b/3.x/zh_CN/docs/articles/3_features/31_performance/sync_and_its_performance_optimization.md new file mode 100644 index 000000000..a87e5bc25 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/sync_and_its_performance_optimization.md @@ -0,0 +1,81 @@ +# 区块链的同步及其性能优化方法 + +作者:石翔|FISCO BCOS 核心开发者 + +同步,是区块链中非常重要的流程,从功能上分为“交易同步”和“状态同步”。交易同步在交易提交时执行,优先保证交易能发往所有的节点,被打包处理。状态同步发生在某个节点发现自己区块高度落后于全网时,通过状态同步快速追回到全网最高的高度,这样作为共识节点可以参与到最新的共识过程中,而非共识节点能获取到最新的区块数据,以进行存储和验证。 + +## 交易同步 + +交易同步,是让区块链上的交易尽可能到达所有节点,为共识中将交易打包成区块提供基础。 + +![](../../../../images/articles/sync_and_its_performance_optimization/IMG_5249.PNG) + +一笔交易(tx1),从客户端上发往某个节点,节点在接收到交易后,会将交易放入自身的交易池(Tx Pool)中供共识去打包。与此同时,节点会将交易广播给其它的节点,其它节点收到交易后,也会将交易放到自身的交易池中。 + +交易在发送的过程中,会有丢失的情况,为了能让交易尽可能到达所有节点,收到广播交易的节点,会根据自身网络拓扑和网络流量策略,选择一到多个相邻节点,进行接力广播。 + +### 交易广播策略 + +如果每个节点都没有限制的转发/广播收到的交易,带宽将被占满,出现交易广播雪崩的问题。为了避免交易广播的雪崩,FISCO BCOS设计了较为精巧的交易广播策略,在尽可能保证交易可达性的前提下,尽量减少重复的交易广播。 + +- 对于SDK来的交易,广播给所有的节点 +- 对于其它节点广播来的交易,随机选择25%的节点再次广播 +- 一条交易在一个节点上,只广播一次,当收到了重复的交易,不会进行二次广播 + +通过上述策略,能够尽量让交易到达所有的节点,交易会尽快被打包、共识、确认,让交易能够更快得到执行的结果。 + +广播策略已经在复杂网络里尽量追求了网络最终到达率,但也会有极小的概率,出现某交易在一定时间窗内无法到达某节点的情况。当交易未到达某个节点,只会使得交易被确认的时间变长,不会影响交易的正确性,也不会漏处理交易,因为有广播机制,网络里还有更多的节点有机会继续处理这个交易。 + +## 区块同步 + +区块同步,能让区块链节点的数据状态保持在最新。 + +区块链状态的新旧,最重要的标识之一就是区块高度,而区块里包含了链上的历史交易,若一个节点的块高和全网最高块高对齐,则此节点有机会回溯历史交易,以获得区块链的最新状态,只有拥有最新状态的节点,才能参与到共识中去,进行下一个新区块的共识。 + +![](../../../../images/articles/sync_and_its_performance_optimization/IMG_5250.PNG) + +当一个全新的节点加入到区块链上,或一个已经断网的节点恢复了网络,此节点的区块高度落后于其它节点,其状态不是最新的。此时就需要进行区块同步。如上图,需要区块同步的节点(Node 1),会主动向其它节点请求下载区块。整个下载过程会将网络请求负载分散到多个节点上。 + +### 区块同步与下载队列 + +区块链节点在运行时,会定时向其它节点广播自身的最高块高。节点收到其它节点广播过来的块高后,会和自身的块高进行比较,若自身的块高落后于此块高,就会启动区块下载流程。区块的下载通过“请求/响应”的方式完成,进入下载流程的节点,会随机挑选满足要求的节点,发送需要下载的区块高度区间。收到下载请求的节点,会根据请求的内容,回应相应的区块。 + +![](../../../../images/articles/sync_and_its_performance_optimization/IMG_5251.PNG) + +收到回应区块的节点,在本地维护一个下载队列,用来对下载下来的区块进行缓冲和排序。下载队列是一个以块高为顺序的优先队列。下载下来的新区块,会不断插入到下载队列中,按高度排序。排序好的区块,会依次被节点执行和验证。验证通过后,更新本地的数据状态,让块高增加,直至更新到最新块,块高达到最高。 + +## 性能优化 + +对同步的性能优化,能有效提升系统效率。FISCO BCOS在这方面做了很多,下面选取了一些关键的优化点。 + +### 编码缓存 + +在交易广播中,需要将交易编码成二进制数据发送给其它节点,其它节点在收到交易二进制数据后,需要解码成程序可识别的数据结构。当交易量很大时,编解码成为交易广播的性能瓶颈。FISCO BCOS将交易的二进制编码进行缓存,当要发送交易时,直接从缓存中取出二进制发送,减少编解码的频率,增加交易广播的速率。 + +### 负载均衡 + +区块落后的节点会通过请求的方式从其它节点下载区块。其它节点在收到请求后,会将相应区间的区块发送给落后的节点。在区块落后很多的情况下,FISCO BCOS节点会将下载区间均匀切分,向不同的节点发起请求,把下载负载分散到不同的节点上,避免单一被请求节点因承载大量的数据访问请求而影响其运行性能。 + +### **回调剥离** + +在FISCO BCOS节点中,有多个回调线程处理网络上收到的包。当网络流量很大时,处理网络包的线程处理不过来,会将网络包放到缓冲队列中。网络上的包主要为同步包和共识包,共识包优先级更高,直接影响出块速度。为了不影响共识包的处理,FISCO BCOS将同步包的处理逻辑从网络回调线程中剥离出来,交给另外的独立线程,和共识包的处理解耦和并行了。 + +### **验签去重** + +同步模块在收到交易时,需要对交易进行验签。共识模块收到区块后,从区块中取出交易,也需要对交易进行验签。虽然是同一笔交易,却在同步和共识中都进行了验签。然而验签非常耗时,大大影响了交易执行的TPS。FISCO BCOS在交易执行时做了去重逻辑,无论是同步还是共识,在验签前先查询验签记录,若此交易已验签,则直接从记录中获取验签结果,保证同一笔交易只验签一次。同时,FISCO BCOS让同步尽可能地在共识前验签,让共识尽可能直接获取验签结果,减少验签在共识中的耗时。共识得到了加速,链的TPS性能表现相应得到提升。 + +## 总结 + +共识与同步是区块链中必不可少的环节。共识打头阵,同步打辅助。同步流程使得整个区块链网络所有节点都达到数据一致性,保证数据全网可验证。同时,在不影响共识的前提下,为共识提前准备好所需的数据,让共识跑得更快更稳定。 + +#### 相关阅读 + +- [卓别林演绎共识与同步流程优化](./articles/3_features/31_performance/consensus_and_sync_process_optimization.md) + +- [同步模块文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/sync/sync.html) + +#### 「群聊互动」 + + **Q** **大雪无痕**:负载均衡同步时如果同步到一个支链上的块,怎么办?另外,出现分叉时,支链保留多久后被丢弃? + + **A** **石翔**:FISCO BCOS 用的共识算法是pbft,不会分叉哈。不会分叉的共识算法带来很多好处,没有了回滚,同步可以负载均衡了,mpt树可以去了,mpt改成了表结构的存储,表结构间没有数据冲突,就可以并行执行交易了,所以联盟链可以很快。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/31_performance/sync_optimization.md b/3.x/zh_CN/docs/articles/3_features/31_performance/sync_optimization.md new file mode 100644 index 000000000..97674a20b --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/31_performance/sync_optimization.md @@ -0,0 +1,89 @@ +# FISCO BCOS同步模块的优化策略 + +作者:陈宇杰|FISCO BCOS 核心开发者 + +**作者语** + +在FISCO BCOS区块链系统中,同步模块身担重任。既是交易传输小能手,将客户端发送的交易输送给所有节点交易池,源源不断地为共识模块提供打包区块的“原材料”;又是“困难户拯救者”,将最新区块同步到块高落后的“困难户”节点,使其能正常参与共识。 + +当然,由于同步模块的职责大多与网络有关,因此它也是系统“带宽消耗大户”,会导致区块链部分节点带宽负载高。为此,FISCO BCOS开发者们也设计了一系列策略来优化这个“带宽消耗大户”,使其能更优雅地服务于系统。 + +本文将详细介绍FISCO BCOS同步模块的优化之路。 + +------ + +## 初识同步模块 + +交易同步和区块同步是FISCO BCOS区块链系统同步模块的主要职责,这两个职责都和网络相关。 + +![](../../../../images/articles/sync_optimization/IMG_5252.PNG) + +如上图所示,交易同步负责将客户端发出的交易发送给所有其他节点,为共识模块提供用于打包区块的交易。为保证交易能到达所有节点,交易同步主要包括交易广播和交易转发两个部分: + +- **交易广播**:客户端首先将交易发送给客户端直连节点,该节点将收到的交易广播给所有其他节点; +- **交易转发**:为保证网络断连情况下交易能到达所有节点,收到广播交易的节点,随机选取25%的节点转发收到的交易。 + +区块同步则负责拯救块高落后的"困难户",将最新块高同步到块高落后的节点。节点区块高度低于其他节点时,会主动向区块高度更高的节点拉取新区块。 + +## 同步模块的不合理网络使用姿势 + +前面章节提到同步模块是“带宽消耗大户”,下面就来细说这个“带宽消耗大户”的不合理网络使用姿势。 + +### 交易同步时,客户端直连节点网络负载高 + +考虑到gossip协议消息传递速度慢,联盟链场景一般采用节点网络全互联的方式来提升网络效率。为保障客户端发出的交易能快速到达所有节点,客户端直连节点收到交易后,会将交易广播给所有节点。由于区块链节点外网带宽有限,随着节点规模增加,客户端直连节点必然因网络负载高而成为系统瓶颈。 + +### 交易转发时,网络利用效率低 + +为保障在部分节点网络断连的情况下,交易仍然能到达所有节点,同步模块引入了交易转发机制。节点收到交易后,会随机选取若干节点广播收到的交易。 + +网络全连的情况下,这样会导致部分节点频繁收到重复的数据包,且节点数目越多,因交易转发带来的冗余消息包就越多,无疑造成巨大的网络带宽浪费。 + +### 区块同步时,部分节点网络负载高,导致节点规模不可扩展 + +考虑到目前使用的BFT或CFT类共识算法的区块链复杂度较高、不具有无限可扩展性,大部分业务架构仅有部分节点作为共识节点,其他节点均作为观察节点(不参与共识,但拥有区块链全量数据),如下图所示。 + +![](../../../../images/articles/sync_optimization/IMG_5253.PNG) + +在这种架构中,大部分观察节点随机从拥有最新区块的共识节点下载区块。在包含n个共识节点、m个观察节点的区块链系统中,设每个区块大小为block_size,理想情况下(即负载均衡),每共识一个区块,每个共识节点需要向m/n个观察节点发送区块,共识节点出带宽大约是(m/n)*block_size;设网络带宽是bandwidth,则每个共识节点最多可向(bandwidth/block_size)个节点同步区块,即区块链最大节点规模是(n*bandwidth/block_size)。在公网带宽bandwidth较小、区块较大的情况下,能容纳的节点数有限,因此随机的区块同步策略不具有可扩展性。 + +## 同步模块的优化策略 + +为提升系统带宽使用效率和系统的可扩展性,FISCO BCOS开发者们提出了一系列优化策略来“纠正”同步模块不合理的网络使用姿势,使其能更优雅、更高效地服务于FISCO BCOS区块链系统。 + +### 策略一:交易树状广播 + +为降低客户端直连节点交易广播带来的网络压力,FISCO BCOS秉着负载均衡的原则,设计了交易树状广播策略,将客户端直连节点的压力分摊给其下属子节点,下图展示了优化前后七节点区块链系统的交易广播拓扑: + +![](../../../../images/articles/sync_optimization/IMG_5254.PNG) + +- **优化前:**节点收到客户端交易后,全量广播给其他节点; +- **优化后:**节点收到客户端交易后,将其发送给子节点,子节点收到交易后,继续将交易转发给自身的子节点。 + +采用交易树状广播后,上图所示的客户端直连节点将部分网络负载分摊给子节点,带宽负载降低为原先的一半,达到了负载均衡的目标。并且,由于所有节点广播交易的出带宽仅与树状拓扑的宽度有关,交易树状广播策略具有可扩展性。此外,相较于基于gossip的交易广播机制,树状广播策略提升了交易广播速率的同时,降低了网络中冗余的消息包数量。 + +### 策略二:基于状态包的交易转发优化 + +为消除交易转发带来的带宽消耗,提升网络效率,FISCO BCOS提出了基于状态包的交易转发策略,优化后的交易转发模块不直接转发交易,仅转发交易状态。节点可根据收到的交易状态以及交易池内已有的交易获取缺失的交易,并直接向相应节点拉取缺失交易。 + +![](../../../../images/articles/sync_optimization/IMG_5255.PNG) + +上图中,客户端直连node0,但node0与node1、node4断连,此时node0仅能将交易广播给node2和node3。node2和node3收到交易后,将最新交易的列表打包成状态包发送给其他节点。node1和node4收到状态包后,与本地交易池内的交易列表做对比,获取缺失的交易列表,并批量向拥有这些交易的node2或node3请求交易。在全连的网络环境中,所有节点交易状态基本一致,节点间交易请求较少,相较于直接转发交易的策略,大大降低了转发冗余交易引起的带宽浪费。 + +### 策略三:区块同步可扩展性优化 + +为降低多个观察节点向单个共识节点同步区块时,共识节点的网络出带宽对网络规模的影响,提升区块链系统区块同步的可扩展性,FISCO BCOS设计并实现了区块状态树状广播策略。 + +下图是由3个共识节点、18个观察节点构成的区块链系统沿三叉树进行区块同步的示意图: + +![](../../../../images/articles/sync_optimization/IMG_5256.PNG) + +该策略将观察节点分摊给每个共识节点,并以共识节点为顶点构造一颗三叉树。共识节点出块后,优先向其子观察节点发送最新区块状态,子观察节点同步最新区块后,优先向自己的子节点发送最新区块状态,以此类推。采用了区块状态树状广播策略后,每个节点优先将最新区块状态发送给子节点,子节点优先向父节点同步最新块,设区块大小为block_size,树的宽度为w,则用于区块同步的网络带宽均为(block_size * w),与区块链系统的节点总数无关,具有可扩展性。 + +此外,考虑到树状拓扑中,节点断连可能导致区块无法到达部分节点,区块状态树状广播优化策略还采用了gossip协议定期同步区块状态,使得树状拓扑中的断连节点也能从其邻居节点处同步最新区块,保障树状区块状态广播的健壮性。 + +## 小结 + +同步模块是交易传输小能手,也是“困难户拯救者”,更是"带宽消耗大户",这个"带宽消耗大户"无论是在执行同步交易的任务,还是在履行同步区块的职责,都存在浪费带宽、过度使用部分节点带宽的嫌疑。 + +FISCO BCOS开发者采用一系列优化策略规范了同步模块的带宽使用姿势,尽量减少同步模块冗余消息包的同时,将高负载节点的带宽压力分摊给下属子节点,提升了区块链系统的可扩展性,使得优化后的同步模块能更优雅、更高效、更健壮地服务于区块链系统。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/32_consensus/consensus_optimization.md b/3.x/zh_CN/docs/articles/3_features/32_consensus/consensus_optimization.md new file mode 100644 index 000000000..ebcd16b88 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/32_consensus/consensus_optimization.md @@ -0,0 +1,85 @@ +# FISCO BCOS共识优化之路 + +作者:陈宇杰|FISCO BCOS 核心开发者 + +**作者语** + +原来的PBFT共识算法在区块打包、交易验签、区块执行、空块处理等方面有持续优化空间,为了让PBFT算法更快更稳,FISCO BCOS做了一系列优化,包括: + +- 打包和共识并发进行; +- 不重复验签交易; +- 引入DAG并行交易执行框架,可并行执行区块内交易; +- 空块快速触发视图切换,并切换Leader,不落盘空块,消除空块落盘存储开销的同时,有效防止了节点作恶; +- 解决了节点宕机后,无法快速追上其他节点视图的问题,保证了系统的可用性。 + +本文分别从性能、存储和可用性三个方面,向大家细说FISCO BCOS的共识优化方案。 + +## 性能优化 + +考虑到**Leader轮流串行打包交易**、**交易验签速度慢**以及**区块执行速度慢**,都是导致性能问题的主要因素,FISCO BCOS做了如下优化: + +### 打包和共识并发执行 + +PBFT共识算法在每一轮共识,都包括**打包阶段**和**共识阶段**,Leader打包新区块时,所有共识节点都处于等待Prepae包的状态中,无法进入共识阶段;共识节点处于共识阶段时,Leader的打包线程不工作,但打包区块和共识是两个独立互斥的过程,可以并发执行。 + +![](../../../../images/articles/consensus_optimization/IMG_4897.PNG) + + +设打包阶段的时间开销为t, 共识阶段时间开销为u,n轮共识的时间开销为n∗(t+u);但若下一轮共识的Leader参与共识阶段的同时,也提前打包区块,并在下一轮共识时,广播已经打包好的区块,则可将共识时间开销缩短为n∗u+t,时间开销降低了(n-1)*t,可以有效提升PBFT共识算法性能。 + +### 避免交易重复验签 + +![](../../../../images/articles/consensus_optimization/IMG_4898.PNG) + +共识节点收到Leader发送的Prepare包后,会从中取出区块,并验证区块内每笔交易签名的有效性,但交易验签是很耗时的操作,会增加PBFT Prepare阶段的时间开销,降低性能。 + +考虑到交易插入到交易池的时候,会进行一次验签,如下图所示,FISCO BCOS系统做了防止交易重复验签的优化,下面结合整个交易流的处理流程,详细说明FISCO BCOS防止交易重复验签的处理流程: + +![](../../../../images/articles/consensus_optimization/IMG_4899.PNG) + +1. RPC接收客户端发送的交易后,进行交易验签; +2. 交易验证通过后,被插入到交易池,同步模块广播交易; +3. 其他节点的同步模块收到其他节点的交易后,并进行验签交易,并将有效交易插入到交易池; +4. 共识模块收到Prepare包后,解出Prepare包内区块,判断区块内交易是否在交易池内,仅验证不包含在交易池内的交易签名。 + +经过上述优化后,将Prepare请求内包含10000笔交易的区块解码和验签时间,由2s降低为200ms,大大减少了Prepare阶段的时间开销。 + +### 区块并行执行 + +区块执行是PBFT共识算法的主要时间开销之一,没有做任何并行优化的情况下,PBFT共识算法几乎无法就一个包含上万笔交易的区块达成共识。 + +为了提升区块链系统TPS,FISCO BCOS系统开发了基于DAG的交易并行执行引擎,并引入了可并行的合约开发框架,支持并行执行交易,达到了上万的TPS。具体可参考这里:[《区块链性能腾飞:基于DAG的并行交易执行引擎》。](https://mp.weixin.qq.com/s?__biz=MzU5NTg0MjA4MA==&mid=2247484211&idx=1&sn=73591fef0a1a7cc683fd6577b362efca&chksm=fe6a867cc91d0f6aad155a2b7ecd2e077ff35af41e088533626ede34af24a57f3613e197af2d&mpshare=1&scene=21&srcid=0806kJGQCVXQewNJU9ZsRQ2w&sharer_sharetime=1565076787459&sharer_shareid=bc5c95f953e1901389b9c82c159fbb6b&rd2werd=1#wechat_redirect) + +## 存储优化 + +![](../../../../images/articles/consensus_optimization/IMG_4900.PNG) + + +为保障系统正常运行、确认Leader可用、防止Leader故意作恶,基于PBFT共识算法的区块链系统在没有交易时,会产生空块,并就空块达成共识。 +虽然空块共识是必要的,但考虑到当前区块链系统的QPS不大,落盘空块会耗费存储空间、降低硬盘利用效率(可存储的交易数)。 +FISCO BCOS基于PBFT共识算法,实现了高效的空块处理方法,保证空块参与PBFT共识流程的同时,不落盘空块,提升了磁盘利用效率。详细方案可参考这里:[《FISCO BCOS的PBFT空块处理》](https://mp.weixin.qq.com/s?__biz=MzU5NTg0MjA4MA==&mid=2247485288&idx=2&sn=35e32f22cda893e7f02fe58369000164&chksm=fe6a8227c91d0b31133d7302b25decb6f6bba08a8d70848fcaf6573e6983a8e69885d2ed7fa3&mpshare=1&scene=21&srcid=&sharer_sharetime=1565077005952&sharer_shareid=bc5c95f953e1901389b9c82c159fbb6b&rd2werd=1#wechat_redirect)。 + +## 可用性优化 + +![](../../../../images/articles/consensus_optimization/IMG_4901.PNG) + +刚启动的节点或者新节点加入区块链网络时,若不能立即和其他节点视图达成一致,会影响系统容错性。 + +- case1:4节点区块链系统,node0宕机,剩余三个节点容错节点数为0;node0重启若无法快速追上其他节点视图,系统可容错节点数仍然为0,且node0处于共识异常状态中。 +- case2:2节点区块链系统正常运行,新加入节点node2,若node2无法快速追上其他节点视图,系统会由于1个节点异常(新加入节点)而处于共识异常状态中。 + +针对上面问题,FISCO BCOS PBFT共识算法引入了快速视图追赶机制,刚启动节点向所有其他共识节点发送视图切换包,其他节点收到包后,向其回复最新视图,从而使得刚启动节点可快速和其他共识节点达成一致视图,系统在加入了新节点后也不会共识异常。 + +![](../../../../images/articles/consensus_optimization/IMG_4902.PNG) + +如上图所示,核心流程如下: + +- 刚启动节点向所有其他节点广播视图切换请求包ViewChange,请求包内的视图ViewChange.toView为1; +- 其他节点收到toView远小于当前节点视图的ViewChange请求后,回复包含当前视图(view)的ViewChange包; +- 刚启动节点收集满2*f+1个ViewChange包后,切换到和其他共识节点一致的视图。 + +## 总结 + +以上详述了FISCO BCOS在共识算法上的优化策略,FISCO BCOS使用系统的方法使得PBFT算法性能和存储效率更高,可用性更强。 +当然,除了前面提到的问题外,PBFT算法在网络复杂度上也有持续优化空间,FISCO BCOS开发团队也在积极调研最新的共识算法及共识算法优化策略,并寻求大规模节点共识的解决方案,敬请期待。 + diff --git a/3.x/zh_CN/docs/articles/3_features/32_consensus/index.md b/3.x/zh_CN/docs/articles/3_features/32_consensus/index.md new file mode 100644 index 000000000..6b95986f5 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/32_consensus/index.md @@ -0,0 +1,15 @@ +### 共识算法 + +共识框架:可插拔设计 + +共识算法:PBFT、Raft、Rpbft + +```eval_rst +.. toctree:: + :maxdepth: 1 + + consensus_optimization.md + pbft_empty_block_processing.md + rpbft_design_analysis.md +``` + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/32_consensus/pbft_empty_block_processing.md b/3.x/zh_CN/docs/articles/3_features/32_consensus/pbft_empty_block_processing.md new file mode 100644 index 000000000..f4d485bb5 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/32_consensus/pbft_empty_block_processing.md @@ -0,0 +1,77 @@ +# FISCO BCOS的PBFT空块处理 + +作者:陈宇杰|FISCO BCOS 核心开发者 + +**作者语** + +为了保障系统正常运行、确认Leader可用、防止Leader故意作恶,基于PBFT共识算法的区块链系统 (如Algorand) 在没有交易时,会产生空块。 + +在常见的区块链网络里,记账者通常根据算法持续出块,目的是为了保障系统正常运行、防止作恶等,即使区块里不包含交易,空区块也会被共识确认和落盘存储。 + +虽然对空块进行共识有一定作用,但空块落盘会耗费存储空间、降低硬盘利用率 (可存储的交易数),并一定程度上影响面向区块数据的回溯和检索效率。 + +所以,FISCO BCOS基于PBFT共识算法,实现了高效的空块处理方法,保证每个区块都参与PBFT共识流程的同时,不落盘空块,提升了磁盘利用效率,也确保了系统的安全性、健壮性。 + +## 名词解释 + +### 节点类型 + +- **Leader/Primary**: 共识节点,负责将交易打包成区块和区块共识,每轮共识过程中有且仅有一个Leader,为防止Leader伪造区块,每轮PBFT共识后,均会切换Leader; +- **Replica**: 副本节点,负责区块共识,每轮共识过程中有多个Replica节点,每个Replica节点的处理过程类似; +- **Observer**: 观察者节点,负责从共识节点或副本节点获取最新区块,执行并验证区块执行结果后,将产生的区块上链。 + +其中Leader和Replica统称为共识节点。 + +### 视图(view) + +PBFT共识算法使用**视图view记录每个节点的共识阶段,相同视图节点维护相同的Leader和Replica节点列表**。当Leader出现故障,会发生视图切换,并根据新视图选出新Leader。 + +FISCO BCOS系统中,Leader计算公式如下: + +``` +leader_idx = (view + block_number) % node_num +``` + +## 为什么共识空块须切换Leader + +### 防止Leader故意作恶 + +![](../../../../images/articles/pbft_empty_block_processing/IMG_5292.PNG) + +如上图,node0是不可信的当前Leader,若共识空块后不切换Leader,该节点一直向其他节点广播空块,使得Leader一直是node0,导致系统无法处理正常交易。共识空块后,切换Leader,可切换Leader为可信节点,有效防止Leader作恶问题。 + +### 防止切换到无交易Leader导致的系统异常 + +![](../../../../images/articles/pbft_empty_block_processing/IMG_5293.PNG) + +如上图,node0是可信的当前Leader,但其交易池内可打包的交易数为0,共识空块后不切换Leader会导致该节点一直向其他节点广播空块,系统Leader一直是node0,无法处理正常交易。共识空块后,切换Leader,可切换Leader为有交易的节点,保障了系统正常运行。 + +## 落盘空块存在的问题 + +### 浪费存储空间 + +有些业务在一天中有忙闲的时段之分,比如,在半夜里,可能有大段的时间并没有用户在交易,这个时候如果持续出块,会持续有空块生成。 + +例:某区块链系统1s出一个块,1天有50%的时间没有交易,每个空块大小为1KB,若这些空块都落盘,则一天空块占据的磁盘空间为:3600s/h * 24h * 50% * 1KB ≈ 43.2MB,1年空块占据约为15.7GB磁盘空间。假设平均每个交易大小为1KB,这15.7GB磁盘空间可用于存储15.7GB/1KB=15,700笔交易。 + +![](../../../../images/articles/pbft_empty_block_processing/IMG_5294.PNG) + +## FISCO BCOS PBFT空块处理方案 + +如下图所示,FISCO BCOS PBFT共识算法,通过空块触发快速视图切换的方法,达到切换Leader目的,同时不落盘空块。 + +![](../../../../images/articles/pbft_empty_block_processing/IMG_5295.PNG) + +### 核心流程 + +结合上图,下面介绍FISCO BCOS PBFT空块处理算法的主要流程: + +1. Leader(node0)节点在指定时间间隔(当前是1秒)没有打包到交易,则基于最高块构造一个空块,内含0笔交易; +2. Leader将空块封装在Prepare包内,并广播给所有其他共识节点; +3. 其他共识节点收到Prepare包后,取出区块,若区块是空块,则将节点即将切换的视图toView设置为当前视图加一,并相互间广播视图切换请求viewchange_request,viewchange_request中的视图为toView,即视图增加当前view; +4. 共识节点收集视图切换包:节点收集满n- f (n是共识节点数,至少为3*f+1;f是系统可容错的节点数目) 个来自不同节点、视图与节点toView值一致的视图切换请求后,触发视图切换,将当前视图view切换为toView; +5. 由于视图切换,下一轮共识的Leader切换为下一个节点(即node1)。 + +## 总结 + +综上可知,FISCO BCOS PBFT共识算法,通过空块触发快速视图切换,并切换Leader优化了空块处理流程,解决了共识空块不切换Leader导致的系统异常,实现了空块不落盘存储,提升了磁盘利用效率,加快了数据追溯的效率,减少了数据分析的复杂度。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/32_consensus/rpbft_design_analysis.md b/3.x/zh_CN/docs/articles/3_features/32_consensus/rpbft_design_analysis.md new file mode 100644 index 000000000..6bbeb9ef3 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/32_consensus/rpbft_design_analysis.md @@ -0,0 +1,117 @@ +# 我们为什么这样设计RPBFT? + +作者:陈宇杰|FISCO BCOS 核心开发者 + +## 前言 + +共识模块是区块链系统的引擎,在保证各区块链节点数据一致性方面起到至关重要的作用。FISCO BCOS引入可插拔的共识引擎后,同时支持PBFT和Raft两种共识算法,相较于采用POW共识算法的区块链系统,交易确认时延更低、吞吐量更高,可满足当前大部分联盟链系统的性能需求。 + +PBFT共识算法更因其可容忍拜占庭错误而天然适用于区块链系统。可PBFT共识算法也存在可扩展性低的问题。FISCO BCOS团队从2019年开始一直致力于研究新的共识算法,以同时保障区块链系统的性能和可扩展性。FISCO BCOS 2.3版本中发布的RPBFT共识算法为研究成果之一。本文将详细介绍RPBFT共识算法的设计目的与其中的技术实现。 + +## PBFT共识算法挑战 + +介绍RPBFT共识算法之前,先来看看PBFT共识算法的挑战,以及学术界的对应解决方案。PBFT共识算法起源于上世纪。1999年,Miguel Castro(卡斯特罗)和Barbara Liskov(利斯科夫)提出PBFT共识算法,将BFT算法复杂度从指数级降到多项式级,使得PBFT共识算法就可应用于实际系统中。不同于POW共识算法,PBFT基于分布式一致性原理保障分布式系统最终一致性。由于摒弃了算力,PBFT共识算法性能更高、交易确认时延更低,加之基于密码学技术的防作恶机制,天然适用于联盟区块链系统。可PBFT共识算法也有"软肋",从其三阶段共识流程得以一窥。 + +![](../../../../images/articles/rpbft_design_analysis/IMG_5296.PNG) + +从上图可看出,PBFT共识流程中,节点之间需要相互广播共识消息包,且网络复杂度与节点数目的平方成正比,严重限制了PBFT的可扩展性。 + +下图整理自IBM研究员Marko调研,反映了采用不同共识算法的区块链系统节点规模与交易延迟之间的关系: + +![](../../../../images/articles/rpbft_design_analysis/IMG_5297.PNG) + +从中可看出,BFT类共识算法性能很高,但其支撑的节点规模最多不超过1000。2019年,HotStuff成为各区块链平台争相研究的共识算法,相对于PBFT,HotStuff具备算法简单、网络复杂度与节点规模成线性关系等多种优势。下图是HotStuff的核心流程: + +![](../../../../images/articles/rpbft_design_analysis/IMG_5298.PNG) + +由于HotStuff复杂度仍然与节点规模成正比,没法从根本上解决共识算法可扩展性问题,且HotStuff每个阶段都依赖于Leader收集、广播消息包,Leader会成为每轮共识的瓶颈。基于以上调研,FISCO BCOS团队先后实现了PBFT分组共识算法、HotStuff共识算法。但随着节点规模的增加,这些共识算法的性能、吞吐率逐渐下降。因此,我们开始探索一种不会因节点数量增加而导致区块链系统性能快速线性下降的共识机制,RPBFT共识算法在这种情况下应运而生。 + +## RPBFT共识算法核心思想 + +RPBFT共识算法的目标是在保障区块链系统性能、安全性的前提下,将共识算法网络复杂度与共识节点规模解耦,提升区块链系统的可扩展性。为实现这个目标,FISCO BCOS团队参考DPOS思路,在大节点规模下,随机选取部分节点作为“共识委员节点”参与每轮PBFT共识,由于共识委员节点数目固定、与节点规模无关,因此RPBFT共识算法可扩展性更强。此外,为了保障系统安全、防止共识委员节点联合作恶,RPBFT算法会周期性地替换共识委员节点,如下图所示 + +![](../../../../images/articles/rpbft_design_analysis/IMG_5299.PNG) + +## RPBFT共识算法实现方案 + +RPBFT算法主要包括2个系统参数: + +- epoch_sealer_num:每轮共识过程中参与共识的节点数目,可通过控制台发交易方式动态配置该参数。 +- epoch_block_num: 共识节点替换周期,为防止选取的共识节点联合作恶,RPBFT每出epoch_block_num个区块,会替换若干个共识委员节点,可通过控制台发交易的方式动态配置该参数。 + +这两个配置项记录在系统配置表中,配置表主要包括配置关键字、配置对应的值、生效块高三个字段,其中生效块高记录了配置最新值的最新生效块高,例:在100块发交易将epoch_sealer_num和epoch_block_num分别设置为4和10000,此时系统配置表如下: + +| key | value | enable_num | +| ---------------- | ----- | ---------- | +| epoch_sealer_num | 4 | 101 | +| epoch_block_num | 10000 | 101 | + +RPBFT共识算法核心算法流程如下: + +### 确定各共识节点编号IDX + +对所有共识节点的NodeID进行排序,如下图,节点排序后的NodeID索引即为该共识节点编号: + +![](../../../../images/articles/rpbft_design_analysis/IMG_5300.PNG) + + +### 链初始化 + +链初始化时,RPBFT需要选取epoch_sealer_num个共识节点到共识委员中参与共识,目前初步实现是选取索引为0到epoch_sealer_num-1的节点参与前epoch_block_num个区块共识。 + +### 共识委员节点运行PBFT共识算法 + +选取的epoch_sealer_num个共识委员节点运行PBFT共识算法,验证节点同步并验证这些验证节点共识产生的区块,验证步骤包括: + +- 校验区块签名列表:每个区块必须至少包含三分之二共识委员节点的签名 +- 校验区块执行结果:本地执行结果须与共识委员产生的区块执行结果一致 + +### 动态替换共识委员节点列表 + +为保障系统安全性,RPBFT算法每出epoch_block_num个区块后,会在共识委员列表中剔除若干个节点,并加入若干个验证节点,下面以每epoch_block_num个区块剔除一个节点为例: + +![](../../../../images/articles/rpbft_design_analysis/IMG_5301.PNG) + +在目前的RPBFT算法实现中,共识委员列表节点被轮流替换为验证节点,设当前有序的共识委员会节点列表为CommitteeSealersList,共识节点总数为N,则共识epoch_block_num个区块后,会将CommitteeSealersList[0]剔除出共识委员列表,并加入索引为(CommitteeSealersList[0].IDX + epoch_sealer_num) % N的验证节点。第i轮替换周期,将CommitteeSealersList[i % epoch_sealer_num]剔除出共识委员列表,加入索引为(CommitteeSealersList[i%epoch_sealer_num].IDX + epoch_sealer_num) % N的验证节点。 + +## RPBFT网络优化 + +考虑到Prepare数据包较大,占网络开销大头,为了进一步提升RPBFT共识算法可扩展性,我们在FISCO BCOS 2.3引入了Prepare包广播优化。将Leader因广播Prepare包产生的出带宽流量分摊给其下属子节点,即:Leader产生Prepare包后,沿着树状拓扑将数据包传播给其他节点,如下图所示: + +![](../../../../images/articles/rpbft_design_analysis/IMG_5302.PNG) + +为保证在节点断连情况下开启树状广播时,Prepare包仍能到达每个节点,RPBFT引入了基于状态包的容错机制,如下图所示: + +![](../../../../images/articles/rpbft_design_analysis/IMG_5303.PNG) + +主要流程包括: + +1. 节点A收到Prepare后,随机选取33%节点广播Prepare包状态,记为prepareStatus,包括{blockNumber, blockHash, view, idx}。 + +2. 节点B收到节点A随机广播过来的prepareStatus后,判断节点A的Prepare包状态是否比节点B当前Prepare包localPrepare状态新。主要判断依据包括: + + (1) prepareStatus.blockNumber是否大于当前块高 + + (2) prepareStatus.blockNumber是否大于localPrepare.blockNumber + + (3) prepareStatus.blockNumber等于localPrepare.blockNumber情况下,prepareStatus.view是否大于localPrepare.view + + 以上任意一个条件成立,都说明节点A的Prepare包状态比节点B的状态新。 + +3. 若节点B的状态落后于节点A,且节点B与其父节点断连,则节点B向节点A发出prepareRequest请求,请求相应的Prepare包。 + +4. 若节点B的状态落后于节点A,但节点B与其父节点相连,若节点B最多等待100ms(可配)后,状态仍然落后于节点A,则节点B向节点A发出prepareRequest请求,请求相应的Prepare包。 + +5. 节点B收到节点A的prepareRequest请求后,向其回复相应的Prepare消息包。 + +6. 节点A收到节点B的Prepare消息包后,执行handlePrepare流程处理收到的Prepare包。 + +区块落盘后,为降低多个验证节点、观察节点向共识委员节点同步区块时,共识委员节点的网络出带宽对网络可扩展性的影响,RPBFT采用了区块状态树状广播策略,详细可参考[FISCO BCOS同步模块的优化策略](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485447&idx=1&sn=2bb8fa3dcf9f9276154ce83f9a75be82&scene=21#wechat_redirect)。 + +## RPBFT算法优化展望 + +FISCO BCOS 2.3初步实现了RPBFT共识算法,消除了节点规模对共识算法复杂度的影响。但目前实现的RPBFT共识算法,仍有待改进的地方,诸如:共识委员节点选取替换规则比较简单等。未来计划引入VRF可验证随机数算法来实现私密、随机、非交互式的共识委员节点选取方法,欢迎大家体验并反馈意见。 + +## 小结 + +本文介绍了BFT类算法的挑战以及FISCO BCOS团队在共识算法领域探索的初步成果。分布式系统共识是大而复杂的领域,FISCO BCOS 2.3发布的RPBFT算法目前仅解耦了节点规模对网络复杂度的影响,是实现高安全、可扩展共识算法的第一步,未来还会引入VRF算法来保证共识委员节点选取的安全性,敬请期待。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/33_storage/crud_guidance.md b/3.x/zh_CN/docs/articles/3_features/33_storage/crud_guidance.md new file mode 100644 index 000000000..1b9f04fa7 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/33_storage/crud_guidance.md @@ -0,0 +1,303 @@ +# FISCO BCOS CRUD使用指南 + +作者:廖飞强|FISCO BCOS 核心开发者 + +本文将介绍 FISCO BCOS的CRUD功能,帮助开发者更高效便捷地开发区块链应用。 + +## 为什么设计CRUD功能? + +在FISCO BCOS 1.0中,节点采用MPT数据结构,通过LevelDB将数据存储于本地,这种模式受限于本地磁盘大小,当业务量增大时数据会急剧膨胀,要进行数据迁移也非常复杂,给数据存储带来较大成本和维护难度。 + +为了突破容量和性能瓶颈,FISCO BCOS 2.0针对底层存储进行了重新设计,实现了分布式存储,带来了容量和性能上的提升。得益于分布式存储采用了库表结构,FISCO BCOS 2.0设计一套CRUD(Create增加、Read读取、Update更新和Delete删除),让接口更加顺其自然。CRUD面向库表的开发方式符合业务开发习惯,同时也为业务开发提供了另外一种选择(以往只能用Solidity合约),从而让区块链应用开发更加便利。 + +## **CRUD有哪些优势?** + +CRUD的核心设计思想是提供面向SQL编程的区块链应用开发规范。其好处显而易见,主要体现在两升两降。 + +### 提升开发区块链应用的效率 + +CRUD类似传统业务SQL编程开发模式,大大降低了合约开发难度。开发者将合约当做数据库的存储过程,将区块链数据的读写操作转换为面向表的读写操作,简单易用,极大提升了开发区块链应用的效率。 + +### 提升区块链应用的性能 + +CRUD底层逻辑基于预编译合约实现,其数据存储采用分布式存储,读写数据产生的交易不再进入缓慢的EVM虚拟机执行,而是由高速的预编译合约引擎执行,因此提高了合约的数据读写效率,使得基于CRUD开发的区块链应用具有更高的性能。 + +### 降低合约维护和升级的复杂度 + +CRUD合约的逻辑与存储分离,这样开发者就只需要关心核心业务逻辑,数据不再与特定合约绑定,更方便合约升级。当合约逻辑需要变更时,可以部署新合约,新合约可以读写旧合约创建的表和数据。 + +### 降低面向SQL业务的迁移成本 + +传统商业应用很大一部分通过数据库表的方式管理数据,通过CRUD合约可以将面向SQL设计的商业应用非常顺滑的迁移到区块链上,降低业务的迁移成本。 + +## CRUD如何使用? + +介绍了CRUD的两升两降优势,想必大家非常关注CRUD具体如何使用? 其实,CRUD简单易用,目前可以用两种方式使用CRUD功能,分别是CRUD合约和SDK CRUD Service接口。 + +### CRUD合约 + +开发者与区块链交互的媒介主要是智能合约,CRUD功能自然会集成在智能合约。集成方式非常轻,Solidity合约只需要引入FISCO BCOS官方提供的Table.sol抽象接口合约文件即可。Table.sol包含分布式存储专用的智能合约接口,其接口实现在区块链节点,可以创建表,并对表进行增删改查操作。引入了该抽象接口的合约称为CRUD合约,以区别于没有引用该接口的Solidity合约。 + +Table.sol抽象接口合约文件包括以下抽象合约接口,下面分别进行介绍。 + +#### TableFactory合约 + +用于创建和打开表,其固定合约地址为0x1001,接口如下: + +| 接口 | 功能 | 参数 | 返回值 | +|-------------------------------------|--------|------------------------------------------------------------------------------|-----------------------------------------------| +| createTable(string ,string, string) | 创建表 | 表名,主键名(目前只支持单个主键),表的其他字段名(字段之间以英文逗号分隔) | 返回错误码(int256),错误码详见下表 | +| opentTable(string) | 打开表 | 表名 | 返回合约Table的地址,当表名不存在时返回空地址 | + +**createTable接口返回:** + +| 错误码 | 说明 | +|:-------|:-----------------------------| +| 0 | 创建成功 | +| -50000 | 用户没有权限 | +| -50001 | 创建表名已存在 | +| -50002 | 表名超过48字符 | +| -50003 | valueField长度超过64字符 | +| -50004 | valueField总长度超过1024字符 | +| -50005 | keyField长度超过64字符 | +| -50007 | 存在重复字段 | +| -50007 | 字段存在非法字符 | +| 其他 | 创建时遇到的其他错误 | + +#### Entry合约 + +Entry代表记录对象,一个Entry对象代表一行记录,其接口如下: + +| 接口 | 功能 | 参数 | 返回值 | +|----------------------|------------|----------------|--------| +| set(string, int) | 设置字段 | 字段名,字段值 | void | +| set(string, string) | 设置字段 | 字段名,字段值 | void | +| set(string, address) | 设置字段 | 字段名,字段值 | void | +| getInt(string) | 获取字段值 | 字段名 | void | +| getString(string) | 获取字段值 | 字段名 | void | +| getBytes64(string) | 获取字段值 | 字段名 | void | +| getBytes32(string) | 获取字段值 | 字段名 | void | +| getAddress(string) | 获取字段值 | 字段名 | void | + +#### Entries合约 + +Entries是记录集合对象,Entries用于存放Entry对象,其接口如下: + +| 接口 | 功能 | 参数 | 返回值 | +|----------|---------------------|---------------|-----------------------| +| get(int) | 获取指定索引的Entry | Entries的索引 | 合约Entry的地址 | +| size() | 获取Entries的大小 | 无 | Entries的大小(int256) | + +#### Condition合约 + +查询、更新和删除记录时指定的过滤条件对象,其接口如下: + +| 接口 | 功能 | 参数 | 返回值 | +|--------------------|----------------|--------------------------------|--------| +| EQ(string, int) | 相等条件 | 字段名,字段值 | void | +| EQ(string, string) | 相等条件 | 字段名,字段值 | void | +| NE(string, int) | 不等条件 | 字段名,字段值 | void | +| NE(string, string) | 不等条件 | 字段名,字段值 | void | +| GT(string, int) | 大于条件 | 字段名,字段值 | void | +| GE(string, int) | 大于或等于条件 | 字段名,字段值 | void | +| LT(string, int) | 小于条件 | 字段名,字段值 | void | +| LE(string, int) | 小于或等于条件 | 字段名,字段值 | void | +| limit(int) | 记录选取条件 | 返回多少条记录 | void | +| limit(int, int) | 记录选取条件 | 记录启始行位置,返回多少条记录 | void | + +#### Table合约 + +用于对表进行增删改查操作的对象,其接口如下: + +| 接口 | 功能 | 参数 | 返回值 | +|----------------------------------|-------------------|--------------------------------|---------------------------| +| select(string, Condition) | 查询数据 | 主键值,过滤条件对象 | 返回Entris的地址 | +| insert(string, Entry) | 插入数据 | 主键值,记录对象 | 返回insert影响的行数 | +| update(string, Entry, Condition) | 更新数据 | 主键值,记录对象,过滤条件对象 | 返回update影响的行数 | +| remove(string, Condition) | 删除数据 | 主键值,过滤条件对象 | 返回remove影响的行数 | +| newEntry() | 创建Entry对象 | 无 | 返回新的Entry合约地址 | +| newCondition() | 创建Condition对象 | 无 | 返回新的Condition合约地址 | + +有了以上对Table.sol抽象接口合约的了解,现在可以正式进行CRUD合约的开发。以官方提供的CRUD合约TableTest.sol为示例,介绍其开发的三步曲: + +#### 第一步:引入Table.sol + +将Table.sol合约放入TableTest.sol同级目录,并在TableTest.sol合约文件中引入Table.sol,其代码如下: + +```solidity +import "./Table.sol"; +``` + +#### 第二步:创建表 + +在TableTest.sol合约文件中,创建表的核心代码如下: + +```solidity +// 创建TableFactory对象,其在区块链上的固定地址是0x1001 +TableFactory tf =TableFactory(0x1001); +// 创建t_test表,表的主键名为name,其他字段名为item_id和item_name +int count =tf.createTable("t_test", "name","item_id,item_name"); +// 检查是否创建成功 +if(count >= 0) +{ + // success +} +``` + +**注:** + +- createTable执行原理:createTable执行成功之后,将会在区块链系统表_sys_tables_(区块链启动会自动创建该表,专门记录区块链中所有表的信息)中插入t_test的表信息,即表名,主键名和其他字段名,但并没有正式创建该表。当对t_test表进行增删改查操作时,会首先判断t_test表是否存在,若不存在,则会查询_sys_tables_表获取t_test表的信息,如果查询有t_test表信息,则创建该表,否则执行失败。t_test表存在,则继续执行增删改查操作。 +- 这一步是可选操作:比如新合约只是读写旧合约创建的表,则不需创建表这步操作。 + +#### 第三步:针对表进行CRUD操作 + +在TableTest.sol合约文件中,插入记录核心代码如下: + +``` solidity +TableFactory tf =TableFactory(0x1001); +// 打开创建的t_test表 +Table table =tf.openTable("t_test"); +// 检查table是否是空地址 +if(table == address(0x0)) +{ + // error +} +// 创建Entry对象,即创建一条空记录 +Entry entry = table.newEntry(); +// 设置Entry对象,即设置记录的字段值 +entry.set("name", name); +entry.set("item_id",item_id); +entry.set("item_name",item_name); +// 调用Table的insert方法插入记录 +// 返回插入影响的记录数,值为1则插入成功,否则插入失败 +int count = table.insert(name,entry); +``` + +查询记录核心代码如下: + +```solidity +TableFactory tf =TableFactory(0x1001); +Table table =tf.openTable("t_test"); +// 检查table是否是空地址 +if(table == address(0x0)) +{ + // error +} +// 创建Condition对象,条件为空表示不过滤,也可以根据需要使用条件过滤 +Condition condition =table.newCondition(); +// 调用Table的select方法查询记录,获得记录集合 +Entries entries =table.select(name, condition); +// 获取记录集合的大小 +int size = entries.size(); +bytes32[] memoryuser_name_bytes_list = new bytes32[](uint256(size)); +int[] memory item_id_list = newint[](uint256(size)); +bytes32[] memoryitem_name_bytes_list = new bytes32[](uint256(size)); +// 遍历记录集合 +// 将记录的三个字段值分别存放到三个数组中,方便方法返回查询的数据 +for(int i = 0; i< size; ++i) { +// 根据索引获取记录集合中的记录 +Entry entry = entries.get(i); +// 根据记录的字段名查询字段值 +// 注意字段值的类型不同需要选择相应的get方法 +user_name_bytes_list[uint256(i)] =entry.getBytes32("name"); +item_id_list[uint256(i)] =entry.getInt("item_id"); +item_name_bytes_list[uint256(i)] =entry.getBytes32("item_name"); +} +``` + +更新记录核心代码如下: + +```solidity +TableFactory tf =TableFactory(0x1001); +Table table =tf.openTable("t_test"); +// 检查table是否是空地址 +if(table == address(0x0)) +{ + // error +} +Entry entry = table.newEntry(); +entry.set("item_name",item_name); +Condition condition =table.newCondition(); +// 设置过滤条件 +condition.EQ("name",name); +condition.EQ("item_id",item_id); +// 调用Table的update方法更新记录 +// 返回更新影响的记录数,值大于0则更新成功,否则更新失败 +int count = table.update(name, entry,condition); +``` + +删除记录核心代码如下: + +```solidity +TableFactory tf =TableFactory(0x1001); +Table table =tf.openTable("t_test"); +// 检查table是否是空地址 +if(table == address(0x0)) +{ + // error +} +Condition condition =table.newCondition(); +condition.EQ("name",name); +condition.EQ("item_id",item_id); +// 调用Table的remove方法删除记录 +// 返回删除影响的记录数,值大于0则删除成功,否则删除失败 +int count = table.remove(name,condition); +``` + +### SDKCRUD Service接口 + +通过CRUD合约,我们可以看到只要合约方法涉及到数据读写操作,则首先打开对应的表,然后调用读写相关接口就可以进行区块链数据的读写。同时,我们注意到,CRUD合约的开发方式还是离不开编写合约、编译合约、部署合约,最后才能调用合约实现相关功能。那么有没有更方便,更简洁的方式呢?比如开发者合约都不用写,不用部署合约,就可以读写区块链上的数据。答案显而易见,我们已经实现了这样的极致易用需求。 + +FISCO BCOS SDK提供CRUD Service数据上链接口,这些接口实现的原理是调用区块链内置的一个预编译的CRUD合约,专门负责对用户表进行增删改查操作。Java SDKCRUD Service实现在(Python SDK和Nodejs SDK类似)org.fisco.bcos.web3j.precompile.crud.CRUDService类,其接口如下: + +| 接口 | 功能 | 参数 | 返回值 | +|--------------------------------------------------------|--------------|----------------------------------------------------------------------------------------------|--------------------------| +| createTable(Table table) | 创建表 | 表对象(需要设置其表名,主键字段名和其他字段名。其中,其他字段名是以英文逗号分隔拼接的字符串) | 错误码 | +| select(Table table, Condition condition) | 查询数据 | 表对象,Condition对象 | Entries对象 | +| insert(Table table, Entry entry) | 插入数据 | 表对象,Entry对象 | 错误码 | +| update(Table table, Entry entry, Condition condition) | 更新数据 | 表对象,Entry对象,Condition对象 | 错误码 | +| remove(Table table, Condition condition) | 删除数据 | 表对象,Condition对象 | 错误码 | +| desc(String tableName) | 查询表的信息 | 表名 | 表的keyField和valueField | + +以上接口覆盖了表的创建、查看和增删改查操作。用户只需要调用SDK的接口就能完成相关操作,[具体示例以下地址查看](https://github.com/FISCO-BCOS/web3sdk/blob/master/src/integration-test/java/org/fisco/bcos/precompile/CRUDServiceTest.java) [gitee地址查看](https://gitee.com/FISCO-BCOS/web3sdk/blob/master/src/integration-test/java/org/fisco/bcos/precompile/CRUDServiceTest.java)。 + +其中调用写接口会产生与调用CRUD合约接口等效的交易,需要共识节点共识一致后才会落盘存储。值得关注的是,利用CRUD Service接口,FISCO BCOS控制台针对每个接口实现了易用的sql语句命令,[欢迎访问以下地址体验](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html)。 + +### 两种CRUD使用方式的比较 + +可能用户有这样的疑问,CRUDService接口如此简洁易用,那么是不是我们就只依靠这组接口完成区块链业务呢?其实也不尽然,相比于CRUD合约,其局限主要在两点: + +- 数据访问范围受限:CRUDService接口做的事情非常专一,其本质是一组针对区块链用户表数据的读写接口。因此对于不是用户表数据,这组接口无能为力。例如Solidity合约的状态变量,并没有存储在一个用户创建的表中,通过这组接口就查询不到状态变量的数据。然而CRUD合约本质是Solidity合约,只是多引入了一个Table.sol合约文件,使其有了CRUD功能。通过CRUD合约就可以操作Solidity状态数据和用户表数据。 +- 业务处理能力受限:很多区块链业务不仅仅只是利用区块链上链数据,而是需要设计相关合约逻辑,满足相关条件和验证的前提下才可以向区块链提交数据,仅利用CRUD Service接口就难以胜任这样的区块链业务,因此CRUD合约必不可少。 + +## 有哪些Effective CRUD最佳实践? + +CRUD功能虽然简单易用,但也需要清晰的知道如何高效的使用CRUD。 + +#### 条款1:绝大多数情况下请选择CRUD合约开发区块链应用 + +区块链应用开发中,如果确定仅仅只是上链数据且数据只采用用户表存储,不依赖合约执行相关业务逻辑,那么考虑使用CRUD Service接口。否则,推荐使用CRUD合约。另外,为了方便开发和调试,可以随时利用CRUD Service的读接口(select和desc接口)或者利用控制台对应的相关命令进行数据查询。 + +#### 条款2:Table.sol文件内容不可修改 + +Table.sol文件定义的是CRUD功能相关的抽象接口,每个接口区块链均有对应的具体实现。如果用户修改该文件,会导致交易执行失败或功能异常等问题。 + +#### 条款3:CRUD用户表的主键不唯一 + +用户习惯于关系型数据库中的主键字段是唯一的,因此默认CRUD用户表中的主键也是唯一的,其实并不是。插入多条记录时,可以指定相同的主键。主键不唯一是由于CRUD表中存储的是主键到对应Entries的映射,进而基于主键进行增删改查。因此,调用CRUD接口(插入、更新、查询和删除记录)时,均需要传入主键值(不是主键名)。另外,主键值过长,会影响读写效率,建议主键值不要设置太长。 + +#### 条款4:使用CRUD合约时,表字段过多,使用数组或struct封装字段参数 + +由于Solidity合约语言的限制,一个合约方法中的局部变量个数不得超过16个,否则会出现"Stacktoo deep, try removing local variables"编译错误。因此对于表字段比较多的情况,可以考虑将多个字段参数使用数组或struct封装,以减少局部变量个数,使其满足编译条件。 + +#### 条款5:使用CRUD合约时,方法中如果涉及表操作,均需要先打开表 + +TableFactory抽象合约有openTable(string)方法,该方法返回打开的表对象。我们可能会将该表对象设置为合约的全局变量,方便下次操作表时直接使用。注意这是错误操作,因为每次打开表时,其获取的表对象注册在一个临时地址上,在下一个区块之后,该地址不再有效,因此不能将表对象设置为全局变量使用,而是当方法需要操作表之前,均需要打开表。另外,由于TableFactory在区块链中注册的是固定地址0x1001,因此可以将TableFactory对象设置为全局变量,不必每次均创建该对象。 + +#### 条款6:使用CRUD合约,可以采用表和状态变量混合存储数据 + +CRUD合约是具备CRUD功能的Solidity合约,因此Solidity之前的状态变量存储方式依然可以使用。当存储一个变量值时,可能直接使用一个变量存储比较方便,因此可以既定义几个状态变量,同时也创建几个用户表进行数据存储。对于比较结构化的数据,推荐使用表的存储方式。 + +#### 条款7:采用权限控制管理用户表 + +CRUD合约的逻辑与用户表数据分离,因此通过合约接口的限制已控制不住用户表的写操作(包括插入、更新和删除操作)。为了避免任何账户均可以写用户表,推荐使用权限控制来管理用户表([点击参考权限控制具体使用](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/security_control/permission_control.html)),指定特定账户才有权限写用户表。 diff --git a/3.x/zh_CN/docs/articles/3_features/33_storage/data_chain_or_database.md b/3.x/zh_CN/docs/articles/3_features/33_storage/data_chain_or_database.md new file mode 100644 index 000000000..90c6d9243 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/33_storage/data_chain_or_database.md @@ -0,0 +1,84 @@ +# 区块链数据是存在链上还是数据库里? + +作者:莫楠|FISCO BCOS 高级架构师 + +在回答这个问题之前,首先要理清“**区块链数据**”和“**链上数据**”的概念。 + +## 区块链数据 + +“区块链数据”广义上包括区块链的**区块数据**和区块链的**状态数据:** + +- 区块数据记录了区块链上发生的每一笔交易,譬如小明给小王转账了50元、小王充值了20元等类似这样的交易数据; +- 状态数据记录了区块链上每个账户或智能合约的当前状态,比如小明当前的余额是50元、小王当前的余额是100元。 + +无论区块数据还是状态数据,它们都是由区块链节点使用和存储的。区块链节点是一个程序,运行在我们的个人电脑、虚拟机或服务器上。多个分布在不同电脑或服务器上的区块链节点,通过网络互相连接,组成了完整的区块链网络。 + +区块链节点通常会把区块链数据存储在个人电脑、虚拟机或服务器上,存储区块链数据最常见的介质,就是磁盘。 + +区块链节点不会直接访问磁盘,它们会通过特定的数据库,如LevelDB、RocksDB或MySQL等单机或分布式数据库来操作数据。相比于直接操作磁盘,数据库抽象了特定的数据访问模型,对区块链节点更为友好。 + +因此,当我们说:“区块链数据保存在数据库”时,可以认为区块链节点将区块链数据保存在MySQL(或其它数据库),MySQL将区块链数据保存在磁盘。 + +![](../../../../images/articles/data_chain_or_database/IMG_5304.JPG) + +数据库有**独立式**与**嵌入式**之分: + +- 独立式数据库,如MySQL、Oracle是通常理解的数据库,独立式数据库作为独立的进程运行,需要单独部署和启停。独立式数据库可以与区块链节点部署在同一台服务器,或者部署在不同的服务器,还支持分布式、集群化的部署。无论何种部署方式,独立式数据库都是区块链节点的存储组件,隶属于区块链节点,与区块链网络无关。 +- 嵌入式数据库如LevelDB、RocksDB,它们以动态依赖库或静态依赖库的方式,与区块链节点整合在同一个进程中,同时启停,用户不会明显感受到它们的存在。 + +## 链上数据 + +区块链数据的区块数据和状态数据并不是凭空产生的。区块数据中的交易,是由区块链的用户生成,用户把交易发送到区块链节点,区块链节点将多个交易打包进区块,区块会在区块链网络上广播和共识,区块链网络对区块达成共识后,认同区块中的交易,将交易的执行结果保存到状态数据中。 + +假设区块链原本的状态数据是:小明当前的余额是50元、小王当前的余额是100元,那么执行了“小明给小王转账了50元”的交易后,状态数据会发生变化,小明当前的余额会变为0元,小王当前的余额变为150元。 + +区块需要进行区块链共识,状态数据是通过执行区块中的交易生成的,这两类数据都直接或间接跟区块链共识有关系,可以将其称为“链上数据”。那么,“链上数据”的明确定义,就是:链上数据是直接或间接由区块链共识产生的数据。 + +**回到最初的问题** + +很显然,“链上数据”和“数据库”不是同一个层面的概念,“区块链数据是存在链上还是存在数据库?”这个问题不成立,区块链数据无论是存储在LevelDB、RocksDB、MySQL数据库或直接存储在磁盘,只要是直接或间接由区块链共识产生,都可以视为链上数据。 + +## FISCO BCOS的链上数据 + +FISCO BCOS的区块链数据,默认是通过RocksDB保存在磁盘中。如果希望把数据保存到MySQL数据库,可以先自行部署一个MySQL数据库,然后修改区块链节点下的群组配置文件,群组配置文件通常位于区块链节点的配置目录下:conf/group.1.ini + +``` +[storage] + type=mysql + db_ip=127.0.0.1 + db_port=3306 + db_username=root + db_name=db_Group1_A + db_passwd=****** +``` + +其中: + +- type为区块链节点的存储类型,配置为mysql,表示使用MySQL来存储区块链数据; +- db_ip为MySQL数据库的IP地址,如果部署在本机,就是127.0.0.1; +- db_port为MySQL数据库的端口,默认为3306; +- db_username是MySQL数据库的登陆用户名; +- db_name是MySQL数据库中用于存储区块链数据的数据库名,无需先行创建; +- db_passwd是MySQL数据库的登陆密码。 + +其它未提及的配置项,可保留默认值不修改,完成这些信息的填写以后,确保数据库运行正常,然后重启区块链节点,区块链节点就会将区块链数据保存到MySQL数据库中。FISCO BCOS的区块链,无论是保存在RocksDB还是MySQL中,都可视为链上数据。使用MySQL,可以方便地查看链上数据的大小、结构等信息,如区块的大小、账户的大小等等。 + +## 总结 + +FISCO BCOS提供了灵活的数据存储机制,对于追求便利与性能的场景,可以使用默认的RocksDB;对于偏重审计和治理的场景,可以使用MySQL,满足不同的需求。 + +**关于FISCO BCOS存储,请参考[FISCO BCOS分布式存储文档](../../../manual/distributed_storage.html)** + +------ + +#### 「群聊互动」 + +【Q】 **什么的小世界**:区块链上的数据都是增加在上面的,不能删除是么,那么长时间使用,会不会节点的效率不断下降? + +【A】 **中大刘忠楠**:节点header存储的交易、状态数据,是限定长度的根哈希值。 + +【A】**莫楠**:区块链确实会随着使用不断增长,但区块链的数据访问模型通常是kv的,kv模型的查询效率受数据量的影响很小,因此不会明显影响性能。 + +【Q】 **什么的小世界**:如果在区块链网络之中增加一个节点,该节点会从其他节点通过广播自动拷贝数据过来是么? + +【A】**莫楠**:在区块链网络中增加一个节点,这个节点会自动同步其它节点的数据。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/33_storage/index.md b/3.x/zh_CN/docs/articles/3_features/33_storage/index.md new file mode 100644 index 000000000..7001c7680 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/33_storage/index.md @@ -0,0 +1,16 @@ +### 关于存储 + +存储设计:支持KV和SQL +引擎类型:支持leveldb、rocksdb、mysql +CRUD接口:提供CRUD接口访问链上数据 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + storage_by_table_structure.md + data_chain_or_database.md + why_switch_to_rocksdb.md + crud_guidance.md +``` + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/33_storage/storage_by_table_structure.md b/3.x/zh_CN/docs/articles/3_features/33_storage/storage_by_table_structure.md new file mode 100644 index 000000000..74e721935 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/33_storage/storage_by_table_structure.md @@ -0,0 +1,188 @@ +# FISCO BCOS基于表的存储结构 + +作者:尹强文|FISCO BCOS 核心开发者 + +FISCO BCOS底层的存储数据结构,并没有采用传统的MPT存储结构,而是用了基于表结构的方式。一方面,避免了世界状态急剧膨胀而导致的性能下降问题;另一方面,表结构能够兼容各种存储引擎,使得业务开发更加方便。 + +## FISCO BCOS表的分类 + +FISCO BCOS每张表都有一个主key字段,1个或者多个value字段,表分为系统表(以_sys_开头),用户表(以_user_开头)和StorageState账户表(以_contract_data_开头)。 +表结构的所有记录,都会有`_id_`,`_status_`,`_num_`,`_hash_`内置字段。用户表和StorageState账户表key字段的类型是varchar(255),value的类型为mediumtext。 + +## 系统表 + +系统表默认存在,由节点进程或者amdb-proxy进程启动时,保证系统表的创建,每张表的说明如下。 + +- **_sys_tables_** + +存储所有表的结构,每一张表都会在这张表中有一条记录,记录表的结构,包括表的key和field字段。表结构如下: + +| 字段 | table_name | key_field | value_field | +| ---- | ---------- | --------- | ------------------------ | +| 说明 | 表名 | 主key名称 | value名称列表,以“,”分隔 | + +以表名为_sys_tx_hash_2_block_为例,_sys_tables_中各个字段数据为: + +``` +table_name=_sys_tx_hash_2_block_key_field=hashvalue_field=value,index +``` + +底层创建表和读取结构表,是基于_sys_tables_这张表,从创建好的_sys_tx_hash_2_block_表中可以看到,这张表包含3个字段,分别是主key字段hash,value字段有2个分别是value和index。 + +- **_sys_consensus_** + +存储共识节点和观察节点的列表。表结构如下: + +| 字段 | name | type | node_id | enable_num | +| ---- | ---------------- | ---------------------------------------------- | ------- | ---------- | +| 说明 | 主key,固定为node | 节点类型,sealer为共识节点,observer为观察节点 | 节点id | 生效块高 | + +例如,某个链包括4个节点,初始化都是共识节点,可以看到四个节点都是sealer(共识节点),生效块高都是0,如图: + +![](../../../../images/articles/storage_by_table_structure/IMG_4903.PNG) + +通过控制台将`149f3777a0...`这个节点移除并加入到观察者列表,查询_sys_consensus_表的数据,发现该条记录的type已经修改为observer,生效块高已经修改为3。如图: + +![](../../../../images/articles/storage_by_table_structure/IMG_4904.PNG) + +- **_sys_current_state_** + +存储当前区块链最新的状态,每次有区块数据存储,这个表都会去更新信息,包括当前分配出去的自增id,当前块高,交易失败数,交易总数。表结构如下: + +| 字段 | key | value | +| ---- | ---- | ----- | +| | | | + +存储的信息如下: + +| key | 含义 | +| ------------------------------ | -------------------- | +| current_id | 当前分配出去的自增id | +| current_number | 当前块高 | +| total_failed_transaction_count | 交易失败数 | +| total_transaction_count | 交易总数 | + +- **_sys_config_** + +存储需要共识的群组配置项,表结构同_sys_current_state_,当前配置了2个数值项,分别是一个区块包含的最大交易数及gas值。写入创世块的时候,会从group.[groupid].genesis文件中读取consensus.max_trans_num和tx.gas_limit两个配置项并写入表中。存储的信息如下: + +| key | 含义 | +| -------------- | ------------------------ | +| tx_count_limit | 一个区块包含的最大交易数 | +| tx_gas_limit | gas值 | + +- **_sys_table_access_** + +存储含有写入权限的外部账户地址。表结构如下: + +| 字段 | table_name | address | enable_num | +| ---- | ---------- | -------------------- | ---------- | +| 说明 | 表名 | 有写入权限的外部地址 | 生效块高 | + +默认这个表是没有数据的,表示所有外部账户都有读写权限,通过控制台使用`grantDeployAndCreateManager`命令为某个账号授权,会在`_sys_table_access_`这张表中新增一条Entry。 + +![](../../../../images/articles/storage_by_table_structure/IMG_4905.JPG) + +同时可以看到,除了被授权的外部账号可以部署合约之外,其他账户部署合约会提示没有权限。 + +![](../../../../images/articles/storage_by_table_structure/IMG_4906.JPG) + +- **_sys_number_2_hash_** + +存储区块号到区块hash映射,可以根据区块号映射到区块hash值。表结构如下: + +| 字段 | number | value | +| ---- | ------ | ---------- | +| 说明 | 区块号 | 区块hash值 | + +- **_sys_hash_2_block_** + +存储hash到序列化的区块数据映射,可以根据区块hash值映射到区块值。表结构如下: + +| 字段 | hash | value | +| ---- | ---------- | ------ | +| 说明 | 区块hash值 | 区块值 | + +- **_sys_block_2_nonces_** + +存储区块中交易的nonces,可以根据区块号,映射到该区块生成时所用到的nonces值。表结构如下: + +| 字段 | number | value | +| ---- | ------ | ------------------------ | +| 说明 | 区块号 | 生成区块时用到的nonces值 | + +- **_sys_tx_hash_2_block_** + +存储交易hash到区块号的映射,表结构如下: + +| 字段 | hash | value | index | +| ---- | -------- | ------ | -------------------- | +| 说明 | 交易hash | 区块号 | 该交易在区块中的编号 | + +一个区块可能包括多个交易,因此,区块hash和交易hash是一对多的关系,所以一个区块会在这个表里生成多条数据。 + +- **_sys_cns_** + +存储合约名到合约地址的映射,表结构如下: + +| 字段 | name | version | address | abi | +| ---- | ------------- | ---------- | -------- | ------------------------------------------------------------ | +| 说明 | 主key,合约名 | 合约版本号 | 合约地址 | 合约的接口说明,描述了合约字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型 | + +用CNS部署的合约,可以通过合约名去调用,具体方式是根据合约名,找到包括多个版本号的合约地址列表,筛选出版本号正确的合约地址,再使用`_contract_data_`+`Address`+`_`作为表名,去查询code的值,执行合约代码。 + +例如,通过CNS部署的TableTest合约,可以在`_sys_cns_`表中查询到如下数据: + +![](../../../../images/articles/storage_by_table_structure/IMG_4907.JPG) + +## 用户表 + +用户调用CRUD接口所创建的表,以`_user_`为表名,底层自动添加`_user_`前缀。 + +表名和表结构由合约决定,例如创建表的合约代码为: + +``` + TableFactory tf = TableFactory(0x1001); int count = tf.createTable("t_test", "name", "item_id,item_name"); return count; +``` + +创建出来的表名为`_user_t_test`,包括3个字段,分别是主key字段`name`,类型为varchar(255);value包含两个字段,分别是`item_id`,`item_name`;如图: + + +![](../../../../images/articles/storage_by_table_structure/IMG_4908.JPG) + +## StorageState账户表 + +`_contract_data_`+`Address`+`_`作为表名。表中存储外部账户相关的信息。存储信息如下: + +| key | value | +| -------- | ----- | +| alive | | +| balance | | +| code | | +| codeHash | | +| nonce | | + +以部署`TableTest`合约为例,`deploy TableTest`会返回一个地址,如图: + + +![](../../../../images/articles/storage_by_table_structure/IMG_4909.JPG) + + +同时,可以看到数据库中生成了一个表名为`_contract_data_a582f529ff55e6ca2ada7ad3bab3b97e1c7013f2_`的表,存储信息如下(和上述表述一致): + +![](../../../../images/articles/storage_by_table_structure/IMG_4910.JPG) + +## 总结 + +基于表的存储方式,抽象了区块链的底层存储模型,实现了类SQL的抽象存储接口,支持多种后端数据库。 +引入基于表的存储方式后,数据读写请求不经过MPT,直接访问存储,结合缓存机制,存储性能相比基于MPT的存储有大幅提升。MPT数据结构作为可选方案仍然保留。 + +### 「群提问」 + +**Q**:腾龙(何直群):table 和 智能合约内部存储有优缺点对比吗? + +**A**:Wheat:table是类似传统数据库使用方式的设计,可以让写业务逻辑的开发比较容易上手。数据基于table存储,管理也更方便。相比合约mpt格式存储数据,table格式性能也更高。 + +**Q**:王先生:有点疑惑,表存储不就和传统的数据库存储一样了吗,那区块链还有什么用? + +**A**:尹强文:使用什么存储结构,本质上不会改变区块链具有去中心化、不可篡改、不可逆、匿名等特性。只是使用基于表的存储,有一些优势,一是数据基于表存储,管理更方便。相比合约mpt格式存储数据,表格式性能也更高,同时表结构能够兼容各种存储引擎,使得业务开发更加方便。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/33_storage/why_switch_to_rocksdb.md b/3.x/zh_CN/docs/articles/3_features/33_storage/why_switch_to_rocksdb.md new file mode 100644 index 000000000..04f6e0173 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/33_storage/why_switch_to_rocksdb.md @@ -0,0 +1,80 @@ +# 为什么从LevelDB切换到RocksDB? + +作者:白兴强|FISCO BCOS 核心开发者 + +存储模块是区块链底层平台中的核心之一,负责将区块链中所有需要持久化的数据存储到磁盘上。一个优秀的区块链底层平台,必然要有一个强大的存储模块支持。FISCO BCOS存储模块经过多次重构和优化,为性能突破提供了有力支撑。目前,FISCO BCOS单链TPS达到2万+,且支持平行多链的并行扩展。 + +2.0.0-rc3版本以前,FISCO BCOS支持使用LevelDB和MySQL作为数据存储引擎,rc3之后开始将嵌入式存储引擎从LevelDB切换到RocksDB。为什么要做切换?切换RocksDB之后能带来什么?本文将带大家一起回顾我们作出这个决定时的考虑。 + +## FISCO BCOS存储模块概览 + +### 数据提交流程 + +FISCO BCOS中需要存储的数据可以分为两部分,一部分是经过共识的链上数据,包括交易、收据、区块和合约数据等;另一部分是各节点维持区块链运行所需的数据,包括当前块高、链上交易数和一些交易区块相关的索引信息。区块链上的新区块来自于同步模块和共识模块。以同步模块为例,当拿到新的区块之后,同步模块会调用BlockVerifier模块执行和验证区块,如果验证通过则调用BlockChain模块将区块和执行区块产生的数据提交给存储模块,由存储模块负责将数据序列化写入数据库。 + +![](../../../../images/articles/why_switch_to_rocksdb/IMG_5305.PNG) + +### 存储模块概览 + +数据提交到存储模块之后,是一种抽象的表结构,存储模块首先将提交的数据加入缓存层,以提高查询性能。完成缓存的更新之后,需要提交的数据会加入提交队列,由缓存层负责异步提交到适配层,如果关闭了缓存设置,则同步提交到适配层。 + +![](../../../../images/articles/why_switch_to_rocksdb/IMG_5306.PNG) + +适配层需要把提交的数据从FISCO BCOS的抽象表结构组织形式转换为后端对应存储的组织形式,对于MySQL这种关系型数据库,则直接将存储模块的表结构对应到数据库表结构即可,例如_sys_config_这个表在MySQL中如下图所示。 + +![](../../../../images/articles/why_switch_to_rocksdb/IMG_5307.PNG) + +对于RocksDB或LevelDB这种KV的存储模式,将表名和插入时设置的主key拼起来作为数据库的KEY,对应的数据则序列化为VALUE。对应于_sys_config_这个表,以及tx_conut_limit这个主key的数据,其在KV数据库中的KEY为_sys_config__tx_conut_limit,VALUE为对应的数据序列化后的字符串。 + +## 为什么选择RocksDB? + +FISCO BCOS从1.0版本开始就使用LevelDB作为底层数据存储引擎,在使用过程中我们也碰到一些小问题,例如内存占用高、文件描述符超限导致进程被干掉、节点被kill后可能导致的DB损坏等。 + +重构2.0版本时,为了更高的性能,我们需要一个更优秀的存储引擎,这个存储引擎应该满足下面这些条件: + +1. 开源且有持续地维护; + +2. 读写性能要比LevelDB更高; + +3. 嵌入式KV数据库,能够支持大数据量场景下的读写; + +4. 与LevelDB类似的接口,降低迁移成本。 + +基于上述条件,RocksDB进入了我们的视野。 + +RocksDB fork自LevelDB,开源且由fackbook维护,相比于LevelDB有较明显的性能提升,保持了与LevelDB一致的接口,极低的迁移成本。从资料上看非常符合我们的需求。 + +### LevelDB与RocksDB性能对比 + +下面的测试数据是在一台4 vCPU E5-26xx 2.4GHz 8G 500GB腾讯云硬盘的机器上获取的,由FISCO BCOS核心开发者尹强文提供。 + +该测试KEY的长度为16字节,VALUE的长度为100字节,压缩算法使用Snappy,其他参数使用默认值,在1千万条数据和1亿条数据的情况下,可看出LevelDB和RocksDB的性能对比:在两种数据量下,各个场景RocksDB都取得了不比LevelDB差或者更好的表现。 + + +![](../../../../images/articles/why_switch_to_rocksdb/IMG_5308.PNG) + +![](../../../../images/articles/why_switch_to_rocksdb/IMG_5309.PNG) + +### FISCO BCOS中使用RocksDB + +在RocksDB的官方wiki上有一个页面叫做Features Not in LevelDB,这个页面中描述了RocksDB中所有新增的功能,例如对列族的支持,允许我们在逻辑上对数据库分区,对backup和checkpoint的支持,支持备份到HDFS,两种compaction方式允许用户在读放大、写放大、空间放大之间取舍,自带统计模块便于调优,支持了ZSTD等更新的压缩算法等。 + +官方wiki中也提到RocksDB为提升性能所做的优化,包括多线程Compaction、多线程memtable插入、降低DB锁的持有时间、写锁的优化、跳表搜索时更少的比较操作等。官方文档中指出,在插入key是有序的场景下,RocksDB使用多线程Compaction,使得RocksDB的性能大幅度高于LevelDB。 + +FISCO BCOS使用RocksDB时只使用了默认参数和与LevelDB兼容的读写接口,并没有做进一步的参数调优,RocksDB在官方文档中有指出,默认参数已经可以达到很好的性能,更进一步的调参并不能带来大幅的性能提升,而用户的业务场景是多种多样的,针对业务场景优化的参数修改对于FISCO BCOS不一定合适。 + +日后,随着对RocksDB的深入了解,如果发现更优的参数设置,我们也会采用。 + +## 总结 + +为什么换RocksDB,其实就一句话,RocksDB性能更高!凡是能够让FISCO BCOS更加优秀的事情,我们都愿意去做。最近,FISCO BCOS发布了v2.2.0版本,在性能方面作了进一步的优化,每一次的性能提升都是FISCO BCOS的开发者不停死磕的结果,这种死磕我们会一直进行下去,希望社区的同学们也一起参与进来,初学者点个star,进一步了解后可以提一些修复PR或者issue,大家一起让FISCO BCOS更加优秀! + +------ + +#### 参考链接 + +[Features Not in LevelDB](https://github.com/facebook/rocksdb/wiki/Features-Not-in-LevelDB) + +[RocksDB官方wiki](https://github.com/facebook/rocksdb/wiki/Performance-Benchmarks) + +[Benchmarking LevelDB vs. Rocks DB vs. HyperLevel DB vs. LMDB Performance for Influx DB](https://www.influxdata.com/blog/benchmarking-leveldb-vs-rocksdb-vs-hyperleveldb-vs-lmdb-performance-for-influxdb/) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/34_protocol/amop_introduction.md b/3.x/zh_CN/docs/articles/3_features/34_protocol/amop_introduction.md new file mode 100644 index 000000000..257c2af08 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/34_protocol/amop_introduction.md @@ -0,0 +1,93 @@ +# FISCO BCOS的AMOP使用介绍 + +作者:尹强文|FISCO BCOS 核心开发者 + +**AMOP简介**:链上信使协议AMOP(Advanced Messages Onchain Protocol)旨在为联盟链各个机构提供一个安全高效的消息传输信道,支持跨机构之间,点对点地实时消息通信,为链外系统之间的交互提供标准化接口,AMOP基于SSL通信加密,确保消息无法被窃听,消息收发均有异常重传、超时检测和路径规划机制,确保消息传输的可靠性。 + +## 逻辑架构 + +AMOP使用了FISCO BCOS的P2P底层通信,逻辑架构如下: + +![](../../../../images/articles/amop_introduction/IMG_5315.JPG) + +各区域概述如下: + +- **链外区域**:机构内部的业务服务区,此区域内的业务子系统使用区块链SDK,连接到区块链节点。 + +- **区块链内部P2P网络区域**:此区域为逻辑区域,部署各机构的区块链节点,区块链节点也可部署在机构内部。 + +## **核心实现** + +AMOP的消息收发基于**Sub-Pub订阅机制**,服务端首先设置一个Topic,客户端往该Topic发送消息,服务端即可收到。 + +AMOP支持同一个区块链网络中有多个Topic收发消息,支持任意数量的服务端和客户端,当有多个服务端关注同一个Topic时,该Topic的消息将随机下发到其中一个可用的服务端。 + +**AMOP包括两个流程**: + +1. 服务端设置Topic,用以监听该Topic的消息; + +2. 客户端往该Topic发送消息。 + +下面以一个例子来说明内部实现,如下图所示,有2个SDK分别为SDK1、SDK2,2个节点分别是Node1、Node2。SDK1连接Node1设置Topic T1,SDK2连接Node2发送Topic为T1的消息。 + +### 1. 服务端设置Topic,用以监听该Topic的消息的时序 + +![](../../../../images/articles/amop_introduction/IMG_5316.JPG) + +**主要流程如下**: + +1. SDK1发送监听某个Topic消息的请求,到其直连的节点Node1,Node1里维护了节点与Topic列表的映射关系,该映射关系用于消息路由,是一个map结构,key是NodeId,value是一个set,set存储的是该NodeId可以接收消息的Topic列表。 +2. Node1新增一个Topic之后,节点会更新节点与Topic映射表。 +3. Node1更新seq:seq主要用于保证各节点映射表一致,新增一个Topic之后,本节点的seq会加1,节点之间的心跳包会将这个值带上发送到其他节点,其他节点(Node2)接收到心跳包之后对比参数里的seq与本节点的seq,如果不一致会向源节点(Node1)请求节点与Topic列表的映射关系,将最新的映射关系更新到本节点并更新seq。这样就保证了全局映射关系的一致。 + +### 2. 客户端往该Topic发送消息时序 + +![](../../../../images/articles/amop_introduction/IMG_5317.JPG) + +- SDK2向Node2上发送消息。 +- Node2从节点与Topic列表的映射关系中查到该Topic可以发往的节点列表,从中随机选择一个节点Node1发送。 +- Node1节点收到消息之后推送给SDK1。 + +## 配置文件配置 + +AMOP无需任何额外配置,以下为Web3Sdk的参考配置,详细请[参考文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/sdk.html)。 + +![](../../../../images/articles/amop_introduction/IMG_5318.PNG) + +不同SDK的配置文件差异在于连接的节点地址不同,以文章开头处的逻辑架构图为例,假定Node1的监听地址是127.0.0.1:20200,Node2的监听地址是127.0.0.1:20201,那么SDK1配置为127.0.0.1:20200,SDK2配置127.0.0.1:20201。 + +## 测试 + +按上述说明配置好后,用户指定一个Topic,执行以下两个命令可以进行测试。 + +### 启动amop服务端 + +``` +java -cp 'conf/:apps/*:lib/*' org.fisco.bcos.channel.test.amop.Channel2Server [topic] +``` + +### 启动amop客户端 + +``` +java -cp 'conf/:apps/*:lib/*' org.fisco.bcos.channel.test.amop.Channel2Client [topic] [消息条数] +``` + +客户端和服务器执行后得如下效果: + +![](../../../../images/articles/amop_introduction/IMG_5319.JPG) + +![](../../../../images/articles/amop_introduction/IMG_5320.JPG) + +## 常见错误码及问题定位 + +- **99**:发送消息失败,AMOP经由所有链路的尝试后,消息未能发到服务端,建议使用发送时生成的‘seq’,检查链路上各个节点的处理情况。 + +- **100**:区块链节点之间经由所有链路的尝试后,消息未能发送到可以接收该消息的节点,和错误码‘99’一样,建议使用发送时生成的‘seq’,检查链路上各个节点的处理情况。 + +- **101**:区块链节点往Sdk推送消息,经由所有链路的尝试后,未能到达Sdk端,和错误码‘99’一样,建议使用发送时生成的‘seq’,检查链路上各个节点以及Sdk的处理情况。 + +- **102**:消息超时,建议检查服务端是否正确处理了消息,带宽是否足够。 + +## 未来计划 + +未来将继续丰富AMOP功能,支持二进制传输、消息多播协议以及Topic认证机制等,也欢迎大家使用AMOP,并提出优化建议。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/34_protocol/index.md b/3.x/zh_CN/docs/articles/3_features/34_protocol/index.md new file mode 100644 index 000000000..acf06086b --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/34_protocol/index.md @@ -0,0 +1,17 @@ +### 网络协议 + +节点间通信:P2P协议 + +客户端与节点通信:JsonRPC,Channel协议 + +消息订阅服务:AMOP协议 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + network_interface.md + network_compression.md + amop_introduction.md +``` + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/34_protocol/network_compression.md b/3.x/zh_CN/docs/articles/3_features/34_protocol/network_compression.md new file mode 100644 index 000000000..ce49559d6 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/34_protocol/network_compression.md @@ -0,0 +1,141 @@ +# FISCO BCOS的网络压缩功能如何? + +作者:陈宇杰|FISCO BCOS 核心开发者 + +**作者语** + +外网环境下,区块链系统性能受限于网络带宽,为了尽量减少网络带宽对系统性能的影响,FISCO BCOS从relase-2.0.0-rc2开始支持网络压缩功能,该功能主要在发送端进行网络数据包压缩,在接收端将解包数据,并将解包后的数据传递给上层模块。 + +本期文章讲的就是FISCO BCOS的网络压缩功能,作者从FISCO BCOS的系统框架、核心实现、处理流程、测试结果等角度进行了解析。 + +## Part 1. 系统框架 + +网络压缩主要在P2P网络层实现,系统框架如下: + +![](../../../../images/articles/network_compression/IMG_5310.JPG) + +网络压缩主要包括两个过程: +- **发送端压缩数据包**:群组层通过P2P层发送数据时,若数据包大小超过1KB,则压缩数据包后,将其发送到目标节点; +- **接收端解压数据包**:节点收到数据包后,首先判断收到的数据包是否被压缩,若数据包是压缩后的数据包,则将其解压后传递给指定群组,否则直接将数据传递给对应群组。 + +## Part 2. 核心实现 + +综合考虑性能、压缩效率等,我们选取了**Snappy**来实现数据包压缩和解压功能。 + +### 数据压缩标记位 + +FISCO BCOS的网络数据包结构如下图: + +![](../../../../images/articles/network_compression/IMG_5311.PNG) + +网络数据包主要包括包头和数据两部分,包头占了16个字节,各个字段含义如下: + +- Length: 数据包长度 +- Version: 扩展位,用于扩展网络模块功能 +- ProtocolID: 存储了数据包目的群组ID和模块ID,用于**多群组数据包路由,目前最多支持32767个群组** +- PaketType: 标记了数据包类型 +- Seq: 数据包序列号 + +**网络压缩模块仅压缩网络数据,不压缩数据包头。** + +考虑到压缩、解压小数据包无法节省数据空间,而且浪费性能,在数据压缩过程中,不压缩过小的数据包,仅压缩数据包大于`c_compressThreshold`的数据包`.c_compressThreshold`默认是1024(1KB)。我们扩展了Version的最高位,作为数据包压缩标志: + +![](../../../../images/articles/network_compression/IMG_5312.PNG) + +- Version最高位为0,表明数据包对应的数据Data是未压缩的数据; +- Version最高位为1,表明数据包对应的数据Data是压缩后的数据。 + +## Part 3. 处理流程 + +下面以群组1的一个节点向群组内其他节点发送网络消息包packetA为例(比如发送交易、区块、共识消息包等),详细说明网络压缩模块的关键处理流程。 + +#### 发送端处理流程: + +- 群组1的群组模块将packetA传入到P2P层; +- P2P判断packetA的数据包大于`c_compressThreshold`,则调用压缩接口,对packetA进行压缩,否则直接将packetA传递给编码模块; +- 编码模块给packetA加上包头,附带上数据压缩信息,即:若packetA是压缩后的数据包,将包头Version的最高位置为1,否则置为0; +- P2P将编码后的数据包传送到目的节点。 + +#### 接收端处理流程: + +- 目标机器收到数据包后,解码模块分离出包头,通过包头Version字段的最高位是否为1,判断网络数据是否被压缩; +- 若网络数据包被压缩过,则调用解压接口,对Data部分数据进行解压,并根据数据包头附带的GID和PID,将解压后的数据传递给指定群组的指定模块;否则直接将数据包传递给上层模块。 + +## Part 4. 配置与兼容 + +#### 配置说明 + +- 开启压缩:2.0.0-rc2及其以上版本 支持网络压缩功能,配置 `config.ini`的`[p2p].enable_compresss=true` +- 关闭压缩:`config.ini`的`[p2p].enable_compresss=false` + +#### 兼容性说明 + +- **数据兼容**:不涉及存储数据的变更; +- **网络兼容rc1**:向前兼容,目前仅**release-2.0.0-rc2及其以上版本**有网络压缩功能 + +## Part 5. 测试结果 + +为测试网络压缩效果,分别在**内网和外网**环境下,以**同样的压测程序和QPS**压测**开启网络压缩和没开启网络压缩**的四节点区块链,测试结果如下。 + +通过测试结果可看出: + +- **内网环境下**:**开启压缩对区块链系统性能影响不大**,运行**串行solidity压测合约**时,网络带宽消耗降低为未开压缩时的**三分之二**;运行**并行precompile压测合约**,网络带宽消耗降低到未开压缩时的**三分之一**; +- **外网环境下**:开启压缩可提升区块链系统性能 + +### 图一:带宽对比 +(关闭压缩和开启压缩情况下,压测并行solidity合约和串行Precompile合约) + +![](../../../../images/articles/network_compression/IMG_5313.JPG) + +通过图一可看出,执行**串行solidity合约**,开启压缩可**节省三分之一带宽**;执行**并行Precompile合约可节省三分 之二带宽**。 + +### 图二:TPS对比 +(内网和外网环境下,关闭压缩和开启压缩情况下TPS) + +![](../../../../images/articles/network_compression/IMG_5314.JPG) + +通过图二可看出,**内网环境下,开启压缩对区块链系统性能影响不大**;外网环境下,因为在有限带宽限制下,开启 压缩可处理更多交易,区块链性能提升了约三分之一。 + +### 图三:详细数据 + +#### 内网环境测试结果 + +| 串行solidity合约(PerformanceOk) | 压缩前 | Snappy压缩后 | +| :------------------------------ | :---------: | :----------: | +| TPS | 1961.5 | 1939.4 | +| 入带宽 | 10.88MBit/s | 6.93MBit/s | +| 出带宽 | 9.08MBit/s | 5.70MBit/s | + +| 并行Precompile合约(PerformanceDT) | 压缩前 | Snappy压缩后 | +| :-------------------------------- | :---------: | :----------: | +| TPS | 9725 | 9741 | +| 入带宽 | 76.06MBit/s | 22.72MBit/s | +| 出带宽 | 80.48MBit/s | 24.17MBit/s | + +#### 外网环境测试结果 + +| 压测场景 | 压缩前 | Snappy压缩后 | +| :--------------------------------------- | :------: | :----------: | +| 四节点,串行solidity合约(PerformanceOk) | 1125.8 | 1740 | +| 四节点, 串行solidity合约(PerformanceOkD) | 低于1000 | 1407 | + +------ + +#### 群友问答 + +**@無名**:测试带宽是用什么软件测的呢? + +**@陈宇杰**:当时测试带宽的时候,是独占的机器,直接用的nload,当然,在多进程环境下,还可以用nethogs等。 + +**@elikong**:提两个问题: + +1、为啥选snappy,有没有做过压缩性能分析对比,包括压缩率,cpu时间,典型消息等方面。 + +2、内网情况压缩前后带宽变化很大,但tps提升不明显的原因是什么? + +**@陈宇杰** + +1、是有前期调研的,当时调研了各种压缩库的压缩比、压缩和解压速度、license等。初选的是lz4和snappy,并实现了同时支持两种库压缩算法的版本,并且进行了压测,压测结果显示两种库测试结果相差不大。由于我们的系统里已经集成了snappy,为了避免引入额外的库,所以最终选用了snappy 。 + +2、内网情况下,性能瓶颈是CPU(包括交易执行速度、验签性能等)、IO等,网络不是瓶颈,因此即使开启了压缩,节省了网络资源,对性能影响也不大。当然这也表明压缩、解压本身对性能损耗不大;外网环境下,网络是瓶颈,这个时候大部分时间是耗费在网络上的,开启压缩,节省了很多网络带宽,使得在相同时间内,节点间可传输更多数据包,因而性能有提升。 + diff --git a/3.x/zh_CN/docs/articles/3_features/34_protocol/network_interface.md b/3.x/zh_CN/docs/articles/3_features/34_protocol/network_interface.md new file mode 100644 index 000000000..932444de4 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/34_protocol/network_interface.md @@ -0,0 +1,99 @@ +# FISCO BCOS网络端口讲解 + +作者:张开翔|FISCO BCOS 首席架构师 + +**作者语** + +区块链网络由多个互相连接的节点构成,每个节点又与客户端浏览器监控工具等相连;理清各种网络端口的存在,达成网络畅通的同时又保证安全是建立区块链网络的基础。 +同时,在搭链的过程中有一些热点问题,比如为什么节点开了这么多端口?或者为什么网络不通?节点无法连接?没有共识出块?正所谓"通则不痛",**网络畅通才能链接一切**。 + +本期文章讲的就是网络端口互通这点事,作者从FISCO BCOS的网络端口、FISCO BCOS 2.0的典型网络配置、设计网络安全组的一些策略等角度进行了解析。 + +## FISCO BCOS 2.0网络的三类端口 + +FISCO BCOS 2.0的网络包括P2P端口、RPC端口、Channel端口。 + +![](../../../../images/articles/network_interface/IMG_4911.PNG) + + +### 1.P2P端口 + +P2P端口,用于区块链节点之间的互联,包括机构内的多个节点,以及多机构间节点和节点的互联。如果其他节点在机构外,那么这个连接要监听公网地址,或者监听内网,且由连接公网的网关(如nginx)转发网络连接。 +节点之间的连接会由联盟链的准入机制控制,节点之间连接依赖节点证书验证,以排除未经许可的危险连接。这个链路上的数据通过SSL方式加密,采用高强度密钥,可以有效的保护通信安全。 + +[P2P网络详细设计](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/p2p/p2p.html) + +[网络安全和准入控制](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/security_control/index.html) + +### 2.Channel端口 + +Channel端口,控制台和客户端SDK连接Channel端口,互相之间要通过证书认证,只有经过认证的客户端才能向节点发起请求,通信数据也是采用SSL方式加密。Channel端口使用了TCP的长连接,用心跳包检测和保持存活,通信效率较高,支持AMOP协议的点对点通信,功能相当灵活强大。 +Channel端口应只监听内网IP地址,供机构内其他的应用服务器通过SDK连接,不应监听外网地址或接受公网的连接,以免发生不必要的安全的问题,也不要只监听本地地址(127.0.0.1或localhost),否则其他应用服务器将无法连接到节点上。 + +[SDK文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/index.html) + +[AMOP协议](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/design/amop_protocol.html) + +### 3. RPC端口 + +RPC是客户端与区块链系统交互的一套协议和接口,用户通过RPC接口可查询区块链相关信息(如块高、区块、节点连接等)和发送交易。 + +RPC端口接受JSON-RPC格式的请求,格式比较直观清晰,采用CURL、JavaScript、Python、Go等语言都可以组装JSON格式的请求,发送到节点来处理。当然发送交易时,要在客户端实现交易签名。要注意的是,RPC连接没有做证书验证,且网络传输默认是明文的,安全性相对不高,建议只监听内网端口,用于监控、运营管理,状态查询等内部的工作流程上。目前监控脚本,区块链浏览器连接的是RPC端口。 + +[RPC端口文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/api.html) + +## 一个FISCO BCOS 2.0的典型网络配置 + +FISCO BCOS 2.0一个典型网络配置如下所示,可以看到RPC和Channel端口共用一个IP,P2P连接单独监听一个IP,即一个区块链节点使用2个IP和3个端口。 + +节点下的config.ini文件: + +``` +[rpc]listen_ip=127.0.0.1channel_listen_port=20200jsonrpc_listen_port=8545[p2p]listen_ip=0.0.0.0listen_port=30300 +``` + +## 几种计算机的典型网络地址 + +**1、特殊地址**:0.0.0.0,表示监听本机所有的地址,包括本地、内网、公网(如有)地址,也就是全面放开,来者不拒。除非为了方便且确信安全,一般不应监听这个地址。 + +**2、本机地址**:127.0.0.1(有的配置可以写成localhost),只有同在本机上的其他进程才能连接到这个地址,其他机器一律连不过来。FISCO BCOS有的示例脚本为了安全和简易起见,默认写的是这个地址,包括build_chain脚本默认配置等。用户有时会发现其他机器运行客户端程序连不过来,大概率是这个原因,或者也可以检查下网络策略是否开通了互联,建议可以用系统的 telnet 【ip】【port】命令来先快速检测下是否能联通。 + +**3、内网地址**:通常192.168.xxx.xxx, 172.xxx.xxx.xxx,10.xxx.xxx.xxx开头的地址是内网地址,如监听这个地址,则只有同一局域网的其他机器可以访问它。 + +**4、外网地址**:暴露在互联网上的公网地址,或者可以从机构外部网络访问的地址,总之是外部服务器能连接的就是外部地址。 + +## 设计网络安全组的一些策略 + +在不同的网络拓扑上,可能牵涉这样的情况:服务器虽然可以访问外网,但是是由网关、路由器、NAT转发的,这时就需要了解具体的网络结构,进行配置了。如监听一个内网地址,把这个内网地址和监听的端口配置到转发器上,同样也可以接收来自外网的连接。 + +在网络安全方面,需要仔细的设计网络安全组策略,IP和端口黑白名单,精确的进行双向的连接控制。包括不限于以下策略: + +- **1、设置外部IP白名单**,只有这些外部IP(一般是建立了联盟的其他机构)能连接过来; +- **2、设置IP黑名单**,拒绝某些特定IP的连接,而不用等它连接到节点才进行准入控制判断; +- **3、控制RPC端口**,(如8545端口)只对本机开放,其他内网外网服务器都连不到这个端口; +- **4、控制Channel端口**,只对某一个内网网段或某几个IP开放,把自己的应用部署到开放的网段或IP对应的服务器上,内网其他应用不能访问区块链节点; +- **5、但凡有外网端口**,建议设置防DDoS的措施,避免频繁连接、海量并发连接攻击。 + +## 总结 + +三种网络端口的IP地址、端口、作用、安全考量 + +![](../../../../images/articles/network_interface/IMG_4912.PNG) + +------ + +### 群友问答 + +**Q**:节点间采用P2P通讯,同时采用SSL认证,每个节点如何获取和验证链接节点的公钥证书、预置根证书和证书链?节点跟其他节点通讯时,哪方做Server,哪方做Client? + +**A**:在创建链的时候,就分配了链的根证书;每个节点跟其他节点通讯时,互为Server Client。 + +**Q**:外网IP建议布防DDoS攻击,这是一种标准的中心化的防御逻辑。区块链的实现逻辑是去中心化,攻击单个节点是否变得没有意义?机构能不能布置更多的节点? + +**A**:关于DDoS的问题,对联盟链来说,一个机构一般部署两个节点,要是被攻击可能是会影响该机构的业务,但不至于影响全网。机构可以布置多个节点,比如4个、5个或者10个。 + +感谢参与本次话题讨论的小伙伴们!开源社区,因你们更美! + +**欢迎更多朋友加入FISCO BCOS官方技术交流群,参与更多话题交流**。(进群请扫描下方二维码添加小助手【FISCOBCOS010】) + +![](../../../../images/articles/小助手_FISCOBCOS010.png) diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/16skills_to_high-level_smart_contracts.md b/3.x/zh_CN/docs/articles/3_features/35_contract/16skills_to_high-level_smart_contracts.md new file mode 100644 index 000000000..9f3a0c554 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/16skills_to_high-level_smart_contracts.md @@ -0,0 +1,233 @@ +# 16大技巧快速实现高水准智能合约 + +作者:张龙|FISCO BCOS 核心开发者 + +## 什么是智能合约? + +智能合约是指把合同/协议条款以代码的形式电子化地放到区块链网络上,通过调用相关条款的接口实现执行,也可以把它当成是一种可自动执行的程序片段。作为区块链的参与者,智能合约既可以接收和存储价值,也可以向外发送信息和价值。 +在区块链中,智能合约非常重要,其贯穿了区块链应用开发全流程。 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5392.PNG) + +从另一个角度,我们再来看下智能合约在交易执行过程中的重要性。 +首先,在交易构建中,我们会进行合约部署与函数调用,合约部署依赖于智能合约的二进制编码。函数调用则依赖智能合约的ABI,这里的ABI是在智能合约编译阶段产生。 +交易签名是对构建好的交易进行签名,然后将其在网络上进行交易广播与交易打包。 +在交易执行前,需要完成合约部署,把智能合约的二进制编码存放到区块链网络上。交易执行阶段,也会回调获取整个智能合约的二进制编码,根据构建的交易解析相应二进制片段,二进制片段对应交易的执行指令集,交易会按照指令集执行。 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5393.JPG) + +由此可见,智能合约在整个交易流程中也非常重要。 + +## **FISCO BCOS平台的智能合约类型** + +FISCO BCOS平台目前主要支持两种智能合约类型:Solidity智能合约与预编译智能合约。 +预编译合约主要用于区块链底层平台,比如系统合约的实现。在应用开发层面,我们推荐使用Solidity合约和基于CRUD接口的预编译合约。 +两者最大的区别在于,Solidity合约采用的是EVM引擎,预编译合约以及基于CRUD合约接口开发的预编译合约都是采用预编译引擎。这两个引擎在执行效力上有非常大的差异,后续会给大家详细介绍。 +Solidity合约源自以太坊,现在许多平台都支持该合约。与其他开发语言类似,写Solidity合约需要先写合约名称,再去定义其状态变量,这里的状态变量类似java语言的成员变量,区别之处在于定义修饰符,修饰符用于条件或权限校验。 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5394.PNG) + +在这之后,是定义函数事件,函数事件重点记录了方法调用过程中的执行情况,以方便对智能合约的交易执行环节做业务层面的监控。定义构造方法的用法和创建类的实例化对象一样。 +最后,我们会对定义的状态变量做一些操作或者业务上的处理,需要再去编写一些合约函数。以上就是Solidity合约的结构。 +Solidity合约的优点在于覆盖用户与应用范围广泛,其功能强大,且经过多年发展,已逐步成熟稳定。 + +但相比原生合约,Solidity语言对开发者而言具备一定学习门槛;同时,在执行过程中需要使用EVM,性能有局限,EVM对象对内存开销较大;最后,智能合约的数据和逻辑是相对耦合的,不便于合约升级和存储扩容。 +针对Solidity合约的缺点,FISCO BCOS设计了预编译合约。 + +预编译合约也有一些不足,比如,分配一些固定的合约地址、对底层源码进行编译。为了解决这些问题,我们开发了CRUD合约接口,开发过程中用户只要继承Table合约,通过引入抽象的接口文件Table.sol就可以开发基于CRUD接口的预编译合约。 + +基于CRUD接口的预编译合约本质上与Solidity合约并没有特别多差异。主要区别有三个: + +1. 需要引入Table.sol合约接口。 +2. 进行上链交易时,首先用接口提供的功能创建一张表,只有这样数据和逻辑才能做到分离。 +3. 对合约相关状态变量的操作过程中,借助Table合约相关接口操作合约数据。比如,通过Table.insert接入口进行insert操作。 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5395.PNG) + +基于CRUD接口的预编译合约优点非常明显: + +1. 类似于数据库的操作,面向接口的编程,降低学习门槛与成本。 +2. 底层通过预约引擎执行,可并行执行,所以其性能非常高。 +3. 底层以表的形式存储数据,做到数据和逻辑分离,便于合约升级和存储扩容。 + +但是其也有一些不足。 + +1. 基于FISCO BCOS平台,无法跨平台。 +2. 适用一些业务逻辑简单的场景,例如存证业务。 + +## 16个小技巧快速写好智能合约 + +在智能合约开发过程中,我们往往面对三座大山。 + +1. 合约安全。安全是智能合约、区块链应用的基础和命脉。在整个区块链发展历史中出现过多次因为智能合约漏洞给用户、平台带来重大损失的事件。 +2. 合约性能。性能是衡量区块链应用可用性的重要指标,决定系统的负载能力和用户体验。 +3. 可扩展性。可扩展性是智能合约及区块链应用系统应对业务变更和升级的有效手段,可以确保系统升级的时效性和成本。 + +针对这三座大山,我们整理了16大技巧,帮助大家快速上手智能合约开发。 + +### 合约安全篇 + +这里,我们总结了几个智能合约安全问题。 + +- 程序错误:初始化方式错误,变量隐藏造成混用 +- 检查不足:权限和边界检查不足 +- 逻辑缺陷:出块者可操纵、重入攻击 +- 恶意合约:骗取tx.origin, RTLO字符攻击 + +针对智能合约开发过程中的安全问题,给大家几个建议。 + +#### 技巧1:做好隐私数据的加密上链 + +智能合约上的数据是完全透明,所以需要一些数据隐私保护方案来确保数据安全。比如说通过哈希、同态加密或者零知识证明的方式对链上数据进行加密处理。 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5396.PNG) + +这份合约里的两个方法都很简单,就是添加一个雇员。在上面的写法中直接把合同相关信息写入,而下面的方法把合同哈希写入。为了确保用户隐私对合同进行加密处理。我们推荐第二种写法。 + +#### 技巧2:合理的设置状态变量和函数的可见范围 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5397.PNG) + +这里有两个modifyScore,一个使用的是public,另一个使用的是internal。两者区别在于,下面的Test合约里继承了Base合约,在testFunction里利用onlyOwner调用modifyScore。 +如果直接采用public修饰符,在这里并不起作用,它不会去校验onlyOwner,因为public函数方法是对外暴露的,用户无需通过testFunction去调用onlyOwner,而是直接调用。所以一定要注意状态变量和函数的可见范围。 + +#### 技巧3:函数权限及变量边界检查 + +关于变量边界检查这里举一个例子: + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5398.PNG) + +我们要给学生成绩进行加分,假设其类型是uint8,在Solidity里uint8按数据换算是0到255的数据区间,如果不做校验将两个相加,可能会造成finalScore直接溢出,导致结果不正确。 +所以我们在加法或者类似的变量操作之后,需要进行合法性的校验。如果在这里加一个require条件判断,就可以及时检查,确保业务逻辑的正确性。 + +#### 技巧4:学会利用安全工具 + +运用Securify,Mythx,Slither等工具对智能合约进行安全扫描,这样的工具非常多,有一些是完全免费的,大家可以了解并尝试使用自己感兴趣的工具。其他智能合约安全实现技巧这里就不过多赘述。 + +### 合约性能篇 + +保证智能合约的性能非常关键,如果系统的性能达不到要求,将影响整个系统的可用性。 +而性能取决于代码运行期间对机器资源的占用。机器资源主要包括CPU、内存、网络等。 +与中心化系统不同,区块链在共识阶段需要每个节点对每笔交易进行执行,每个节点的机器配置可能都不一样,而最短板的机器会影响整个区块链网络的性能。所以在一定的机器配置下可以通过智能合约节省一些资源消耗。 +这里我们也给到大家一些优化建议。 + +#### 技巧5:减少不必要的计算和验证逻辑,减少CPU开销 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5399.PNG) + +这两个方法都是对一个数组进行平方求和,在errorMethod里对每个数进行平方计算。 +下面的方法没有计算而直接输出结果,由于大量复杂计算会对区块链网络以及性能造成很大影响,建议像这样的复杂计算和验证逻辑无需在区块链智能合约里出现,而放到链下或者业务系统中实现。 + +#### 技巧6:减少不必要的数据,减少内存、网络和存储的开销 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5400.PNG) + +这里定义了两个公司的状态变量,在Company1中companyInduction变量存放公司的简介。这在Company2里被注释掉了。这是因为公司简介对链上交易逻辑没有多大影响,但从性能角度,其占据大量区块链网络节点内存、网络和存储开销,从而对整个网络性能造成极大压力。 +所以建议大家只需把跟业务关联的核心数据、轻量化数据上链。 + +#### 技巧7:利用不同的数据组装形式,减少跨合约调用 + +跨合约调用中,区块链网络节点会重新建一个EVM,这个过程需要消耗时间,对内存开销与区块链网络性能影响都非常大。 +因此,推荐灵活使用不同的数据组装形式,例如,使用结构体避免跨合约调用,从而节省区块链节点内存、网络以及时间开销。 + +#### 技巧8:通过智能合约提供的高级特性,比如继承,减少跨合约调用 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5401.PNG) + +上面两个例子,一个是通过合约引入直接调用,另一个是通过继承去调用合约里getName。 +在智能合约里的继承指的是在编译阶段,把父合约代码全部Copy到子合约中进行编译。也就是说,在最终合约里,父合约融入到了子合约里。当调用父合约时,就不是跨合约调用。 + +#### 技巧9:改变数据类型,学会用空间换时间 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5402.PNG) + +上述例子通过mapping避免了数组的使用,提升查询时的性能。但是,按照以往经验,mapping所占用空间是数组的4倍,是否使用还要看业务具体需求:如果出于性能考虑,可以通过mapping改变数据类型,提升智能合约的执行效率。 + +#### **技巧10:紧凑状态变量打包,减少内存和存储开销** + +什么是紧凑状态变量?智能合约在EVM中的执行基于栈,栈里有相应卡槽,每个卡槽是32位左右。如果不注意变量顺序,会占用更多卡槽,消耗更多资源。下面的gasUsed就是计算机资源的开销。 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5403.PNG) + +在上面示例中,如果定义了一个bytes1、bytes31、bytes32,同样占据的是64个byte,这里因为bytes1和bytes31在同一位置,EVM自动打入一个卡槽。而错误写法里,EVM放到了两个不同卡槽。因此上面的结构体占据两个卡槽,下面的占据三个卡槽,它们使用资源的情况也不同,在实际操作中,需要注意这些细节。 + +#### 技巧11:注意函数修饰符,减少不必要的执行 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5404.PNG) + +函数修饰符一般包括pure、view等,如果不加这些修饰符,区块链网络会自动把智能合约理解为一笔交易。按照以太坊黄皮书定义,查询操作为调用,对状态数据产生变更的就可以理解为交易。 +交易需要经过执行、共识过程,调用则不用。在智能合约中,如果设置了view修饰符,就是一次调用,不需要执行共识、进入EVM,而是直接查询本地节点数据,因此性能会得到很大提升。 + +### 可拓展性篇 + +在智能合约开发过程中,上链部署之后,对智能合约的升级是非常复杂的事情。智能合约可扩展性的价值就在于以下几点: + +- 最小化成本(时间+人力)进行业务升级 +- 作为系统异常的应急处理方式 +- 便于其他人的接手和维护 + +以下一些技巧,可帮助大家提升智能合约可扩展性。 + +#### 技巧12:逻辑和数据的分离:采用经典三层架构 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5405.PNG) + +左边的智能合约通过setScore对成绩做管理,但如果要对学生成绩增加其他属性,那整个合约需要重新定义、部署,导致之前链上的数据没法使用。 +采用三层架构就能解决这个问题。 +首先,我们把数据单独放在Score合约里,通过datamap管理,然后通过ScoreManager对数据操作。这就是经典三层架构,确保逻辑和数据分离。 +如果Score里要新增其他字段,比如studentid,我们只需更新Score合约与ScoreManager合约,就可做到兼容。由于datamap里的数据完全不能变,我们只需在Manage合约里对不同数据实体进行不同逻辑处理就可以确保合约的可扩展性。 + +#### 技巧13:抽象通用逻辑 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5406.PNG) + +在左边合约里,每个合约都有onlyOwner修饰符,如果10个合约同时使用这个修饰符,维护成本将非常高。因此,建议大家重构出Base合约,在具体业务合约中继承,就可以进行复用了。这就是抽象通用逻辑实现合约的可扩展性。当下次合约升级时,只需修改Base合约即可。 + +#### 技巧14:模块化编程:单一职责模式 + +单一职责模式是一种编码规范。 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5407.PNG) + +左上的Rolemanager里包括两种角色account和company,也包括对两者的操作,其中显然违背了单一职责模式。一旦修改对账户的操作,对公司的操作也会随之改变,造成较大影响。 +通过右下的方式把不同实体的操作分离。当修改account操作时,company操作不会受影响,从而减少了智能合约的维护成本。 + +#### 技巧15:尽量复用成熟库 + +尽量复用成熟库的第一个好处是提升智能合约开发效率;第二个是减少智能合约编写中的漏洞,毕竟成熟库是经过前人大量业务实践总结出来的,其安全性有保证。 + +#### 技巧16:适当预留空闲字段 + +![](../../../../images/articles/16skills_to_high-level_smart_contracts/IMG_5408.PNG) + +在上面的ScoreManager合约里,Score结构体包括两个字段score本身与status成绩状态。如果需要增加studentid或其他备注信息,则需重新部署升级智能合约。因此,可以通过添加resever的保留字段的方式提升其可用性。但其实这样的方式也会对安全和性能造成影响。 + +今天主要跟大家分享了FISCO BCOS的两种智能合约。同时,针对智能合约安全、性能以及可扩展性,为大家提供了相应的开发技巧。智能合约的开发过程是安全、性能、可扩展性三者的博弈。开发者应根据实际业务需要选择适用的技巧与方案。 + +------ + +### Q&A + + **Q** :合约升级重新部署,怎么让数据可以重用?两个合约地址,我的SDK层需要修改适配。 + + **A** :合约通过三层模式进行逻辑和数据分离后,如果需要合约升级,需要在数据处理层对不同的合约数据做不同的处理,SDK层面也需要进行适配。 + + + **Q** :请问在uint256的话,在EVM栈中是占几个卡槽呢? + + **A** :占用一个卡槽。 + + + **Q** :智能合约能模糊查询吗?溯源如何处理? + + **A** :在区块链上模糊查询、历史数据查询等是不建议做的,因为区块链不适合做大数据处理。目前我们提供数据导出工具,已开源,可以助力业务快速进行大数据处理。 + + + **Q** :请问智能合约中怎么安全的处理百分比呢? + + **A** :智能合约没有小数类型,在上链前可以按照精度乘100或1000,链下处理在除一下就可以了. + + + **Q** :能否绑定智能合约在某个节点上运行?同一个智能合约在某个节点上可否开多个实例? + + **A** :不行的,智能合约的部署及交易的执行,都会进行全网共识,在所有共识节点执行,并在所有节点落盘(或同步账本)。智能合约部署相当于创建一个智能合约实例,多次部署会产生多个实例。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/abi_of_contract.md b/3.x/zh_CN/docs/articles/3_features/35_contract/abi_of_contract.md new file mode 100644 index 000000000..803f7bc4e --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/abi_of_contract.md @@ -0,0 +1,263 @@ +# 浅谈合约ABI + +作者:王章|FISCO BCOS 核心开发者 + +## 引子 + +当调用合约接口时,可以向区块链发送一笔交易,并获取交易的回执,交易回执保存交易的输入参数、输出、Event log、执行状态等信息。交易回执示例如下图所示: + +![](../../../../images/articles/abi_of_contract/IMG_5500.PNG) + +[交易回执详情](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/api.html#gettransactionreceipt)如下。 在交易回执中,input、output字段可以分别表示交易的输入参数及EVM执行交易后的返回值,这些字段是接口的入参或者返回值根据合约的ABI编码生成的。 + +## 什么是合约ABI + +“合约ABI是以太坊生态系统中与合约交互的标准方式,不论是外部客户端与合约的交互还是合约与合约之间的交互。”上述是以太坊官方文档给出的定义,更通俗的理解,包含两方面内容: + +1. ABI是合约接口的说明。 +2. ABI定义与合约进行交互数据编码规则。 + +下面我们将从这两方面对ABI进行说明。 + +### ABI接口说明 + +ABI是合约接口的说明,内容包括合约的接口列表、接口名称、参数名称、参数类型、返回类型等。这些信息以JSON格式保存,可以在solidity文件编译时由合约编译器生成,[详情请参考](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html#id12)。 + +这里以Asset.sol合约为例: + +![](../../../../images/articles/abi_of_contract/IMG_5501.PNG) + +#### Asset Contract ABI: + +``` +[ + { + "constant": true, + "inputs": [ + { + "name": "account", + "type": "string" + } + ], + "name": "select", + "outputs": [ + { + "name": "", + "type": "int256" + }, + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "from_account", + "type": "string" + }, + { + "name": "to_account", + "type": "string" + }, + { + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "type": "int256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "account", + "type": "string" + }, + { + "name": "asset_value", + "type": "uint256" + } + ], + "name": "register", + "outputs": [ + { + "name": "", + "type": "int256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "ret", + "type": "int256" + }, + { + "indexed": true, + "name": "account", + "type": "string" + }, + { + "indexed": true, + "name": "asset_value", + "type": "uint256" + } + ], + "name": "RegisterEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "ret", + "type": "int256" + }, + { + "indexed": true, + "name": "from_account", + "type": "string" + }, + { + "indexed": true, + "name": "to_account", + "type": "string" + }, + { + "indexed": true, + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferEvent", + "type": "event" + } +] +``` + +可以看到ABI是一个JSON的对象数组,包含接口与Event的信息。Asset合约的transfer接口以及其ABI如下: + +#### 接口: + +`function transfer(string from_account, string to_account, uint256 amount) public returns(int256)` + +#### 接口ABI: + +![](../../../../images/articles/abi_of_contract/IMG_5502.PNG) + +### ABI编码 + +假定用户需要调用Asset合约的transfer接口,已知条件如下。 + +#### Asset合约地址: + +`0x1386bf8e0138e821994140503ee214a9019eb0ec` + +#### transfer接口定义: + +`function transfer(string from_account, string to_account, uint256 amount) public returns(int256);` + +#### 用户参数: + +`String fromAccount = "Alice";` + +`String toAccount = "Bob"` + +`BigInteger amount = 10000;` + +用户如何将这些参数传递给最终执行交易的EVM,使EVM能够知道用户调用的接口为transfer接口,并且EVM能够正确读取用户输入的参数?EVM的返回值用户又该如何使用? + +这是ABI的另一个作用,定义了数据的编码格式。 + +这里以引子中交易回执的input字段为例来分析交易的输入编码: + +`"input": "0x9b80b050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000005416c6963650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003426f620000000000000000000000000000000000000000000000000000000000"` + +input数据可以分为函数选择器和参数编码两部分。 + +### 1. 函数选择器(Function Selector) + +用来指定调用的函数,函数签名Keccak哈希的前四个字节,EVM根据函数选择器来判断用户调用的是合约的哪个接口。 + +在transfer接口调用中: + +`bytes4(sha3(“transfer(string,string,uint256)”)) = 0x9b80b050` + +### 2. 参数编码 + +参数的编码(解码同样适用)需要结合ABI描述信息的内容,根据ABI描述信息中接口的类型列表对参数进行编码。 + +#### transfer类型列表: + +![](../../../../images/articles/abi_of_contract/IMG_5503.PNG) + +#### 参数列表: + +`String fromAccount = "Alice";` + +`String toAccount = "Bob"` + +`BigInteger amount = 10000;` + +#### 编码流程: + +`enc(string("Alice"),string("Bob"),uint256(10000)) = "000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000005416c6963650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003426f620000000000000000000000000000000000000000000000000000000000"` + +将Function selector与参数编码两部分合并,最终得到input。 + +## 合约ABI的优势与局限 + +### 为什么需要合约ABI + +从ABI的定义就可以看出,ABI是与合约交互的标准形式,相当于定义访问合约接口协议规范,统一了合约与合约、不同平台的客户端与合约之间的交互形式。 + +### 合约ABI的局限 + +下面来谈谈合约ABI编码的一些局限: + +- ABI编码本身的规则很复杂,这增加了用户实现的难度,不过除了个别ABI库的作者外,普通用户并不需要自己实现。 +- ABI的编码会对所有的数据编码强制32字节对齐,最终这些编码数据都需要随交易进行持久化,浪费了很多的存储空间。 +- 升级困难:ABI添加新的类型支持甚至是新的规则时,所有平台的实现都需要升级,这些新的特性在有的平台上不一定容易支持。比如:ABIEncoderV2到目前为止,各个库的支持仍然不是很完善。 + +# 总结 + +本文介绍了合约ABI的概念,ABI的JSON描述信息以及ABI编解码,并且最后分析了ABI编解码的优势与局限,让用户对合约ABI有一个初步的了解认识。大家如果有更深入的需求,可以查看[ABI的官方文档](https://solidity.readthedocs.io/en/develop/abi-spec.html)。 + +------ + +#### 参考资料 + +- [Asset.sol源码](https://github.com/FISCO-BCOS/LargeFiles/raw/master/tools/asset-app.tar.gz ) +- [合约ABI JSON格式](https://solidity.readthedocs.io/en/latest/abi-spec.html#json) +- [Function Selector](https://solidity.readthedocs.io/en/develop/abi-spec.html#function-selector) +- [ABI编码](https://solidity.readthedocs.io/en/develop/abi-spec.html#argument-encoding) + diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/contract_design_practice_deposit&points_scene.md b/3.x/zh_CN/docs/articles/3_features/35_contract/contract_design_practice_deposit&points_scene.md new file mode 100644 index 000000000..b92c7f609 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/contract_design_practice_deposit&points_scene.md @@ -0,0 +1,263 @@ +# 存证&积分场景合约设计技巧与实例代码解析 + +作者:毛嘉宇|FISCO BCOS 核心开发者 + +## 场景1:区块链+存证的权限合约编写 + +电子数据存证是记录“用户身份验证-数据创建-存储-传输”全过程的方式,应用一系列安全技术全方位确保电子数据的真实性、完整性、安全性,在司法上具备完整的法律效力。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5409.PNG) + +区块链技术的下列特点有助于降低成本、提升效率,并且确保存证数据的安全。 + +- 完善的防篡改机制:使用区块链技术保全证据,进一步加强了证据不可篡改性; +- 证据效力得到机构认可:司法机构作为链上节点,对链数据参与认可和签名,事后可从链上确认数据的真实有效性; +- 服务持续有效:数据被多方共识上链后,即使有部分共识方退出也不会造成数据的丢失或失效。 + +### 存证场景简要业务流程 + +在存证场景中可以抽象出三类典型用户:**存证方、审核方和取证方**。 + +- 存证方提交需要存证的申请。 +- 审核方基于内容,对存证数据进行审核和签名确认。实际业务场景中,审核方可能会涉及投票和多方审核的多签过程。 +- 当存证上链后,取证方可随时查询存证者地址、时间戳和审核详情等相关信息进行核验。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5410.PNG) + +### 存证场景权限合约实例讲解 + +我们以存证场景中权限合约进行讲解。 + +#### 存证合约概要设计 + +**首先将逻辑和数据层分离**。因为Solidity智能合约语言没有独立数据层,为便于合约后续扩展、升级,需要将逻辑和数据层分离,体现在下图里就是将数据层和控制层区分开。 + +**其次引入权限层**。在一条联盟链上所有节点可以自由访问链上数据,智能合约提供了一种修饰器机制,可控制合约给指定授权用户访问,依据合约单一职责原理,将这一层抽象出来。 + +同时,我们需要控制数据层的权限,防止将写入数据层的接口权限开放给所有人,因此需要依赖并引入权限合约。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5411.PNG) + +#### 权限合约实例讲解 + +权限合约比较简单,不需要依赖其他合约,在很多合约开发中存在需求,可供复用。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5412.PNG) + +Authentication合约里首先定义了两个成员变量,合约属主owner和权限控制映射列表acl(access control list)。 + +- **owner**:在合约构造时owner会自动被赋值为msg.sender,也就是合约的调用者,修饰器onlyOwner可以用来判断后续调用者是不是当初合约的创建者。 +- **acl**:acl的变量是一个address到bool类型的mapping,我们看下allow和deny函数,allow将传入参数的地址所映射bool值设置为true,deny设置为false,设置完后可以通过auth修饰器来判断合约访问者权限。 + +##### 存证数据 + +下图展示的是证据数据层,存证数据合约的代码。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5413.PNG) + +EvidenceRepository是存证数据仓库,它继承了权限合约,权限合约里的方法和修饰器可在存证仓库的合约被使用。 + +- 存证数据合约定义了一个struct的结构体EvidenceData,用来存放存证数据。为了简化模型,我们只定义了三个最核心的数据字段:存证数据Hash值、提交者地址和存入时间戳,在实际业务存证场景中大家可以根据所需字段进行扩展。 +- mapping的变量,就是byte32到结构体的映射关系,实际上是以存证hash做为主键映射这个结构体的数据。key是hash,值就是上面的结构体,通过hash值可以检索查询和保存存证数据。 +- 定义的函数中只确定了最核心的setData和getData函数。请注意,该合约本身继承了Authentication合约,所以在setData里能够使用auth的修饰器,控制只有被授权用户才能访问,防止智能合约被部署到链上以后遭到恶意攻击或调用。getData函数根据传入的哈希把存入数据整体查询出来并返回。 + +可以看出,所有存证数据都被保存到数据合约里。这样可以起到统一存储、统一管理的效果。当然,这不一定是最优方案。 +在业务场景中,如果合约拥有海量存证数据,则可能成为性能瓶颈,采用分拆设计方案会更加合理。 + +##### 请求数据 + +存证方开始提交存证数据并不会直接被写入到存证仓库中,而是经过审核方签名完成后才会真正提交,审核方可以为多方。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5414.PNG) + +理解合约用途后,我们仔细看这个合约。 + +- 请求数据的合约结构和存证数据一致。第一部分是数据结构,SaveRequest是一个结构体,里面定义了一个存证请求详细的数据结构,包括最核心的存证hash、提交者、已经审核通过的票数。 +- ext是一个描述说明字段,status记录了已经投票签名通过的审核方,threshold是投票阈值,voters是审核方地址列表,saveRequests定义了请求hash和请求本身的映射。类似存证数据合约,在请求数据合约中,所有请求数据也都存储在单个数据仓库合约里。 +- 最后来看两个核心的函数:创建请求和投票审核。两个函数内都有auth修饰符控制权限。创建请求时,函数内部会使用require语句检查请求是否已经存在;投票时,函数内部会使用require语句检查审核者是否已经投票,请求本身是否存在,审核者是否合法。如果检查通过,审核投票票数加一,标记审核者已签名。 + +##### 控制器 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5415.PNG) + +控制器引入了两个数据仓库合约,我们只需调用controller就可以完成所有用户接口的交互;它的构造函数参数变量包含了请求合约构造所需的参数:审核者列表及投票阈值,这个构造函数会自动构造和创建合约。 + +controller定义了两个方法,一个是创建存证请求,另一个是审核人根据请求进行投票。 +创建请求函数较为简单,会直接调用请求数据仓库合约里的创建请求函数。 +处理投票函数相对复杂。在验证hash数据非空后,会调用审核接口,如果审核成功,会触发检查当前请求审核通过数是否超过阈值,一旦超过,就自动保存到存证数据合约,同时,删除该请求。 + +此外,这个合约里还定义了三个event事件,有以下作用: + +- 记录事件定义的参数,存储到区块链交易日志中,提供廉价存储。 +- 提供一种回调机制,在事件执行成功后,由节点向注册监听的SDK发送回调通知,触发回调函数被执行。 +- 提供一个过滤器,支持参数检索和过滤。 + +例如,createSaveRequest日志记录了hash和调用地址。如果配合SDK,我们可以实现对这个特定事件监听,并自动触发自定义回调函数。 + +#### 存证合约示例小结 + +以上就是一个完整的存证场景权限合约demo。为了便于理解,我们并没有把例子设计得面面俱到,希望大家能更好地从中理解到demo的设计思想: + +- 数据与逻辑分离; +- 建议采取自底向上开发,先开发依赖最少的部分,模块化、分层化的设计与实现; +- 关注权限控制与检查,避免出现一些非授权访问; +- 定义统一和清晰的接口; +- 存证数据hash上链。 + +## 场景2:区块链+积分合约实例讲解 + +下面介绍另一个智能合约典型应用场景——积分场景。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5416.PNG) + +区块链技术可以如何解决积分场景中的这些痛点呢? + +- 增加品牌曝光度:多个机构组成积分联盟,积分可有效通兑,实现客户资源引流,提升营销效果。 +- 保证积分安全性:所有积分的生成和流转过程保存到链上,防止商户篡改和抵赖。 +- 提升用户体验:不同商户和用户之间实现积分流转、互通,更加便利。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5417.PNG) + +图:典型积分业务场景示例 + +一种思路是基于区块链技术,多个商家组成积分联盟,实现积分通存通兑、客户资源相互引流等。我们抽象了一个管理者,管理者部署和管理合约,商家有发行积分、拉入其他商家、撤销发行者身份的权限;消费者有开户、销户、消费积分和积分转账的权限。 + +### 积分场景合约实例讲解 + +先来做积分合约的概要设计。在存证合约中,我们引入了数据和逻辑分离的思想;在积分合约中,我们将引入管理、数据和逻辑分离的思想。 +为什么要增加一层管理合约呢?原有的两层结构中,控制合约会自动创建数据合约,而数据层合约中写死了属主是控制合约。 +引入了管理合约后,就实现了类似控制反转的效果,控制合约和数据合约都由管理合约来创建;同时,管理合约还可以随时设置数据合约中控制合约的地址。这样,控制合约就可以随时实现平滑地业务逻辑升级;将管理合约分离出来,还有利于链上权限治理。 +此外,我们还将常用的权限、角色功能抽象为合约,并抽象了权限mapping和数据计算的库。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5418.PNG) + +下面我们将看下积分合约具体的代码实现。 + +#### 合约库——安全计算 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5419.PNG) + +安全计算在Solidity中非常重要。涉及到数值计算部分,可优先考虑采用成熟开源的库。分享一个小技巧,由于链上资源非常宝贵,建议大家使用库的时候可以裁剪掉冗余的代码,节省资源。 +安全计算的库,会在执行后重新检查数值,避免出现溢出,规避攻击。 + +#### 库——角色管理 + +角色管理的库提供了创建角色、删除角色、查询角色的功能。这里有个基础的mapping bearer,是address到bool的映射,在mapping中维护role身份。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5420.PNG) + +#### 基础权限合约 + +在BasicAuth的基础权限合约中,我们提供了对属主的判断。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5421.PNG) + +#### 发行者合约 + +发行者合约依赖上面LibRole的合约。为了简化规则,易于理解,我们这样定义:发行者允许添加新的发行者,也可以撤销自己发行者身份。有了发行者角色后,我们就可以发行积分了。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5422.PNG) + +#### 积分数据合约 + +现在进入到积分合约主体——admin-controller-data三层架构。 +首先介绍积分数据合约。它会将所有用户积分,以及角色信息都存到积分数据合约里。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5423.PNG) + +- balances维护了每个用户的余额; +- accounts维护已经注册的账户; +- totalAmount系统里是总共发行的积分; +- description注释或备注信息 +- latestVersion实现访问权限控制; +- upgradeVersion的方法,有授权用户可调用这个方法来升级合约,这里由Admin合约来发起并调用; +- setBalance方法,设置某个账户的余额必须通过onlyLatestVersion检查,只有有权限的owner才能调用这个数据合约。 + +#### 管理合约 + +管理合约作用是创建所有的合约。constructor更新在数据合约中所持有的版本号,一旦controller需要升级,只需调用下这个方法即可。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5424.PNG) + +#### 控制合约 + +最后介绍控制合约。由于controller代码较长,这里只展示最典型的两个函数。 +balance查余额调的就是数据查余额的接口。积分的消费通过transfer实现,其中会有很多修饰器来检查账户是否已经注册,是否有效等,此外采用了智能合约事件来输出和打印日志。 + +![](../../../../images/articles/contract_design_practice_deposit&points_scene/IMG_5425.PNG) + +#### 积分合约示例小结 + +小结一下积分场景demo中的一些设计思想: + +- 引用三层架构:使用数据、逻辑、管理来管理合约; +- 抽象了库、封装了常用的合约来复用; +- 必须时刻关注合约安全,比如合约数值计算是否正确,权限是否合适; +- 以合约为单位,对职责进行抽象,尽可能实现合约职责单一。 + +## 如何写出高质量设计说明文档 + +### 文档编写之『术』 + +『术』主要就是编写文档时结构上所需要素,这里分为了三类: + +- 业务背景:首先编写文档时不要预设他人能理解所有的专业术语,其次要清楚地介绍业务存在的痛点,区块链能否解决这些痛点。 +- 技术方案设计:需清晰地说明基础业务需求(如参与者、场景、活动),设计思路概要,详细的合约职责、函数、参数等。 +- 使用说明:实际使用场景、上手指南和使用手册等。 + +### 文档编写之『道』 + +有了术,就能确保文档内容结构的完整性,文档就有了骨架和血肉;但是,『道』才是文档的灵魂和精髓所在,这里整理了5个关注点: + +- 亮点:展示出本方案的独特性(创意/设计/功能/规范/文档); +- 痛点:说清楚问题和解决方法; +- 重点:代码、注释、文档编写要条理清晰、可读性强,围绕问题和解决方案展开,不要为了炫技而炫技; +- 难点:基于智能合约特性,权衡规范、效率和安全性; +- 要点:以解释作为基本导向,不要预设别人能够理解所有业务和技术术语。 + +本文主要分享了存证和积分两个典型应用场景合约设计思路和实例代码解析,为大家总结了相关的开发技巧和文档写作技巧。 +在智能合约开发过程中,开发者需根据实际业务需求选择适用的技巧与方案。正所谓『兵无常势,水无常形』,没有最优的设计,只有最合适的设计。 + +------ + +### Q&A + +**Q** :智能合约中如何获取之前的数据? + +**A** :主要有两种方法:1.在智能合约中定义需要查询历史数据的函数,通过合约查询接口来查询。2.使用WeBASE-Collect-Bee数据导出组件将链上数据导出到链下数据库中,可以查询所有数据。 + + +**Q** :合约中的变量定义了private 属性,也可以被链上公开获取到吗? + +**A** :链上所有数据都是公开的,即便定义了private属性的变量,也可以通过技术手段获取。 + + +**Q** :在智能合约内可不可以调用其他外部接口? + +**A** :智能合约中可以调用其他合约接口,但是不能访问外部接口。 + + +**Q** :如果积分在一定时间内会减少,这种积分场景怎么实现? + +**A** :首先要定义一个积分减少的业务规则;其次要实现这种场景在技术上是可行的,例如可以设计一个积分销毁函数,调用这个函数后,可以减少指定账户积分并同时减少总积分数量。最后,具体的实现逻辑和方式取决于业务规则。另外,需要注意的是,智能合约不支持类似定时脚本机制,需要外部调用才能触发。 + + +**Q** :在编写智能合约时一定要按照三层结构进行编写吗? + +**A** :不一定,取决于具体的业务场景,需要从实际业务场景中分析利弊,选择合适的方案。一般场景下我们推荐分层,这样更加灵活,更利于合约升级和维护。 + + + +**Q** :怎么通过智能合约实现同一群组内不同用户数据读写权限管控? + +**A** :数据一旦上链后,对链上所有参与者来说都是公开透明的,因此,在链上实现同一群组内不同用户数据读写权限的管控本身不可行。但我们可以通过在数据上链前对数据本身进行加密来实现类似效果。 + + +**Q** :存证中的哈希值是合同或者发票的哈希值吗? + +**A** :这个规则取决于具体应用需求,可以直接是文件的哈希或者是拼装了其他信息再算一个哈希值,需要看具体场景需求。 + + +**Q** :如果上链的数据错误,怎么处理? + +**A** :数据一旦上链后,就不能被篡改和被物理删除;但可以设计一种合约逻辑删除机制,例如,在特定的数据合约中添加一个状态字段来标记数据是否被删除。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/contract_name_service.md b/3.x/zh_CN/docs/articles/3_features/35_contract/contract_name_service.md new file mode 100644 index 000000000..5e3e67788 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/contract_name_service.md @@ -0,0 +1,157 @@ +# FISCO BCOS的CNS合约命名服务 + +作者:陈宇|FISCO BCOS 核心开发者 + +## CNS为何而生? + +FISCO BCOS原有的调用智能合约流程为: + +1. 编写合约; +2. 编译合约得到合约接口abi描述; +3. 部署合约得到合约地址address; +4. 封装合约的abi和地址,通过SDK实现对合约的调用。 + +从上述合约调用流程可知,业务方调用合约之前,必须获取合约abi以及合约地址address,这是业界调用合约的通用方法。 + +但通过后续的用户调研,我们收集到业务方提出的如下建议: + +1. 对于较长的合约abi字符串,需提供位置进行存储,从而代替业务方的自行存储; +2. 对于20字节的合约地址魔数,其丢失后将导致合约不可访问,需减少业务方的记忆成本; +3. 合约重新部署后,相关多个业务方可快速无感知地更新合约地址; +4. 易于对合约进行版本管理。 + +为给业务方提供更加良好的智能合约调用体验,FISCO BCOS提出CNS合约命名服务方案。 + +## CNS如何实现? + +CNS通过提供链上合约名称与合约地址映射关系的记录及相应的查询功能,方便业务方通过记忆简单的合约名称来实现对链上合约的调用。为方便业务方调用合约,SDK封装了CNS方式调用合约的接口,接口内部实现了合约地址的查找,业务方对此无感知。 + +### 信息记录 + +CNS记录的内容包括:合约名称、合约版本、合约地址和合约abi。其中合约abi指合约的接口说明,描述了合约字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型。上述CNS信息以系统表的方式进行存储,账本内各节点一致,但各账本独立。CNS表定义如下: + +![](../../../../images/articles/contract_name_service/IMG_5496.PNG) + + +### 接口描述 + +SDK与区块链节点间的接口以合约的方式提供。该CNS合约以预编译合约的方式进行逻辑实现,声明如下接口: + +``` +pragma solidity ^0.4.2; +contract CNS +{ + // CNS信息上链 + function insert(string name, string version, string addr, string abi) public returns(uint256); + // 查询返回表中该合约所有不同version的记录,JSON格式 + function selectByName(string name) public constant returns(string); + // 查询返回表中该合约该版本的唯一地址 + function selectByNameAndVersion(string name, string version) public constant returns(string); +} +``` + +SDK提供预编译合约对应的CnsService类,实现对CNS的支持。CnsService供业务方进行调用,可以配置及查询CNS信息,其API如下: + +- `String registerCns(String name, String version, String address, String abi)`:根据合约名称、合约版本、合约地址和合约abi注册CNS信息。 +- `String getAddressByContractNameAndVersion(String contractNameAndVersion)`:根据合约名称和合约版本(合约名称和合约版本用英文冒号连接)查询合约地址。若缺失合约版本,默认使用合约最新版本。 +- `List queryCnsByName(String name)`:根据合约名称查询CNS信息。 + +- `List queryCnsByNameAndVersion(String name, String version)`:根据合约名称和合约版本查询CNS信息。 + + + +### 交互流程 + +#### 部署合约 + +业务方通过CNS部署合约的过程包括两个步骤,两个步骤均由SDK执行。第一个是发送部署合约的交易上链;第二个是通过发送上链交易,实现合约名称和合约地址的关联。 + +![](../../../../images/articles/contract_name_service/IMG_5497.PNG) + + +#### 调用合约 + +SDK接收到业务方基于CNS调用合约的请求时,先行查询获取该合约名称对应的合约地址,再基于合约地址进行合约的调用。 + +![](../../../../images/articles/contract_name_service/IMG_5498.PNG) + + +## CNS使用演示 + +我们以调用CnsService的控制台为例,描述CNS相关的注册、调用和查询功能。 + +#### deployByCNS + +运行deployByCNS,采用部署合约。用CNS部署的合约,可用合约名直接调用。 + +##### 参数: + +- 合约名称:部署的合约名称。 +- 合约版本:部署的合约版本。 + +##### 示例: + +``` +# 部署HelloWorld合约1.0版 +[group:1]> deployByCNS HelloWorld.sol 1.0 +contract address:0x3554a56ea2905f366c345bd44fa374757fb4696a + +# 部署HelloWorld合约2.0版 +[group:1]> deployByCNS HelloWorld.sol 2.0 +contract address:0x07625453fb4a6459cbf14f5aa4d574cae0f17d92 + +# 部署TableTest合约 +[group:1]> deployByCNS TableTest.sol 1.0 +contract address:0x0b33d383e8e93c7c8083963a4ac4a58b214684a8 +``` + +#### queryCNS + +运行queryCNS,根据合约名称和合约版本(可选参数),查询CNS表记录信息。 + +##### 参数: + +- 合约名称:部署的合约名称。 +- 合约版本:部署的合约版本(可选)。 + +##### 示例: + +![](../../../../images/articles/contract_name_service/IMG_5499.PNG) + +#### **callByCNS** + +运行callByCNS,采用CNS调用合约,即用合约名称直接调用合约。 + +##### 参数: + +- 合约名称与合约版本:合约名称与版本用英文冒号分隔,例如HelloWorld:1.0或HelloWorld.sol:1.0。 + + 当省略合约版本时,例如HelloWorld或HelloWorld.sol,则调用最新版本的合约。 + +- 合约接口名:调用的合约接口名。 + +- 参数:由合约接口参数决定。 + +##### 示例: + +``` +# 调用HelloWorld合约1.0版,通过set接口设置name字符串 +[group:1]> callByCNS HelloWorld:1.0 set "Hello,CNS" +transaction hash:0x80bb37cc8de2e25f6a1cdcb6b4a01ab5b5628082f8da4c48ef1bbc1fb1d28b2d + +# 调用HelloWorld合约2.0版,通过set接口设置name字符串 +[group:1]> callByCNS HelloWorld:2.0 set "Hello,CNS2" +transaction hash:0x43000d14040f0c67ac080d0179b9499b6885d4a1495d3cfd1a79ffb5f2945f64 + +# 调用HelloWorld合约1.0版,通过get接口获取name字符串 +[group:1]> callByCNS HelloWorld:1.0 get +Hello,CNS + +# 调用HelloWorld合约最新版(即2.0版),通过get接口获取name字符串 +[group:1]> callByCNS HelloWorld get +Hello,CNS2 +``` + +## 总结 + +FISCO BCOS通过CNS简化了业务方调用合约的方式,也方便了业务方对合约进行管理及升级操作。同时,CNS专注于实现地址映射功能。CNS所映射的地址类型除合约地址外,还可以映射账号地址。当CNS映射账号地址时,合约abi内容为空。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/entry_quick_guide.md b/3.x/zh_CN/docs/articles/3_features/35_contract/entry_quick_guide.md new file mode 100644 index 000000000..2ee4db5cb --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/entry_quick_guide.md @@ -0,0 +1,237 @@ +# FISCO BCOS智能合约开发快速入门 + +作者:张龙|FISCO BCOS 核心开发者 + +目前,FISCO BCOS平台支持Solidity和Precompiled两种类型的智能合约,同时,提供交互式控制台工具(Console),方便开发者与链进行交互,部署、调用智能合约。 +为了让大家快速上手智能合约,FISCO BCOS推出了智能合约系列教程,本文将带大家快速入门,运用FISCO BCOS开发部署一个简单的智能合约。 + +## 智能合约简介 + +众所周知,智能合约的出现,使区块链不仅能处理简单的转账功能,还能实现复杂的业务逻辑,极大地推动了区块链技术发展,加速应用落地。 + +目前,在众多区块链平台中,大多数集成了以太坊虚拟机,并使用Solidity作为智能合约开发语言。作为一门面向合约的高级编程语言,Solidity借鉴了C++、Python和JavaScript等语言的设计,使用静态类型,不仅支持基础/复杂数据类型操作、逻辑操作,同时提供高级语言的相关特性,比如继承、重载、库和用户自定义类型等。 + +作为最大最活跃的国产开源联盟链社区,FISCO BCOS无缝支持Solidity合约,并提供从开发、编译、部署到调用的全链路工具和完整解决方案,使智能合约和区块链应用开发变得简单。 +除此之外,基于大量探索和实践,FISCO BCOS不仅支持Solidity合约,还支持Precompiled合约,并在用户层提供CRUD合约接口。面向库表开发的CRUD合约不仅更符合用户开发习惯,进一步降低合约开发难度,提升性能,使区块链应用满足高并发场景的诉求。 + +## 智能合约分类 + +FISCO BCOS平台支持两种类型的智能合约:Solidity合约和Precompiled合约。 + +### Solidity合约 + +Solidity合约运行在EVM上,EVM为以太坊虚拟机,采用哈佛架构,指令、数据和栈完全分离。 +在智能合约运行期间,首先创建一个沙盒环境(EVM实例),沙盒环境与外部环境完全隔离,无法访问网络、文件系统其它进程,智能合约在EVM内只允许进行有限的操作。交易执行时,EVM通过获取合约的opcode,将opcode转化为对应的EVM指令,并按照指令进行执行。 + +从应用落地的数量来看,Solidity合约使用最为广泛,几乎所有区块链平台都支持,但Solidity也有很多缺点。如下: + +- 合约在EVM中串行执行,性能较差; +- 跨合约调用会新建EVM,内存开销较大; +- 合约变量和数据存在MPT数中,不便于合约升级; +- 逻辑和数据耦合,不便于存储扩容。 + +### Precompiled合约 + +Precompiled合约即预编译合约。预编译合约通过Precompiled引擎执行,采用C++编写合约逻辑,合约编译集成进FISCO BCOS底层节点。 +调用合约不进EVM,可并行执行,突破EVM性能瓶颈;提供标准开发框架,只需继承基类,实现call接口即可;适合于逻辑相对确定、追求高并发的场景;数据存在表中,与合约分离,可升级合约逻辑。 + +当然,预编译合约的使用有一定的门槛。如下: + +- 对于数据的存储,需要创建FISCO BCOS特有的表结构; +- 编写合约时需继承Precompiled类,然后实现Call接口函数; +- 完成合约开发后,需在底层为预编译合约注册地址; +- 编写完成合约后,需要重新编译FISCO BCOS源码。 + +为了屏蔽预编译合约在开发和使用中的门槛,FISCO BCOS基于预编译合约和分布式存储设计了CRUD合约接口。用户在编写Solidity合约时,只需要引入抽象合约接口文件Table.sol,便可使用CRUD功能,用户不需要关心底层的具体实现。 + +## 智能合约开发 + +本节将基于全球英文认证考试成绩管理作为场景,基于FISCO BCOS平台对智能合约进行开发。全球认证考试包括GRE、TOEFL、IELTS等。为了简化合约逻辑,所有成绩统一由考试管理中心发布和管理,学生可以根据自己的账号(地址)查询自己的考试成绩。 + +### Solidity合约开发 + +在 Solidity 中,合约类似于面向对象编程语言中的类。Solidity合约有自身的代码结构,由几个部分组成,如下所示。 + +- 状态变量:状态变量是永久存储在合约中的值 +- 构造函数:用于部署并初始化合约 +- 事件:事件是能方便地调用以太坊虚拟机日志功能的接口 +- 修饰器:函数修饰器可以用来改变函数的行为,比如自动检查,类似Spring的AOP +- 函数:函数是合约中代码的可执行单元 + +#### 创建合约 + +首先创建一个名为StudentScoreBySol的合约,用于管理学生的成绩。如下代码所示,开头需要引入合约版本。 + +![](../../../../images/articles/entry_quick_guide/IMG_4913.PNG) + +#### 定义状态变量 + +状态变量用于存储和管理学生的考试成绩。 +在当前场景中定义两个变量,其中_owner为合约的创建者,即考试管理中心;_scores用于存储学生成绩,为一个嵌套mapping类型,第一个mapping的key(address)为学生的账户(私钥对应的地址),value也为一个mapping类型,对应为每一科的成绩,在第二个mapping中key(bytes32)为科目名称,如GRE、TOEFL等,value(uint8)为成绩。如下所示。 + +![](../../../../images/articles/entry_quick_guide/IMG_4914.PNG) + +#### 定义事件 + +定义一个事件setScoreEvent,用于跟踪对学生成绩的新增/修改操作,可以在业务层面对事件进行监听。事件的定义是可选的,如果没有定义也没关系,在业务层面可以根据方法的返回值去判断交易是否成功,但无法做到更精细的问题定位。 + +![](../../../../images/articles/entry_quick_guide/IMG_4915.PNG) + +#### 定义修饰器 + +智能合约中的修饰器(Modifier)类似面向对象编程中的AOP,满足条件才会执行后续操作。如下所示,修饰器要求必须是合约的Owner才能进行后续操作,其中Owner为考试管理中心。 + +![](../../../../images/articles/entry_quick_guide/IMG_4916.PNG) + +#### 定义构造方法 + +构造方法用于实例化合约,在当前构造方法中,指定Owner为合约的部署者。 + +![](../../../../images/articles/entry_quick_guide/IMG_4917.PNG) + +#### 编写函数 + +当前合约中,定义两个函数,setScore函数用于新增/修改/删除(score置为0)学生成绩,并使用了onlyOwner修饰器,只有Owner(考试管理中心)才能操作,并通过setScoreEvent事件跟踪每次操作内容。getScore方法用于成绩查询,其中view修饰符表示不会修改状态变量。 + +![](../../../../images/articles/entry_quick_guide/IMG_4918.PNG) + +Solidity合约完整代码如下所示。基于Solidity语言的合约开发,看似简单,但需要对Solidity编程语言深入学习,才能编写出高可用的合约,具备一定学习成本。 +通过FISCO BCOS开源社区推出的智能合约专题,开发者可了解更多运用Solidity编写智能合约的方法与技巧,关注“FISCO BCOS开源社区”公众号可获取专题。 +更多细节可参考Solidity官方文档:https://solidity-cn.readthedocs.io/zh/develop/ + +![](../../../../images/articles/entry_quick_guide/IMG_4919.PNG) + +### CRUD合约开发 + +CRUD合约是CRUD功能的核心,用户可以直接在合约中引用CRUD接口文件Table.sol,并在Solidity合约中调用CRUD接口。CRUD合约的开发完全遵从数据库的操作习惯,更容易理解和上手。 + +CRUD合约更多开发细节可参考:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html#crud + +#### 创建合约 + +CRUD创建的合约和Solidity创建的没有太大区别,唯一区别在于需要引入CRUD接口文件Table.sol,如下所示。修饰器和构造方法的作用与Solidity合约相同。 + +![](../../../../images/articles/entry_quick_guide/IMG_4920.PNG) + +#### 事件定义 + +在Solidity合约中可以通过setScore完成成绩的新增/修改/删除,但在CRUD合约中,需要借助CRUD接口文件的不同接口,通过不同函数实现,所以需要针对不同的函数定义不同事件,如下所示。 + +![](../../../../images/articles/entry_quick_guide/IMG_4921.PNG) + +- createEvent:用于跟踪创建表操作; +- insertEvent:用于跟踪插入成绩操作; +- updateEvent:用于跟踪更新成绩操作; +- removeEvent:用于跟踪删除成绩操作。 + +#### 创建表函数 + +CRUD合约实现业务功能,首先需要像数据库操作一样,创建一张表,用于存放数据。 +FISCO BCOS底层提供了TableFactory合约,该合约的地址固定为0x1001,可以通过TableFactory对象提供的方法对表进行创建(createTable)和打开(openTable),如下所示。 +createTable接口返回值为0时,说明创建成功。需要注意的是,为了让创建的表可被多个合约共享访问,表名必须是群组内全局可见且唯一的,无法在同一条链上的同一个群组中,创建多个名称相同的表。 + +![](../../../../images/articles/entry_quick_guide/IMG_4922.PNG) + +#### 新增成绩函数 + +对表进行操作时,首先需要通过TableFactory打开对应的表,获得表对象,然后通过表对象的insert方法进行数据插入。在插入数据前,首先需要构建一个Entry对象实例,代码如下所示。 + +![](../../../../images/articles/entry_quick_guide/IMG_4923.PNG) + +需要注意的是,Table接口合约的insert、remove、update和select函数返回值类似数据库,均为受影响的记录行数,且接口中key的类型为string。 +而在当前场景中,学生的studentId为address类型,所以需要在函数内部将address类型转化为string类型,代码如下。 + +![](../../../../images/articles/entry_quick_guide/IMG_4924.PNG) + +#### 更新成绩函数 + +更新成绩操作步骤包括:通过TableFactory对象打开表,然后,像数据库一样构造筛选条件。 +在CRUD合约接口中,提供了Condition对象,该对象提供了诸如大于、等于、小于等一系列条件方法。构造完成条件对象后,可以调用table对象的udpdate接口,完成更新操作,代码如下。 + +![](../../../../images/articles/entry_quick_guide/IMG_4925.PNG) + +#### 删除成绩操作 + +删除操作和更新操作类似,需要调用table.remove接口完成,不再赘述,代码如下。 + +![](../../../../images/articles/entry_quick_guide/IMG_4926.PNG) + +#### 查询成绩操作 + +查询成绩操作很简单,需要调用table.select接口完成,代码如下。 + +![](../../../../images/articles/entry_quick_guide/IMG_4927.PNG) + +至此基于CRUD的合约开发完成。 + +从当前场景的代码行数来看,CRUD合约比较复杂,Solidity合约相对简单。但这只是一个幻觉,实际情况可能并非如此。而且CRUD合约的开发更符合开发者习惯,没有多余的学习成本,更容易理解和上手。 + +## 合约部署及调用 + +开发完智能合约后,需要对合约进行编译和部署,然后才能调用。FISCO BCOS平台提供了交互式控制台工具(Console),可以非常方便地与链进行交互。下面将以上述智能合约为例,采用控制台工具进行部署和调用。 +控制台安装及使用可参考:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html + +### 准备工作 + +在对合约进行部署和调用前需要做三件事情。首先复制编写好的合约到控制台目录console/contracts/solidity下。如下图所示。 + +![](../../../../images/articles/entry_quick_guide/IMG_4928.PNG) + +其次对合约进行编译,可以采用控制台目录下的sol2java.sh脚本对合约进行编译,编译结束后会在console/contracts/sdk目录下生成如下文件夹,如下图所示。 +```eval_rst +.. note:: + 若控制台版本大于等于v2.8.0,请执行bash sol2java.sh -h命令查看该脚本使用方法 +``` + +![](../../../../images/articles/entry_quick_guide/IMG_4929.PNG) + +其中abi中存放合约的ABI,bin存放合约的二级制编码文件(BINARY),JAVA文件夹中为对应的JAVA合约,便于通过SDK和链进行交互。 +需要注意的是对CRUD合约编译时。需要将CRUD接口合约Table.sol一并放入console/contracts/solidity目录下,不然会报错。 +最后,对合约进行部署时,依赖外部账户,所以首先需要生成账户。在控制台中提供了账户生成工具get_account.sh,运行该脚本会在console/accounts目录下生成账户。 + +我们利用账户生成工具生成两个账户。一个为考试管理中心的账户,用于部署和新增/修改/删除学生成绩;一个为学生账户,用于查看考试成绩。如下所示。 + +![](../../../../images/articles/entry_quick_guide/IMG_4930.PNG) + +### Solidity合约部署和调用 + +首先采用考试管理中心账户启动控制台,如下图所示,即表示控制台启动成功。 + +![](../../../../images/articles/entry_quick_guide/IMG_4931.PNG) + +然后通过deploy命令对合约进行部署,合约部署成功之后会返回合约地址,如下图所示。 + +![](../../../../images/articles/entry_quick_guide/IMG_4932.PNG) + +合约部署完成之后,可以通过控制台的call命令调用合约函数。如下图所示,新增学生的GRE成绩为70(修改和删除均可通过调用setScore方法进行操作),函数返回值为true,则表示交易成功。call命令的具体用法可以通过call -h 查看。 + +![](../../../../images/articles/entry_quick_guide/IMG_4933.PNG) + +采用学生账户启动控制台,通过getScore函数查看成绩,如下图所示,返回值为70,说明没有问题。也可以使用学生账户调用setScore方法,会报错,打印没有权限,不再赘述。 + +![](../../../../images/articles/entry_quick_guide/IMG_4934.PNG) + +### CRUD合约部署和调用 + +CRUD合约的部署和调用和Solidity合约没有区别,这里同样采用控制台进行。 + +首先采用考试管理中心账户启动控制台,并对StudentScoreByCRUD合约进行部署。如下图所示。 + +![](../../../../images/articles/entry_quick_guide/IMG_4935.PNG) + +合约部署完成之后,调用create函数创建stu_score表,如下所示,返回结果为0,说明创建成功。 + +![](../../../../images/articles/entry_quick_guide/IMG_4936.PNG) + +创建好表之后,就可以调用相关接口对学生成绩进行操作了,首先调用insert函数新增学生成绩。如下所示,返回结果为1,说明插入成绩成功。 + +![](../../../../images/articles/entry_quick_guide/IMG_4937.PNG) + +成绩插入成功之后,关闭当前控制台,用学生账户登录控制台,并调用select函数查询成绩,如下图所示,返回70,说明查询成功。剩余函数测试可自行完成,不再赘述。 + +![](../../../../images/articles/entry_quick_guide/IMG_4938.PNG) + +## 结束语 + +本文重点介绍了FISCO BCOS平台的智能合约开发。在FISCO BCOS平台中,既可以采用原生Solidity语言开发智能合约,也可以使用预编译合约模式开发合约。Solidity合约性能差、学习成本高;预编译合约,采用预编译引擎,支持并行计算,性能更高,同时支持存储扩容等。 +但由于预编译合约使用存在一定的门槛,基于此,FISCO BCOS平台开发了CRUD合约接口,用户不需要关心底层的实现逻辑,只需要引入Table.sol合约接口文件,通过调用相关接口即可完成合约的开发。 diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/index.md b/3.x/zh_CN/docs/articles/3_features/35_contract/index.md new file mode 100644 index 000000000..d1c9c2bc7 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/index.md @@ -0,0 +1,61 @@ +### 智能合约 + +合约引擎:支持Solidity和预编译合约 + +引擎特点:图灵完备,沙盒运行 + +版本控制:基于CNS支持多版本合约 + +灰度升级:支持多版本合约共存、灰度升级 + +生命周期管理:支持合约和账户的冻结、解冻 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + entry_quick_guide.md + smart_contract_practice.md + 16skills_to_high-level_smart_contracts.md + contract_design_practice_deposit&points_scene.md +``` + +预编译合约 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + pre-compiled_contract_architecture_design.md + pre-compiled_contract_rapid_development.md +``` + +Solidity合约 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + smart_contract_concept_and_evolution.md + smart_contract_write_elegantly.md + solidity_presensation.md + solidity_basic_features.md + solidity_advanced_features.md + solidity_design_patterns.md + solidity_design_programming_strategy.md + solidity_operation_principle.md + smart_contract_test_practice.md + 3516.md + 3517.md +``` + +其他 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + contract_name_service.md + outside_account_generation.md + abi_of_contract.md +``` \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/outside_account_generation.md b/3.x/zh_CN/docs/articles/3_features/35_contract/outside_account_generation.md new file mode 100644 index 000000000..a0481f71b --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/outside_account_generation.md @@ -0,0 +1,125 @@ +# FISCO BCOS的外部账户生成 + +作者:白兴强|FISCO BCOS 核心开发者 + +## 账户是什么 + +FISCO BCOS使用账户来标识和区分每一个独立的用户。在采用公私钥体系的区块链系统里,每一个账户对应着一对公钥和私钥。其中,由公钥经哈希等安全的单向性算法计算后,得到的地址字符串被用作该账户的账户名,即账户地址。而仅有用户知晓的私钥则对应着传统认证模型中的密码。这类有私钥的账户也常被称为外部账户或账户。 + +FISCO BCOS中部署到链上的智能合约在底层存储中也对应一个账户,我们称这类账户为合约账户。与外部账户的区别在于,合约账户的地址是部署时确定,根据部署者的账户地址及其账户中的信息计算得出,并且合约账户没有私钥。 + +本文将主要介绍外部账户的生成,不讨论合约账户相关内容,关于生成的外部账户的使用方式,请参考FISCO BCOS各SDK的说明文档。 + +## 账户的使用场景 + +在FISCO BCOS中,账户有以下使用场景: + +- SDK需要持有外部账户私钥,使用外部账户私钥对交易签名。区块链系统中,每一次对合约写接口的调用都是一笔交易,而每笔交易需要用账户的私钥签名。 +- 权限控制需要外部账户的地址。FISCO BCOS权限控制模型,根据交易发送者的外部账户地址,判断是否有写入数据的权限。 +- 合约账户地址唯一的标识区块链上的合约。每个合约部署后,底层节点会为其生成合约地址,调用合约接口时,需要提供合约地址。 + +## **外部账户的生成** + +出于方便,下文中提及外部账户,均简称为账户。FISCO BCOS提供了get_account.sh脚本和Web3SDK接口用以创建账户,同时,console和Web3SDK也支持加载创建的账户私钥,用于交易签名。用户可将账户私钥,存储为PEM或PKCS12格式的文件。其中,PEM格式使用明文存储私钥,而PKCS12格式使用用户提供的口令加密存储私钥,详情可以[参考这里](https://zh.wikipedia.org/wiki/PKCS_12)。 + +### 使用get_account.sh脚本生成账户(操作) + +- **获取脚本** + +``` +curl -LO https://media.githubusercontent.com/media/FISCO-BCOS/LargeFiles/master/tools/get_account.sh && chmod u+x get_account.sh && bash get_account.sh -h +``` + +执行上面的指令,看到如下输出,则下载到了正确的脚本,否则请重试。 + +``` +Usage: ./get_account.sh + default generate account and store private key in PEM format file + -p generate account and store private key in PKCS12 format file + -k [FILE] calculate address of PEM format [FILE] + -P [FILE] calculate address of PKCS12 format [FILE] + -h Help +``` + +- **生成PEM格式存储的账户私钥** + +``` +bash get_account.sh +``` + +执行上面的命令,可以得到类似下面的输出,包括账户地址和以账户地址为文件名的私钥PEM文件。 + +``` +[INFO] Account Address : 0xee5fffba2da55a763198e361c7dd627795906ead +[INFO] Private Key (pem) : accounts/0xee5fffba2da55a763198e361c7dd627795906ead.pem +``` + +- **生成PKCS12格式存储的账户私钥** + +``` +bash get_account.sh -p +``` + +执行上面的命令,可以得到类似下面的输出,按照提示输入密码,生成对应的p12文件。 + +``` +Enter Export Password: +Verifying - Enter Export Password: +[INFO] Account Address : 0x02f1b23310ac8e28cb6084763d16b25a2cc7f5e1 +[INFO] Private Key (p12) : accounts/0x02f1b23310ac8e28cb6084763d16b25a2cc7f5e1.p12 +``` + +### 使用Java-SDK接口生成账户 + +有时我们需要在代码中生成新的账户,这个时候就需要借助Java-SDK(项目名为web3SDK)提供的接口。 + +如下所示,Java-SDK提供生成账户、计算账户地址和获取公钥等功能,与get_account.sh脚本相比更多了对国密账户生成的支持。 + +``` +import org.fisco.bcos.web3j.crypto.EncryptType +import org.fisco.bcos.web3j.crypto.Credentials +import org.fisco.bcos.web3j.crypto.gm.GenCredential + +//创建普通账户 +EncryptType.encryptType = 0; +//创建国密账户,向国密区块链节点发送交易需要使用国密账户 +// EncryptType.encryptType = 1; +Credentials credentials = GenCredential.create(); +//账户地址 +String address = credentials.getAddress(); +//账户私钥 +String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16); +//账户公钥 +String publicKey = credentials.getEcKeyPair().getPublicKey().toString(16); +``` + +上述接口可以直接在Java业务代码中使用,同时Java-SDK也提供了加载PEM格式或PKCS12格式存储的私钥的功能,详情[请参考这里](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/sdk.html#id5)。 + +## 账户地址计算方法 + +FISCO BCOS的账户地址由ECDSA公钥计算得来,对ECDSA公钥计算keccak-256sum哈希,取计算结果的后20字节的16进制表示作为账户地址,每个字节需要两个16进制数表示,所以账户地址长度为40。FISCO BCOS的账户地址与以太坊兼容。 + +下面简要演示账户地址计算步骤: + +- 使用OpenSSL生成椭圆曲线私钥,椭圆曲线的参数使用secp256k1。执行下面的命令,生成PEM格式的私钥并保存在ecprivkey.pem文件中。 + +``` +openssl ecparam -name secp256k1 -genkey -noout -out ecprivkey.pem +``` + +- 根据私钥计算公钥,然后使用公钥计算对应的账户地址。需要获取keccak-256sum工具,可以从[这里下载](https://github.com/vkobel/ethereum-generate-wallet/tree/master/lib)。 + +``` +openssl ec -in ecprivkey.pem -text -noout 2>/dev/null| sed -n '7,11p' | tr -d ": \n" | awk '{print substr($0,3);}' | ./keccak-256sum -x -l | tr -d ' -' | tail -c 41 +``` + +得到类似下面的输出,就是计算得出ecprivkey.pem对应的账户地址。 + +``` +dcc703c0e500b653ca82273b7bfad8045d85a470 +``` + +## **总结** + +本文简要介绍了FISCO BCOS外部账户的定义、生成以及账户地址的计算方法。未来,我们也会开放更多好用的配套组件,来帮助开发者更方便安全地管理账户。 + diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/pre-compiled_contract_architecture_design.md b/3.x/zh_CN/docs/articles/3_features/35_contract/pre-compiled_contract_architecture_design.md new file mode 100644 index 000000000..277ef5202 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/pre-compiled_contract_architecture_design.md @@ -0,0 +1,99 @@ +# FISCO BCOS 2.0原理解析:预编译合约架构设计 + +作者:白兴强|FISCO BCOS 核心开发者 + +FISCO BCOS 2.0提出了一套预编译合约框架,允许用户使用C++来写智能合约。由于不进入EVM执行,预编译合约可以获得更高的性能,适用于合约逻辑简单但调用频繁,或者合约逻辑固定而计算量大的场景。 + +本文介绍预编译合约的起源和实现,主要包括以下几个方面: + +- Solidity合约的使用及遇到的难题; +- FISCO BCOS 2.0新增预编译合约,其架构设计和执行流程流程; +- 在部分特定场景中,为什么预编译合约比Solidity更优秀; +- 预编译合约在FISCO BCOS 2.0版本中的使用。 + +## Solidity合约的使用与不足 + +在FISCO BCOS平台中使用Solidity合约,一般需经过以下五个步骤。在开发完Solidity合约之后,必须要将编译后的合约部署到底层平台,根据平台返回的地址才能够调用合约的接口。 + +![](../../../../images/articles/pre-compiled_contract_architecture_design/IMG_5426.PNG) + +Solidity合约的优点是完全与以太坊兼容,开发资源丰富且比较通用,但是Solidity合约也存在虚拟机执行性能低、代价高和开发复杂的问题。尤其是对于联盟链治理的场景,一些参数需要链上所有节点保持一致,非常适合使用合约管理,但如果使用Solidity实现,会导部署步骤非!常!复!杂! + +FISCO-BCOS 1.3版本使用Solidity实现了一套系统合约,使用一个代理合约管理其他系统合约。其部署过程如下图所示: + +![](../../../../images/articles/pre-compiled_contract_architecture_design/IMG_5427.PNG) + +部署完系统合约后,需要将系统合约地址配置在代理合约中,然后将代理合约地址配置在节点配置文件并重启,才能调用这一套系统治理的合约,并且之后的节点扩容也需要基于创世节点的配置操作,才能保持一致。 + +## FISCO BCOS 2.0 新增预编译合约 + +FISCO BCOS 2.0受以太坊内置合约启发,实现了一套预编译合约框架。未来,我们还会尝试将现有的典型业务场景抽象,开发成预编译合约模板,作为底层提供的基础能力,帮助用户更快的更方便的在业务中使用FISCO BCOS。 + +### 预编译合约的好处 + +**可访问分布式存储接口**:基于这套框架,用户可以访问本地DB存储状态,实现自己需要的任何逻辑。 + +**更好的性能表现**:由于实现是C++代码,会编译在底层中,不需要进入EVM执行,可以有更好的性能。 + +**无需学习Solidity语言即可上手**:基于FISCO BCOS预编译合约框架,开发者可以使用C++开发自己的预编译合约,快速实现需要的业务逻辑,而不需要学习Solidity语言。 + +**并行模型大幅提升处理能力**:我们在2.0版本中基于预编译合约和DAG实现了合约的并行执行,用户只需要指定接口冲突域,底层会自动根据冲突域构建交易依赖关系图,根据依赖关系尽可能并行执行交易,从而使得交易处理能力大幅提升。 + +### 预编译合约与以太坊内置合约的对比 + +上述说到,FISCO BCOS 预编译合约受以太坊内置合约启发,但实现原理却是大不相同的。 + +以太坊通过内置合约来避免EVM中复杂计算的代价,以太坊当前使用内置合约实现了8个函数(如下表所示)。可以看到,以太坊内置合约占用了0x1-0x8这8个地址,每个内置合约实际上就是一个本地函数的调用,只能用于状态无关的计算使用。 + +![](../../../../images/articles/pre-compiled_contract_architecture_design/IMG_5428.PNG) + +用户在Solidity中使用内置合约,需要借助call这个操作,依次输入下列参数 + +call(gasLimit, to, value, inputOffset, inputSize, outputOffset, outputSize) + +包括内置合约地址、输入参数偏移、输入参数大小、输出参数偏移和输出参数大小,对用户而言,这不是一件简单的事情。 + +而FISCO BCOS的预编译合约框架,支持复杂的参数类型,支持通过AMDB读取和存储数据。每个预编译合约地址固定,合约内可以实现多个接口,所实现接口的调用方式与原生Solidity完全相同。 + +**下图是比较直观的对比**: + +![](../../../../images/articles/pre-compiled_contract_architecture_design/IMG_5429.PNG) + +**注:**√ 代表支持,× 代表不支持 + +## FISCO BCOS预编译合约架构 + +通过这一小节,你可以清楚了解预编译合约模块在FISCO BCOS中的位置,以及预编译合约的执行流程。 + +如下图所示,预编译合约会被区块执行引擎所调用,区块验证器通过区块执行引擎来执行区块,执行引擎执行区块时,会根据被调用合约的地址,来判断使用EVM还是预编译合约引擎。 + +![](../../../../images/articles/pre-compiled_contract_architecture_design/IMG_5430.PNG) + +当被调用的合约地址是EVM合约时,执行引擎会创建并执行EVM来执行交易;当被调用合约地址是已注册的预编译合约地址时,执行引擎通过调用地址对应的预编译合约接口来执行交易。 + +**预编译合约执行流程如下图所示**: + +![](../../../../images/articles/pre-compiled_contract_architecture_design/IMG_5431.PNG) + +执行引擎首先根据预编译合约地址拿到合约对象,然后通过调用合约对象的call接口来获取执行结果。call接口中的操作主要包括: + +1. 根据调用参数解析出被调用的接口 +2. 根据ABI编码解析传入的参数 +3. 执行被调用的合约接口 +4. 将执行结果ABI编码并返回 + +所以,开发者如果要开发预编译合约,只需要实现其预编译合约的call接口和在执行引擎中注册所实现合约的地址即可。 + +## 预编译合约在FISCO BCOS 2.0中的应用 + +### 系统合约 + +FISCO BCOS 2.0 基于预编译合约实现了一套系统合约,使用系统合约来管理需要共识的链配置,包括对群组内节点的加入、删除、节点身份的转换、CNS服务的管理、链权限的管理、CRUD合约的使用等。 + +**FISCO BCOS当前系统合约及地址如下表**: + +![](../../../../images/articles/pre-compiled_contract_architecture_design/IMG_5432.PNG) + +### CRUD合约支持 + +FISCO BCOS 2.0基于预编译合约实现了AMDB存储对应的预编译合约,使得用户能够在Solidity中访问AMDB存储,也就是FISCO BCOS 2.0的CRUD合约写法。通过这种方式,用户可以将合约数据存储在底层的AMDB存储中,使得合约逻辑与数据分离,一方面提高合约处理性能,一方面使得升级合约逻辑更加方便。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/pre-compiled_contract_rapid_development.md b/3.x/zh_CN/docs/articles/3_features/35_contract/pre-compiled_contract_rapid_development.md new file mode 100644 index 000000000..ae4160253 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/pre-compiled_contract_rapid_development.md @@ -0,0 +1,270 @@ +# 预编译合约极速开发指南(附完整步骤+实操模板) + +作者:白兴强|FISCO BCOS 核心开发者 + +上篇文章,我们亮出了[FISCO BCOS预编译合约的架构设计](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485333&idx=1&sn=5561ae72507526380381856c307ffe61&chksm=9f2ef589a8597c9f6ed68bd2eb7f46fb8083f302dfdd47ae5ef75dd9d5f114631d21dfbedc9c&token=422221390&lang=zh_CN#rd),该框架具备地址固定、无需部署、本地执行性能更高等诸多优点。因预编译合约的使用方式与普通Solidity合约使用方式完全相同,该框架能做到在不改变客户端开发者体验的情况下,获得极高的运行速度,这对逻辑相对确定、追求高速度和并发能力的场景来说,可谓是屠龙刀一样的存在。 + +今天,我将以HelloWorld合约为例,为大家介绍如何使用预编译合约版本的HelloWorld。注意,本章内容需要你具备一定的C++开发经验,且详细阅读了[《FISCO BCOS 2.0原理解析:](http://mp.weixin.qq.com/s?__biz=MzU5NTg0MjA4MA==&mid=2247483970&idx=1&sn=eb2049961515acafe8a2d29e8b0e28e9&chksm=fe6a870dc91d0e1b016fe96e97d519ff1e65bd7d79143f94467ff15e0cdf79ccb44293e52a7b&scene=21#wechat_redirect)[ 分布式存储架构设计》](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485336&idx=1&sn=ea3a7119634c1c27daa4ec2b9a9f278b&chksm=9f2ef584a8597c9288f8c5000c7def47c3c5b9dc64f25221985cd9e3743b9364a93933e51833&token=422221390&lang=zh_CN#rd)。下图所示5个步骤是开发预编译合约的必经之路,我将按步骤实现HelloWorld预编译合约,然后分别使用控制台、Solidity合约两种方式来调用HelloWorld预编译合约。 + +![](../../../../images/articles/pre-compiled_contract_rapid_development/IMG_5433.PNG) + + +## HelloWorld预编译合约开发 + + +先来看一下我们想要实现的HelloWorld合约的Solidity版本。Solidity版本的HelloWorld,有一个成员name用于存储数据,两个接口get(),set(string)分别用于读取和设置该成员变量。 + +``` +pragma solidity ^0.4.24; + +contract HelloWorld{ + string name; + constructor() public { + name = "Hello, World!"; + } + function get() public constant returns(string){ + return name; + } + function set(string n) public{ + name = n; + } +} +``` + +### step1 定义HelloWorld接口 + +Solidity的接口调用都会被封装为一笔交易,其中,调用只读接口的交易不会被打包进区块,而写接口交易会被打包进区块中。由于底层需要根据交易数据中的ABI编码来判断调用的接口并解析参数,所以需要先把接口定义出来。预编译合约的ABI接口规则与Solidity完全相同,定义预编译合约接口时,通常需要定义一个有相同接口的Solidity合约,这个合约称为预编译合约的**接口合约**。接口合约在调用预编译合约时需要使用。 + +``` +pragma solidity ^0.4.24; + +contract HelloWorldPrecompiled{ + function get() public constant returns(string); + function set(string n); +} +``` + +### step2 设计存储结构 + +预编译合约涉及存储操作时,需要确定存储的表信息(表名与表结构,存储数据在FISCO BCOS中会统一抽象为表结构)。这在之前的文章[分布式存储架构设计](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485336&idx=1&sn=ea3a7119634c1c27daa4ec2b9a9f278b&chksm=9f2ef584a8597c9288f8c5000c7def47c3c5b9dc64f25221985cd9e3743b9364a93933e51833&token=422221390&lang=zh_CN#rd)有介绍。如果合约中不涉及变量存储,可以忽略该步骤。对于HelloWorld,我们设计如下的表。该表只存储一对键值对,key字段为hello_key,value字段为hello_value 存储对应的字符串值,可以通过set(string)接口修改,通过get()接口获取。 + +![](../../../../images/articles/pre-compiled_contract_rapid_development/IMG_5434.PNG) + + +### step3 实现合约逻辑 + +实现新增合约的调用逻辑,需要新实现一个C++类,该类需要继承Precompiled类, 重载call函数, 在call函数中实现各个接口的调用行为。 + +``` +virtual bytes call(std::shared_ptr _context, + bytesConstRef _param, Address const& _origin) = 0; +``` + +call函数有三个参数,_ context保存交易执行的上下文,_ param是调用合约的参数信息,本次调用对应合约接口以及接口的参数可以从_ param解析获取,_origin是交易发送者,用于权限控制。 接下来,我们在源码**FISCO-BCOS/libprecompiled/extension**目录下实现HelloWorldPrecompiled类,重载call函数,实现get()/set(string)两个接口。 + +##### 接口注册: + +``` +// 定义类中所有的接口 +const char* const HELLO_WORLD_METHOD_GET = "get()"; +const char* const HELLO_WORLD_METHOD_SET = "set(string)"; + +// 在构造函数进行接口注册 +HelloWorldPrecompiled::HelloWorldPrecompiled() +{// name2Selector是基类Precompiled类中成员,保存接口调用的映射关系 + name2Selector[HELLO_WORLD_METHOD_GET] = getFuncSelector(HELLO_WORLD_METHOD_GET); + name2Selector[HELLO_WORLD_METHOD_SET] = getFuncSelector(HELLO_WORLD_METHOD_SET); +} +``` + +##### 创建表: + +``` +// 定义表名 +const std::string HELLO_WORLD_TABLE_NAME = "_ext_hello_world_"; +// 主键字段 +const std::string HELLOWORLD_KEY_FIELD = "key"; +// 其他字段字段,多个字段使用逗号分割,比如 "field0,field1,field2" +const std::string HELLOWORLD_VALUE_FIELD = "value"; +``` + +##### 在call函数中添加打开表的逻辑: + +``` +// call函数中,表存在时打开,否则首先创建表 +Table::Ptr table = openTable(_context, HELLO_WORLD_TABLE_NAME); +if (!table) +{// 表不存在,首先创建 + table = createTable(_context, HELLO_WORLD_TABLE_NAME, HELLOWORLD_KEY_FIELD, + HELLOWORLD_VALUE_FIELD, _origin); + if (!table) + {// 创建表失败,返回错误码 + } +} +``` + +##### 区分调用接口: + +``` + +uint32_t func = getParamFunc(_param); +if (func == name2Selector[HELLO_WORLD_METHOD_GET]) +{// get() 接口调用逻辑 +} +else if (func == name2Selector[HELLO_WORLD_METHOD_SET]) +{// set(string) 接口调用逻辑 +} +else +{// 未知接口,调用错误,返回错误码 +} +``` + +##### 参数解析与返回: + +调用合约时的参数包含在call函数的_param参数中,是按照Solidity ABI格式进行编码,使用dev::eth::ContractABI工具类可以进行参数的解析,同样接口返回时返回值也需要按照该编码格编码。 + +dev::eth::ContractABI类中我们需要使用abiIn/abiOut两个接口,前者用户参数的序列化,后者可以从序列化的数据中解析参数。 + +##### HelloWorldPrecompiled实现: + +考虑手机上的阅读体验,我们分块介绍call接口内部实现并省略部分错误处理逻辑,详细代码实现可以参考FISCO BCOS 2.0文档使用手册->智能合约开发->[预编译合约开发](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html#id2)。 + +``` +bytes HelloWorldPrecompiled::call(dev::blockverifier::ExecutiveContext::Ptr _context, + bytesConstRef _param, Address const& _origin) +{ + // 解析函数接口 + uint32_t func = getParamFunc(_param); + // 解析函数参数 + bytesConstRef data = getParamData(_param); + bytes out; + dev::eth::ContractABI abi; + + // 打开_ext_hello_world_表,省略 +........ +``` + +get()接口实现 + +``` +// 区分调用接口,各个接口的具体调用逻辑 + if (func == name2Selector[HELLO_WORLD_METHOD_GET]) + { // get() 接口调用 + // 默认返回值 + std::string retValue = "Hello World!"; + auto entries = table->select(HELLOWORLD_KEY_FIELD_NAME, table->newCondition()); + if (0u != entries->size()) + { + auto entry = entries->get(0); + retValue = entry->getField(HELLOWORLD_VALUE_FIELD); + } + out = abi.abiIn("", retValue); + } +``` + +set接口实现 + +``` +else if (func == name2Selector[HELLO_WORLD_METHOD_SET]) + { // set(string) 接口调用 略,请参考前文链接 + std::string strValue; + abi.abiOut(data, strValue); + auto entries = table->select(HELLOWORLD_KEY_FIELD_NAME, table->newCondition()); + auto entry = table->newEntry(); + entry->setField(HELLOWORLD_KEY_FIELD, HELLOWORLD_KEY_FIELD_NAME); + entry->setField(HELLOWORLD_VALUE_FIELD, strValue); + + int count = 0; + if (0u != entries->size()) + { // update + count = table->update(HELLOWORLD_KEY_FIELD_NAME, entry, table->newCondition(), + std::make_shared(_origin)); + } + else + { // insert + count = table->insert(HELLOWORLD_KEY_FIELD_NAME, entry, + std::make_shared(_origin)); + } + if (count == storage::CODE_NO_AUTHORIZED) + { // 没有表操作权限 + } + // 返回错误码 + out = abi.abiIn("", u256(count)); + } + else + { // 参数错误,未知的接口调用 + out = abi.abiIn("", u256(CODE_UNKNOW_FUNCTION_CALL)); + } + return out; +} +``` + +### step4 分配并注册合约地址 + +FSICO BCOS 2.0执行交易时,根据合约地址区分是不是预编译合约,所以开发完预编译合约后,需要在底层注册为预编译合约注册地址。2.0版本地址空间划分如下: + +![](../../../../images/articles/pre-compiled_contract_rapid_development/IMG_5435.PNG) + +用户分配地址空间为0x5001-0xffff,用户需要为新添加的预编译合约分配一个未使用的地址,**预编译合约地址必须唯一, 不可冲突**。 + +开发者需要修改FISCO-BCOS/cmake/templates/UserPrecompiled.h.in文件,在registerUserPrecompiled函数中注册HelloWorldPrecompiled合约的地址(**要求v2.0.0-rc2以上版本**),如下注册HelloWorldPrecompiled合约: + +``` +void ExecutiveContextFactory::registerUserPrecompiled(ExecutiveContext::Ptr context) +{ + // 用户预编译合约地址范围 [0x5001,0xffff] + context->setAddress2Precompiled(Address(0x5001), std::make_shared()); +} +``` + +### step5 编译源码 + +参考FISCO BCOS 2.0使用手册->获取可执行程序->[源码编译](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/get_executable.html)。需要注意的是,实现的HelloWorldPrecompiled.cpp和HelloWorldPrecompiled.h需要放置于FISCO-BCOS/libprecompiled/extension目录下。 + +## HelloWorld预编译合约调用 + +### 使用控制台调用HelloWorld预编译合约 + +在控制台solidity/contracts创建HelloWorldPrecompiled.sol文件,文件内容是HelloWorld预编译合约的接口声明,如下 + +``` +pragma solidity ^0.4.24; +contract HelloWorldPrecompiled{ + function get() public constant returns(string); + function set(string n); +} +``` + +使用编译出的二进制搭建节点后,部署控制台v1.0.2以上版本,然后执行下面语句即可调用 + +![](../../../../images/articles/pre-compiled_contract_rapid_development/IMG_5436.JPG) + +### 在Solidity中调用HelloWorld预编译合约 + +我们尝试在Solidity合约中创建预编译合约对象并调用其接口。在控制台solidity/contracts创建HelloWorldHelper.sol文件,文件内容如下 + +``` +pragma solidity ^0.4.24; +import "./HelloWorldPrecompiled.sol"; + +contract HelloWorldHelper { + HelloWorldPrecompiled hello; + function HelloWorldHelper() { + // 调用HelloWorld预编译合约 + hello = HelloWorldPrecompiled(0x5001); + } + function get() public constant returns(string) { + return hello.get(); + } + function set(string m) { + hello.set(m); + } +} +``` + +部署HelloWorldHelper合约,然后调用HelloWorldHelper合约的接口,结果如下 + +![](../../../../images/articles/pre-compiled_contract_rapid_development/IMG_5437.JPG) + +到这里,就可以恭喜你顺滑地完成了HelloWorld预编译合约的开发,其他预编译合约的开发流程道理相通。 + diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/smart_contract_concept_and_evolution.md b/3.x/zh_CN/docs/articles/3_features/35_contract/smart_contract_concept_and_evolution.md new file mode 100644 index 000000000..128d9b0f6 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/smart_contract_concept_and_evolution.md @@ -0,0 +1,117 @@ +# 智能合约初探:概念与演变 + +作者:储雨知|FISCO BCOS 核心开发者 + +## 前言 + +自2009年比特币开启区块链时代以来,近10年里,随着技术与生态的发展,基于区块链的分布式应用(dapp)呈现出井喷的趋势,而支撑着dapp的底层技术就是“区块链+智能合约”。 +智能合约与区块链的结合,普遍被认为是区块链世界中一次里程碑式的升级。第一个结合了区块链与智能合约技术的平台--以太坊的诞生,被认为是开启了"区块链2.0"时代。 + +## 什么是智能合约 + +1996年,Nick Szabo在文章《Smart Contracts: Building Blocks For Digital Markets》中提出了智能合约的概念。 +所谓“合约”,就是条文、合同一类的东西,里面记录了发生的条件与对应执行的条款,以支持确权等操作;所谓"智能",就意味着自动化、可编程。 + +所以,智能合约就是可编程的合同,也可以理解为一段自动执行的条文合同,在计算机中,就是一段自动执行的程序片段。它更易于合约保存,并且由确定的算法运行,给定输入,就得到对应的输出,极大保障了合约的执行力。 +以自动售货机做类比,可以帮助我们更好地理解智能合约的核心特征。 +当使用者选择好要购买的货物并完成支付,出货逻辑就会被触发,用户就能得到想要的货物,而这个过程不需要人工介入,节省了售卖货物的人力成本。如果要破坏这个合约,就得物理破坏售卖机。像POS刷卡机、EDI(电子数据交换)等,也可作此种类比。 + +## 智能合约与区块链 + +智能合约在上世纪被提出,而区块链2009年才诞生,就定义而言,智能合约与区块链关系不大。 +那为什么在这10年中,智能合约与区块链却产生了如此紧密的关联?因为区块链可以保证智能合约的不可篡改,不仅合约内容不可篡改,每次调用记录亦不可篡改。 +智能合约产生价值的最基本前提是有一个强有力的底层介质用于储存,让其不可被物理破坏。 + +然而,智能合约的本体是一份代码,非常容易被篡改,如何为其提供强力的存储介质就成了问题。这正好是区块链擅长解决的——通过比特币的实践,证明了区块链可以在分布式环境下让电子记录不可被篡改。 +与此同时,智能合约也在反哺着区块链,它极大地扩展了区块链的业务场景。 + +与智能合约结合后,区块链不再服务于单一的货币支付,可以延申到生活中的方方面面。丰富的应用场景也对区块链的能力产生了新的挑战。 + +## 区块链2.0:以太坊的诞生 + +2009年诞生的比特币,运用区块链等技术来保证生态,开创了区块链1.0时代。 +用户可以通过脚本代码来定制一些内容,例如如何解锁一笔资金。这些脚本代码会随着交易一起保存,从而享有不可篡改的特质,并且是确定性的。所以从某种角度来说,这些脚本也可看作智能合约。可是它们并不好用。 +首先,这些脚本代码不是图灵完备的,这限制了实现的功能;其次,开发门槛较高,编写复杂逻辑的体验会很差,好比用JVM字节码来写程序。 + +2013年,一个青年V神提出了以太坊,其核心是通过世界状态对区块链数据进行更新和验证。以太坊与比特币最大的不同在于可通过智能合约执行复杂的逻辑操作。 +在以太坊上,智能合约的语言是Solidity,它是图灵完备且较为上层的语言,极大地扩展了智能合约的能力范畴,降低了智能合约编写难度。 +正因为此,以太坊的诞生,也标志着区块链2.0时代开启。随后,智能合约技术逐步渗透了溯源、存证、供应链等多个业务场景。 + +## 智能合约的现状与前景 + +从编程角度而言,智能合约就是一段代码。相比常规代码,智能合约具有许多差别与限制,例如: + +- 单线程执行 +- 代码执行会消耗资源,不能超出资源限制 +- 目前难以获取链外数据,例如取得天气信息、比赛结果等 +- 其他限制,如TPS + +这些特点使得目前智能合约生态以链上资源的治理为核心。就像以太坊上各式各样的ERC标准与治理方案;EOS上有各种资源模型,比如CPU、RAM、兼经济模型、Rex、Bancor协议等。 +显然,就目前的生态而言,智能合约对现实世界的影响力有限。 +但事物总是在发展的。目前,已有许多致力于突破这些限制的研究,典型的有Oracle(谕言机,但常被称为预言机),它允许智能合约和链外进行交互,这样就能大大提高智能合约的使用场景,彷佛一台电脑通上了网;再比如那些突破链自身性能瓶颈的尝试,例如支付通道、跨链、plasma、rollup,它们都从不同角度打破安全与性能的枷锁。 +毋庸置疑,智能合约将扮演着越来越重要的角色,将来随着以太坊2.0的落地,也许会开启新一个区块链时代。 + +## 智能合约技术 + +以太坊采用了Solidity作为智能合约语言,Solidity 是一门为实现智能合约而创建的高级编程语言,能在允许以太坊程序的节点上运行。该语言吸收了C++、JavaScript的一些特性,例如它是静态类型语言,支持继承、库等。 +除了Solidity,每个平台的智能合约技术也有所不同,接下来将从公有链、联盟链作为切入,介绍其他平台所采用的技术。 + +### 公有链 + +首先,不妨先认识三大公链的智能合约技术。 + +![](../../../../images/articles/smart_contract_concept_and_evolution/IMG_5438.PNG) + +### 联盟链 + +除了公链,联盟链也是重要的区块链类型。比之公链,联盟链共识的复杂度被大大缩减,因此具有更高的执行效率。 +联盟链受企业级机构青睐,一般而言,相关机构之间会形成联盟,通过联盟链来共享数据。联盟链可覆盖供应链金融、司法存证、溯源等多种场景,未来还会与IOT、AI等技术结合。 +在当今联盟链生态中,除去采用chaincode的Fabric,大部分平台都采用Solidity作为智能合约语言,FISCO BCOS即是如此。 + +时下,Solidity可谓占据了智能合约的C位,掌握Solidity是学习智能合约和区块链的重要一环。后面系列也将对如何用Solidity编写、运行以及测试智能合约作深入介绍解析,敬请关注。 +除了Solidity,WebAssembly、Libra的Move等一些智能合约语言也在发展中,可以保持关注。 + +## 智能合约运行分析 + +下面将分享一个基础的智能合约:HelloWorld。 + +``` +pragma solidity 0.4.22; + +contract HelloWorld{ + + uint private _num; + function store(uint256 num) public { + _num = num; + } + + function get() public view returns (uint256){ + return _num; + } +} +``` + +这段Solidity代码的功能是存取_num字段。该字段被称为“状态变量”,会由区块链持久存储。 +用户可以将这段代码部署在以太坊或类似的区块链上,部署成功就意味着该智能合约不可再被修改,只要底层区块链不被销毁,这段合约就一直存在。任何人都可通过“合约地址”来调用该合约接口,每次调用信息都会被记录在链上。 +在讲解这段代码如何运行之前,我们先回顾下传统java程序的运行方式。 + +首先,用户编译完java代码后,会以字节码的形式保存在磁盘上;然后用户会调用程序,这由JVM来托管执行;程序执行期间可能会通过日志来记录调用参数,也可能会和磁盘进行IO。 +Solidity的执行与此类似。不同的是介质由硬盘换成了区块链,由单机变为分布式。 +代码部署后,以字节码的形式存储在每一个节点上。当用户要求调用某个函数时,调用请求将会被囊括在交易中,并被打包到某个区块上,一旦全网对该区块形成共识,就意味着调用是合法的。 +接下来,EVM会来调用字节码,它负责存取底层的状态变量,好比传统编程的IO。 + +![](../../../../images/articles/smart_contract_concept_and_evolution/IMG_5439.PNG) + +光从代码来看,合约开发似乎不过如此,单个合约只需要围绕着字段进行操作,对于很多简单业务而言,不过是CRUD而已。 +但其复杂性也恰恰在于此,合约在区块链环境上执行,是不可修改的。 +所以如果出现了bug,就必须部署新的合约,这对于合约的可维护性提出了挑战。并且,一旦业务复杂起来,容易出现安全漏洞,导致链上资产损失。同时,还要考虑完成代码编写、逻辑执行、数据存储的成本问题。 +综上所述,写合约不难,但写好合约,却需要一定功底。 + +## 结语 + +本文介绍了智能合约的概念与历史演变。 +智能合约是上世纪提出的技术,在区块链浪潮下焕发出了新的生机。反之,智能合约广泛的应用场景,又极大的促进了区块链发展。 + +学习智能合约,推荐选择Solidity语言,因为其具备一些传统语言的特征,同时,执行环境完全基于区块链,实际业务开发的体验与以往的编程体验会有所差别。 +读者可以尝试基于FISCO BCOS快速搭建区块链环境,部署一个最简单的合约,熟悉部署、调用方式,再进一步走入Solidity的世界。 + diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/smart_contract_test_practice.md b/3.x/zh_CN/docs/articles/3_features/35_contract/smart_contract_test_practice.md new file mode 100644 index 000000000..35b67462b --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/smart_contract_test_practice.md @@ -0,0 +1,468 @@ +# 智能合约测试的技巧与实践 + +作者:毛嘉宇|FISCO BCOS 核心开发者 + +## 前言 + +区块链的发展伴随着信息安全的话题。在Solidity不长的发展历程中,发生过不止一次骇人听闻、影响深远的安全攻击事件,给一些机构和组织造成不可挽回的损失。『祸乱生于疏忽,测试先于交付』,如果这些缺陷和漏洞在测试环节被发现,就能有效避免损失。测试是智能合约开发与交付过程中至关重要的一环。其能有效检验实际结果是否符合设计预期,有助识别错误、查缺补漏。同时,高质量、可复用的测试,还有助于提升整体开发效率。前文介绍了Solidity的前世今生、语法特性、设计模式、编程攻略和底层原理。作为系列终篇,本文将重点介绍和分享Solidity的测试场景、方法和实践。 + +## 前置准备 + +进入测试前,需要完成以下步骤:链的搭建、控制台安装、智能合约开发、智能合约编译与部署、利用Java等SDK开发一个应用。 + +详细准备工作可参考《[FISCO BCOS零基础入门,五步轻松构建应用](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485305&idx=1&sn=5a8dc012880aac6f5cd3dacd7db9f1d9&chksm=9f2ef565a8597c73b87fd248c41d1a5b9b0e6a6c6c527baf873498e351e3cb532b77eda9377a&scene=21#wechat_redirect)》和FISCO BCOS官方文档,此处不再赘述。[FISCO BCOS官方文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html)地址。 + +![](../../../../images/articles/smart_contract_test_practice/IMG_5483.PNG) + +## 测试环境 + +FISCO BCOS提供控制台、WeBASE-Front和SDK代码测试,这三种环境适用于不同测试场景: + +- 控制台:提供命令行交互界面,通过在控制台创建合约和输入调用、查询指令,来进行简单调试。适用于非常简单的合约。 +- WeBASE-Front:提供可视化交互界面以及简易的IDE环境。适用于业务逻辑并不复杂的合约,更推荐开发人员进行一些调试。 +- SDK:例如集成Java sdk,创建一个Java项目,并编写应用和测试代码。适用于对智能合约质量要求较高、要求测试案例可复用、业务逻辑复杂或要求持续集成的场景。 + +### 控制台测试 + +FISCO BCOS 2.0及以上版本提供了方便易用的命令行终端、『开箱即用』的区块链利器,详情可参考《[FISCO BCOS 控制台详解,飞一般的区块链体验](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485275&idx=1&sn=95e1cb1a961041d5800b76b4a407d24e&chksm=9f2ef547a8597c51a8940548dd1e30f22eb883dd1864371e832bc50188c153989050244f31e5&scene=21#wechat_redirect)》。接下来将通过一个合约示例来讲解如何运用控制台进行测试。首先,我们写一个HelloWorld合约: + +``` +pragma solidity ^0.4.25; + +contract HelloWorld{ + string public name; + constructor() public{ + name = "Hello, World!"; + } + + function set(string n) public{ + name = n; + } +} +``` + +然后,将这个合约命名为HelloWorld.sol,并保存到控制台所在的contracts/solidity/路径下。随后,执行./start.sh 启动控制台并部署合约: + +``` +============================================================================================= +Welcome to FISCO BCOS console(1.0.8)! +Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console. + ________ ______ ______ ______ ______ _______ ______ ______ ______ +| | \/ \ / \ / \ | \ / \ / \ / \ +| $$$$$$$$\$$$$$| $$$$$$| $$$$$$| $$$$$$\ | $$$$$$$| $$$$$$| $$$$$$| $$$$$$\ +| $$__ | $$ | $$___\$| $$ \$| $$ | $$ | $$__/ $| $$ \$| $$ | $| $$___\$$ +| $$ \ | $$ \$$ \| $$ | $$ | $$ | $$ $| $$ | $$ | $$\$$ \ +| $$$$$ | $$ _\$$$$$$| $$ __| $$ | $$ | $$$$$$$| $$ __| $$ | $$_\$$$$$$\ +| $$ _| $$_| \__| $| $$__/ | $$__/ $$ | $$__/ $| $$__/ | $$__/ $| \__| $$ +| $$ | $$ \\$$ $$\$$ $$\$$ $$ | $$ $$\$$ $$\$$ $$\$$ $$ + \$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ + +============================================================================================= +[group:1]> deploy HelloWorld +contract address: 0x34e95689e05255d160fb96437a11ba97bb31809f + +[group:1]> +``` + +合约被成功部署后就可以开始测试了。我们先打印这个合约中name的值,然后修改为新的值,最后重新查询name中的值。 + +``` +[group:1]> call HelloWorld 0x34e95689e05255d160fb96437a11ba97bb31809f name +Hello, World! + +[group:1]> call HelloWorld 0x34e95689e05255d160fb96437a11ba97bb31809f set "Hello, test!" +transaction hash: 0x72c8a95b651fb5d12c44b69624d5213d58af1509f00920757fce94d019b5eae8 + +[group:1]> call HelloWorld 0x34e95689e05255d160fb96437a11ba97bb31809f name +Hello, test! + +[group:1]> +``` + +上述例子演示了如何使用控制台部署与调试合约。控制台设计简洁优雅,使用体验如丝般顺滑。不过,在处理一些复杂场景,例如需要切换外部账户,或通过可视化界面进行操作时,WeBASE-Front当仁不让地扛起大旗。 + +### WeBASE-Front测试 + +WeBASE-Front为开发者提供了运行核心信息的可视化操作、Solidity开发的IDE环境以及私钥管理功能,让大家更便捷地开启区块链之旅。关于WeBASE-Front的介绍可参考《[WeBASE节点前置组件功能解析](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485288&idx=1&sn=d4a69c02496591e9bbf3fa4de150aa5b&chksm=9f2ef574a8597c6210f742514a71537e49bd8f56017d53b48b441ac7c40f65bb7b66b6049aeb&scene=21#wechat_redirect)》与《[安装部署说明](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Install/developer.html#)》。 + +接下来,我们演示一个需要切换外部账户的测试案例,以下是合约代码: + +``` + +pragma solidity ^0.4.25; + +contract BasicAuth { + address public _owner; + + constructor() public { + _owner = msg.sender; + } + + function setOwner(address owner) + public + onlyOwner +{ + _owner = owner; + } + + modifier onlyOwner() { + require(msg.sender == _owner, "BasicAuth: only owner is authorized."); + _; + } +} +``` + +在这个示例中,合约owner被自动赋值为合约部署者。修饰器onlyOwner决定了setOwner函数只能由_owner用户来发起。在合约管理-合约IDE中,创建test文件夹,并复制合约代码: + +![](../../../../images/articles/smart_contract_test_practice/IMG_5484.PNG) + +然后,点击私钥管理-新增用户,创建user1和user2两个用户。 + +![](../../../../images/articles/smart_contract_test_practice/IMG_5485.PNG) + +这时,选择部署合约,会弹出用户地址窗口选项,选择user1。 + +![](../../../../images/articles/smart_contract_test_practice/IMG_5486.PNG) + +合约部署成功后,会展示合约地址、合约名、abi、合约binary等系列信息: + +![](../../../../images/articles/smart_contract_test_practice/IMG_5487.PNG) + +点击合约调用,弹出调用窗口,『方法』下拉框里包含了所有可调用的函数列表,选择_owner函数,点击确认,就可返回该合约的_owner变量值。 + +![](../../../../images/articles/smart_contract_test_practice/IMG_5488.PNG) + +现在,我们来测试setOwner()函数。如上所述,本合约的_owner是user1,通过切换用户user2来调用这个函数,预期结果是调用失败。我们选择setOwner方法,选择私钥地址为user2: + +![](../../../../images/articles/smart_contract_test_practice/IMG_5489.PNG) + +正如预期,这个函数的调用失败了: + +![](../../../../images/articles/smart_contract_test_practice/IMG_5490.PNG) + +以上执行结果打印出了整个交易的TransactionReceipt,点击还原可转换为原始output值。『所见即所得』,WeBASE-Front让区块链变得更简单易用。使用WeBASE-Front测试最大短板在于测试案例无法复用。倘若合约非常复杂,那所有测试案例都得靠人工一遍遍输入,操作原始低效。 + +### SDK测试 + +在系统测试中,需要遵循经典的AIR实践原则: + +- Automatic:测试应该被全自动执行,这也是实现持续集成的前提。 +- Independent:测试案例彼此保持独立,不存在相互依赖和调用。 +- Repeatable:测试案例必须可被复用。可以跨越软硬件环境,被重复执行。 + +要满足以上甚至更多测试实践原则,使用控制台或WeBASE-Front的方式就显得有些力不从心,而集成SDK并编写测试代码的方式更值得推荐。这种方式虽然前期花费时间较长、成本较高;但测试后期能大大降低重复的工作量,显著提升整体测试效率。这也符合IT公司现行的软件测试实践规范。一般这部分代码由公司开发测试人员或质量保证(QA)工程师编写。但在很多公司中,这部分代码由开发人员编写。良好的测试代码,能提升代码质量,降低代码重构难度,提高开发效率。 + +FISCO BCOS提供了多语言SDK,如Java、Python、Node.js等,其中最为成熟与常用的是Java SDK。《[在IDE中使用JavaSDK](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk/quick_start.html)》详细介绍了在IDE中创建新工程以及将已经提供的示例项目导入IDE。在Java开发实践中,Springboot使用更为深入人心,FISCO BCOS也提供了相应使用案例,相关配置文档可以参考:《Spring Boot项目配置》,通过spring-boot-starter开发者可快速下载示例工程,并导入偏好的IDE中。 + +配置工程链基本环境后,下面将以上述spring-boot-starter工程为例,介绍具体测试步骤和要点。 + +1. 编写合约:HelloWorld合约。 +2. 编译智能合约,将其转为Java文件,从上述WeBASE-Front中,也能编译并导出Java文件。 +3. 将编译生成的Java文件导入工程中,如HelloWorld.java。 +4. 基于上述文件,调用合约功能和接口,编写相关测试案例,例如:ContractTest。 +5. 基于Spring提供的gradle插件,我们可以通过"./gradlew test"命令来运行所有测试案例。 +6. 如果需要持续集成,可以在配置和初始化FISCO BCOS后,将步骤5命令加入自动化脚本中。 + +接下来,我们将具体分析核心测试代码ContractTest: + +``` +@Test +public void deployAndCallHelloWorld() throws Exception { + // deploy contract + HelloWorld helloWorld = HelloWorld.deploy(client, credential); + Assert.assertNotNull(helloWorld); + // call set function + helloWorld.set("Hello, World!"); + // call get function + String result = helloWorld.get(); + Assert.assertTrue("Hello, World!".equals(result)); + } +``` + +- 第4行中,HelloWorld合约被部署。为符合独立性原则,建议在每个测试案例中部署独立的合约,以避免测试案例执行顺序对正常测试造成干扰。需要模拟合约依赖性的情况除外。 +- 第9行和第11行,分别调用了set和get。为符合可重复性原则,该测试案例必须设计成幂等,即在任意的软硬件环境下,测试案例预期结果都是一致的。 +- 第7行和第12行,使用了Junit框架提供的断言方法,用来判断智能合约执行结果是否符合预期。 + +值得一提的是,在Java SDK中,任意交易上链后,会获得一个回执TransactionReceipt对象,该对象中包含了返回状态和错误信息(如果交易成功,则message为null),可通过这个状态判断交易是否正常,例如: + +``` +TransactionReceipt tr = helloWorld.set("Hello, World!"); +Assert.assertEquals(tr.getMessage(), "0x0", tr.getStatus()); +``` + +以上基于Springboot提供的测试特性,实现了合约测试,如果需要了解更多细节,请[参考Spring的相关文档](https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/reference/html/spring-boot-features.html#boot-features-testing)。 + +## 测试类型 + +如传统软件,智能合约的测试同样可分为功能测试、非功能测试、安全性测试和回归测试,下面将对这些测试作逐一介绍。 + +### 功能测试 + +功能测试包括但不限于单元测试、集成测试、冒烟测试、用户验收测试。除用户验收测试外,其他测试都可通过开发或测试人员编写代码实现。智能合约测试重要目的之一是检测合约代码正确性,在预定输入值前提下,检查输出值是否符合预期。 + +上文我们介绍了控制台、WeBASE-Front和SDK三种测试环境。在一些逻辑复杂的智能合约中,测试难点之一在于构造测试案例。在这种场景下,使用智能合约可以更好地模拟和构造测试数据,直接使用Solidity编写智能合约更为原生、友好。 + +最后,测试并不游离于智能合约开发之外,而是其中重要的一环,测试也需遵循依赖关系原则,即开发者在进行开发时需要考虑智能合约的『可测试性』。例如,假设测试代码完全使用SDK编写,那智能合约的修改就可能导致测试代码需要做出对应变更,这会对测试效果造成影响,提升测试成本。基于软件设计『不可依赖多变部分』的原则,可测试性同样不能依赖于多变部分。 + +为了解决上述问题,我们在智能合约层引入测试代码。这些代码仅被设计为测试组件,不会发布到线上环境,以此将测试案例改动影响解耦并封装到智能合约层。测试合约作为独立组件,支持开发和测试环节。 + +测试组件中首先可以抽象和定义一些测试的工具合约,例如: + +``` +pragma solidity 0.4.25; + +library LibAssert { + event LogTest(bool indexed result, string message); + + function equal(uint8 a, uint8 b, string message) internal returns (bool result) { + result = (a == b); + log(result, message); + } + + function notEqual(uint8 a, uint8 b, string message) internal returns (bool result) { + result = (a != b); + log(result, message); + } + + function log(bool result, string message) internal { + if(result) + emit LogTest(true, ""); + else + emit LogTest(false, message); + } +} +``` + +这是一个最简单的测试合约库,提供了equal和notEqual的方法来判断uint8变量,开发者可基于此工具扩展自己的测试工具合约。 + +其次,依托于工具合约,我们可以编写独立的测试合约案例。 + +下面将以上述Uint8MathTest为例,演示如何使用此工具合约,首先,我们定义一个TestDemo合约: + +``` +pragma solidity ^0.4.25; +import "./Uint8MathTest.sol"; +import "./LibAssert.sol"; +contract TestDemo { + using LibAssert for uint8; + function testAdd() external returns (bool result) { + uint8 a = 1; + uint8 b = 1; + Uint8MathTest math = new Uint8MathTest(); + uint8 c = math.add(a,b); + uint8 expectedValue = 2; + result = expectedValue.equal(c, "Not equal"); + } +} +``` + +然后,在控制台中运行这个测试案例: + +``` +[group:1]> deploy TestDemo +contract address: 0xd931b41c70d2ff7b54eb9b2453072f9b1a4dc05c + +[group:1]> call TestDemo 0xd931b41c70d2ff7b54eb9b2453072f9b1a4dc05c testAdd +transaction hash: 0xe569e5d8eae1b949a0ffe27a60f0b4c8bd839f108648f9b18879833c11e94ee4 +--------------------------------------------------------------------------------------------- +Output +function: testAdd() +return type: (bool) +return value: (true) +--------------------------------------------------------------------------------------------- +Event logs +--------------------------------------------------------------------------------------------- +``` + +除了依赖自定义的智能合约测试代码,也可以用智能合约本身来编写测试案例。在SDK层,我们只需实现TestDemo中的测试函数代码。即使未来测试逻辑改动,也无需改动SDK代码,从而保证了测试代码的健壮性。合约测试代码组件需贯彻智能合约在整体设计中所遵循的设计原则。 + +### 非功能测试 + +非功能测试主要包括性能测试、容量测试、可用性测试等。由于智能合约运行于FISCO BCOS的底层节点,容量测试和可用性测试更多与底层节点相关,因此,对用户而言,非功能测试的重点就在性能测试上。 + +虽然,我们可以使用系列通用性能测试工具对智能合约进行测试,但是,实际压测过程中会存在一些痛点,例如: + +- 针对具体合约场景测试,存在大量且重复的测试代码,费时费力; +- 性能指标缺乏统一度量,无法横向对比; +- 展示结果不够直观。 + +为了解决以上痛点,FISCO BCOS适配了区块链测试专业工具Caliper,让用户可以优雅地进行性能测试。更多细节和内容请参考:《[性能测试工具Caliper在FISCO BCOS平台中的实践](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485260&idx=1&sn=118e20d331f2dc51e033e12402868cc5&scene=21#wechat_redirect)》。 + +### 安全性测试 + +智能合约上线前需要进行严格的安全性测试。安全性测试的方式包括:公开智能合约并发布悬赏、聘请专门的智能合约安全机构对合约进行检测和评估、使用智能合约专用的工具进行审计等。大家可以视自身合约的重要性及逻辑复杂程度选择对应的安全性测试级别。对于个人开发者或非重大业务的智能合约,选择免费的智能合约工具检测即可。下面以VS Code为例,演示如何使用智能合约安全插件对合约进行安全性检测。打开VS Code,在其插件库中搜索Beosin-VaaS: ETH,选择安装。随后,打开智能合约文件,右键选择Beosin-VaaS:ETH选项,在弹出的窗口中选择当前合约代码版本。安装完成后,会自动弹出如下界面: + +![](../../../../images/articles/smart_contract_test_practice/IMG_5491.PNG) + +点击start即可对所选合约进行安全检测。以下是对HelloWorld合约的检测结果: + +``` +start compile! +compile over! +start deploy! +deploy over! +start execute function name: set(string) +execute function name : set(string) end! +No problem was found in the contract +---end--- +``` + +当我们对Uint8MathTest合约进行检测时,会发现报错: + +``` +####### Compile Problem ####### +file: /Users/maojiayu/Downloads/Uint8MathTest.sol +title: Compile Problem +description: Function state mutability can be restricted to pure +code: function add(uint8 a, uint8 b) public returns (uint8 c) { +warningType: Info +line: 5 +``` + +通过报错信息,我们可以发现该函数既没读取也没使用区块链上的状态,符合pure修饰符的使用条件,建议使用『pure』关键字来修饰。安全性测试是合约测试过程中不可或缺的一环,需高度重视。在严格的工程实践中,合约上生产前必须由相关的测试负责人出具安全性检测报告。此外,开发人员可以收集和总结Solidity安全编程规则和漏洞风险提示,并动态更新维护。在交付测试前,开发人员可组织代码审查和走查,依据总结,集中、逐项进行风险排查。安全性测试是检测和评价智能合约是否安全的必备环节,但不能将合约安全性完全寄望于测试。更重要的是,在设计、开发和测试的各个阶段,都需要用户时刻保持安全意识,建立和培养安全编码习惯。合约发布上线后,也不能放松警惕,时刻关注业界最新的安全警告,并定期、动态对所有代码进行检测和扫描。 + +### 回归测试 + +回归测试通常包括执行持续集成的自动化测试案例以及合约上线前的人工测试。上述SDK以及智能合约测试案例可有效覆盖测试案例所执行的路径和范围。自动化的回归测试有助于快速检测并发现问题,节省大量重复人力,保证合约经历系列修改和测试后,不偏离主干功能。同样,开发者可使用Jenkins、Travis等工具进行构建和测试。除了执行个别自动化测试无法执行的案例外,人工测试更多地是确认之前修改的代码是否符合预期,智能合约的运行是否符合当初设计。此外,在合约最终发布前,人工测试还起到审核检查作用,故而一定要认真对待。 + +## 测试要点 + +无论何种类型的系统测试,均需特别注意以下测试要点。 + +- 注意边界值的测试,例如数字溢出、特殊取值、循环边界值等。 +- 注意检查智能合约的实现是否符合预期,其运行逻辑和流程是否与设计一致。 +- 除了正常流程外,还需要模拟和测试在各种异常环境,甚至是极端环境下,智能合约运作是否正常,能否达到预期的处理结果。 +- 围绕智能合约不变的业务逻辑,忽略变化值,进行对应测试。 + +### 边界值 + +边界值测试是一种常见的软件测试方法。据统计,绝大多数的bug发生在输入或输出范围的边界上,而非其内部。我们来演示一个典型的数值溢出测试案例。如下简单的合约,实现了两个uint8数值加法,并返回了结果: + +``` +pragma solidity 0.4.25; + +contract Uint8MathTest { + function add(uint8 a, uint8 b) public returns (uint8 c) { + c = a + b; + } +} +``` + +这时,我们需要设计一个边界值的测试案例。已知uint8的取值范围在[0,28)即[0,256)之间,以此设计一个溢出的测试案例:(a=255, b=1),测试结果如下: + +``` +[group:1]> deploy Uint8MathTest +contract address: 0xd8a765995c58eb8da103bdcc2c033c0acb81e373 + +[group:1]> call Uint8MathTest 0xd8a765995c58eb8da103bdcc2c033c0acb81e373 add 255 1 +transaction hash: 0x0583185839bc52870ac57cdfd00c0c18840c2674d718b4cc3cb7bc1ef4c173e0 +--------------------------------------------------------------------------------------------- +Output +function: add(uint8,uint8) +return type: (uint8) +return value: (0) +--------------------------------------------------------------------------------------------- +``` + +可以看到最后结果变为0,而不是预期的256,显然,这是因为结果发生了溢出。当然,在使用边界值测试方法取值时,并非只取有效边界值,还应包含无效边界值。边界值测试可帮助查出更多错误和缺陷。 + +### 是否符合预期 + +在建筑公司交付房屋后,开发商会依据设计标准检验房屋建造是否合格。同样,除了检查合约执行结果是否正确外,在测试中还需检查合约交互、操作、数据流向、性能表现等各方面实现是否符合设计。举个例子,在金融业场景中,我们会使用Solidity开发具体链上业务逻辑。其中,不可避免与金额打交道,就需要测试对应资产规模是否符合设计标准。 + +在需求和设计阶段,我们会预估运行在链上的资产规模并作设计要求,例如要求某个供应链金融区块链业务系统能在千亿资产规模下正常运行。假设在智能合约中,定义金额的字段是uint32,可以计算其最大能表示的值为232即不到43亿。虽然在智能合约发布上线后大多数时间内,该问题不会造成任何影响;但是,一旦业务快速增长,当资产规模超过43亿后,就会出现严重故障。这类问题非常隐蔽,因此,需要更加全面、仔细的测试来提早发现和定位。 + +### 异常流程 + +在实际业务场景中,即便经过系列测试保证智能合约运行符合绝大多数场景需求,也可能因为疏忽或遗漏,导致在特定异常流程下,出现问题,在智能合约发布后造成了重大影响。故而,开发者需要特别重视在测试范围和内容中对异常流程的搜寻和覆盖,尽可能测试覆盖到所有的异常流程。 + +### 变与不变 + +使用Solidity测试与其他语言的显著不同还在于合约中的很多交易和值无法复现。正如『人的一生无法两次踏入同一条河流』,随着私钥、证书、环境等改变,其交易Hash值、区块Hash、合约地址等也会随之不同,这也给测试带来一些客观困难。另一方面,Solidity对于一致性有着严苛要求,例如对EVM执行指令语义的一致性、对外部随机变量的『排斥』等。掌握合约测试的关键在于抓住其中不变的方面。 + +## 测试技巧 + +作为区块链上专用编程语言,相比其他高级语言,Solidity有非常多限制。例如,缺乏成熟的测试工具支持,无法在运行时进行debug以及查看EVM虚拟机内的状态与数据。同时,Solidity缺乏独立的数据抽象层,导致无法像传统应用那样直接通过连接数据库来查看合约内详细的变量状态,只能通过在合约内增加查询调用来『曲线救国』。 当然,我们也可以采取一些技巧,尽可能规避以上问题。 + +### 如何展示合约更多内部变量? + +编写Solidity代码与其他高级语言最大差别是无法进行debug。这个问题解决办法之一是打印和展示更多内部变量。 + +#### 问题场景: + +还是上述的HelloWorld合约,现在我们无法在set函数执行时获取原有的name值,只能通过name()函数来查询。有没有办法在set函数执行时,记录和打印出name原来的值呢? + +#### 解决方案: + +定义一个event,在set函数内部进行调用。例如: + +``` +pragma solidity ^0.4.25; + +contract HelloWorld{ + string public name; + event LogSet(string oldValue, string newValue, address sender); + constructor() public{ + name = "Hello, World!"; + } + + function set(string n) public{ + emit LogSet(n, name, msg.sender); + name = n; + } +} +``` + +然后,在控制台中执行,可以看到刚才定义的LogSet事件被打印出来了。我们在事件中还定义打印了msg.sender的地址,如下图所示,对应地址也被打印出来。 + +![](../../../../images/articles/smart_contract_test_practice/IMG_5492.PNG) + +Event相当于提供了log日志的简单机制,当出现无法解决且需要展示合约内部状态的情况,Event提供了合适的方法和机制。 + +### 如何获得链上全量数据模型? + +#### 问题场景: + +都说Solidity是图灵完备的语言,EVM是设计简洁的状态机,如果想要获取状态机内部每个状态和交易的『世界状态』蛛丝马迹,有什么好的解决方案? + +#### 解决方案: + +Solidity缺乏独立的可对外访问的数据层,无法直接获取每笔交易或每个状态的详情。不过,我们可以通过WeBASE数据导出组件来导出所有链上数据。WeBankBlockchain-Data-Export可以导出区块链上的基础数据,如当前块高、交易总量等。如果正确配置了FISCO BCOS上运行的所有合约,Data-Export可以导出区块链上合约的业务数据,包括event、构造函数、合约地址、执行函数的信息等。数据导出组件Data-Export的目的在于降低获取区块链数据的开发门槛,提升研发效率。研发人员几乎无需编写任何代码,只进行简单配置,就可以把数据导出到Mysql数据库。 + +还是以上面的HelloWorld为例,参考安装文档:Data-Export快速部署。安装过程略过不表,导出以后会自动在数据库中生成如下的表: + +![](../../../../images/articles/smart_contract_test_practice/IMG_5493.PNG) + +数据库表的功能如下: + +- account_info: 记录了所有在链上部署的合约信息,包括了合约名、合约地址、块高、上链时间等。 +- blcok_detail_info: 记录了每个区块的信息,包括区块hash、交易数量、块高、上链时间等。 +- block_task_pool:数据导出的任务表,记录了任务详情和状态信息。 +- block_tx_detail_info:记录了每笔交易的信息,包括了交易的合约名称、函数名称、交易发送者地址、交易接收者地址、交易hash等。 +- hello_world_log_set_event:数据导出会自动生成每个event的数据库表,命名规则为合约名+事件名。上面例子中定义的event所自动生成的表,包括了event中定义的所有变量和交易信息等。 +- hello_world_set_method:数据导出会自动生成不同transaction的数据库表,命名规则为合约名+函数名。上面例子中定义的set函数表,包含了函数的入参、返回码和交易hash等。 + +hello_world_log_set_event显示了所有HelloWorld合约中,LogSetEvent事件记录的信息。 + +![](../../../../images/articles/smart_contract_test_practice/IMG_5494.PNG) + +hello_world_set_method显示了历史调用的所有函数信息。 + +![](../../../../images/articles/smart_contract_test_practice/IMG_5495.PNG) + +有了上述的数据库导出状态与信息,使用区块链瞬间变得容易,测试也更加得心应手、如虎添翼。数据库会如实地导出和记录区块链上所有操作,让一切链上数据都尽在掌握中! + +## 总结 + +优质的测试环节能够提升智能合约编写的质量,杜绝因为合约编写漏洞而造成的重大损失,还能使合约开发曲线趋缓,有助于提升智能合约开发效率。『翻过高山,正遇江海。行过雪原,恰逢花期。』只有经历了艰苦、严谨、细心、反复的测试周期,才能迎接智能合约发布的曙光。至此,智能合约系列也行至尾声。本教程从智能合约的概念引入,介绍了Solidity的基本语言特性、设计模式、编程攻略,再到深入到EVM核心、Solidity测试。短短几篇小文难以穷尽Solidity编程所有细节,期待社区的开发者,一起参与和分享更多知识和经验,共同建设更好的FISCO BCOS社区。 + +------ + +#### 参考资料 + +- [Spring Boot项目配置参考](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk.html#spring-boot) +- [spring-boot-starter](https://github.com/FISCO-BCOS/spring-boot-starter/tree/master-2.0) +- [合约转为Java文件指引](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk/quick_start.html#id4) +- [HelloWorld合约](https://github.com/FISCO-BCOS/spring-boot-starter/blob/master-2.0/src/main/contracts/HelloWorld.sol) +- [WeBankBlockchain-Data-Export快速部署](https://data-doc.readthedocs.io/zh_CN/dev/docs/WeBankBlockchain-Data-Export/install_Service.html) + diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/smart_contract_write_elegantly.md b/3.x/zh_CN/docs/articles/3_features/35_contract/smart_contract_write_elegantly.md new file mode 100644 index 000000000..0bca0b365 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/smart_contract_write_elegantly.md @@ -0,0 +1,363 @@ +# 如何优雅地编写智能合约 + +作者:张龙|FISCO BCOS 核心开发者 + +## 写在开头 + +众所周知,智能合约的出现,使得区块链不仅能够处理简单的转账功能,还能实现复杂的业务逻辑处理,其核心在于账户模型。 + +目前在众多区块链平台中,大多数集成了以太坊虚拟机,并使用Solidity作为智能合约的开发语言。Solidity语言不仅支持基础/复杂数据类型操作、逻辑操作,同时提供高级语言的相关特性,比如继承、重载等。 + +除此之外,Solidity语言还内置很多常用方法,比如成套的加密算法接口,使得数据加解密非常简单;提供事件Event,便于跟踪交易的执行状态,为业务的逻辑处理、监控和运维提供便利。 + +然而,我们在编写智能合约代码的时候,还是会碰到各种问题,这些问题包括:代码bug、可扩展性、可维护性、业务互操作的友好性等。同时,Solidity语言还不完善、需要执行在EVM上、语言本身及执行环境也会给我们带来一些坑。 + +基于此,我们结合之前的项目和经验进行梳理,希望将之前碰到的问题总结下来,为后续的开发提供借鉴依据。 + +**⊙ 注**:智能合约安全不在本篇文章讨论范畴,文中智能合约代码为0.4版本写法。 + +## Solidity常见问题 + +### EVM栈溢出 + +EVM的栈深度为1024,但是EVM指令集最多访问深度为16,这给智能合约的编写带来很多限制,常见的报错为:stack overflows。 + +这个报错出现在智能合约编译阶段。我们知道EVM的栈用于存储临时变量或者局部变量,比如函数的参数或者函数内部的变量。优化一般也是从这两个方面出发。 + +下述代码片段可能存在栈溢出问题: + +``` + +//如果课程超过14个,那么参数超过16个,则溢出 +function addStudentScores( + bytes32 studentId, + bytes32 studentName, + uint8 chineseScore; + uint8 englishScore; + ... + uint8 mathScore +) + public + returns (bool) +{ + //TODO +} +``` + +函数参数和局部变量不能超过16个,一般建议不超过10个。参数过多会出现的问题: + +1. 容易栈溢出; +2. 编写代码费劲容易出错; +3. 不利于业务理解和维护; +4. 不便于扩展。 + +常规做法是尽量减少函数参数,碰到实在无法减少的情况,建议采用数组。局部变量和函数参数类似,定义过多也会导致栈溢出,可以通过拼接数组,减少变量个数,一般会和数组入参结合使用,上述代码片段优化后如下所示: + +``` +function addStudentScores( + bytes32[] studentInfo, + uint8[] scores +) + public + returns (bool) +{ + //TODO +} +``` + +### BINARY字段超长 + +智能合约通过JAVA编译器编译后会生成对应的JAVA合约,在JAVA合约中有一个重要的常量字段BINARY,该字段为智能合约的编码,即合约代码。合约代码用于合约部署时签名,每一次合约的变更对应的BINARY都会不一样。 + +在编写智能合约时,如果单个智能合约代码很长,经过编译后的BINARY字段会很大。在JAVA合约中,BINARY字段用String类型存储,String类型的最大长度为65534,如果智能合约代码过多,会导致BINARY字段的长度超过String类型的最大长度,导致String类型溢出,从而报错。 + +解决方案也非常简单: + +1. 尽可能复用代码,比如某些判断在不同的方法中多次出现,可以抽取出来,这样也便于后续的维护; +2. 合约拆分,将一个合约拆分成为多个合约,一般出现String越界,基本上可以说明合约设计不合理。 + +### 慎用string类型 + +string类型是一个比较特殊的动态字节数组,无法直接和定长数组进行转化,其解析和数组转化也非常复杂。 + +除此之外,string类型浪费空间、非常昂贵(消耗大量gas),且不能进行合约间传递(新的实验性ABI编译器除外),所以建议用bytes代替,特殊场景例外,比如未知长度字节数组或预留字段。 + +⊙ **备注**:string类型可以通过在合约中添加新的实验性ABI编译器(如下代码)进行合约间传递。 + +``` +pragma experimental ABIEncoderV2; +``` + +## 智能合约编写 + +### 分层设计 + +网上多数智能合约的例子,比如著名的ERC20等,通常做法是写在一个智能合约文件中,这种写法本身没有什么问题,但面临复杂的业务,这种写法无可避免地会出现: + +1. 代码全部写在一个文件中,这个文件就非常大,不便于查看和理解,修改容易出错; +2. 不便于多人协作和维护,尤其是业务发生变动或代码出现漏洞时,需要重新升级部署合约,导致之前的合约作废,相关业务数据或资产也就没有了。 + +那么,有没有一种方法可以使得智能合约升级又不影响原有账户(地址)? + +先给答案:没有!(基于底层的分布式存储的CRUD除外,目前FISCO BCOS 2.0支持分布式存储,可直接通过CRUD操作数据库进行合约升级。) + +但是!没有并不意味着不能升级,智能合约升级之后最大的问题是数据,所以只要保证数据完整就可以了。 + +举个例子:我们需要对学生信息上链,常规写法如下所示: + +``` +contract Students { + struct StudentInfo { + uint32 _studentId; + bytes32 _studentName; + } + mapping (uint32 => StudentInfo) private _studentMapping; + function addStudent(uint32 studentId, bytes32 studentName) public returns(bool){ + //TODO: + } +} +``` + +这种写法,代码全部在一个智能合约中,如果现有的智能合约已经不能满足业务诉求,比如类型为uint32字段需升级为为uint64,或者合约中添加一个新的字段,比如sex,那这个智能合约就没有用了,需要重新部署。但因为重新部署,合约地址变了,无法访问到之前的数据。 + +一种做法是对合约进行分层,将业务逻辑和数据分离,如下所示: + +``` +contract StudentController { + mapping (uint32 => address) private _studentMapping; + function addStudent(uint32 studentId, bytes32 studentName) public returns(bool){ + //TODO: + } +} +contract Student { + uint32 _studentId; + bytes32 _studentName; + //uint8 sex; +} +``` + +这种写法使得逻辑和数据分离,当需要新增一个性别sex字段时,原始数据可以编写两个StudentController合约,通过版本区分,新的Student采用新的逻辑,需要业务层面做兼容性处理,其最大的问题是对于原有数据的交互性操作,需要跨合约完成,非常不方便,比如查询所有学生信息。 + +我们再次进行分层,多出一个map层,专门用于合约数据管理,即使业务逻辑层和数据层都出现问题,也没有关系,只需要重新编写业务逻辑层和数据层,并对原有数据进行特殊处理就可以做到兼容。不过,这种做法需要提前在数据合约中做好版本控制(version),针对不同的数据,采用不同的逻辑。 + +这种做法最大的好处是数据全部保存在StudentMap中,数据合约和逻辑合约的变更都不会影响到数据,且在后续的升级中,可以通过一个controller合约做到对新老数据的兼容,如下所示: + +``` +contract StudentController { + mapping (uint32 => address) private _studentMapping; + constructor(address studentMapping) public { + _studentMapping = studentMapping; + } + function addStudent(uint version, uint32 studentId, bytes32 studentName, uint8 sex) public returns(bool){ + if(version == 1){ + //TODO + }else if(version == 2){ + //TODO + } + } +} +contract StudentMap { + mapping (uint32 => address) private _studentMapping; + function getStudentMap() public constant returns(address){ + return _studentMapping; + } +} +contract Student { + uint8 version; + uint32 _studentId; + bytes32 _studentName; + //uint8 sex; +} +``` + +### 统一接口 + +智能合约尽管具备很多高级语言的特性,但是本身还是存在很多限制。对于业务的精准处理,需要采用Event事件进行跟踪,对于不同的合约和方法,可以编写不同的Event事件,如下: + +PS:你也可以采用require的方式进行处理,不过require方式不支持动态变量,每个require处理后需要填入特定的报错内容,在SDK层面耦合性太重,且不便于扩展。 + +``` +contract StudentController { + //other code + event addStudentSuccessEvent(...); //省略参数,下同 + event addStudentFailEvent(...); + + function addStudent(bytes32 studentId, bytes32 studentName) public returns(bool){ + if(add success){ + addStudentSuccessEvent(...); + return true; + }else { + addStudentFailEvent(...); + return false; + } + } +} +``` + +这种做法也没有问题,不过我们需要编写大量的Event事件,增加了智能合约的复杂性。如果每次新增加一个方法或者处理逻辑,我们都需要编写一个专门的事件进行追踪,代码侵入性太强,容易出错。 + +除此之外,基于智能合约的SDK开发,对于每一个交易(方法)由于Event事件不同,需要编写大量的不可复用的代码,解析Event事件。这种写法,对于代码的理解和维护性都是非常差的。要解决这个问题,我们只需要编写一个基合约CommonLib,如下所示: + +``` +contract CommonLib { + //tx code + bytes32 constant public ADD_STUDENT = "1"; + bytes32 constant public MODIFY_STUDENT_NAME = "2"; + + //return code + bytes32 constant public STUDENT_EXIST = "1001"; + bytes32 constant public STUDENT_NOT_EXIST = "1002"; + bytes32 constant public TX_SUCCESS = "0000"; + + event commonEvent(bytes id, bytes32 txCode, bytes32 rtnCode); +} + +contract StudentController is CommonLib { + function addStudent(bytes32 studentId, bytes32 studenntName) public returns(bool) { + //process add student + if(add success){ + commonEvent(studentId, ADD_STUDENT, TX_SUCCESS); + return true; + }else { + commonEvent(studentId, ADD_STUDENT, STUDENT_EXIST); + return false; + } + } + function modifyStudentName(bytes32 studentId, bytes32 studentName) public returns(bool){ + //TODO: + } +} +``` + +当新增一个modifyStudentName方法或其他合约时,原有的做法是根据方法可能出现的情况定义多个Event事件,然后在SDK中针对不同的Event编写解析方法,工作量很大。现在只需要在CommonLib中定义一对常量即可,SDK的代码可以完全复用,几乎没有任何新增的工作。 + +⊙ **注**:在上述例子中,commonEvent包含三个参数,其中txCode为交易类型,即调用的哪个交易方法,rtnCode为返回代码,表示在执行txCode所代表的交易方法时出现什么情况,这两个参数是必须的。在commonEvent中还有一个Id字段,用于关联业务字段studentId,在具体的项目中,关联的业务字段可以自行定义和调整。 + +### 代码细节 + +代码细节能体验一个coder的能力和职业操守。在业务比较赶的情况下,经常会忽略代码细节,同时代码细节(风格)因人而异。对于一个多人协作的项目,统一的代码风格、代码规范,能极大提升研发效率、降低研发及维护成本、降低代码错误率。 + +#### 命名规范 + +智能合约命名并没有一个标准,不过团队内部可以按照一个行业共识的规范执行。经过实战,推荐以下风格(不强制),如下代码块。 + +1. 合约命名:采用驼峰命名、首字母大写、且能表达对应的业务含义; +2. 方法命名:采用驼峰命名、首字母小写、且能表达对应的业务含义; +3. 事件命名:采用驼峰命名、首字母小写、且能表达对应的业务含义,以Event结尾; +4. 合约变量:采用驼峰命名、以_开头,首字母小写、且能表达对应的业务含义; +5. 方法入参:采用驼峰命名、首字母小写、且能表达对应的业务含义; +6. 方法出参:建议只写出参类型,无需命名,特殊情况例外; +7. 事件参数:同方法入参; +8. 局部变量:同方法入参。 + +``` +contract Student { + bytes32 _studentId; + bytes32 _studentName; + event setStudentNameEvent(bytes32 studentId, bytes32 studentName); + function setStudentName(bytes32 studentName) public returns(bool){} + //other code +} +``` + +#### 条件判断 + +在智能合约中,可以通过逻辑控制进行条件判断,比如if语句,也可以采用solidity语言提供的内置方法,比如require等。 + +两者在执行时存在一些差异,一般情况下,使用require没有问题,但是require不支持传参,如果业务需要在异常情况下给出明确的异常提示,则推荐使用if语句结合Event使用,如下。 + +``` +event commonEvent(bytes id, bytes32 txCode, bytes32 rtnCode); +//require(!_studentMapping.studentExist(studentId),"student does not exist"); +if(_studentMapping.studentExist(studentId)){ + commonEvent(studentId, ADD_STUDENT, STUDENT_EXIST); + return false; +} +``` + +#### 常量及注释 + +在智能合约中,常量和其他编程语言一样,需要采用大写加下划线方式命名,且命名需具备业务含义,同时需要采用constant关键词修饰,建议放置在合约开头。 + +常量也需要区分,对外接口常量采用public修饰,放置在基合约中。业务相关常量采用private修饰,放置在具体的业务逻辑合约中。如下所示: + +``` +contract CommonLib { + //tx code + bytes32 constant public ADD_STUDENT = "1"; + bytes32 constant public MODIFY_STUDENT_NAME = "2"; + ... +} + +contract StudentController is CommonLib { + /** student status */ + bytes32 constant private STUDENT_REGISTERED = "A"; + bytes32 constant private STUDENT_CANCELED = "C"; + + //other code +} +``` + +智能合约的注释同大部分编程语言,没有很严格的要求。对于一些特殊字段、常量、数组中的每个变量及特定逻辑,需进行说明,方法及Event可以使用/** comments */,特定字段及逻辑说明可采用//。如下所示: + +``` +/** +* stundent controller +*/ +contract StudentController { + /** add student */ + function addStudent( + //[0]-seqNo;[1]-studentId;[2]-studentName; + bytes32[3] studentInfos +) + public returns(bool) +{ + //TODO: + } +} +``` + +#### 兜底方案 + +在智能合约设计过程中,谁都无法保证自己的代码一定满足业务诉求,因为业务的变动是绝对的。同时,谁也无法保证业务及操作人员一定不会犯错,比如业务对某些字段未做校验导致链上出现非法数据,或者因为业务操作人员手误、恶意操作等,导致链上出现错误数据。 + +区块链系统不像其他传统系统,可以通过手动修改库或文件对数据进行修正,区块链必须通过交易对数据进行修正。 + +针对业务变更,在编写智能合约时可以适当增加一些保留字段,用于后续可能存在的业务变更。一般定义为一个通用化的数据类型比较合适,比如string,一方面string类型存储容量大,另一方面几乎啥都可以存。 + +我们可以在SDK层面通过数据处理将扩展数据存入string字段,在使用时提供相应的数据处理反向操作解析数据,比如在Student合约中,新增reserved字段,如下所示。当前阶段,reserved没有任何作用,在智能合约中为空。 + +``` +contract Student { + //other code + string _reserved; + + function getReserved() constant public returns(string){ + return _reserved; + } + + function setReserved(string reserved) onlyOwner public returns(bool){ + _reserved = reserved; + return true; + } +} +``` + +针对手误或者非法操作导致的数据错误,务必预留相关的接口,以便在紧急情况下可以不修改合约,而通过更新SDK对链上数据进行修复(SDK中可以先不实现)。比如针对Student合约中的owner字段,添加set操作。 + +``` +contract Student { + //other code; + address _owner; + function setOwner(address owner) onlyOwner public returns(bool){ + _owner = owner; + return true; + } +} +``` + +需要特别注意的是,对于预留字段和预留方法,必须确保其操作权限,防止引入更多问题。同时预留字段和预留方法都是一种非正常情况下的设计,具备超前意识,但一定要避免过度设计,这样会导致智能合约的存储空间非常浪费,同时预留方法使用不当会给业务的安全性带来隐患。 + +## 写在最后 + +区块链应用的开发涉及很多方面,智能合约是核心,本篇给出了开发智能合约过程中的一些建议和优化方法,但并不是完整和完美的,且本质上无法杜绝bug的出现,但通过优化方法,可以让代码变得更加健壮和易维护,从这点上来讲,已具备业界的基本良心要求了。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_advanced_features.md b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_advanced_features.md new file mode 100644 index 000000000..83a10848c --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_advanced_features.md @@ -0,0 +1,407 @@ +# 智能合约编写之Solidity的高级特性 + +作者:毛嘉宇|FISCO BCOS 核心开发者 + +## **前言** + +FISCO BCOS使用了Solidity语言进行智能合约开发。Solidity是一门面向区块链平台设计、图灵完备的编程语言,支持函数调用、修饰器、重载,事件、继承和库等多种高级语言的特性。在本系列前两篇文章中,介绍了智能合约的概念与Solidity的基础特性。本文将介绍Solidity的一些高级特性,帮助读者快速入门,编写高质量、可复用的Solidity代码。 + +## **合理控制函数和变量的类型** + +基于最少知道原则(Least Knowledge Principle)中经典面向对象编程原则,一个对象应该对其他对象保持最少的了解。优秀的Solidity编程实践也应符合这一原则:每个合约都清晰、合理地定义函数的可见性,暴露最少的信息给外部,做好对内部函数可见性的管理。同时,正确地修饰函数和变量的类型,可给合约内部数据提供不同级别的保护,以防止程序中非预期的操作导致数据产生错误;还能提升代码的可读性与质量,减少误解和bug;更有利于优化合约执行的成本,提升链上资源的使用效率。 + +### 守住函数操作的大门:函数可见性 + +Solidity有两种函数调用方式: + +- 内部调用:又被称为『消息调用』。常见的有合约内部函数、父合约的函数以及库函数的调用。(例如,假设A合约中存在f函数,则在A合约内部,其他函数调用f函数的调用方式为f()。) + +- 外部调用:又被称为『EVM调用』。一般为跨合约的函数调用。在同一合约内部,也可以产生外部调用。(例如,假设A合约中存在f函数,则在B合约内可通过使用A.f()调用。在A合约内部,可以用this.f()来调用。)。 + +函数可以被指定为 external ,public ,internal 或者 private标识符来修饰。 + +| 标识符 | 作用 | +| -------- | ---------------------------------------- | +| external | 不可内部调用,在接收大量数据时更为高效。 | +| public | 同时支持内部和外部调用。 | +| internal | 只支持内部调用。 | +| private | 仅在当前合约使用,且不可被继承。 | + +基于以上表格,我们可以得出函数的可见性 public > external > internal > private。另外,如果函数不使用上述类型标识符,那么默认情况下函数类型为 public。 + +综上所述,我们可以总结一下以上标识符的不同使用场景: + +- public,公有函数,系统默认。通常用于修饰**可对外暴露的函数,且该函数可能同时被内部调用。** + +- external,外部函数,推荐**只向外部暴露**的函数使用。当函数的某个参数非常大时,如果显式地将函数标记为external,可以强制将函数存储的位置设置为calldata,这会节约函数执行时所需存储或计算资源。 + +- internal,内部函数,推荐所有合约内**不对合约外暴露**的函数使用,可以避免因权限暴露被攻击的风险。 + +- private,私有函数,在极少数严格保护合约函数**不对合约外部开放且不可被继承**的场景下使用。 + +不过,需要注意的是,无论用何种标识符,即使是private,整个函数执行的过程和数据是对所有节点可见,其他节点可以验证和重放任意的历史函数。实际上,整个智能合约所有的数据对区块链的参与节点来说都是透明的。 + +刚接触区块链的用户常会误解,在区块链上可以通过权限控制操作来控制和保护上链数据的隐私。这是一种错误的观点。事实上,在区块链业务数据未做特殊加密的前提下,区块链同一账本内的所有数据经过共识后落盘到所有节点上,链上数据是全局公开且相同的,智能合约只能控制和保护合约数据的执行权限。如何正确地选择函数修饰符是合约编程实践中的『必修课』,只有掌握此节真谛方可自如地控制合约函数访问权限,提升合约安全性。 + +### 对外暴露最少的必要信息:变量的可见性 + +与函数一样,对于状态变量,也需要注意可见性修饰符。状态变量的修饰符默认是internal,不能设置为external。此外,当状态变量被修饰为public,编译器会生成一个与该状态变量同名的函数。具体可参考以下示例: + +``` +pragma solidity ^0.4.0; +​ +contract TestContract { + uint public year = 2020; +} +​ +contract Caller { + TestContract c = new TestContract(); + function f() public { + uint local = c.year(); + //expected to be 2020 + } +} +``` + +这个机制有点像Java语言里lombok库所提供的@Getter注解,默认为一个POJO类变量生成get函数,大大简化了某些合约代码的书写。同样,变量的可见性也需要被合理地修饰,不该公开的变量果断用private修饰,使合约代码更符合『最少知道』的设计原则。 + +### 精确地将函数分类:函数的类型 + +函数可以被声明为pure、view,两者的作用可见下图。 + +| 函数类型 | 作用 | +| -------- | ---------------------- | +| pure | 承诺不读取或修改状态。 | +| view | 保证不修改状态。 | + +那么,什么是读取或修改状态呢?简单来说,两个状态就是读取或修改了账本相关的数据。 + +在FISCO BCOS中,读取状态可能是: + +1. 读取状态变量。 +2. 访问 block,tx, msg 中任意成员 (除 msg.sig 和 msg.data 之外)。 +3. 调用任何未标记为 pure 的函数。 +4. 使用包含某些操作码的内联汇编。 + +而修改状态可能是: + +1. 修改状态变量。 +2. 产生事件。 +3. 创建其它合约。 +4. 使用 selfdestruct。 +5. 调用任何没有标记为 view 或者 pure 的函数。 +6. 使用底层调用。 +7. 使用包含特定操作码的内联汇编。 + +需要注意的是,在某些版本编译器中,并没有对这两个关键字进行强制的语法检查。推荐尽可能使用pure和view来声明函数,例如将没有读取或修改任何状态的库函数声明为pure,这样既提升了代码可读性,也使其更赏心悦目,何乐而不为? + +### 编译时就确定的值:状态常量 + +所谓的状态常量是指被声明为constant的状态变量。一旦某个状态变量被声明为constant,那么该变量值只能为编译时确定的值,无法被修改。编译器一般会在编译状态计算出此变量实际值,不会给变量预留储存空间。所以,constant只支持修饰值类型和字符串。状态常量一般用于定义含义明确的业务常量值。 + +## 面向切片编程:函数修饰器(modifier) + +Solidity提供了强大的改变函数行为的语法:函数修饰器(modifier)。一旦某个函数加上了修饰器,修饰器内定义的代码就可以作为该函数的装饰被执行,类似其他高级语言中装饰器的概念。这样说起来很抽象,让我们来看一个具体的例子: + +``` +pragma solidity ^0.4.11; +​ +contract owned { + function owned() public { owner = msg.sender; } + address owner; +​ + // 修饰器所修饰的函数体会被插入到特殊符号 _; 的位置。 + modifier onlyOwner { + require(msg.sender == owner); + _; + } +​ + // 使用onlyOwner修饰器所修饰,执行changeOwner函数前需要首先执行onlyOwner"_;"前的语句。 + function changeOwner(address _owner) public onlyOwner { + owner = _owner; + } +} +``` + +如上所示,定义onlyOwner修饰器后,在修饰器内,require语句要求msg.sender必须等于owner。后面的"_;"表示所修饰函数中的代码。 + +所以,代码实际执行顺序变成了: + +1. 执行onlyOwner修饰器的语句,先执行require语句。(执行第9行) +2. 执行changeOwner函数的语句。(执行第15行) + +由于changeOwner函数加上了onlyOwner的修饰,故只有当msg.sender是owner才能成功调用此函数,否则会报错回滚。同时,修饰器还能传入参数,例如上述的修饰器也可写成: + +``` +modifier onlyOwner(address sender) { + require(sender == owner); + _; +} +​ +function changeOwner(address _owner) public onlyOwner(msg.sender) { + owner = _owner; +} +``` + +同一个函数可有多个修饰器,中间以空格间隔,修饰器依次检查执行。此外,修饰器还可以被继承和重写。由于其所提供的强大功能,修饰器也常被用来实现权限控制、输入检查、日志记录等。比如,我们可以定义一个跟踪函数执行的修饰器: + +``` +event LogStartMethod(); +event LogEndMethod(); +​ +modifier logMethod { + emit LogStartMethod(); + _; + emit LogEndMethod(); +} +``` + +这样,任何用logMethod修饰器来修饰的函数都可记录其函数执行前后的日志,实现日志环绕效果。如果你已经习惯了使用Spring框架的AOP,也可以试试用modifier实现一个简单的AOP功能。 + +modifier最常见的打开方式是通过提供函数的校验器。在实践中,合约代码的一些检查语句常会被抽象并定义为一个modifier,如上述例子中的onlyOwner就是个最经典的权限校验器。这样一来,连检查的逻辑也能被快速复用,用户也不用再为智能合约里到处都是参数检查或其他校验类代码而苦恼。 + +## 可以debug的日志:合约里的事件(Event) + +介绍完函数和变量,我们来聊聊Solidity其中一个较为独有的高级特性——事件机制。 + +事件允许我们方便地使用 EVM 的日志基础设施,而Solidity的事件有以下作用: + +1. 记录事件定义的参数,存储到区块链交易的日志中,提供廉价的存储。 +2. 提供一种回调机制,在事件执行成功后,由节点向注册监听的SDK发送回调通知,触发回调函数被执行。 +3. 提供一个过滤器,支持参数的检索和过滤。 + +事件的使用方法非常简单,两步即可玩转。 + +- 第一步,使用关键字『event』来定义一个事件。建议事件的命名以特定前缀开始或以特定后缀结束,这样更便于和函数区分,在本文中我们将统一以『Log』前缀来命名事件。下面,我们用『event』来定义一个函数调用跟踪的事件: + +``` +event LogCallTrace(address indexed from, address indexed to, bool result); + +``` + +事件在合约中可被继承。当他们被调用时,会将参数存储到交易的日志中。这些日志被保存到区块链中,与地址相关联。在上述例子中,用indexed标记参数被搜索,否则,这些参数被存储到日志的数据中,无法被搜索。 + +- 第二步,在对应的函数内触发定义事件。调用事件的时候,在事件名前加上『emit』关键字: + +``` +function f() public { + emit LogCallTrace(msg.sender, this, true); +} +``` + +这样,当函数体被执行的时候,会触发执行LogCallTrace。 + +最后,在FISCO BCOS的Java SDK中,合约事件推送功能提供了合约事件的异步推送机制,客户端向节点发送注册请求,在请求中携带客户端关注的合约事件参数,节点根据请求参数对请求区块范围的Event Log进行过滤,将结果分次推送给客户端。更多细节可以参考合约事件推送功能文档。在SDK中,可以根据事件的indexed属性,根据特定值进行搜索。[合约事件推送功能文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk.html#id14): + +不过,日志和事件无法被直接访问,甚至在创建的合约中也无法被直接访问。但好消息是日志的定义和声明非常利于在『事后』进行追溯和导出。例如,我们可以在合约的编写中,定义和埋入足够的事件,通过WeBASE的数据导出子系统我们可以将所有日志导出到MySQL等数据库中。这特别适用于生成对账文件、生成报表、复杂业务的OLTP查询等场景。此外,WeBASE提供了一个专用的代码生成子系统帮助分析具体的业务合约,自动生成相应的代码。 + +- [WeBASE的数据导出子系统](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Collect-Bee/index.html) + +- [代码生成子系统](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Codegen-Monkey/index.html) + +在Solidity中,事件是一个非常有用的机制,如果说智能合约开发最大的难点是debug,那善用事件机制可以让你快速制伏Solidity开发。 + +## 面向对象之重载 + +重载是指合约具有多个不同参数的同名函数。对于调用者来说,可使用相同函数名来调用功能相同,但参数不同的多个函数。在某些场景下,这种操作可使代码更清晰、易于理解,相信有一定编程经验的读者对此一定深有体会。下面将展示一个典型的重载语法: + +``` +pragma solidity ^0.4.25; +​ +contract Test { + function f(uint _in) public pure returns (uint out) { + out = 1; + } +​ + function f(uint _in, bytes32 _key) public pure returns (uint out) { + out = 2; + } +} +``` + +需要注意的是,每个合约只有一个构造函数,这也意味着合约的构造函数是不支持重载的。我们可以想像一个没有重载的世界,程序员一定绞尽脑汁、想方设法给函数起名,大家的头发可能又要多掉几根。 + +## 面向对象之继承 + +Solidity使用『is』作为继承关键字。因此,以下这段代码表示的是,合约B继承了合约A: + +``` +pragma solidity ^0.4.25; +​ +contract A { +} +​ +contract B is A { +} +``` + +而继承的合约B可以访问被继承合约A的所有非private函数和状态变量。在Solidity中,继承的底层实现原理为:当一个合约从多个合约继承时,在区块链上只有一个合约被创建,所有基类合约的代码被复制到创建的合约中。相比于C++或Java等语言的继承机制,Solidity的继承机制有点类似于Python,支持多重继承机制。因此,Solidity中可以使用一个合约来继承多个合约。在某些高级语言中,比如Java,出于安全性和可靠性的考虑,只支持单重继承,通过使用接口机制来实现多重继承。对于大多数场景而言,单继承的机制就可以满足需求了。多继承会带来很多复杂的技术问题,例如所谓的『钻石继承』等,建议在实践中尽可能规避复杂的多继承。继承简化了人们对抽象合约模型的认识和描述,清晰体现了相关合约间的层次结构关系,并且提供软件复用功能。这样,能避免代码和数据冗余,增加程序的重用性。 + +## **面向对象之抽象类和接口** + +根据依赖倒置原则,智能合约应该尽可能地面向接口编程,而不依赖具体实现细节。Solidity支持抽象合约和接口的机制。如果一个合约,存在未实现的方法,那么它就是抽象合约。例如: + +``` +pragma solidity ^0.4.25; +​ +contract Vehicle { + //抽象方法 + function brand() public returns (bytes32); +} +``` + +抽象合约无法被成功编译,但可以被继承。接口使用关键字interface,上面的抽象也可以被定义为一个接口。 + +``` +pragma solidity ^0.4.25; +​ +interface Vehicle { + //抽象方法 + function brand() public returns (bytes32); +} +``` + +接口类似于抽象合约,但不能实现任何函数,同时,还有进一步的限制: + +1. 无法继承其他合约或接口。 +2. 无法定义构造函数。 +3. 无法定义变量。 +4. 无法定义结构体 +5. 无法定义枚举。 + +合适地使用接口或抽象合约有助于增强合约设计的可扩展性。但是,由于区块链EVM上计算和存储资源的限制,切忌过度设计,这也是从高级语言技术栈转到Solidity开发的老司机常常会陷入的天坑。 + +## **避免重复造轮子:库(Library)** + +在软件开发中,很多经典原则可以提升软件的质量,其中最为经典的就是尽可能复用久经考验、反复打磨、严格测试的高质量代码。此外,复用成熟的库代码还可以提升代码的可读性、可维护性,甚至是可扩展性。 + +和所有主流语言一样,Solidity也提供了库(Library)的机制。Solidity的库有以下基本特点: + +1. 用户可以像使用合约一样使用关键词library来创建合约。 +2. 库既不能继承也不能被继承。 +3. 库的internal函数对调用者都是可见的。 +4. 库是无状态的,无法定义状态变量,但是可以访问和修改调用合约所明确提供的状态变量。 + +接下来,我们来看一个简单的例子,以下是FISCO BCOS社区中一个LibSafeMath的代码库。我们对此进行了精简,只保留了加法的功能: + +``` +pragma solidity ^0.4.25; +​ +library LibSafeMath { + /** + * @dev Adds two numbers, throws on overflow. + */ + function add(uint256 a, uint256 b) internal returns (uint256 c) { + c = a + b; + assert(c >= a); + return c; + } +} +``` + +我们只需在合约中import库的文件,然后使用L.f()的方式来调用函数,(例如LibSafeMath.add(a,b))。接下来,我们编写调用这个库的测试合约,合约内容如下: + +``` +pragma solidity ^0.4.25; +​ +import "./LibSafeMath.sol"; +​ +contract TestAdd { +​ + function testAdd(uint256 a, uint256 b) external returns (uint256 c) { + c = LibSafeMath.add(a,b); + } +} +``` + +在FISCO BCOS控制台中,我们可以测试合约的结果(控制台的介绍文章详见[FISCO BCOS 控制台详解,飞一般的区块链体验](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485275&idx=1&sn=95e1cb1a961041d5800b76b4a407d24e&chksm=9f2ef547a8597c51a8940548dd1e30f22eb883dd1864371e832bc50188c153989050244f31e5&scene=21#wechat_redirect)),运行结果如下: + +``` +============================================================================================= +Welcome to FISCO BCOS console(1.0.8)! +Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console. + ________ ______ ______ ______ ______ _______ ______ ______ ______ +| | \/ \ / \ / \ | \ / \ / \ / \ +| $$$$$$$$\$$$$$| $$$$$$| $$$$$$| $$$$$$\ | $$$$$$$| $$$$$$| $$$$$$| $$$$$$\ +| $$__ | $$ | $$___\$| $$ \$| $$ | $$ | $$__/ $| $$ \$| $$ | $| $$___\$$ +| $$ \ | $$ \$$ \| $$ | $$ | $$ | $$ $| $$ | $$ | $$\$$ \ +| $$$$$ | $$ _\$$$$$$| $$ __| $$ | $$ | $$$$$$$| $$ __| $$ | $$_\$$$$$$\ +| $$ _| $$_| \__| $| $$__/ | $$__/ $$ | $$__/ $| $$__/ | $$__/ $| \__| $$ +| $$ | $$ \\$$ $$\$$ $$\$$ $$ | $$ $$\$$ $$\$$ $$\$$ $$ + \$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ +​ +============================================================================================= +[group:1]> deploy TestAdd +contract address: 0xe2af1fd7ecd91eb7e0b16b5c754515b775b25fd2 +​ +[group:1]> call TestAdd 0xe2af1fd7ecd91eb7e0b16b5c754515b775b25fd2 testAdd 2000 20 +transaction hash: 0x136ce66603aa6e7fd9e4750fcf25302b13171abba8c6b2109e6dd28111777d54 +--------------------------------------------------------------------------------------------- +Output +function: testAdd(uint256,uint256) +return type: (uint256) +return value: (2020) +--------------------------------------------------------------------------------------------- +​ +[group:1]> +``` + +通过以上示例,我们可清晰了解在Solidity中应如何使用库。类似Python,在某些场景下,指令『using A for B;』可用于附加库函数(从库 A)到任何类型(B)。这些函数将接收到调用它们的对象作为第一个参数(像 Python 的 self 变量)。这个功能使库的使用更加简单、直观。 + +例如,我们对代码进行如下简单修改: + +``` +pragma solidity ^0.4.25; +​ +import "./LibSafeMath.sol"; +​ +contract TestAdd { + // 添加using ... for ... 语句,库 LibSafeMath 中的函数被附加在uint256的类型上 + using LibSafeMath for uint256; +​ + function testAdd(uint256 a, uint256 b) external returns (uint256 c) { + //c = LibSafeMath.add(a,b); + c = a.add(b); + //对象a直接被作为add方法的首个参数传入。 + } +} +``` + +验证一下结果依然是正确的。 + +``` +============================================================================================= +Welcome to FISCO BCOS console(1.0.8)! +Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console. + ________ ______ ______ ______ ______ _______ ______ ______ ______ +| | \/ \ / \ / \ | \ / \ / \ / \ +| $$$$$$$$\$$$$$| $$$$$$| $$$$$$| $$$$$$\ | $$$$$$$| $$$$$$| $$$$$$| $$$$$$\ +| $$__ | $$ | $$___\$| $$ \$| $$ | $$ | $$__/ $| $$ \$| $$ | $| $$___\$$ +| $$ \ | $$ \$$ \| $$ | $$ | $$ | $$ $| $$ | $$ | $$\$$ \ +| $$$$$ | $$ _\$$$$$$| $$ __| $$ | $$ | $$$$$$$| $$ __| $$ | $$_\$$$$$$\ +| $$ _| $$_| \__| $| $$__/ | $$__/ $$ | $$__/ $| $$__/ | $$__/ $| \__| $$ +| $$ | $$ \\$$ $$\$$ $$\$$ $$ | $$ $$\$$ $$\$$ $$\$$ $$ + \$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ +​ +============================================================================================= +[group:1]> deploy TestAdd +contract address: 0xf82c19709a9057d8e32c19c23e891b29b708c01a +​ +[group:1]> call TestAdd 0xf82c19709a9057d8e32c19c23e891b29b708c01a testAdd 2000 20 +transaction hash: 0xcc44a80784404831d8522dde2a8855606924696957503491eb47174c9dbf5793 +--------------------------------------------------------------------------------------------- +Output +function: testAdd(uint256,uint256) +return type: (uint256) +return value: (2020) +--------------------------------------------------------------------------------------------- +​ +[group:1]> +``` + +更好地使用Solidity library有助于开发者更好地复用代码。除了Solidity社区提供的大量开源、高质量的代码库外,FISCO BCOS社区也计划推出全新的Solidity代码库,开放给社区用户,敬请期待。当然,你也可以自己动手,编写可复用的代码库组件,并分享到社区。 + +## 总结 + +本文介绍了Solidity合约编写的若干高级语法特性,旨在抛砖引玉,帮助读者快速沉浸到Solidity编程世界。编写高质量、可复用的Solidity代码的诀窍在于:多看社区优秀的代码,多动手实践编码,多总结并不断进化。期待更多朋友在社区里分享Solidity的宝贵经验和精彩故事,have fun :) + diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_basic_features.md b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_basic_features.md new file mode 100644 index 000000000..3097c9a6f --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_basic_features.md @@ -0,0 +1,386 @@ +# 智能合约编写之Solidity的基础特性 + +作者:储雨知|FISCO BCOS 核心开发者 + +如前篇介绍,目前大部分的联盟链平台,包括FISCO BCOS,都采用Solidity作为智能合约开发语言,因此熟悉并上手Solidity十分必要。作为一门面向区块链平台设计的图灵完备的编程语言,Solidity支持函数调用、修饰符、重载、事件、继承等多种特性,在区块链社区中,拥有广泛的影响力和踊跃的社区支持。但对于刚接触区块链的人而言,Solidity是一门陌生的语言。智能合约编写阶段将从Solidity基础特性、高级特性、设计模式以及编程攻略分别展开,带读者认识Solidity并掌握其运用,更好地进行智能合约开发。本篇将围绕Solidity的基础特性,带大家上手开发一个最基本的智能合约。 + +## 智能合约代码结构 + +任何编程语言都有其规范的代码结构,用于表达在一个代码文件中如何组织和编写代码,Solidity也一样。本节,我们将通过一个简单的合约示例,来了解智能合约的代码结构。 + +``` +pragma solidity ^0.4.25; +contract Sample{ +​ + //State variables + address private _admin; + uint private _state; +​ + //Modifier + modifier onlyAdmin(){ + require(msg.sender == _admin, "You are not admin"); + _; + } +​ + //Events + event SetState(uint value); +​ + //Constructor + constructor() public{ + _admin = msg.sender; + } +​ + //Functions + function setState(uint value) public onlyAdmin{ + _state = value; + emit SetState(value); + } +​ + function getValue() public view returns (uint){ + return _state; + } +​ +} +``` + +上面这段程序包括了以下功能: + +- 通过构造函数来部署合约 +- 通过setValue函数设置合约状态 +- 通过getValue函数查询合约状态 + +整个合约主要分为以下几个构成部分: + +- **状态变量** - _admin, _state,这些变量会被永久保存,也可以被函数修改 +- **构造函数** - 用于部署并初始化合约 +- **事件** - SetState, 功能类似日志,记录了一个事件的发生 +- **修饰符** - onlyAdmin, 用于给函数加一层"外衣" +- **函数** - setState, getState,用于读写状态变量 + +下面将逐一介绍上述构成部分。 + +### 状态变量 + +状态变量是合约的骨髓,它记录了合约的业务信息。用户可以通过函数来修改这些状态变量,这些修改也会被包含到交易中;交易经过区块链网络确认后,修改即为生效。 + +``` +uint private _state; +``` + +状态变量的声明方式为:[类型] [访问修饰符-可选] [字段名] + +### 构造函数 + +构造函数用于初始化合约,它允许用户传入一些基本的数据,写入到状态变量中。在上述例子中,设置了_admin字段,作为后面演示其他功能的前提。 + +``` +constructor() public{ + _admin = msg.sender; +} +``` + +和java不同的是,构造函数不支持重载,只能指定一个构造函数。 + +### 函数 + +函数被用来读写状态变量。对变量的修改将会被包含在交易中,经区块链网络确认后才生效。生效后,修改会被永久的保存在区块链账本中。函数签名定义了函数名、输入输出参数、访问修饰符、自定义修饰符。 + +``` +function setState(uint value) public onlyAdmin; +``` + +函数还可以返回多个返回值: + +``` +function functionSample() public view returns(uint, uint){ + return (1,2); +} +``` + +在本合约中,还有一个配备了view修饰符的函数。这个view表示了该函数不会修改任何状态变量。与view类似的还有修饰符pure,其表明该函数是纯函数,连状态变量都不用读,函数的运行仅仅依赖于参数。 + +``` +function add(uint a, uint b) public pure returns(uint){ + return a+b; +} +``` + +如果在view函数中尝试修改状态变量,或者在pure函数中访问状态变量,编译器均会报错。 + +### 事件 + +事件类似于日志,会被记录到区块链中,客户端可以通过web3订阅这些事件。 + +#### 定义事件 + +``` +event SetState(uint value); +``` + +#### 构造事件 + +``` +emit SetState(value); +``` + +这里有几点需要注意: + +- 事件的名称可以任意指定,不一定要和函数名挂钩,但推荐两者挂钩,以便清晰地表达发生的事情. + +- 构造事件时,也可不写emit,但因为事件和函数无论是名称还是参数都高度相关,这样操作很容易笔误将事件写成函数调用,因此不推荐。 + +``` +function setState(uint value) public onlyAdmin{ + _state = value; + //emit SetState(value); + //这样写也可以,但不推荐,因为很容易笔误写成setState + SetState(value); +} +``` + +- Solidity编程风格应采用一定的规范。查看[编程风格](https://learnblockchain.cn/docs/solidity/style-guide.html#id16) + +### 修饰符 + +修饰符是合约中非常重要的一环。它挂在函数声明上,为函数提供一些额外的功能,例如检查、清理等工作。在本例中,修饰符onlyAdmin要求函数调用前,需要先检测函数的调用者是否为函数部署时设定的那个管理员(即合约的部署人)。 + +``` +//Modifer +modifier onlyAdmin(){ + require(msg.sender == _admin, "You are not admin"); + _; +} +​ +... +//Functions +function setState(uint value) public onlyAdmin{ + ... +} +``` + +值得注意的是,定义在修饰符中的下划线“_”,表示函数的调用,指代的是开发者用修饰符修饰的函数。在本例中,表达的是setState函数调用的意思。 + +## 智能合约的运行 + +了解了上述的智能合约示例的结构,就可以直接上手运行,运行合约的方式有多种,大家可以任意采取其中一种: + +- 方法一:可以使用[FISCO BCOS控制台](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html#id7)的方式来部署合约 + +- 方法二:使用FISCO BCOS开源项目WeBASE提供的在线ide WEBASE-front运行 + +- 方法三:通过在线ide remix来进行合约的部署与运行, [remix的地址](http://remix.ethereum.org/) + +本例中使用remix作为运行示例。 + +### 编译 + +首先,在remix的文件ide中键入代码后,通过编译按钮来编译。成功后会在按钮上出现一个绿色对勾: + + +![](../../../../images/articles/solidity_basic_features/IMG_5445.PNG) + +### 部署 + +编译成功后就可进行部署环节,部署成功后会出现合约实例。 + +![](../../../../images/articles/solidity_basic_features/IMG_5446.PNG) + +### setState + +合约部署后,我们来调用setState(4)。在执行成功后,会产生一条交易收据,里面包含了交易的执行信息。 + +![](../../../../images/articles/solidity_basic_features/IMG_5447.PNG) + +在这里,用户可以看到交易执行状态(status)、交易执行人(from)、交易输入输出(decoded input, decoded output)、交易开销(execution cost)以及交易日志(logs)。在logs中,我们看到SetState事件被抛出,里面的参数也记录了事件传入的值4。如果我们换一个账户来执行,那么调用会失败,因为onlyAdmin修饰符会阻止用户调用。 + +![](../../../../images/articles/solidity_basic_features/IMG_5448.JPG) + +### getState + +调用getState后,可以直接看到所得到的值为4,正好是我们先前setState所传入的值: + +![](../../../../images/articles/solidity_basic_features/IMG_5449.PNG) + +## Solidity数据类型 + +在前文的示例中,我们用到了uint等数据类型。由于Solidity类型设计比较特殊,这里也会简单介绍一下Solidity的数据类型。 + +### 整型系列 + +Solidity提供了一组数据类型来表示整数, 包含无符号整数与有符号整数。每类整数还可根据长度细分,具体细分类型如下。 + +| 类型 | 长度(位) | 有符号 | +| ------- | -------- | ------ | +| uint | 256 | 否 | +| uint8 | 8 | 否 | +| uint16 | 16 | 否 | +| ... | ... | 否 | +| uint256 | 256 | 否 | +| int | 256 | 是 | +| int8 | 8 | 是 | +| int16 | 16 | 是 | +| ... | ... | 是 | +| int256 | 256 | 是 | + +### 定长bytes系列 + +Solidity提供了bytes1到bytes32的类型,它们是固定长度的字节数组。用户可以读取定长bytes的内容。 + +``` + function bytesSample() public{ +​ + bytes32 barray; + //Initialize baarray + //read brray[0] + byte b = barray[0]; + } +``` + +并且,可以将整数类型转换为bytes。 + +``` + uint256 s = 1; + bytes32 b = bytes32(s); +``` + +这里有一个关键细节,Solidity采取大端序编码,高地址存的是整数的小端。例如,b[0]是低地址端,它存整数的高端,所以值为0;取b[31]才是1。 + +``` + function bytesSample() public pure returns(byte, byte){ +​ + uint256 value = 1; + bytes32 b = bytes32(value); + //Should be (0, 1) + return (b[0], b[31]); + } +``` + +### 变长bytes + +从上文中,读者可了解定长byte数组。此外,Solidity还提供了一个变长byte数组:bytes。使用方式类似数组,后文会有介绍。 + +### string + +Solidity提供的string,本质是一串经UTF-8编码的字节数组,它兼容于变长bytes类型。目前Solidity对string的支持不佳,也没有字符的概念。用户可以将string转成bytes。 + +``` + function stringSample() public view returns(bytes){ + string memory str = "abc"; + bytes memory b = bytes(str); + //0x616263 + return b; + } +``` + +要注意的是,当将string转换成bytes时,数据内容本身不会被拷贝,如上文中,str和b变量指向的都是同一个字符串abc。 + +### address + +address表示账户地址,它由私钥间接生成,是一个20字节的数据。同样,它也可以被转换为bytes20。 + +``` + function addressSample() public view returns(bytes20){ +​ + address me = msg.sender; + bytes20 b = bytes20(me); + return b; + } +``` + +### mapping + +mapping表示映射, 是极其重要的数据结构。它与java中的映射存在如下几点差别: + +- 它无法迭代keys,因为它只保存键的哈希,而不保存键值,如果想迭代,可以用开源的可迭代哈希类库 +- 如果一个key未被保存在mapping中,一样可以正常读取到对应value,只是value是空值(字节全为0)。所以它也不需要put、get等操作,用户直接去操作它即可。 + +``` +contract Sample{ +​ + mapping(uint=>string) private values; +​ + function mappingSample() public view returns(bytes20){ + //put a key value pair + values[10] = "hello"; +​ + //read value + string value = values[10]; +​ + } +​ +} +``` + +### 数组 + +如果数组是状态变量,那么支持push等操作: + +``` +contract Sample{ +​ + string[] private arr; +​ + function arraySample() public view { + arr.push("Hello"); + uint len = arr.length;//should be 1 + string value = arr[0];//should be Hello + } +​ +} +``` + +数组也可以以局部变量的方式使用,但稍有不同: + +``` +function arraySample() public view returns(uint){ + //create an empty array of length 2 + uint[] memory p = new uint[](2); + p[3] = 1;//THIS WILL THROW EXCEPTION + return p.length; +} +``` + +### struct + +Solidity允许开发者自定义结构对象。结构体既可以作为状态变量存储,也可以在函数中作为局部变量存在。 + +``` +struct Person{ + uint age; + string name; + } +​ + Person private _person; +​ + function structExample() { + Person memory p = Person(1, "alice"); + _person = p; + } +``` + +本节中只介绍了比较常见的数据类型,更完整的列表可参考[Solidity官方网站](https://solidity.readthedocs.io/en/v0.6.3/types.html)。 + +#### 全局变量 + +示例合约代码的构造函数中,包含msg.sender。它属于全局变量。在智能合约中,全局变量或全局方法可用于获取和当前区块、交易相关的一些基本信息,如块高、块时间、合约调用者等。 + +比较常用的全局变量是msg变量,表示调用上下文,常见的全局变量有以下几种: + +- **msg.sender**:合约的直接调用者。 + + 由于是直接调用者,所以当处于 用户A->合约1->合约2 调用链下,若在合约2内使用msg.sender,得到的会是合约1的地址。如果想获取用户A,可以用tx.origin. + +- **tx.origin**:交易的"始作俑者",整个调用链的起点。 + +- **msg.calldata**:包含完整的调用信息,包括函数标识、参数等。calldata的前4字节就是函数标识,与msg.sig相同。 + +- **msg.sig**:msg.calldata的前4字节,用于标识函数。 +- **block.number**:表示当前所在的区块高度。 + +- **now**:表示当前的时间戳。也可以用block.timestamp表示。 + +这里只列出了部分常见全局变量,请参考[完整版本](https://solidity.readthedocs.io/en/v0.4.24/units-and-global-variables.html)。 + +## 结语 + +本文以一个简单的示例合约作为引入,介绍了运用Solidity开发智能合约的基本知识。读者可以尝试运行该合约,感受智能合约的开发。若想更深入学习智能合约示例,推荐[官方网站](https://solidity.readthedocs.io/en/v0.6.2/solidity-by-example.html)示例供读者学习,也可关注本专题后续系列文章。在官网的示例中,提供了投票、竞拍、微支付通道等多个案例,这些案例贴近实际生活,是很好的学习资料。 diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_design_patterns.md b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_design_patterns.md new file mode 100644 index 000000000..a45b7754d --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_design_patterns.md @@ -0,0 +1,538 @@ +# 智能合约编写之 Solidity的设计模式 + +作者:储雨知|FISCO BCOS 核心开发者 + +## 前言 + +随着区块链技术发展,越来越多的企业与个人开始将区块链与自身业务相结合。区块链所具有的独特优势,例如,数据公开透明、不可篡改,可以为业务带来便利。但与此同时,也存在一些隐患。数据的公开透明,意味着任何人都可以读取;不可篡改,意味着信息一旦上链就无法删除,甚至合约代码都无法被更改。除此之外,合约的公开性、回调机制,每一个特点都可被利用,作为攻击手法,稍有不慎,轻则合约形同虚设,重则要面临企业机密泄露的风险。所以,在业务合约上链前,需要预先对合约的安全性、可维护性等方面作充分考虑。幸运的是,通过近些年Solidity语言的大量实践,开发者们不断提炼和总结,已经形成了一些"设计模式",来指导应对日常开发常见的问题。 + +## 智能合约设计模式概述 + +2019年,IEEE收录了维也纳大学一篇题为《Design Patterns For Smart Contracts In the Ethereum Ecosystem》的论文。这篇论文分析了那些火热的Solidity开源项目,结合以往的研究成果,整理出了18种设计模式。这些设计模式涵盖了安全性、可维护性、生命周期管理、鉴权等多个方面。 + +| 类型 | 模式 | +| ------------------ | ------------------------------------------------------------ | +| Security | 1. Checks-Effects-Interaction
2. Emergency Stop
3. Speed Bump
4. Rate Limit
5. Mutex
6. Balance Limit | +| Maintenance | 7. Data Segregation
8. Satellite
9. Contract Register
10. Contract Relay | +| Lifecycle | 11. Mortal
12. Automatic Deprecation | +| Authorization | 13. Ownership
14. Access Restriction | +| Action And Control | 15. Pull Payment
16. Commit And Reveal
17. State Machine
18. Oracle | + +接下来,本文将从这18种设计模式中选择最为通用常见的进行介绍,这些设计模式在实际开发经历中得到了大量检验。 + +## 安全性(Security) + +智能合约编写,首要考虑的就是安全性问题。在区块链世界中,恶意代码数不胜数。如果你的合约包含了跨合约调用,就要特别当心,要确认外部调用是否可信,尤其当其逻辑不为你所掌控的时候。如果缺乏防人之心,那些“居心叵测”的外部代码就可能将你的合约破坏殆尽。比如,外部调用可通过恶意回调,使代码被反复执行,从而破坏合约状态,这种攻击手法就是著名的Reentrance Attack(重入攻击)。这里,先引入一个重入攻击的小实验,以便让读者了解为什么外部调用可能导致合约被破坏,同时帮助更好地理解即将介绍的两种提升合约安全性的设计模式。 + +关于重入攻击,这里举个精简的例子。AddService合约是一个简单的计数器,每个外部合约可以调用AddService合约的addByOne来将字段_count加一,同时通过require来强制要求每个外部合约最多只能调用一次该函数。这样,_count字段就精确的反应出AddService被多少合约调用过。在addByOne函数的末尾,AddService会调用外部合约的回调函数notify。AddService的代码如下: + +``` +contract AddService{ + + uint private _count; + mapping(address=>bool) private _adders; + + function addByOne() public { + //强制要求每个地址只能调用一次 + require(_adders[msg.sender] == false, "You have added already"); + //计数 + _count++; + //调用账户的回调函数 + AdderInterface adder = AdderInterface(msg.sender); + adder.notify(); + //将地址加入已调用集合 + _adders[msg.sender] = true; + } +} + +contract AdderInterface{ + function notify() public; +} +``` + +如果AddService如此部署,恶意攻击者可以轻易控制AddService中的_count数目,使该计数器完全失效。攻击者只需要部署一个合约BadAdder,就可通过它来调用AddService,就可以达到攻击效果。BadAdder合约如下: + +``` + +contract BadAdder is AdderInterface{ + + AddService private _addService = //...; + uint private _calls; + + //回调 + function notify() public{ + if(_calls > 5){ + return; + } + _calls++; + //Attention !!!!!! + _addService.addByOne(); + } + + function doAdd() public{ + _addService.addByOne(); + } +} +``` + +BadAdder在回调函数notify中,反过来继续调用AddService,由于AddService糟糕的代码设计,require条件检测语句被轻松绕过,攻击者可以直击_count字段,使其被任意地重复添加。攻击过程的时序图如下: + +![](../../../../images/articles/solidity_design_patterns/IMG_5450.PNG) + +在这个例子中,AddService难以获知调用者的回调逻辑,但依然轻信了这个外部调用,而攻击者利用了AddService糟糕的代码编排,导致悲剧的发生。本例子中去除了实际的业务意义,攻击后果仅仅是_count值失真。真正的重入攻击,可对业务造成严重后果。比如在统计投票数目是,投票数会被改得面目全非。打铁还需自身硬,如果想屏蔽这类攻击,合约需要遵循良好的编码模式,下面将介绍两个可有效解除此类攻击的设计模式。 + +### Checks-Effects-Interaction - 保证状态完整,再做外部调用 + +该模式是编码风格约束,可有效避免重放攻击。通常情况下,一个函数可能包含三个部分: + +- Checks:参数验证 +- Effects:修改合约状态 +- Interaction:外部交互 + +这个模式要求合约按照Checks-Effects-Interaction的顺序来组织代码。它的好处在于进行外部调用之前,Checks-Effects已完成合约自身状态所有相关工作,使得状态完整、逻辑自洽,这样外部调用就无法利用不完整的状态进行攻击了。回顾前文的AddService合约,并没有遵循这个规则,在自身状态没有更新完的情况下去调用了外部代码,外部代码自然可以横插一刀,让_adders[msg.sender]=true永久不被调用,从而使require语句失效。我们以checks-effects-interaction的角度审阅原来的代码: + +``` + //Checks + require(_adders[msg.sender] == false, "You have added already"); + //Effects + _count++; + //Interaction + AdderInterface adder = AdderInterface(msg.sender); + adder.notify(); + //Effects + _adders[msg.sender] = true; +``` + +只要稍微调整顺序,满足Checks-Effects-Interaction模式,悲剧就得以避免: + +``` + //Checks + require(_adders[msg.sender] == false, "You have added already"); + //Effects + _count++; + _adders[msg.sender] = true; + //Interaction + AdderInterface adder = AdderInterface(msg.sender); + adder.notify(); +``` + +由于_adders映射已经修改完毕,当恶意攻击者想递归地调用addByOne,require这道防线就会起到作用,将恶意调用拦截在外。虽然该模式并非解决重入攻击的唯一方式,但依然推荐开发者遵循。 + +### Mutex - 禁止递归 + +Mutex模式也是解决重入攻击的有效方式。它通过提供一个简单的修饰符来防止函数被递归调用: + +``` +contract Mutex { + bool locked; + modifier noReentrancy() { + //防止递归 + require(!locked, "Reentrancy detected"); + locked = true; + _; + locked = false; + } + + //调用该函数将会抛出Reentrancy detected错误 + function some() public noReentrancy{ + some(); + } +} +``` + +在这个例子中,调用some函数前会先运行noReentrancy修饰符,将locked变量赋值为true。如果此时又递归地调用了some,修饰符的逻辑会再次激活,由于此时的locked属性已为true,修饰符的第一行代码会抛出错误。 + +## **可维护性(Maintenance)** + +在区块链中,合约一旦部署,就无法更改。当合约出现了bug,通常要面对以下问题: + +1. 合约上已有的业务数据怎么处理? +2. 怎么尽可能减少升级影响范围,让其余功能不受影响? +3. 依赖它的其他合约该怎么办? + +回顾面向对象编程,其核心思想是将变化的事物和不变的事物相分离,以阻隔变化在系统中的传播。所以,设计良好的代码通常都组织得高度模块化、高内聚低耦合。利用这个经典的思想可解决上面的问题。 + +### Data segregation - 数据与逻辑相分离 + +了解该设计模式之前,先看看下面这个合约代码: + +``` +contract Computer{ + + uint private _data; + + function setData(uint data) public { + _data = data; + } + + function compute() public view returns(uint){ + return _data * 10; + } +} +``` + +此合约包含两个能力,一个是存储数据(setData函数),另一个是运用数据进行计算(compute函数)。如果合约部署一段时间后,发现compute写错了,比如不应是乘以10,而要乘以20,就会引出前文如何升级合约的问题。这时,可以部署一个新合约,并尝试将已有数据迁移到新的合约上,但这是一个很重的操作,一方面要编写迁移工具的代码,另一方面原先的数据完全作废,空占着宝贵的节点存储资源。 + +所以,预先在编程时进行模块化十分必要。如果我们将"数据"看成不变的事物,将"逻辑"看成可能改变的事物,就可以完美避开上述问题。Data Segregation(意为数据分离)模式很好地实现了这一想法。该模式要求一个业务合约和一个数据合约:数据合约只管数据存取,这部分是稳定的;而业务合约则通过数据合约来完成逻辑操作。 + +结合前面的例子,我们将数据读写操作专门转移到一个合约DataRepository中: + +``` +contract DataRepository{ + + uint private _data; + + function setData(uint data) public { + _data = data; + } + + function getData() public view returns(uint){ + return _data; + } +} +``` + +计算功能被单独放入一个业务合约中: + +``` +contract Computer{ + DataRepository private _dataRepository; + constructor(address addr){ + _dataRepository =DataRepository(addr); + } + + //业务代码 + function compute() public view returns(uint){ + return _dataRepository.getData() * 10; + } +} +``` + +这样,只要数据合约是稳定的,业务合约的升级就很轻量化了。比如,当我要把Computer换成ComputerV2时,原先的数据依然可以被复用。 + +### Satellite - 分解合约功能 + +一个复杂的合约通常由许多功能构成,如果这些功能全部耦合在一个合约中,当某一个功能需要更新时,就不得不去部署整个合约,正常的功能都会受到波及。Satellite模式运用单一职责原则解决上述问题,提倡将合约子功能放到子合约里,每个子合约(也称为卫星合约)只对应一个功能。当某个子功能需要修改,只要创建新的子合约,并将其地址更新到主合约里即可,其余功能不受影响。 + +举个简单的例子,下面这个合约的setVariable功能是将输入数据进行计算(compute函数),并将计算结果存入合约状态_variable: + +``` +contract Base { + uint public _variable; + + function setVariable(uint data) public { + _variable = compute(data); + } + + //计算 + function compute(uint a) internal returns(uint){ + return a * 10; + } +} +``` + +如果部署后,发现compute函数写错,希望乘以的系数是20,就要重新部署整个合约。但如果一开始按照Satellite模式操作,则只需部署相应的子合约。 + +首先,我们先将compute函数剥离到一个单独的卫星合约中去: + +``` +contract Satellite { + function compute(uint a) public returns(uint){ + return a * 10; + } +} +``` + +然后,主合约依赖该子合约完成setVariable: + +``` +contract Base { + uint public _variable; + + function setVariable(uint data) public { + _variable = _satellite.compute(data); + } + + Satellite _satellite; + //更新子合约(卫星合约) + function updateSatellite(address addr) public { + _satellite = Satellite(addr); + } +} +``` + +这样,当我们需要修改compute函数时,只需部署这样一个新合约,并将它的地址传入到Base.updateSatellite即可: + +``` +contract Satellite2{ + function compute(uint a) public returns(uint){ + return a * 20; + } +} +``` + +### Contract Registry - 跟踪最新合约 + +在Satellite模式中,如果一个主合约依赖子合约,在子合约升级时,主合约需要更新对子合约的地址引用,这通过updateXXX来完成,例如前文的updateSatellite函数。这类接口属于维护性接口,与实际业务无关,过多暴露此类接口会影响主合约美观,让调用者的体验大打折扣。Contract Registry设计模式优雅地解决了这个问题。在该设计模式下,会有一个专门的合约Registry跟踪子合约的每次升级情况,主合约可通过查询此Registyr合约取得最新的子合约地址。卫星合约重新部署后,新地址通过Registry.update函数来更新。 + +``` +contract Registry{ + + address _current; + address[] _previous; + + //子合约升级了,就通过update函数更新地址 + function update(address newAddress) public{ + if(newAddress != _current){ + _previous.push(_current); + _current = newAddress; + } + } + + function getCurrent() public view returns(address){ + return _current; + } +} +``` + +主合约依赖于Registry获取最新的卫星合约地址。 + +``` +contract Base { + uint public _variable; + + function setVariable(uint data) public { + Satellite satellite = Satellite(_registry.getCurrent()); + _variable = satellite.compute(data); + } + + Registry private _registry = //...; +} +``` + +### **Contract Relay - 代理调用最新合约** + +该设计模式所解决问题与Contract Registry一样,即主合约无需暴露维护性接口就可调用最新子合约。该模式下,存在一个代理合约,和子合约享有相同接口,负责将主合约的调用请求传递给真正的子合约。卫星合约重新部署后,新地址通过SatelliteProxy.update函数来更新。 + +``` +contract SatelliteProxy{ + address _current; + function compute(uint a) public returns(uint){ + Satellite satellite = Satellite(_current); + return satellite.compute(a); + } + + //子合约升级了,就通过update函数更新地址 + function update(address newAddress) public{ + if(newAddress != _current){ + _current = newAddress; + } + } +} + + +contract Satellite { + function compute(uint a) public returns(uint){ + return a * 10; + } +} +``` + +主合约依赖于SatelliteProxy: + +``` +contract Base { + uint public _variable; + + function setVariable(uint data) public { + _variable = _proxy.compute(data); + } + SatelliteProxy private _proxy = //...; +} +``` + + + +## 生命周期(Lifecycle) + +在默认情况下,一个合约的生命周期近乎无限——除非赖以生存的区块链被消灭。但很多时候,用户希望缩短合约的生命周期。这一节将介绍两个简单模式提前终结合约生命。 + +### Mortal - 允许合约自毁 + +字节码中有一个selfdestruct指令,用于销毁合约。所以只需要暴露出自毁接口即可: + +``` +contract Mortal{ + + //自毁 + function destroy() public{ + selfdestruct(msg.sender); + } +} +``` + +### Automatic Deprecation - 允许合约自动停止服务 + +如果你希望一个合约在指定期限后停止服务,而不需要人工介入,可以使用Automatic Deprecation模式。 + +``` +contract AutoDeprecated{ + + uint private _deadline; + + function setDeadline(uint time) public { + _deadline = time; + } + + modifier notExpired(){ + require(now <= _deadline); + _; + } + + function service() public notExpired{ + //some code + } +} +``` + +当用户调用service,notExpired修饰符会先进行日期检测,这样,一旦过了特定时间,调用就会因过期而被拦截在notExpired层。 + +## 权限(Authorization) + +前文中有许多管理性接口,这些接口如果任何人都可调用,会造成严重后果,例如上文中的自毁函数,假设任何人都能访问,其严重性不言而喻。所以,一套保证只有特定账户能够访问的权限控制设计模式显得尤为重要。 + +### Ownership + +对于权限的管控,可以采用Ownership模式。该模式保证了只有合约的拥有者才能调用某些函数。首先需要有一个Owned合约: + +``` +contract Owned{ + + address public _owner; + + constructor() { + _owner = msg.sender; + } + + modifier onlyOwner(){ + require(_owner == msg.sender); + _; + } +} +``` + +如果一个业务合约,希望某个函数只由拥有者调用,该怎么办呢?如下: + +``` +contract Biz is Owned{ + function manage() public onlyOwner{ + } +} +``` + +这样,当调用manage函数时,onlyOwner修饰符就会先运行并检测调用者是否与合约拥有者一致,从而将无授权的调用拦截在外。 + +## 行为控制(Action And Control) + +这类模式一般针对具体场景使用,这节将主要介绍基于隐私的编码模式和与链外数据交互的设计模式。 + +### Commit - Reveal - 延迟秘密泄露 + +链上数据都是公开透明的,一旦某些隐私数据上链,任何人都可看到,并且再也无法撤回。Commit And Reveal模式允许用户将要保护的数据转换为不可识别数据,比如一串哈希值,直到某个时刻再揭示哈希值的含义,展露真正的原值。以投票场景举例,假设需要在所有参与者都完成投票后再揭示投票内容,以防这期间参与者受票数影响。我们可以看看,在这个场景下所用到的具体代码: + +``` +contract CommitReveal { + + struct Commit { + string choice; + string secret; + uint status; + } + + mapping(address => mapping(bytes32 => Commit)) public userCommits; + event LogCommit(bytes32, address); + event LogReveal(bytes32, address, string, string); + + function commit(bytes32 commit) public { + Commit storage userCommit = userCommits[msg.sender][commit]; + require(userCommit.status == 0); + userCommit.status = 1; // committed + emit LogCommit(commit, msg.sender); + } + + function reveal(string choice, string secret, bytes32 commit) public { + Commit storage userCommit = userCommits[msg.sender][commit]; + require(userCommit.status == 1); + require(commit == keccak256(choice, secret)); + userCommit.choice = choice; + userCommit.secret = secret; + userCommit.status = 2; + emit LogReveal(commit, msg.sender, choice, secret); + } +} +``` + +### Oracle - 读取链外数据 + +目前,链上的智能合约生态相对封闭,无法获取链外数据,影响了智能合约的应用范围。链外数据可极大扩展智能合约的使用范围,比如在保险业中,如果智能合约可读取到现实发生的意外事件,就可自动执行理赔。获取外部数据会通过名为Oracle的链外数据层来执行。当业务方的合约尝试获取外部数据时,会先将查询请求存入到某个Oracle专用合约内;Oracle会监听该合约,读取到这个查询请求后,执行查询,并调用业务合约响应接口使合约获取结果。 + +![](../../../../images/articles/solidity_design_patterns/IMG_5451.PNG) + +下面定义了一个Oracle合约: + +``` +contract Oracle { + address oracleSource = 0x123; // known source + + struct Request { + bytes data; + function(bytes memory) external callback; +} + + Request[] requests; + event NewRequest(uint); + modifier onlyByOracle() { + require(msg.sender == oracleSource); _; + } + + function query(bytes data, function(bytes memory) external callback) public { + requests.push(Request(data, callback)); + emit NewRequest(requests.length - 1); + } + + //回调函数,由Oracle调用 + function reply(uint requestID, bytes response) public onlyByOracle() { + requests[requestID].callback(response); + } +} +``` + +业务方合约与Oracle合约进行交互: + +``` +contract BizContract { + Oracle _oracle; + + constructor(address oracle){ + _oracle = Oracle(oracle); + } + + modifier onlyByOracle() { + require(msg.sender == address(_oracle)); + _; + } + + function updateExchangeRate() { + _oracle.query("USD", this.oracleResponse); + } + + //回调函数,用于读取响应 + function oracleResponse(bytes response) onlyByOracle { + // use the data + } +} +``` + +## 总结 + +本文的介绍涵盖了安全性、可维护性等多种设计模式,其中,有些偏原则性,如Security和Maintenance设计模式;有些是偏实践,例如Authrization,Action And Control。这些设计模式,尤其实践类,并不能涵盖所有场景。随着对实际业务的深入探索,会遇到越来越多的特定场景与问题,开发者可对这些模式提炼、升华,以沉淀出针对某类问题的设计模式。上述设计模式是程序员的有力武器,掌握它们可应对许多已知场景,但更应掌握提炼设计模式的方法,这样才能从容应对未知领域,这个过程离不开对业务的深入探索,对软件工程原则的深入理解。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_design_programming_strategy.md b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_design_programming_strategy.md new file mode 100644 index 000000000..81abc76a4 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_design_programming_strategy.md @@ -0,0 +1,552 @@ +# 智能合约编写之Solidity的编程攻略 + +作者:毛嘉宇|FISCO BCOS 核心开发者 + +## **前 言** + +作为一名搬砖多年的资深码农,刚开始接触Solidity便感觉无从下手:昂贵的计算和存储资源、简陋的语法特性、令人抓狂的debug体验、近乎贫瘠的类库支持、一言不合就插入汇编语句……让人不禁怀疑,这都已经过了9012年了,居然还有这种反人类的语言?对于习惯使用各类日益“傻瓜化”的类库和自动化高级框架的码农而言,学习Solidity的过程就是一场一言难尽的劝退之旅。但随着对区块链底层技术的深入学习,大家会慢慢理解作为运行在“The World Machine”上的Solidity语言,必须要严格遵循的设计原则以及权衡后必须付出的代价。正如黑客帝国中那句著名的slogan:“Welcome to the dessert of the real”,在恶劣艰苦的环境面前,最重要的是学会如何适应环境、保存自身并快速进化。本文总结了一些Solidity编程的攻略,期待各位读者不吝分享交流,达到抛砖引玉之效。 + +## 上链的原则 + +**“如无必要,勿增实体”。** + +基于区块链技术及智能合约发展现状,数据的上链需遵循以下原则: + +- 需要分布式协作的重要数据才上链,非必需数据不上链; +- 敏感数据脱敏或加密后上链(视数据保密程度选择符合隐私保护安全等级要求的加密算法); +- 链上验证,链下授权。 + +在使用区块链时,开发者不需要将所有业务和数据都放到链上。相反,“好钢用在刀刃上”,智能合约更适合被用在分布式协作的业务场景中。 + +## 精简函数变量 + +如果在智能合约中定义了复杂的逻辑,特别是合约内定义了复杂的函数入参、变量和返回值,就会在编译的时候碰到以下错误: + +``` +Compiler error: Stack too deep, try removing local variables. +``` + +这也是社区中的高频技术问题之一。造成这个问题的原因就是EVM所设计用于最大的栈深度为16。所有的计算都在一个栈内执行,对栈的访问只限于其顶端,限制方式为:允许拷贝最顶端16个元素中的一个到栈顶,或者将栈顶元素和下面16个元素中的一个交换。所有其他操作都只能取最顶的几个元素,运算后,把结果压入栈顶。当然可以把栈上的元素放到存储或内存中。但无法只访问栈上指定深度的那个元素,除非先从栈顶移除其他元素。如果一个合约中,入参、返回值、内部变量的大小超过了16个,显然就超出了栈的最大深度。因此,我们可以使用结构体或数组来封装入参或返回值,达到减少栈顶元素使用的目的,从而避免此错误。例如以下代码,通过使用bytes数组来封装了原本16个bytes变量。 + +``` +function doBiz(bytes[] paras) public { + require(paras.length >= 16); + // do something +} +``` + +## 保证参数和行为符合预期 + +心怀“Code is law”的远大理想,极客们设计和创造了区块链的智能合约。在联盟链中,不同的参与者可以使用智能合约来定义和书写一部分业务或交互的逻辑,以完成部分社会或商业活动。 + +相比于传统软件开发,智能合约对函数参数和行为的安全性要求更为严格。在联盟链中提供了身份实名和CA证书等机制,可以有效定位和监管所有参与者。不过,智能合约缺乏对漏洞和攻击的事前干预机制。正所谓字字珠玑,如果不严谨地检查智能合约输入参数或行为,有可能会触发一些意想不到的bug。 + +因此,在编写智能合约时,一定要注意对合约参数和行为的检查,尤其是那些对外部开放的合约函数。Solidity提供了require、revert、assert等关键字来进行异常的检测和处理。一旦检测并发现错误,整个函数调用会被回滚,所有状态修改都会被回退,就像从未调用过函数一样。以下分别使用了三个关键字,实现了相同的语义。 + +``` +require(_data == data, "require data is valid"); + +if(_data != data) { revert("require data is valid"); } + +assert(_data == data); +``` + +不过,这三个关键字一般适用于不同的使用场景: + +- require:最常用的检测关键字,用来验证输入参数和调用函数结果是否合法。 +- revert:适用在某个分支判断的场景下。 +- assert: 检查结果是否正确、合法,一般用于函数结尾。 + +在一个合约的函数中,可以使用函数修饰器来抽象部分参数和条件的检查。在函数体内,可以对运行状态使用if-else等判断语句进行检查,对异常的分支使用revert回退。在函数运行结束前,可以使用assert对执行结果或中间状态进行断言检查。在实践中,推荐使用require关键字,并将条件检查移到函数修饰器中去;这样可以让函数的职责更为单一,更专注到业务逻辑中。同时,函数修饰器等条件代码也更容易被复用,合约也会更加安全、层次化。 + +在本文中,我们以一个水果店库存管理系统为例,设计一个水果超市的合约。这个合约只包含了对店内所有水果品类和库存数量的管理,setFruitStock函数提供了对应水果库存设置的函数。在这个合约中,我们需要检查传入的参数,即水果名称不能为空。 + +``` +pragma solidity ^0.4.25; + +contract FruitStore { + mapping(bytes => uint) _fruitStock; + modifier validFruitName(bytes fruitName) { + require(fruitName.length > 0, "fruite name is invalid!"); + _; + } + function setFruitStock(bytes fruitName, uint stock) validFruitName(fruitName) external { + _fruitStock[fruitName] = stock; + } +} +``` + +如上所述,我们添加了函数执行前的参数检查的函数修饰器。同理,通过使用函数执行前和函数执行后检查的函数修饰器,可以保证智能合约更加安全、清晰。智能合约的编写需要设置严格的前置和后置函数检查,来保证其安全性。 + +## 严控函数的执行权限 + +如果说智能合约的参数和行为检测提供了静态的合约安全措施,那么合约权限控制的模式则提供了动态访问行为的控制。由于智能合约是发布到区块链上,所有数据和函数对所有参与者都是公开透明的,任一节点参与者都可发起交易,无法保证合约的隐私。因此,合约发布者必须对函数设计严格的访问限制机制。Solidity提供了函数可见性修饰符、修饰器等语法,灵活地使用这些语法,可帮助构建起合法授权、受控调用的智能合约系统。还是以刚才的水果合约为例。现在getStock提供了查询具体水果库存数量的函数。 + +``` +pragma solidity ^0.4.25; + +contract FruitStore { + mapping(bytes => uint) _fruitStock; + modifier validFruitName(bytes fruitName) { + require(fruitName.length > 0, "fruite name is invalid!"); + _; + } + function getStock(bytes fruit) external view returns(uint) { + return _fruitStock[fruit]; + } + function setFruitStock(bytes fruitName, uint stock) validFruitName(fruitName) external { + _fruitStock[fruitName] = stock; + } +} +``` + +水果店老板将这个合约发布到了链上。但是,发布之后,setFruitStock函数可被任何其他联盟链的参与者调用。虽然联盟链的参与者是实名认证且可事后追责;但一旦有恶意攻击者对水果店发起攻击,调用setFruitStock函数就能任意修改水果库存,甚至将所有水果库存清零,这将对水果店正常经营管理产生严重后果。因此,设置某些预防和授权的措施很必要:对于修改库存的函数setFruitStock,可在函数执行前对调用者进行鉴权。类似的,这些检查可能会被多个修改数据的函数复用,使用一个onlyOwner的修饰器就可以抽象此检查。owner字段代表了合约的所有者,会在合约构造函数中被初始化。使用public修饰getter查询函数,就可以通过_owner()函数查询合约的所有者。 + +``` +contract FruitStore { + address public _owner; + mapping(bytes => uint) _fruitStock; + + constructor() public { + _owner = msg.sender; + } + + modifier validFruitName(bytes fruitName) { + require(fruitName.length > 0, "fruite name is invalid!"); + _; + } + // 鉴权函数修饰器 + modifier onlyOwner() { + require(msg.sender == _owner, "Auth: only owner is authorized."); + _; + } + function getStock(bytes fruit) external view returns(uint) { + return _fruitStock[fruit]; + } + // 添加了onlyOwner修饰器 + function setFruitStock(bytes fruitName, uint stock) + onlyOwner validFruitName(fruitName) external { + _fruitStock[fruitName] = stock; + } +} +``` + +这样一来,我们可以将相应的函数调用权限检查封装到修饰器中,智能合约会自动发起对调用者身份验证检查,并且只允许合约部署者来调用setFruitStock函数,以此保证合约函数向指定调用者开放。 + +## 抽象通用的业务逻辑 + +分析上述FruitStore合约,我们发现合约里似乎混入了奇怪的东西。参考单一职责的编程原则,水果店库存管理合约多了上述函数功能检查的逻辑,使合约无法将所有代码专注在自身业务逻辑中。对此,我们可以抽象出可复用的功能,利用Solidity的继承机制继承最终抽象的合约。基于上述FruitStore合约,可抽象出一个BasicAuth合约,此合约包含之前onlyOwner的修饰器和相关功能接口。 + +``` +contract BasicAuth { + address public _owner; + + constructor() public { + _owner = msg.sender; + } + + function setOwner(address owner) + public + onlyOwner +{ + _owner = owner; + } + + modifier onlyOwner() { + require(msg.sender == _owner, "BasicAuth: only owner is authorized."); + _; + } +} +``` + +FruitStore可以复用这个修饰器,并将合约代码收敛到自身业务逻辑中。 + +``` +import "./BasicAuth.sol"; + +contract FruitStore is BasicAuth { + mapping(bytes => uint) _fruitStock; + + function setFruitStock(bytes fruitName, uint stock) + onlyOwner validFruitName(fruitName) external { + _fruitStock[fruitName] = stock; + } +} +``` + +这样一来,FruitStore的逻辑被大大简化,合约代码更精简、聚焦和清晰。 + +## 预防私钥的丢失 + +在区块链中调用合约函数的方式有两种:内部调用和外部调用。出于隐私保护和权限控制,业务合约会定义一个合约所有者。假设用户A部署了FruitStore合约,那上述合约owner就是部署者A的外部账户地址。这个地址由外部账户的私钥计算生成。但是,在现实世界中,私钥泄露、丢失的现象比比皆是。一个商用区块链DAPP需要严肃考虑私钥的替换和重置等问题。这个问题最为简单直观的解决方法是添加一个备用私钥。这个备用私钥可支持权限合约修改owner的操作,代码如下: + +``` +ontract BasicAuth { + address public _owner; + address public _bakOwner; + + constructor(address bakOwner) public { + _owner = msg.sender; + _bakOwner = bakOwner; + } + + function setOwner(address owner) + public + canSetOwner +{ + _owner = owner; + } + + function setBakOwner(address owner) + public + canSetOwner +{ + _bakOwner = owner; + } + + // ... + + modifier isAuthorized() { + require(msg.sender == _owner || msg.sender == _bakOwner, "BasicAuth: only owner or back owner is authorized."); + _; + } +} +``` + +这样,当发现私钥丢失或泄露时,我们可以使用备用外部账户调用setOwner重置账号,恢复、保障业务正常运行。 + +## 面向接口编程 + +上述私钥备份理念值得推崇,不过其具体实现方式存在一定局限性,在很多业务场景下,显得过于简单粗暴。对于实际的商业场景,私钥的备份和保存需要考虑的维度和因素要复杂得多,对应密钥备份策略也更多元化。以水果店为例,有的连锁水果店可能希望通过品牌总部来管理私钥,也有的可能通过社交关系重置帐号,还有的可能会绑定一个社交平台的管理帐号……面向接口编程,而不依赖具体的实现细节,可以有效规避这个问题。例如,我们利用接口功能首先定义一个判断权限的抽象接口: + +``` +contract Authority { + function canCall( + address src, address dst, bytes4 sig + ) public view returns (bool); +} +``` + +这个canCall函数涵盖了函数调用者地址、目标调用合约的地址和函数签名,函数返回一个bool的结果。这包含了合约鉴权所有必要的参数。我们可进一步修改之前的权限管理合约,并在合约中依赖Authority接口,当鉴权时,修饰器会调用接口中的抽象方法: + +``` +contract BasicAuth { + Authority public _authority; + + function setAuthority(Authority authority) + public + auth + { + _authority = authority; + } + + modifier isAuthorized() { + require(auth(msg.sender, msg.sig), "BasicAuth: only owner or back owner is authorized."); + _; + } + + function auth(address src, bytes4 sig) public view returns (bool) { + if (src == address(this)) { + return true; + } else if (src == _owner) { + return true; + } else if (_authority == Authority(0)) { + return false; + } else { + return _authority.canCall(src, this, sig); + } + } +} +``` + +这样,我们只需要灵活定义实现了canCall接口的合约,在合约的canCall方法中定义具体判断逻辑。而业务合约,例如FruitStore继承BasicAuth合约,在创建时只要传入具体的实现合约,就可以实现不同判断逻辑。 + +## 合理预留事件 + +迄今为止,我们已实现强大灵活的权限管理机制,只有预先授权的外部账户才能修改合约owner属性。不过,仅通过上述合约代码,我们无法记录和查询修改、调用函数的历史记录和明细信息。而这样的需求在实际业务场景中比比皆是。比如,FruitStore水果店需要通过查询历史库存修改记录,计算出不同季节的畅销与滞销水果。 + +一种方法是依托链下维护独立的台账机制。不过,这种方法存在很多问题:保持链下台账和链上记录一致的成本开销非常高;同时,智能合约面向链上所有参与者开放,一旦其他参与者调用了合约函数,相关交易信息就存在不能同步的风险。针对此类场景,Solidity提供了event语法。event不仅具备可供SDK监听回调的机制,还能用较低的gas成本将事件参数等信息完整记录、保存到区块中。FISCO BCOS社区中,也有WEBASE-Collect-Bee这样的工具,在事后实现区块历史事件信息的完整导出。 + +[WEBASE-Collect-Bee工具参考](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Collect-Bee/index.html) + +基于上述权限管理合约,我们可以定义相应的修改权限事件,其他事件以此类推。 + +``` +event LogSetAuthority (Authority indexed authority, address indexed from); +} +``` + +接下来,可以调用相应的事件: + +``` +function setAuthority(Authority authority) + public + auth +{ + _authority = authority; + emit LogSetAuthority(authority, msg.sender); + } +``` + +当setAuthority函数被调用时,会同时触发LogSetAuthority,将事件中定义的Authority合约地址以及调用者地址记录到区块链交易回执中。当通过控制台调用setAuthority方法时,对应事件LogSetAuthority也会被打印出来。基于WEBASE-Collect-Bee,我们可以导出所有该函数的历史信息到数据库中。也可基于WEBASE-Collect-Bee进行二次开发,实现复杂的数据查询、大数据分析和数据可视化等功能。 + +## 遵循安全编程规范 + +每一门语言都有其相应的编码规范,我们需要尽可能严格地遵循Solidity官方编程风格指南,使代码更利于阅读、理解和维护,有效地减少合约的bug数量。[Solidity官方编程风格指南参考](https://solidity.readthedocs.io/en/latest/style-guide.html)。除了编程规范,业界也总结了很多安全编程指南,例如重入漏洞、数据结构溢出、随机数误区、构造函数失控、为初始化的存储指针等等。重视和防范此类风险,采用业界推荐的安全编程规范至关重要,例如[Solidity官方安全编程指南](https://solidity.readthedocs.io/en/latest/security-considerations.html)。同时,在合约发布上线后,还需要注意关注、订阅Solidity社区内安全组织或机构发布的各类安全漏洞、攻击手法,一旦出现问题,及时做到亡羊补牢。 + +对于重要的智能合约,有必要引入审计。现有的审计包括了人工审计、机器审计等方法,通过代码分析、规则验证、语义验证和形式化验证等方法保证合约安全性。虽然本文通篇都在强调,模块化和重用被严格审查并广泛验证的智能合约是最佳的实践策略。但在实际开发过程,这种假设过于理想化,每个项目或多或少都会引入新的代码,甚至从零开始。不过,我们仍然可以视代码的复用程度进行审计分级,显式地标注出引用的代码,将审计和检查的重点放在新代码上,以节省审计成本。 + +最后,“前事不忘后事之师”,我们需要不断总结和学习前人的最佳实践,动态和可持续地提升编码工程水平,并不断应用到具体实践中。 + +### 积累和复用成熟的代码 + +前文面向接口编程中的思想可降低代码耦合,使合约更容易扩展、利于维护。在遵循这条规则之外,还有另外一条忠告:尽可能地复用现有代码库。智能合约发布后难以修改或撤回,而且发布到公开透明的区块链环境上,就意味着一旦出现bug造成的损失和风险更甚于传统软件。因此,复用一些更好更安全的轮子远胜过重新造轮子。在开源社区中,已经存在大量的业务合约和库可供使用,例如OpenZeppelin等优秀的库。如果在开源世界和过去团队的代码库里找不到合适的可复用代码,建议在编写新代码时尽可能地测试和完善代码设计。此外,还要定期分析和审查历史合约代码,将其模板化,以便于扩展和复用。 + +例如,针对上面的BasicAuth,参考防火墙经典的ACL(Access Control List)设计,我们可以进一步地继承和扩展BasicAuth,抽象出ACL合约控制的实现。 + +``` +contract AclGuard is BasicAuth { + bytes4 constant public ANY_SIG = bytes4(uint(-1)); + address constant public ANY_ADDRESS = address(bytes20(uint(-1))); + mapping (address => mapping (address => mapping (bytes4 => bool))) _acl; + + function canCall( + address src, address dst, bytes4 sig +) public view returns (bool) { + return _acl[src][dst][sig] + || _acl[src][dst][ANY_SIG] + || _acl[src][ANY_ADDRESS][sig] + || _acl[src][ANY_ADDRESS][ANY_SIG] + || _acl[ANY_ADDRESS][dst][sig] + || _acl[ANY_ADDRESS][dst][ANY_SIG] + || _acl[ANY_ADDRESS][ANY_ADDRESS][sig] + || _acl[ANY_ADDRESS][ANY_ADDRESS][ANY_SIG]; + } + + function permit(address src, address dst, bytes4 sig) public onlyAuthorized { + _acl[src][dst][sig] = true; + emit LogPermit(src, dst, sig); + } + + function forbid(address src, address dst, bytes4 sig) public onlyAuthorized { + _acl[src][dst][sig] = false; + emit LogForbid(src, dst, sig); + } + + function permit(address src, address dst, string sig) external { + permit(src, dst, bytes4(keccak256(sig))); + } + + function forbid(address src, address dst, string sig) external { + forbid(src, dst, bytes4(keccak256(sig))); + } + + function permitAny(address src, address dst) external { + permit(src, dst, ANY_SIG); + } + + function forbidAny(address src, address dst) external { + forbid(src, dst, ANY_SIG); + } +} +``` + +在这个合约里,有调用者地址、被调用合约地址和函数签名三个主要参数。通过配置ACL的访问策略,可以精确地定义和控制函数访问行为及权限。合约内置了ANY的常量,匹配任意函数,使访问粒度的控制更加便捷。这个模板合约实现了强大灵活的功能,足以满足所有类似权限控制场景的需求。 + +## 提升存储和计算的效率 + +迄今为止,在上述的推演过程中,更多的是对智能合约编程做加法。但相比传统软件环境,智能合约上的存储和计算资源更加宝贵。因此,如何对合约做减法也是用好Solidity的必修课程之一。 + +### 选取合适的变量类型 + +显式的问题可通过EVM编译器检测出来并报错;但大量的性能问题可能被隐藏在代码的细节中。Solidity提供了非常多精确的基础类型,这与传统的编程语言大相径庭。下面有几个关于Solidity基础类型的小技巧。在C语言中,可以用short\int\long按需定义整数类型,而到了Solidity,不仅区分int和uint,甚至还能定义uint的长度,比如uint8是一个字节,uint256是32个字节。这种设计告诫我们,能用uint8搞定的,绝对不要用uint16!几乎所有Solidity的基本类型,都能在声明时指定其大小。开发者一定要有效利用这一语法特性,编写代码时只要满足需求就尽可能选取小的变量类型。数据类型bytes32可存放 32 个(原始)字节,但除非数据是bytes32或bytes16这类定长的数据类型,否则更推荐使用长度可以变化的bytes。bytes类似byte[],但在外部函数中会自动压缩打包,更节省空间。如果变量内容是英文的,不需要采用UTF-8编码,在这里,推荐bytes而不是string。string默认采用UTF-8编码,所以相同字符串的存储成本会高很多。 + +### 紧凑状态变量打包 + +除了尽可能使用较小的数据类型来定义变量,有的时候,变量的排列顺序也非常重要,可能会影响到程序执行和存储效率。其中根本原因还是EVM,不管是EVM存储插槽(Storage Slot)还是栈,每个元素长度是一个字(256位,32字节)。分配存储时,所有变量(除了映射和动态数组等非静态类型)都会按声明顺序从位置0开始依次写下。在处理状态变量和结构体成员变量时,EVM会将多个元素打包到一个存储插槽中,从而将多个读或写合并到一次对存储的操作中。值得注意的是,使用小于32 字节的元素时,合约的gas使用量可能高于使用32字节元素时。这是因为EVM每次会操作32个字节,所以如果元素比32字节小,必须使用更多的操作才能将其大小缩减到所需。这也解释了Solidity中最常见的数据类型,例如int,uint,byte32,为何都刚好占用32个字节。所以,当合约或结构体声明多个状态变量时,能否合理地组合安排多个存储状态变量和结构体成员变量,使之占用更少的存储位置就十分重要。例如,在以下两个合约中,经过实际测试,Test1合约比Test2合约占用更少的存储和计算资源。 + +``` +contract Test1 { + //占据2个slot, "gasUsed":188873 + struct S { + bytes1 b1; + bytes31 b31; + bytes32 b32; + } + S s; + function f() public { + S memory tmp = S("a","b","c"); + s = tmp; + } +} + +contract Test2 { + //占据3个slot, "gasUsed":188937 + struct S { + bytes31 b31; + bytes32 b32; + bytes1 b1; + } + // …… +} +``` + +### 优化查询接口 + +查询接口的优化点很多,比如一定要在只负责查询的函数声明中添加view修饰符,否则查询函数会被当成交易打包并发送到共识队列,被全网执行并被记录在区块中;这将大大增加区块链的负担,占用宝贵的链上资源。再如,不要在智能合约中添加复杂的查询逻辑,因为任何复杂查询代码都会使整个合约变得更长更复杂。读者可使用上文提及的WeBASE数据导出组件,将链上数据导出到数据库中,在链下进行查询和分析。 + +### 缩减合约binary长度 + +开发者编写的Solidity代码会被编译为binary code,而部署智能合约的过程实际上就是通过一个transaction将binary code存储在链上,并取得专属于该合约的地址。缩减binary code的长度可节省网络传输、共识打包数据存储的开销。例如,在典型的存证业务场景中,每次客户存证都会新建一个存证合约,因此,应当尽可能地缩减binary code的长度。常见思路是裁剪不必要的逻辑,删掉冗余代码。特别是在复用代码时,可能引入一些非刚需代码。以上文ACL合约为例,支持控制合约函数粒度的权限。 + +``` +function canCall( + address src, address dst, bytes4 sig + ) public view returns (bool) { + return _acl[src][dst][sig] + || _acl[src][dst][ANY_SIG] + || _acl[src][ANY_ADDRESS][sig] + || _acl[src][ANY_ADDRESS][ANY_SIG] + || _acl[ANY_ADDRESS][dst][sig] + || _acl[ANY_ADDRESS][dst][ANY_SIG] + || _acl[ANY_ADDRESS][ANY_ADDRESS][sig] + || _acl[ANY_ADDRESS][ANY_ADDRESS][ANY_SIG]; + } +``` + +但在具体业务场景中,只需要控制合约访问者即可,通过删除相应代码,进一步简化使用逻辑。这样一来,对应合约的binary code长度会大大缩小。 + +``` +function canCall( + address src, address dst +) public view returns (bool) { + return _acl[src][dst] + || _acl[src][ANY_ADDRESS] + || _acl[ANY_ADDRESS][dst]; + } +``` + +另一种缩减binary code的思路是采用更紧凑的写法。经实测,采取如上短路原则的判断语句,其binary长度会比采用if-else语法的更短。同样,采用if-else的结构,也会比if-if-if的结构生成更短的binary code。最后,在对binary code长度有极致要求的场景中,应当尽可能避免在合约中新建合约,这会显著增加binary的长度。例如,某个合约中有如下的构造函数: + +``` +constructor() public { + // 在构造器内新建一个新对象 + _a = new A(); +} +``` + +我们可以采用在链下构造A对象,并基于address传输和固定校验的方式,来规避这一问题。 + +``` +constructor(address a) public { + A _a = A(a); + require(_a._owner == address(this)); +} +``` + +当然,这样也可能会使合约交互方式变得复杂。但其提供了有效缩短binary code长度的捷径,需要在具体业务场景中做权衡取舍。 + +## 保证合约可升级 + +### 经典的三层结构 + +通过前文方式,我们尽最大努力保持合约设计的灵活性;翻箱倒柜复用了轮子;也对发布合约进行全方位、无死角的测试。除此之外,随着业务需求变化,我们还将面临一个问题:如何保证合约平滑、顺利的升级?作为一门高级编程语言,Solidity支持运行一些复杂控制和计算逻辑,也支持存储智能合约运行后的状态和业务数据。不同于WEB开发等场景的应用-数据库分层架构,Solidity语言甚至没有抽象出一层独立的数据存储结构,数据都被保存到了合约中。但是,一旦合约需要升级,这种模式就会出现瓶颈。 + +在Solidity中,一旦合约部署发布后,其代码就无法被修改,只能通过发布新合约去改动代码。假如数据存储在老合约,就会出现所谓的“孤儿数据”问题,新合约将丢失之前运行的历史业务数据。这种情况,开发者可以考虑将老合约数据迁移到新合约中,但此操作至少存在两个问题: + +1. 迁移数据会加重区块链的负担,产生资源浪费和消耗,甚至引入安全问题; +2. 牵一发而动全身,会引入额外的迁移数据逻辑,增加合约复杂度。 + +一种更合理的方式是抽象一层独立的合约存储层。这个存储层只提供合约读写的最基本方法,而不包含任何业务逻辑。在这种模式中,存在三种合约角色: + +- 数据合约:在合约中保存数据,并提供数据的操作接口。 +- 管理合约:设置控制权限,保证只有控制合约才有权限修改数据合约。 +- 控制合约:真正需要对数据发起操作的合约。 + +具体的代码示例如下: + +##### 数据合约: + +``` +contract FruitStore is BasicAuth { + address _latestVersion; + mapping(bytes => uint) _fruitStock; + + modifier onlyLatestVersion() { + require(msg.sender == _latestVersion); + _; + } + + function upgradeVersion(address newVersion) public { + require(msg.sender == _owner); + _latestVersion = newVersion; + } + + function setFruitStock(bytes fruit, uint stock) onlyLatestVersion external { + _fruitStock[fruit] = stock; + } +} +``` + +##### 管理合约: + +``` +contract Admin is BasicAuth { + function upgradeContract(FruitStore fruitStore, address newController) isAuthorized external { + fruitStore.upgradeVersion(newController); + } +} +``` + +##### 控制合约: + +``` +contract FruitStoreController is BasicAuth { + function upgradeStock(bytes fruit, uint stock) isAuthorized external { + fruitStore.setFruitStock(fruit, stock); + } +} +``` + +一旦函数的控制逻辑需要变更,开发者只需修改FruitStoreController控制合约逻辑,部署一个新合约,然后使用管理合约Admin修改新的合约地址参数就可轻松完成合约升级。这种方法可消除合约升级中因业务控制逻辑改变而导致的数据迁移隐患。但天下没有免费的午餐,这种操作需要在可扩展性和复杂性之间需要做基本的权衡。首先,数据和逻辑的分离降低了运行性能。其次,进一步封装增加了程序复杂度。最后,越是复杂的合约越会增加潜在攻击面,简单的合约比复杂的合约更安全。 + +### 通用数据结构 + +到目前为止,还存在一个问题,假如数据合约中的数据结构本身需要升级怎么办? + +例如,在FruitStore中,原本只保存了库存信息,现在由于水果销售店生意发展壮大,一共开了十家分店,需要记录每家分店、每种水果的库存和售出信息。在这种情况下,一种解决方案是采用外部关联管理方式:创建一个新的ChainStore合约,在这个合约中创建一个mapping,建立分店名和FruitStore的关系。 + +此外,不同分店需要创建一个FruitStore的合约。为了记录新增的售出信息等数据,我们还需要新建一个合约来管理。假如在FruitStore中可预设一些不同类型的reserved字段,可帮助规避新建售出信息合约的开销,仍然复用FruitStore合约。但这种方式在最开始会增加存储开销。一种更好的思路是抽象一层更为底层和通用的存储结构。代码如下: + +``` +contract commonDB is BasicAuth { + mapping(bytes => uint) _uintMapping; + + function getUint(bytes key) external view returns(uint) { + return _uintMapping[key]; + } + + function setUint(bytes key, uint value) isAuthorized onlyLatestVersion external { + _uintMapping[key] = value; + } + +} +``` + +类似的,我们可加入所有数据类型变量,帮助commonDB应对和满足不同的数据类型存储需求。相应的控制合约可修改如下: + +``` +contract FruitStoreControllerV2 is BasicAuth { + function upgradeStock(bytes32 storeName, bytes32 fruit, uint stock) + isAuthorized external { + commonDB.setUint(sha256(storeName, fruit), stock); + uint result = commonDB.getUint(sha256(storeName, fruit)); + } +} +``` + +使用以上存储的设计模式,可显著提升合约数据存储灵活性,保证合约可升级。众所周知,Solidity既不支持数据库,使用代码作为存储entity,也无法提供更改schema的灵活性。但是,通过这种KV设计,可以使存储本身获得强大的可扩展性。总之,**没有一个策略是完美的,优秀的架构师善于权衡**。智能合约设计者需要充分了解各种方案的利弊,并基于实际情况选择合适的设计方案。 + +## 总结 + +文至于此,希望激起读者对在Solidity世界生存与进化的兴趣。“若有完美,必有谎言”,软件开发的世界没有银弹。本文行文过程就是从最简单的合约逐步完善和进化的过程。在Solidity编程世界中,生存与进化都离不开三个关键词:安全、可复用、高效。生命不息,进化不止。短短一篇小文难以穷尽所有生存进化之术,希望这三个关键词能帮助大家在Solidity的世界里翱翔畅游,并不断书写辉煌的故事和传说:) diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_operation_principle.md b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_operation_principle.md new file mode 100644 index 000000000..aa7c721c2 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_operation_principle.md @@ -0,0 +1,240 @@ +# 智能合约编写之Solidity运行原理 + +作者:储雨知|FISCO BCOS 核心开发者 + +## 引 言 + +作为一门面向智能合约的语言,Solidity与其他经典语言既有差异也有相似之处。一方面,服务于区块链的属性使其与其他语言存在差异。例如,合约的部署与调用均要经过区块链网络确认;执行成本需要被严格控制,以防止恶意代码消耗节点资源。另一方面,身为编程语言,Solidity的实现并未脱离经典语言,比如Solidity中包含类似栈、堆的设计,采用栈式虚拟机来进行字节码处理。本系列前几篇文章介绍了如何开发Solidity程序,为了让读者知其然更知其所以然,本文将进一步介绍Solidity的内部运行原理,聚焦于Solidity程序的生命周期和EVM工作机制。 + +## Solidity的生命周期 + +与其他语言一样,Solidity的代码生命周期离不开编译、部署、执行、销毁这四个阶段。下图整理展现了Solidity程序的完整生命周期: + +![](../../../../images/articles/solidity_operation_principle/IMG_5474.PNG) + +经编译后,Solidity文件会生成字节码。这是一种类似jvm字节码的代码。部署时,字节码与构造参数会被构建成交易,这笔交易会被打包到区块中,经由网络共识过程,最后在各区块链节点上构建合约,并将合约地址返还用户。当用户准备调用该合约上的函数时,调用请求同样也会经历交易、区块、共识的过程,最终在各节点上由EVM虚拟机来执行。 + +下面是一个示例程序,我们通过remix探索它的生命周期。 + +``` +pragma solidity ^0.4.25; + +contract Demo{ + uint private _state; + constructor(uint state){ + _state = state; + } + function set(uint state) public { + _state = state; + } +} +``` + +### 编译 + +源代码编译完后,可以通过ByteCode按钮得到它的二进制: + +``` +608060405234801561001057600080fd5b506040516020806100ed83398101806040528101908080519060200190929190505050806000819055505060a4806100496000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146044575b600080fd5b348015604f57600080fd5b50606c60048036038101908080359060200190929190505050606e565b005b80600081905550505600a165627a7a723058204ed906444cc4c9aabd183c52b2d486dfc5dea9801260c337185dad20e11f811b0029 +``` + +还可以得到对应的字节码(OpCode): + +``` +PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0xED DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP PUSH1 0xA4 DUP1 PUSH2 0x49 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3F JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x60FE47B1 EQ PUSH1 0x44 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH1 0x4F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x6C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x6E JUMP JUMPDEST STOP JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x4e 0xd9 MOD DIFFICULTY 0x4c 0xc4 0xc9 0xaa 0xbd XOR EXTCODECOPY MSTORE 0xb2 0xd4 DUP7 0xdf 0xc5 0xde 0xa9 DUP1 SLT PUSH1 0xC3 CALLDATACOPY XOR 0x5d 0xad KECCAK256 0xe1 0x1f DUP2 SHL STOP 0x29 +``` + +其中下述指令集为set函数对应的代码,后面会解释set函数如何运行。 + +``` +JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP STOP +``` + +### 部署 + +编译完后,即可在remix上对代码进行部署,构造参数传入0x123: + +![](../../../../images/articles/solidity_operation_principle/IMG_5475.PNG) + +部署成功后,可得到一条交易回执: + +![](../../../../images/articles/solidity_operation_principle/IMG_5476.PNG) + +点开input,可以看到具体的交易输入数据: + +![](../../../../images/articles/solidity_operation_principle/IMG_5477.PNG) + +上面这段数据中,标黄的部分正好是前文中的合约二进制;而标紫的部分,则对应了传入的构造参数0x123。这些都表明,合约部署以交易作为介质。结合区块链交易知识,我们可以还原出整个部署过程: + +- 客户端将部署请求(合约二进制,构造参数)作为交易的输入数据,以此构造出一笔交易 +- 交易经过rlp编码,然后由发送者进行私钥签名 +- 已签名的交易被推送到区块链上的节点 +- 区块链节点验证交易后,存入交易池 +- 轮到该节点出块时,打包交易构建区块,广播给其他节点 +- 其他节点验证区块并取得共识。不同区块链可能采用不同共识算法,FISCO BCOS中采用PBFT取得共识,这要求经历三阶段提交(pre-prepare,prepare, commit) +- 节点执行交易,结果就是智能合约Demo被创建,状态字段_state的存储空间被分配,并被初始化为0x123 + +### 执行 + +根据是否带有修饰符view,我们可将函数分为两类:调用与交易。由于在编译期就确定了调用不会引起合约状态的变更,故对于这类函数调用,节点直接提供查询即可,无需与其他区块链节点确认。而由于交易可能引起状态变更,故会在网络间确认。下面将以用户调用了set(0x10)为假设,看看具体的运行过程。首先,函数set没有配置view/pure修饰符,这意味着其可能更改合约状态。所以这个调用信息会被放入一笔交易,经由交易编码、交易签名、交易推送、交易池缓存、打包出块、网络共识等过程,最终被交由各节点的EVM执行。在EVM中,由SSTORE字节码将参数0xa存储到合约字段_state中。该字节码先从栈上拿到状态字段_state的地址与新值0xa,随后完成实际存储。下图展示了运行过程: + +![](../../../../images/articles/solidity_operation_principle/IMG_5478.PNG) + +这里仅粗略介绍了set(0xa)是如何运行,下节将进一步展开介绍EVM的工作机制以及数据存储机制。 + +### 销毁 + +由于合约上链后就无法篡改,所以合约生命可持续到底层区块链被彻底关停。若要手动销毁合约,可通过字节码selfdestruct。销毁合约也需要进行交易确认,在此不多作赘述。 + +## EVM原理 + +在前文中,我们介绍了Solidity程序的运行原理。经过交易确认后,最终由EVM执行字节码。对EVM,上文只是一笔带过,这一节将具体介绍其工作机制。 + +### 运行原理 + +EVM是栈式虚拟机,其核心特征就是所有操作数都会被存储在栈上。下面我们将通过一段简单的Solidity语句代码看看其运行原理: + +``` +uint a = 1; +uint b = 2; +uint c = a + b; +``` + +这段代码经过编译后,得到的字节码如下: + +``` +PUSH1 0x1 +PUSH1 0x2 +ADD +``` + +为了读者更好了解其概念,这里精简为上述3条语句,但实际的字节码可能更复杂,且会掺杂SWAP和DUP之类的语句。我们可以看到,在上述代码中,包含两个指令:PUSH1和ADD,它们的含义如下: + +- PUSH1:将数据压入栈顶。 +- ADD:POP两个栈顶元素,将它们相加,并压回栈顶。 + +这里用半动画的方式解释其执行过程。下图中,sp表示栈顶指针,pc表示程序计数器。当执行完push1 0x1后,pc和sp均往下移: + +![](../../../../images/articles/solidity_operation_principle/IMG_5479.PNG) + +类似地,执行push1 0x2后,pc和sp状态如下: + +![](../../../../images/articles/solidity_operation_principle/IMG_5480.PNG) + +最后,当add执行完后,栈顶的两个操作数都被弹出作为add指令的输入,两者的和则会被压入栈: + +![](../../../../images/articles/solidity_operation_principle/IMG_5481.PNG) + + + +### 存储探究 + +在开发过程中,我们常会遇到令人迷惑的memory修饰符;阅读开源代码时,也会看到各种直接针对内存进行的assembly操作。不了解存储机制的开发者遇到这些情况就会一头雾水,所以,这节将探究EVM的存储原理。在前文《[智能合约编写之Solidity的基础特性](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485625&idx=1&sn=9af6032cbf0ad0a3f7f8b7e85faebc77&chksm=9f2efaa5a85973b3fb118b3f1a6e2cd6aef8c1852ee97e93d98afeae71975c3cffc24a0b28fd&scene=21#wechat_redirect)》中我们介绍过,一段Solidity代码,通常会涉及到局部变量、合约状态变量。而这些变量的存储方式存在差别,下面代码表明了变量与存储方式之间的关系。 + +``` +contract Demo{ + //状态存储 + uint private _state; + + function set(uint state) public { + //栈存储 + uint i = 0; + //内存存储 + string memory str = "aaa"; + } +} +``` + +#### 栈 + +栈用于存储字节码指令的操作数。在Solidity中,局部变量若是整型、定长字节数组等类型,就会随着指令的运行入栈、出栈。例如,在下面这条简单的语句中,变量值1会被读出,通过PUSH操作压入栈顶: + +``` +uint i = 1; +``` + +对于这类变量,无法强行改变它们的存储方式,如果在它们之前放置memory修饰符,编译会报错。 + +#### 内存 + +内存类似java中的堆,它用于储存"对象"。在Solidity编程中,如果一个局部变量属于变长字节数组、字符串、结构体等类型,其通常会被memory修饰符修饰,以表明存储在内存中。 + +本节中,我们将以字符串为例,分析内存如何存储这些对象。 + +##### 1. 对象存储结构 + +下面将用assembly语句对复杂对象的存储方式进行分析。assembly语句用于调用字节码操作。mload指令将被用于对这些字节码进行调用。mload(p)表示从地址p读取32字节的数据。开发者可将对象变量看作指针直接传入mload。在下面代码中,经过mload调用,data变量保存了字符串str在内存中的前32字节。 + +``` +string memory str = "aaa"; +bytes32 data; +assembly{ + data := mload(str) +} +``` + +掌握mload,即可用此分析string变量是如何存储的。下面的代码将揭示字符串数据的存储方式: + +``` +function strStorage() public view returns(bytes32, bytes32){ + string memory str = "你好"; + bytes32 data; + bytes32 data2; + assembly{ + data := mload(str) + data2 := mload(add(str, 0x20)) + } + return (data, data2); +} +``` + +data变量表示str的0~31字节,data2表示str的32~63字节。运行strStorage函数的结果如下: + +``` +0: bytes32: 0x0000000000000000000000000000000000000000000000000000000000000006 +1: bytes32: 0xe4bda0e5a5bd0000000000000000000000000000000000000000000000000000 +``` + +可以看到,第一个数据字得到的值为6,正好是字符串"你好"经UTF-8编码后的字节数。第二个数据字则保存的是"你好"本身的UTF-8编码。熟练掌握了字符串的存储格式之后,我们就可以运用assembly修改、拷贝、拼接字符串。读者可搜索Solidity的字符串库,了解如何实现string的concat。 + +##### 2. 内存分配方式 + +既然内存用于存储对象,就必然涉及到内存分配方式。memory的分配方式非常简单,就是顺序分配。下面我们将分配两个对象,并查看它们的地址: + +``` +function memAlloc() public view returns(bytes32, bytes32){ + string memory str = "aaa"; + string memory str2 = "bbb"; + bytes32 p1; + bytes32 p2; + assembly{ + p1 := str + p2 := str2 + } + return (p1, p2); +} +``` + +运行此函数后,返回结果将包含两个数据字: + +``` +0: bytes32: 0x0000000000000000000000000000000000000000000000000000000000000080 +1: bytes32: 0x00000000000000000000000000000000000000000000000000000000000000c0 +``` + +这说明,第一个字符串str1的起始地址是0x80,第二个字符串str2的起始地址是0xc0,之间64字节,正好是str1本身占据的空间。此时的内存布局如下,其中一格表示32字节(一个数据字,EVM采用32字节作为一个数据字,而非4字节): + +![](../../../../images/articles/solidity_operation_principle/IMG_5482.PNG) + +- 0x40~0x60:空闲指针,保存可用地址,本例中是0x100,说明新的对象将从0x100处分配。可以用mload(0x40)获取到新对象的分配地址。 +- 0x80~0xc0:对象分配的起始地址。这里分配了字符串aaa +- 0xc0~0x100:分配了字符串bbb +- 0x100~...:因为是顺序分配,新的对象将会分配到这里。 + +#### 状态存储 + +顾名思义,状态存储用于存储合约的状态字段。从模型而言,存储由多个32字节的存储槽构成。在前文中,我们介绍了Demo合约的set函数,里面0x0表示的是状态变量_state的存储槽。所有固定长度变量会依序放到这组存储槽中。对于mapping和数组,存储会更复杂,其自身会占据1槽,所包含数据则会按相应规则占据其他槽,比如mapping中,数据项的存储槽位由键值k、mapping自身槽位p经keccak计算得来。从实现而言,不同的链可能采用不同实现,比较经典的是以太坊所采用的MPT树。由于MPT树性能、扩展性等问题,FISCO BCOS放弃了这一结构,而采用了分布式存储,通过rocksdb或mysql来存储状态数据,使存储的性能、可扩展性得到提高。 + +## 结语 + +本文介绍了Solidity的运行原理,运行原理总结如下。首先,Solidity源码会被编译为字节码,部署时,字节码会以交易为载体在网络间确认,并在节点上形成合约;合约函数调用,如果是交易类型,会经过网络确认,最终由EVM执行。EVM是栈式虚拟机,它会读取合约的字节码并执行。在执行过程中,会与栈、内存、合约存储进行交互。其中,栈用于存储普通的局部变量,这些局部变量就是字节码的操作数;内存用于存储对象,采用length+body进行存储,顺序分配方式进行内存分配;状态存储用于存储状态变量。理解Solidity的运行方式及其背后原理,是成为Solidity编程高手必经之路。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_presensation.md b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_presensation.md new file mode 100644 index 000000000..feadcf72c --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/35_contract/solidity_presensation.md @@ -0,0 +1,58 @@ +# 深入浅出Solidity + +作者:石翔|FISCO BCOS 核心开发者 + +在只有比特币的年代,区块链能够实现简单的价值产生和转移,但却未出现更多的商业模式。以太坊给区块链带来了维度的提升,基于区块链的应用渐趋丰富,区块链的各种商业模式加速涌现。这其中很重要的原因,是以太坊给区块链带来了一套图灵完备的编程语言。 + +区块链的主要功能,是实现了多方的共识。在比特币中,需要共识的操作是固定的,是非图灵完备的。其共识的仅仅是价值所有者的改变。但以太坊上,开发者可以自己编写需要共识的逻辑,以太坊通过智能合约语言Solidity,实现了共识逻辑的自定义。 + +## Solidity 介绍 + +Solidity语言和Java存在着些许相似之处。在众多编程语言中,Java是发展较为成熟的。Java代码在Java虚拟机(JVM)执行。JVM屏蔽掉了操作系统的差异,使得Java成为一个跨平台的语言。一套Java代码可在Windows、Linux、Mac上通用,而不需要关心操作系统的差异。 + +Solidity与Java类似。代码写好后,都需要通过编译器将代码转换成二进制,在Java中,编译器是Javac,而对于Solidity,是solc。生成后的二进制代码,会放到虚拟机里执行。Java代码在Java虚拟机(JVM)中执行,在Solidity中,是一个区块链上的虚拟机EVM。 + +![](../../../../images/articles/solidity_presensation/IMG_5440.PNG) + +Solidity与Java的不同之处在于,Solidity是服务于区块链的语言,代码在区块链上执行。EVM是区块链上的一个执行器。每个区块链节点都有一个EVM。Solidity在EVM中被执行后,EVM对区块链的数据进行了改变。这些数据的改变交由共识算法去共识。同时,Solidity的操作仅限于EVM内部,不能访问外部不确定系统或数据,如系统时钟,网络文件系统等。 + +Solidity的设计目的,是给区块链提供一套统一的逻辑,让相同的代码跑在区块链的每个节点上,借助共识算法,让区块链的数据以统一的方式进行改变,达到全局一致的结果。 + +## Solidity 实现细节 + +以此处的Demo合约为例,合约中有一个全局变量m,并有一个函数add(),实现给全局变量m增加x数值的功能。 + +![](../../../../images/articles/solidity_presensation/IMG_5441.PNG) + +通过合约编译器solc,可将此合约编译成二进制。二进制的每个字(8 bit),表示一个EVM的操作码(OPCODE)。Demo合约编译出的二进制及其相应的OPCODE如下,实现了完整的Demo合约的功能,包括对合约的装载、合约接口的调用和异常处理的逻辑。其中,标红部分是add()方法的实现。 + +![](../../../../images/articles/solidity_presensation/IMG_5442.PNG) + +将add()函数的OPCODE的**标红部分**摘取出来,可看到其具体的实现思想与汇编代码相同,是一种基于堆栈式的操作。其中的SLOAD将区块链上指定位置的数据读入堆栈顶部,ADD实现将堆栈顶端的两个数据相加,SSTORE再将相加后放在堆栈顶部的结果写入区块链下一个区块的数据中,为下个区块的共识做准备。 + +![](../../../../images/articles/solidity_presensation/IMG_5443.PNG) + +在合约二进制被部署到区块链上后,通过发送交易调用合约里的方法。节点根据交易将合约代码装载入EVM中,并根据交易的传参执行合约上相应的函数add()。 + +EVM执行合约代码,从区块链上读入当前区块的数据,进行相加操作,并将结果写入下一个区块(等待共识的区块)对应的状态数据中。 + +此后,共识算法将待执行的区块共识落盘,区块高度增加,区块链上的数据完成更新。 + +![](../../../../images/articles/solidity_presensation/IMG_5444.PNG) + +上述步骤可见,Solidity的实现与当今已有的做法有着很多相似之处。编译,用的是传统的套路,将代码转换成虚拟机可执行的二进制;执行,也是与传统方式相同,借助堆栈作为缓冲区执行二进制代码。 + +## Solidity 局限与改进 + +Solidity由于是第一个大规模应用的智能合约语言,存在着一些有待改进的地方。 + +**Solidity不够灵活。**Solidity语言受到自身堆栈深度的限制,函数传参和局部参数的个数总和不能超过16个。要实现一些比较复杂的函数难免有些鸡肋。Solidity是一种强类型的语言,但其类型转换较为麻烦。将整型转换成字符串时需要转换成二进制再拼接。在字符串的操作上,缺少一些方便的函数。 + +**Solidity的性能较差。**在执行上,OPCODE的执行是一种用程序模拟的汇编执行器,而不是直接使用CPU的资源。在存储上,Solidity的底层存储单位是32字节(256 bits),对硬盘的读写要求较高,浪费了大量的存储资源。 + +**针对上述两点,FISCO BCOS提供了一种用C++写合约方式:预编译合约。开发者可以用C++编写智能合约逻辑,并将其内置在节点中。** + +预编译合约的调用方法与Solidity合约相同,通过合约地址即可直接调用。FISCO BCOS提供了参数解析,将调用的参数解析成C++可识别的格式。 + +预编译合约突破了Solidity语言的限制,借助强大的C++语言,可以灵活的实现各种逻辑,灵活性大大提高。同时,C++的性能优势也得到了很好的利用,通过预编译合约编写的逻辑,相比于Solidity语言来说,性能得到提升。 + diff --git a/3.x/zh_CN/docs/articles/3_features/36_cryptographic/ecdsa_analysis.md b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/ecdsa_analysis.md new file mode 100644 index 000000000..15a770346 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/ecdsa_analysis.md @@ -0,0 +1,148 @@ +# 一个数字引发的探索——ECDSA解析 + +作者:李辉忠|FISCO BCOS 高级架构师 + +FISCO BCOS交易签名算法基于ECDSA原理进行设计,ECDSA也是比特币和以太坊采用的交易签名算法。本文介绍ECDSA及椭圆曲线加密(ECC)相关知识、ECDSA的Recover机制和实现方式、FISCO BCOS交易签名和验签的底层原理。内容偏硬(shu)核(xue),欢迎对密码学原理、区块链底层原理感兴趣的开发者一起交流。 + +## 故事开始 + +故事要从以太坊中一个神奇的魔数开始说起。 + +![](../../../../images/articles/ecdsa_analysis/IMG_5504.JPG) + +以太坊黄皮书中,关于交易签名的阐述讲到两个特殊的数「27,28」,实际上是从「0,1」通过加了一个27演变得到「27,28」,所以本质上是一个特殊的数27。这个特殊的数字27代表了什么含义呢?一次侦探之旅开始了… + +## **这像是一个bug** + +搜索发现此前已有许多关于该问题的讨论,其中,Stack Exchange的一篇帖子指出这是一个设计bug。以太坊源码github上,也有一个相关issue,该issue被打上了「type:bug」的标签。 + +![](../../../../images/articles/ecdsa_analysis/IMG_5505.PNG) + +![](../../../../images/articles/ecdsa_analysis/IMG_5506.JPG) + +Stack Exchange帖子中有一个链接给出了修复该Bug的代码,请看下面截图(红框)。在注释说明和代码可见,fromRpcSig函数对27这个魔数进行了特殊处理。从RPC过来的签名中,v值如果小于27(可能是0-3),则直接加上27作为新v值,fromRpcSig函数通过这个方式兼容ECDSA原始v值(也就是recoveryID)和以太坊v值。 + +![](../../../../images/articles/ecdsa_analysis/IMG_5507.JPG) + +这真是以太坊设计的一个bug吗?回到刚才那个fromRpcSig的源代码文件,详细看其各接口实现,我们发现有这样一行代码「v: chainId ? recovery + (chainId * 2 + 35) : recovery + 27」,这行为v赋值的代码透露了三个信息,分别是魔数27、魔数35和ChainID。 + +![](../../../../images/articles/ecdsa_analysis/IMG_5508.JPG) + +于是,疑问更多了,魔数35是什么?ChainID又是什么? + +## 这不像是一个Bug + +带着这些疑问,再一次查阅相关设计材料,我们看到,以太坊EIP155中描述了有关ChainID的设计。基于以太坊源码构建的网络,实际运行的链有很多,为了防止一条链的交易被提交上链到另一条链,造成重放攻击,引入了ChainID的设计,在块高2,675,000的位置进行分叉实现。 + +![](../../../../images/articles/ecdsa_analysis/IMG_5509.JPG) + +明白了ChainID的作用,另一个疑问又产生了——以太坊中,有NetworkID来区分不同网络,为什么还需要ChainID?这要从NetworkID和ChainID的作用范围来解释。NetworkID主要在网络层面进行链的隔离,节点在建立相互连接的时候需要交换NetworkID,拥有一致的NetworkID才能完成握手连接。ChainID是交易层面,防止不同网络的交易被交叉重复攻击。以太坊(ETH)和经典以太坊(ETC)的主网NetworkID都是1,需要通过 ChainID机制才能防止交易在ETH和ETC网络之间交叉重放,ETH主网的ChainID是1,ETC主网的ChainID是61。说到这里其实还是没有搞清楚为什么是27,为什么是35?我们在EIP github的Issue#155中看到Jan和Buterin的交流记录,看来27是来自比特币的产物。 + +![](../../../../images/articles/ecdsa_analysis/IMG_5510.PNG) + +顺藤摸瓜,打开electrum的github,我们在electrum/electrum/ecc.py中找到如下代码 + +![](../../../../images/articles/ecdsa_analysis/IMG_5511.JPG) + +![](../../../../images/articles/ecdsa_analysis/IMG_5512.PNG) + +![](../../../../images/articles/ecdsa_analysis/IMG_5513.PNG) + +![](../../../../images/articles/ecdsa_analysis/IMG_5514.PNG) + +从代码中可见,electrum在签名时,为原本只有0-3之间的recid(recoveryID),加上了27,还有一个压缩标记,如果有压缩则再加上4,recid的值范围在27-34。至此可知,27和35大概来源于此,以太坊继承比特币的设计,在比特币源码bitcoin/src/key.cpp的CKey::SignCompact函数中也确定了该实现方式,但是比特币为什么如此设计,仍未可知。 + +## **ECDSA才是“bug”** + +故事到这里,我们对以太坊代码中那个魔数27的前世今生有大概了解,但这仅仅是故事的开端,由此引发我们进一步思考一个问题:recoveryID是什么?为了解释清楚这个问题,我们需要从ECDSA算法着手,从数学角度理解其背后的原理。ECDSA是FISCO BCOS采用的交易签名算法,由此我们会发现,ECDSA算法有一种Recover机制,它才是真正“bug”级别的功能。 + +ECDSA(Elliptic Curve Digital Signature Algorithm)是基于椭圆曲线的数字签名算法。数字签名算法是采用公私钥体系实现类似写在纸上的普通签名,用于鉴别数字信息的方法,常见的数字签名算法包括DSA、RSA和ECDSA等。椭圆曲线密码(ECC)是基于椭圆曲线数学的公钥加密算法,建立在椭圆曲线离散对数困难问题之上,常用的协议有ECDH、ECDSA和ECIES等。椭圆曲线的参数可以有多种配置方式,也就存在多种不同的曲线,例如secp256k1、secp256r1、Curve25519等,不同曲线的安全性存在一些区别,在SafeCurves中有相关对比描述。 + +ECDSA算法主要包括以下四个关键功能: + +### 产生密钥GenKey + +- 选择一条椭圆曲线E_P(a,b),选择基点G,G的阶数为n +- 选择随机数d ∈n为私钥,计算公钥Q = d⋅G + +### 签名算法Sign + +- 对消息m使用消息摘要算法,得到z=hash(m) +- 生成随机数k∈n,计算点(x, y)=k⋅G +- 取r=x mod n,若r=0则重新选择随机数k +- 计算s = k^−1(z+rd) mod n,若s=0则重新选择随机数k +- 上述(r,s)即为ECDSA签名 + +### 验证算法Verify + +使用公钥Q和消息m,对签名(r,s)进行验证。 + +- 验证r,s∈n +- 计算z = hash(m) +- 计算u_1 =zs^−1 mod n和u_2 = rs^−1 mod n +- 计算(x, y) = u1⋅G+u2⋅Q mod n +- 判断r == x,若相等则签名验证成功 + +### 恢复算法Recover + +已知消息m和签名(r,s),恢复计算出公钥Q。 + +- 验证r, s∈n +- 计算R=(x, y),其中x=r,r+n,r+2n...,代入椭圆曲线方程计算获得R +- 计算z = hash(m) +- 计算u_1 = −zr^−1 mod n和u_2 = sr^−1 mod n +- 计算公钥Q= (x’, y’)=u_1⋅G+u_2⋅R + +为了回答recoveryID的问题,我们重点关注「恢复算法Recover」。在计算R的步骤可以看到,存在多个x的取值可能性,导致存在多个R的可能性,因此计算得到的Q也存在多个可能的结果,需要通过和已知的公钥对比,确定哪一个Q是正确的。如果遍历x的所有可能都未找到正确的Q,说明该消息和签名是不对应的,或者是一个未知的公钥。 + +为了确定正确的Q,需要遍历x的所有可能取值,跑多轮Recover算法,这个时间开销是比较大的。**为了提高Recover的时间效率,采用空间换时间的思路,在签名中增加一个v值,用于快速确定x,避免遍历查找试探,这个v值就是recoveryID。** + +在区块链系统中,客户端对每笔交易进行签名,节点对交易签名进行验证。如果采用「验证算法Verify」,那节点必须首先知道签发该交易所对应的公钥,因此需要在每笔交易中携带公钥,这需要消耗很大带宽和存储。如果采用「恢复算法Recover」,并且在生成的签名中携带recoveryID,就可以快速恢复出签发该交易对应的公钥,根据公钥计算出用户地址,然后在用户地址空间执行相应操作。 + +这里潜藏了一个区块链设计哲学,区块链上的资源(资产、合约)都是归属某个用户的,如果能够构造出符合该用户地址的签名,等同于掌握了该用户的私钥,因此节点无需事先确定用户公钥,仅从签名恢复出公钥,进而计算出用户地址,就可以执行这个用户地址空间的相应操作。**FISCO BCOS基于这个原理设计实现了交易签名和验签**。 + +## **recoveryID的计算** + +关于JavaSDK性能优化的文章([记一次JavaSDK性能从8000提升至30000的过程](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485438&idx=1&sn=2d68d0f051dd42a0c68dc9da39538ea9&chksm=9f2ef5e2a8597cf4a96620f95b16b734b0efd55d7463c4d0bf04b46b51acce4cf68794a480af&scene=21#wechat_redirect))中提到一个关键优化点——recoveryID的计算,这里仔细展开讨论。 + +ECDSA签名(r,s),其中r是椭圆曲线上一个点kG (x, y)对应的x mod n,相当于签名信息中只留下了X轴坐标相关的值,丢弃了Y轴相关的值。在「恢复算法Recover」中尝试找回Y轴对应的值构造R,进而恢复出公钥。 + +由于r = x mod n,因此r,r+n,r+2n…都可能是合法的原始x值,不同的椭圆曲线存在不同数量这样合法的x值,FISCO BCOS采用的secp256k1曲线存在两个可能r, r+n。 + +每一个X轴坐标对应两个可能的Y坐标,因此FISCO BCOS中具备四种可能的R,(r, y) (r, -y) (r+n, y’) (r+n, -y’)。但是,对于一个r值存在两个X轴坐标的概率极低,低到几乎可以忽略,以太坊中就忽略了这两种小概率事件。 + +那这个小概率事件的概率具体有多小呢?这要从secp256k1曲线的参数说起,通常描述一个椭圆曲线的点(x,y)的时候,x和y的值是 mod p 的结果,p是曲线的参数,它是一个大素数,之前提到的n也是曲线的参数,等于这条曲线上点的数量(曲线上点的数量为n*h,h也是曲线参数,该曲线h=1),在secp256k1中,n和p的值非常接近,具体可见下图。 + +![](../../../../images/articles/ecdsa_analysis/IMG_5515.JPG) + +由于r = x mod n,x是mod p的结果,r是mod n的结果,x值的范围是[0, p-1],r值的范围是[0, n-1]。如果r+n也是曲线上的点,则r的值必须小于p-n,概率为 (p-n) / p,大约为3.73*10^-39,这个概率是非常小的。 + +基于签名结果(r, s)和签名过程中生成的随机点(x, y)的y值,recoveryID的计算方式如下: + +1. id = y & 1; //「签名算法Sign」中kG点的y坐标,根据奇偶性设置id值,因为y是mod p的结果,其奇偶性与坐标轴的正负性是完全对应的 +2. id |= (x != r ? 2 : 0); // 小概率事件,如前文解释 +3. if (s > n / 2) id = id ^ 1; // 签名计算得出的s如果大于n/2就会取n-s作为s值,因此这里做相应转换,这两个转换是同时发生的 + +[JavaSDK性能优化](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485438&idx=1&sn=2d68d0f051dd42a0c68dc9da39538ea9&chksm=9f2ef5e2a8597cf4a96620f95b16b734b0efd55d7463c4d0bf04b46b51acce4cf68794a480af&scene=21#wechat_redirect)的文章就是基于这个计算公式,将遍历探寻recoveryID改为计算获得,大幅提升了性能。 + +## 后话 + +从一个神奇的数字开始,查阅相关资料,了解设计原理,进而闯入ECDSA的世界,在一堆数学公式中迷茫、游荡,问题一个接着一个。一开始雾里看花,似懂非懂,靠着处女座的洁癖精神,总算把心中疑问一一化解。精妙绝伦的密码协议,高深莫测的数学理论,做一个区块链码农,要学习的东西还很多。唯有苦其心志,劳其筋骨,善待每一个疑点,不放过每一处细节。总会有一天,那时拨开云雾见天日,守得云开见月明。 + +------ + +#### 参考资料 + +- [Ethereum yellow paper](https://ethereum.github.io/yellowpaper/paper.pdf) +- [Stack Exchange](https://ethereum.stackexchange.com/questions/78929/whats-the-magic-numbers-meaning-of-27-or-28-in-vrs-use-to-ecrover-the-sender/78930?newreg=a613981e27424bc4b1c2c0e00d939327) +- [ISSUE](https://github.com/ethereum/go-ethereum/issues/2053) +- [EIP155](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md) +- [EIP155 Issue](https://github.com/ethereum/eips/issues/155) +- [ChainID](https://chainid.network) +- [ECC wiki](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography) +- [ECDSA wiki](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) +- [Curve25519 wiki](https://en.wikipedia.org/wiki/Curve25519) +- [SafeCurves](https://safecurves.cr.yp.to/index.html) +- [ECC SEC1](http://www.secg.org/sec1-v2.pdf) +- [ECC SEC2](https://www.secg.org/sec2-v2.pdf) + diff --git a/3.x/zh_CN/docs/articles/3_features/36_cryptographic/elliptic_curve.md b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/elliptic_curve.md new file mode 100644 index 000000000..aadcebc5b --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/elliptic_curve.md @@ -0,0 +1,143 @@ +# 一场椭圆曲线的寻根问祖之旅 + +作者:李辉忠|FISCO BCOS 高级架构师 + +本文介绍密码学中常见的椭圆曲线以及他们之间的关系,介绍不同标准体系的命名规则,尝试描述椭圆曲线之间的家族演义关系。文章试图讲清椭圆曲线相关概念和功能,不涉及复杂的数学证明和推理,欢迎感兴趣的同学阅读。笔者主要参考Wikipedia和相关组织网站的信息进行整理,不排除出现纰漏的可能,欢迎专家批评指正。 + +## 一个可能你没关心过的问题 + +在[《一个数字引发的探索——ECDSA解析》](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485497&idx=1&sn=44ac5977abbf92bd81e9013433a59f69&chksm=9f2efa25a8597333575c8bf0642c2e312e54d23867644021c9b2e353963d405e1d945e2a067d&scene=21#wechat_redirect)中提到的椭圆曲线secp256k1,它有一些特性,可以快速计算出recoveryID。这个secp256k1为什么如此命名?不怕各位笑话,我在弄清楚它之前,经常拼写错,写成sec256pk1,seck256p1等。 + +## 咬文嚼字secp256k1 + +搞清楚secp256k1的命名含义其实很简单,搜索引擎可以快速为你定位到答案,它出自一个密码协议标准,每一个字母和数字都代表着特定含义,我们来逐一解析。 + +![](../../../../images/articles/elliptic_curve/IMG_5516.PNG) + +### 1、密码协议标准 + +第一部分是「sec」,sec是Standards for Efficient Cryptography 的简称,是SECG发布的一种密码学协议标准。SECG发布的「SEC 1」和「SEC 2」两个关于椭圆曲线的协议标准,在「SEC 2」中有详细说明secp256k1以及其他曲线的参数定义。除了「sec」,还有众多其他关于椭圆曲线的协议标准,从「SafeCurve」中可以看到有下列不同类型的标准。 + +![](../../../../images/articles/elliptic_curve/IMG_5517.PNG) + + +「SafeCurve」此处较久没有更新,有些标准已经更新了多次,例如NIST关于数字签名的标准 FIPS 186目前在用的是第四版,第五版也在起草中了,从「NIST」官网中可见。NIST是美国的国家标准技术研究所(National Institute of Standards and Technology),因此,NIST的标准也是美国标准。 + +![](../../../../images/articles/elliptic_curve/IMG_5518.PNG) + +「NIST FIPS 186-4」标准中定义了若干椭圆曲线标准,例如NIST P-256、NIST P-384等,其中开头NIST也代表密码协议标准的名字。后续描述都是围绕这两个标准来解析。 + +### 2、有限域 + +第二部分是「p」,p表示该椭圆曲线是基于素数有限域Fp。有限域是离散数学中的概念,此处不做展开,简单来说,它是一个由有限数量元素组成的集合,元素之间可以进行加法和乘法计算,具备一些独特的属性。密码学中使用椭圆曲线都是基于有限域的,除了素数有限域Fp之外,还有另一种特征为2的有限域F2m(因格式问题,2m应为2的m次方,下同) ,Fp的大小(元素个数)为p,F2m的大小为2m。基于Fp的椭圆曲线为: + + +![](../../../../images/articles/elliptic_curve/IMG_5519.PNG) + + +基于F2m的椭圆曲线为: + +![](../../../../images/articles/elliptic_curve/IMG_5520.JPG) + + +在「SEC 2」中还定义了sect163k1、sect163r1等曲线,其中,t表示的是该曲线基于F2m。在「NIST FIPS 186-4」中定了P-256、B-163等曲线,P-表示基于Fp,B-表示基于F2m。 + +### 3、有限域大小 + +每个椭圆曲线E都有若干关键参数,包括阶为n的基点G和系数h等,其中,n为一个大素数,n*h为椭圆曲线上点的数量。为了计算效率考虑,h通常设置为1、2或4。通俗地讲,如果椭圆曲线上的点数量越多,那么这条椭圆曲线的安全度就越高,因此n的取值是影响曲线安全的关键。椭圆曲线又都是基于有限域的,曲线上的点都是有限域中的元素,因此,有限域大小决定了曲线安全度。第三部分「256」就是有限域大小的表现形式,还有更多其他如192、224、384等,在「NIST FIPS 186-4」中有个表格展现了Fp 和F2m 两个域的各种不同大小配置。 + +![](../../../../images/articles/elliptic_curve/IMG_5521.JPG) + +SEC标准在这块的设置和NIST标准类似,我们会看到p系列的曲线有p192、p224、p256(secp256k1就是其中一种)、p384和p521,t/B系列有t163/B-163、t233/B-233等。 + +### 4、Koblitz Curve + +第四部分「k」表示该曲线是Koblitz Curve,从「SEC 2」中可以看到还有此处标记为r的曲线(如secp256r1),r表示该曲线是伪随机曲线Pesudo-Random Curve。Koblitz Curve命名源自数学家「Neal Koblitz」,它是一种特殊的曲线,它的一些参数是精心挑选设置的。Koblitz Curve具有自同态的性质,可以通过优化大幅提升计算效率。相比之下,Pesudo-Random Curve的对应参数是通过随机种子计算出来的,有标准的检验算法可以检测所有参数是随机种子产生而来。对应「**2、有限域**」中的两个椭圆曲线,Koblitz Curve分别简化为 + +![](../../../../images/articles/elliptic_curve/IMG_5522.PNG) + +![](../../../../images/articles/elliptic_curve/IMG_5523.PNG) + +例如,secp256k1对应的曲线b=7,即曲线表示为 + + +![](../../../../images/articles/elliptic_curve/IMG_5524.PNG) + + +在「NIST FIPS 186-4」中Koblitz Curve曲线以「K-」标记开头,分别有K-163、K-233等。 + +### **5、末位标记** + +到了第五部分「1」,这是代表在前4个条件下提供了多种推荐参数设置,在SEC标准中大部分该位都是1,即只提供一种推荐参数,sect163r2是一个例外。下面把SEC和NIST两个标准推荐的曲线分别列一下,二者有较大部分是相同的参数设置。 + +![](../../../../images/articles/elliptic_curve/IMG_5525.JPG) + +上述表格中,同一行中SEC和NIST都出现的,两个曲线虽然名字不同,但参数完全相同,也就是说其实一样的。橙色底纹的几个SEC曲线没有对应的NIST曲线,因此SEC标准包含的曲线比NIST多一些,本文开头提到的secp256k1就是SEC单独存在的。说到这里,不得不提一个正经八卦。据说,NIST推荐的Pesudo-Random Curve,也就是P和B系列,并没有公布随机数挑选规则,外界存在一种疑虑,可能NSA(美国国家安全局)掌握了后门,能够轻易破解这些密码协议。有兴趣的同学可以搜索「Dual_EC_DRBG后门」,更大的八卦是据说中本聪选择secp256k1作为比特币签名算法的曲线,而没有选择更常用的secp256r1,也是因为这个潜藏的风险。 + +## **椭圆曲线族谱** + +调研发现,「STD」记录了比「SafeCurve」更为详细的标准和曲线,感觉这可以算是椭圆曲线族谱了。翻阅该网站记录的所有曲线,发现绝大部分还是基于「(2)有限域」中的曲线,推荐的参数不同而已。但是,在「other」中存在几种例外,E-222采用Edward Curve,Curve25519采用Montgomery Curve,Ed448采用Twisted Edward Curve。 + +Edward Curve是什么?Montgomery Curve又是怎样的?Edward与Twisted Edward Curve又有什么关系?上述问题再一次触碰到我的知识盲区,所以接下来只好以截图为主,内容源自Wikipedia,如果觉得看着有点晕,可直接跳过看结论。「Edward Curve」定义如下: + +![](../../../../images/articles/elliptic_curve/IMG_5526.PNG) + +「Montgomery Curve」定义如下: + +![](../../../../images/articles/elliptic_curve/IMG_5527.PNG) + +「Twisted Edward Curve」定义如下: + +![](../../../../images/articles/elliptic_curve/IMG_5528.JPG) + +「Curve25519」定义如下: + +![](../../../../images/articles/elliptic_curve/IMG_5529.JPG) + +「Ed25519」的定义如下: + +![](../../../../images/articles/elliptic_curve/IMG_5530.JPG) + +根据Wikipedia,大概可以整理出这么几个信息: + +1. Edward Curve是Twisted Edward Curve中的一种 +2. Twisted Edward Curve和Montgomery Curve可以互相转换 +3. Edward Curve和Montgomery Curve这两种曲线都具有特殊属性,例如能够为计算加速 +4. Curve25519是一种曲线,Ed25519是一种签名算法 +5. Curve25519又是精选的Montgomery Curve,具有更高的计算效率 +6. Curve25519和Ed25519采用的曲线是一致的,一个是Montgomery表现形式,一个是Twisted Edward Curve表现形式 +7. 25519的取名来自于该曲线的有限域参数p=2255- 19 + +在阅读Wikipedia的过程中发现一个名字「Weierstrass equation」,原来它才是这些曲线的鼻祖,在一个域k上的任何一个平面曲线,都可以表示成Weierstrass equation。 + +![](../../../../images/articles/elliptic_curve/IMG_5531.PNG) + +不难发现,前面提到过的各个公式都是Weierstrass equation的一种演化版本(Twisted Edward Curve看起来不是,但是它可以转换到Montgomery Curve,本质上也一样)到此,为椭圆曲线寻根问到祖,并且从「STD」也获知了椭圆曲线家族的族谱。 + +「STD」中罗列了多个其他标准,例如Brainpool曲线系列、BN曲线系列、MNT曲线系列等,这些系列的背后都代表了一种独特的曲线生成哲学,或是为了提供可验证的随机数,或是为了提供满足Paring的特性,或是为了提高抗攻击的能力等等,每一份精心选择的参数都是一群数学家们巧夺天工的设计。 + +## **后话** + +古有拆文解字,参透汉字玄机,道破人生天机;而今咬文嚼字,摸清椭圆原理,揭开曲线家谱。始于名字,解码secp256k1,厘清标准;终于名字,问祖weierstrass,致敬大神。 + +通过了解椭圆曲线之间的内在关系,对其设计有了更多一点的理解。知道的更多了,不知道的也更多了,那些特殊曲线的数学原理是什么?为什么具有更高的计算效率?性能能提升多少?… 又是一个深夜,拥抱最新的收获,夹杂更多的困惑。电脑中正好在播放“把太细的神经割掉,会不会比较睡得着…” + +------ + +#### 参考资料 + +- [SEC1](https://www.secg.org/sec1-v2.pdf) +- [SEC2](https://www.secg.org/sec2-v2.pdf) +- [NIST](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf) +- [STD](https://neuromancer.sk/std/) +- [SafeCurves](https://safecurves.cr.yp.to) +- [Koblitz Curves](https://link.springer.com/content/pdf/10.1007%2F3-540-46766-1_22.pdf) +- [Weierstrass Equation](https://www.lmfdb.org/knowledge/show/ec.weierstrass_coeffs) +- [Montgomery Curve wiki](https://en.wikipedia.org/wiki/Montgomery_curve) +- [Twisted Edward Curve wiki](https://en.wikipedia.org/wiki/Twisted_Edwards_curve) +- [Edward Curve wiki](https://en.wikipedia.org/wiki/Twisted_Edwards_curve) +- [ECDSA wiki](https://en.wikipedia.org/wiki/EdDSA#Ed25519) +- [Curve25519 wiki](https://en.wikipedia.org/wiki/Curve25519) +- [Curve25519 paper](http://cr.yp.to/ecdh/curve25519-20060209.pdf) +- [Ed25519 paper](http://ed25519.cr.yp.to/ed25519-20110926.pdf) + diff --git a/3.x/zh_CN/docs/articles/3_features/36_cryptographic/index.md b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/index.md new file mode 100644 index 000000000..831fa8948 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/index.md @@ -0,0 +1,23 @@ +### 密码算法和协议 + +国密算法 支持 + +国密SSL 支持 + +哈希算法:Keccak256、SM3 + +对称加密算法:AES、SM4 + +非对称加密算法:ECDSA、SM2 + +非对称加密椭圆曲线:secp256k1、sm2p256v1 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + national_cryptography_features.md + national_cryptography_deployment_example.md + ecdsa_analysis.md + elliptic_curve.md +``` diff --git a/3.x/zh_CN/docs/articles/3_features/36_cryptographic/national_cryptography_deployment_example.md b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/national_cryptography_deployment_example.md new file mode 100644 index 000000000..31601f8f0 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/national_cryptography_deployment_example.md @@ -0,0 +1,156 @@ +# FISCO BCOS国密版部署示例 + +作者:刘海锋|FISCO BCOS开源社区贡献者 + +随着区块链的底层技术被不断关注,越来越多的项目开始使用区块链来固化数据。近期因为工作需要,对比了多家国内的区块链产品,实际部署了几个区块链系统后,最终选择了FISCO BCOS。在实际部署的过程中,我总结出了这一套可供实际项目使用的部署流程,供区块链爱好者参考。 + +## 设计覆盖实际项目使用情况的一套场景 + +在决定使用FISCO BCOS时,为了尽可能覆盖到实际项目使用的情况,我设计了一套场景,里面包含了大多数实际情况,并且遇坑填坑,最终按照设计的场景部署成功了。以下是我设计的场景: + +1、假设多家机构组成联盟,每家机构都派出代表进驻联盟委员会(在本次测试组网部署中,假设有ABCD四家机构)。 + +2、联盟决定使用国密版FISCO BCOS组建联盟链。 + +3、联盟委员会确定联盟链组网模式(主要确认节点数量、节点分布、群组构成情况和信息交换方式等)。 + +本次测试,使用同一服务器的不同端口模拟不同节点,使用拷贝指令模拟信息交换方式(实际部署可通过U盘、邮件、网络消息传输等联盟成员信任的方式传递),组网模式假设如下: + +![](../../../../images/articles/national_cryptography_deployment_example/640.jpeg) + +4、联盟委员会提供联盟链的链证书(自建或向CA公司申请,本次测试使用FISCO BCOS提供的企业级部署工具自建)。 + +5、联盟的每家机构向联盟委员会申请对应机构的机构证书(本次测试使用FISCO BCOS提供的企业级部署工具自建)。 + +6、联盟每个机构,根据联盟委员会确定的联盟链组网模式,使用FISCO BCOS提供的企业级部署工具,生成机构下属的节点部署程序,并按组网模式修改对应节点部署程序的配置文件。 + +7、联盟所有机构部署并启动下属节点程序,组成联盟链。 + +8、组网变动: + +- 机构A认为自己下属节点太多,消耗资源,准备从群组1移除节点2变为游离节点,不参与共识。同时为了提高业务处理效率,将节点1设置为观察节点,不参与共识。 + +- 机构D想加入群组2,并添加机构D下属节点: + +![](../../../../images/articles/national_cryptography_deployment_example/640-2.png) + +- 机构D和机构B想用节点3和节点5组成新群组:群组3。 + +9、机构A和机构D向联盟委员会提出组网变动申请。 + +10、联盟委员会同意机构A和机构D的组网变动申请。 + +11、机构A开始组网变动操作: + +- 群组1的机构A或B根据联盟委员会同意的机构A组网变动申请,使用控制台或SDK发送节点2退出和节点1转换为观察节点的指令,完成机构A的组网变动请求。 + +12、机构D开始组网变动操作: + +- 第5步中,机构D已向联盟委员会申请机构D的机构证书,现在,机构D使用FISCO BCOS提供的企业级部署工具,生成机构D下属的节点部署程序,根据新的组网模式,修改节点部署程序的配置文件,启动节点,准备加入联盟链。 + +- 机构D向群组2的机构B或C发送节点5入网请求,等待机构B或C使用控制台或SDK发送节点5加入群组2共识的指令。 + +- 机构B或C根据联盟委员会同意的机构D组网变动申请,使用控制台或sdk发送节点5加入群组2共识的指令。 + +- 机构D和机构B根据联盟委员会同意的群组3组网变动申请,组建群组3。 + +13、结束。 + +## 部署联盟链准备工作 + +FISCO BCOS为实际项目中部署和使用联盟链提供了企业级部署工具,里面包含了部署联盟链所需的各种操作。联盟委员会可以使用企业级部署工具自建生成链证书并为联盟成员机构颁发自建的机构证书,联盟成员机构可以使用企业级部署工具生成群组的创世区块和机构下属的节点部署程序。 + +本次测试模拟联盟链的实际搭建过程,测试部署目录(Linux)为:/usr/local/rc3-test-BCOS/,以下简称为目录rc3-test-BCOS。 + +- 环境要求:python 2.7+/3.6+,openssl 1.0.2k+。 + +- 获取企业级部署工具:git clone https://github.com/FISCO-BCOS/generator.git,得到企业级部署工具根目录generator。 + +```eval_rst +.. note:: + - 如果因为网络问题导致长时间无法下载企业级部署工具,请尝试 `git clone https://gitee.com/FISCO-BCOS/generator.git` +``` + +- 将generator上传(或直接clone)为/usr/local/rc3-test-BCOS/generator/,以下简称为目录generator。 + +- 保证generator的操作权限:chmod -R 777 /usr/local/rc3-test-BCOS/generator/ + +- 安装企业级部署工具(一定要保证安装正确): + +``` + cd generator + ./scripts/install.sh + + #查看版本: + ./generator -v + > INFO | v1.0.0-rc3 +``` + +- 下载国密版FISCO BCOS: + +``` + cd generator + ./generator --download_fisco ./meta -g +``` + +-g参数表示国密,去掉-g则下载的是普通版FISCO BCOS,执行完该命令,国密版FISCO BCOS会下载到generator/meta/下。 + +- 查看国密FISCO BCOS版本: + +``` +cd generator +./meta/fisco-bcos -v +``` + +``` +> FISCO-BCOS Version : 2.0.0-rc3 gm +> Build Time : 20190613 15:24:38 +> Build Type : Linux/clang/RelWithDebInfo +> Git Branch : master +> Git Commit Hash : a43952c544aa8252f7ac965e310148c099510410 +``` + +可以看到,本次测试部署使用的是` v1.0.0-rc3`版本的企业级部署工具,`2.0.0-rc3 gm`版本的FISCO BCOS(似乎与rc2版本的部署流程相同)。 + +## 证书说明 + +FISCO BCOS国密版的链证书和机构证书需要两套,分别为国密证书和普通版证书。 + +- 证书链: + +``` +> 链证书——机构证书----节点证书 +> +> 链证书——机构证书----sdk证书 +``` + +- 证书支持自建、CA公司申请,企业级部署工具底层使用`openssl`工具自建生成,如果要用CA公司申请的证书,可直接把证书文件的名称改为规定的名称即可。 +- 链证书普通版`ca.crt`,对应的私钥`ca.key`。链证书国密版`gmca.crt`,对应的私钥`gmca.key`。 +- 机构证书普通版`agency.crt`,对应的私钥`agency.key`,机构证书国密版`gmagency.crt`,对应的私钥`gmagency.key`。 +- 说明:链证书私钥需要联盟委员会保管,机构证书的私钥由各机构自行保管,证书及私钥的意义这里不做延伸。 +- 使用FISCO BCOS企业级部署工具时,所有需要证书的操作都需要将链证书和机构证书(.crt文件)放置在`generator/meta/`下。 + +## 部署联盟链详细步骤(附每一步代码) + +经过尝试,我按以下操作顺序执行,成功部署了一个符合上面场景描述的联盟链。由于步骤十分详细,而且含有大量代码,所以单独放在此处链接里:[《手把手教你实操部署FISCO BCOS联盟链》](https://blog.csdn.net/FISCO_BCOS/article/details/95496272)(温馨提示:此文附每一步代码演示,复制链接到PC端打开体验为佳。) + +## 关键步骤总结 + +1. 联盟委员会及相关成员确定组网模式; +2. 相关的各种证书的颁发; +3. 准备FISCO BCOS企业级部署工具; +4. 根据组网模式,各机构收集所要组建群组的下属节点的p2p连接信息; +5. 各群组生成并分发创世区块(文件); +6. 各机构生成机构下属加点的节点部署程序; +7. 各机构根据组网模式,修改下属节点部署程序中的配置文件,启动联盟链。 + +## 写在最后 + +至此,这套可供实际项目使用的部署流程就搭建完成了。我在刚开始部署时,会觉得整个系统的部署很复杂,多次部署之后,觉得流程挺合理挺清楚的,因为在实际场景中不是一个人在操作,是整个联盟各机构一起在协同,按联盟链该有的组织形式去部署其实很快,多次部署中我也总结了一些经验: + +- 首先是多看官方技术文档,梳理出了大致流程。 +- 其次就是解决证书的问题,这个问题对我来说如鲠在喉,在实际业务中,证书必须是具有法律效力,由CA公司颁发的。我认为证书的生成,可以考虑从企业级部署工具中分离出来,作为搭建测试链的一个工具。当然,在实际业务中,如果不重视数据的法律效应,也可以只把证书当做一个加密的公私钥对看待。 +- FISCO BCOS目前处于快速迭代开发的阶段,推出的一些功能都很好,比如区块链浏览器。 +- 适配支持FISCO BCOS底层平台的区块链中间件平台WeBASE,功能全面,上手快速,节约大量时间都很好。 + +整体而言FISCO BCOS体验很不错,期待看到FISCO BCOS更多的突破。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/36_cryptographic/national_cryptography_features.md b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/national_cryptography_features.md new file mode 100644 index 000000000..6068e63bf --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/36_cryptographic/national_cryptography_features.md @@ -0,0 +1,161 @@ +# FISCO BCOS的国密特性 + +作者:李昊轩|FISCO BCOS 核心开发者 + + +> 安全是信任的保障,算法则是安全的基础,节点通信信道的建立、签名的生成、数据的加密等,都需要用到密码学的相应算法。FISCO BCOS采用国密算法,实现安全可控的区块链架构。 + +本期文章讲解国密算法的相关概念,以及国密算法在区块链中的应用。 + +## 区块链中的密码学 + +在区块链中,一般使用密码学的场景有以下几种: + +### 1. 数据哈希算法 + +哈希函数是一类单向函数,作用是将任意长度的消息转换为定长的输出值,具有单向性、无碰撞性、确定性、不可逆的性质。 +在区块链中,哈希函数用于将消息压缩成定长的输出,以及保证数据真实性,确保数据未被修改。 + +### 2. 数据加密解密算法 + +加解密算法主要分为对称加密和非对称加密两种: +- 对称加密具有速度快、效率高、加密强度高等特点,使用时需要提前协商密钥,主要对大规模数据进行加密,如FISCO BCOS的节点数据落盘时进行的加密。 +- 非对称加密具有无需协商密钥的特点,相较于对称加密计算效率较低,存在中间人攻击等缺陷,主要用于密钥协商的过程。 + +针对不同的需求,两者可以互相配合,组合使用。 + +### 3. 消息签名的生成和验证 + +在区块链中,需要对消息进行签名,用于消息防篡改和身份验证。如节点共识过程中,需要对其他节点的身份进行验证,节点需要对链上交易数据进行验证等。 + +### 4. 握手建立流程 + +前面我们讲过[**节点TLS的握手过程**](https://mp.weixin.qq.com/s?__biz=MzU5NTg0MjA4MA==&mid=2247484845&idx=1&sn=c943c8a3f55a060991ffafec8bbdb27b&scene=21#wechat_redirect)(点击直达),其中需要使用到密码组件和数字证书,都需要使用到相应的密码学算法。 + +## FISCO BCOS的国密算法 + +国密算法由国家密码局发布,包含SM1\ SM2\ SM3\ SM4\等,为我国自主研发的密码算法标准。 +为了充分支持国产密码学算法,金链盟基于国产密码学标准,实现了国密加解密、签名、验签、哈希算法、国密SSL通信协议,并将其集成到FISCO BCOS平台中,实现了对国家密码局认定的商用密码的完全支持。 +国密版FISCO BCOS将交易签名验签、p2p网络连接、节点连接、数据落盘加密等底层模块的密码学算法均替换为国密算法。 + +1. 节点TLS握手中采用国密SSL算法; +2. 交易签名生成,验证过程采用国密SM2算法; +3. 数据加密过程中采用国密SM4算法; +4. 数据摘要算法采用国密SM3算法。 + +国密版FISCO BCOS节点之间的认证选用国密SSL 1.1的ECDHE_SM4_SM3密码套件进行SSL链接的建立,差异如下表所示: + +| | **OpenSSL** | **国密SSL** | +| ------------ | ---------------------------------------- | ---------------------------------------- | +| 加密套件 | 采用ECDH、RSA、SHA-256、AES256等密码算法 | 采用国密算法 | +| PRF算法 | SHA-256 | SM3 | +| 密钥交换方式 | 传输椭圆曲线参数以及当前报文的签名 | 当前报文的签名和加密证书 | +| 证书模式 | OpenSSL证书模式 | 国密双证书模式,分别为加密证书和签名证书 | + +国密版与标准版FISCO BCOS在数据结构上的差异如下: + +| **算法类型** | **标准版**FISCO BCOS | **国密版**FISCO BCOS | +| ------------ | ---------------------------------------------- | -------------------------------------------------- | +| 签名 | ECDSA (公钥长度: 512 bits, 私钥长度: 256 bits) | SM2 (公钥长度:512 bits, 私钥长度:256 bits) | +| 哈希 | SHA3 (哈希串长度: 256 bits) | SM3 (哈希串长度: 256 bits) | +| 对称加解密 | AES (加密秘钥长度: 256 bits) | SM4 (对称密钥长度: 128 bits) | +| 交易长度 | 520bits(其中标识符8bits,签名长度512bits) | 1024bits(128字节,其中公钥512bits,签名长度512bits) | + +## 开启国密特性 + +需要使用国密版FISCO BCOS特性时,有以下几点需要注意: + +### 1. 搭建国密版FISCO BCOS区块链 + +搭建国密版FISCO BCOS的区块链方式主要有2种: + +##### (1). 使用build_chain.sh脚本搭建 + +buildchain.sh脚本的-g为国密编译选项,使用成功后会生成国密版的节点。默认从GitHub下载最新稳定版本可执行程序,操作方式: + +```bash +curl -LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.9.1/build_chain.sh && chmod u+x build_chain.sh +``` + +```eval_rst +.. note:: + - 如果因为网络问题导致长时间无法下载build_chain.sh脚本,请尝试 `curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master-2.0/tools/build_chain.sh && chmod u+x build_chain.sh` +``` + +运行以下命令,搭建四节点的国密版FISCO BCOS联盟链 + +```bash +./build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -g +``` + +执行成功后,会搭建本地四节点的国密版FISCO BCOS联盟链。 + +##### (2). 使用企业级部署工具搭建 + +企业级部署工具generator的-g命令为国密相关操作,用户需要在生成相关证书,下载二进制等操作的过程中附带-g选项,操作方式: + +**参考教程**:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/enterprise_quick_start.html + +``` +./generator --download_fisco ./meta -g +./generator --generate_chain_certificate ./dir_chain_ca -g +./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyB -g +... +``` + +以下操作与教程中类似 + +``` +./generator --build_install_package ./meta/peersB.txt ./nodeA -g +``` + +### 2. 使用国密版sdk/控制台 + + +国密版sdk和控制台的操作命令与普通版相同,Web3SDK和1.x版本控制台在启用国密特性时需要做如下操作: + +- (1). 将applicationContext.xml中的encryptType设置为1; +- (2). 加载私钥时需要加载国密版的私钥; +- (3). 控制台还需要获取国密版jar包。 + +```eval_rst +.. note:: + java sdk和2.6.0+版本的控制台启用国密算法时不需要额外配置 +``` + +### 3. 开启国密版落盘加密功能 + +国密版落盘加密需要同时对节点conf/gmnode.key和conf/origin_cert/node.key进行加密,其余操作与普通版相同。 + +## 总结 + +FISCO BCOS中的主要算法特性对比如下: + +| | **标准版****FISCO BCOS** | **国密版****FISCO BCOS** | +| ------------ | ------------------------ | ------------------------ | +| SSL链接 | Openssl TLSv1.2协议 | 国密TLSv1.1协议 | +| 签名验证 | ECDSA签名算法 | SM2签名算法 | +| 消息摘要算法 | SHA-256 SHA-3 | SM3消息摘要算法 | +| 落盘加密算法 | AES-256加密算法 | SM4加密算法 | +| 证书模式 | OpenSSL证书模式 | 国密双证书模式 | +| 合约编译器 | 以太坊solidity编译器 | 国密solidity编译器 | + +------ + +### 「用户提问」 + +**Q**:**王刚+云飞微联网+珠海**:请问solidity编译器也需要用到密码学算法吗? + +**A**:**李昊轩**:solidity中的abi会用到哈希,需要底层和合约编译器都使用相同的SM3算法。 + +**Q**:**陈小军-江南科友-广州**:请问一下国密TLS协议套件是自己实现的吗,还是用了开源的? + +**A**:**李昊轩**:国密TLS我们采用的是TASSL开源库。 + +**Q**:**腾龙(何直群)**:如果使用国密的节点,因为签名算法都换了,是不是 RPC SDK 都会不一样了? + +**A**:**李昊轩**:是的, sdk也需要开启国密特性。 + +**Q**:**KHJ**:目前落盘加密的私钥是如何处理的? + +**A**:**meng**:要自己保存,可以参考这里的[说明](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/storage_security.html) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/37_safety/access_control_glance.md b/3.x/zh_CN/docs/articles/3_features/37_safety/access_control_glance.md new file mode 100644 index 000000000..a2f2b1742 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/37_safety/access_control_glance.md @@ -0,0 +1,162 @@ +# FISCO BCOS权限控制一览 + +作者:张开翔|FISCO BCOS 首席架构师 + +**作者语** + +在多方参与的联盟链上,各方分工协作的同时也要做到**职责分明、各司其职**。链的管理者没有必要“既当裁判又当运动员”的参与业务交易,只参与交易的用户也不必很操心智能合约的开发部署。同时,"DO分离"(开发和运维分离)已经是业界成熟的做法,越权操作会带来风险,最终可能破坏信誉和造成资产损失。 + +清晰、易用、周全的**权限控制能力**,无论是对于信息安全,还是为了完善联盟治理,都至关重要。 + +本期文章讲的就是FISCO BCOS权限控制这点事,作者从FISCO BCOS的权限分类、典型的联盟链角色设计、权限控制操作基本步骤等角度进行了解析。 + +```eval_rst +.. note:: + 从 ``v1.0.9`` 开始,控制台不再支持 ``grantPermissionManager`` 命令,请使用 ``grantCommitteeMembers`` 和 ``grantOperator`` 等区块链委员权限管理相关的命令替代该命令。 +``` + +## FISCO BCOS的权限分类 + +FISCO BCOS在链刚建立起来的时候,为了方便快速地进行开发和体验,默认并没有做任何权限控制。但如果这条链是用来提供企业级服务,则从一开始就要设计权限控制的策略并落实之。 FISCO BCOS的权限分类: + +![](../../../../images/articles/access_control_glance/IMG_4967.PNG) + + +### 1. 链管理员权限 + +即**分配权限的权限**,如定义账户A作为链管理员,A可以为账户B、C、D分配权限;可以设置多个管理员,如果不设置管理员,任何账户都可以无差别修改各种权限。 + +### 2. 系统管理权限 + +目前包括4种: + +- 节点管理权限(增删共识节点或观察节点) +- 系统参数修改权限 +- 修改CNS合约命名权限 +- 能否部署合约和建表的权限 + +其中部署合约和建表是“二合一”的控制项,在使用CRUD合约时,我们建议部署合约的时候一起把合约里用到的表建了(写在合约的构造函数里),否则接下来读写表的交易可能会遇到“缺表”错误。如果业务流程需要动态创建表,动态建表的权限也应该只分配给少数账户,否则链上可能会出现各种废表。 + +### 3. 用户表权限 + +以用户表为粒度,控制某些账户能否**改写某个用户表**,以避免用户表被他人意外修改,这个权限要依赖FISCO BCOS的CRUD合约写法。另外,**读用户表**不受权限控制;如果要进行数据的隐私控制,需要引入数据加密、零知识等技术。 + +### 4.合约接口权限 + +一个合约可以包括多个接口,由于合约里的逻辑和业务密切相关,接口粒度的权限控制由开发者实现,开发者可对msg.sender或 tx.orgin进行判断,决定是否允许本次调用继续处理。 + +FISCO BCOS的控制台提供了一系列控制权限的命令,可以很方便的为用户**授予(grant)、取消(revoke)、查看(list)**各种权限,可以参见控制台的文档。 + +## 联盟链中典型的权限管理角色设计 + +在联盟链里,不同的角色各司其职,分工协作,典型的角色设计可参照: + +### 1. 链管理员 + +通常是参与链的多方共同选出一个委员会,一个或多个机构可获得管理员权限,以进行人员管理和权限分配。链管理员并不负责任节点管理,修改系统参数,部署合约等系统管理操作。 + +### 2. 系统管理员 + +指定的业务运营人员或系统运维人员,按需分配各种权限,负责日常的链上管理,包括节点增删,系统参数修改等。由链管理员根据大家约定的治理规则来分配权限,比如只允许指定的账户部署合约,则给他们设定合约部署权限,这样其他账户则不能随意部署合约了。 + +### 3.交易用户 + +用户向区块链发送业务交易请求,业务交易主要是调用合约和读写用户表,可以根据业务逻辑,结合用户表权限和合约接口权限来进行灵活的控制。 + +### 4. 监管方 + +给监管方分配哪些系统和用户表权限,可参考具体的监管规则,如监管方只读所有数据,则不用设定特殊的权限。 + +管理不同角色的帐户又是另一个复杂的问题,既要清晰区分,又要便于使用,还要保证帐号安全;万一帐号丢失后要支持找回,帐号泄漏后重置,以后会另文介绍。 + +## 权限控制操作基本步骤 + +### step1 + +首先采用控制台grantPermissionManager命令设置一个或多个链管理员角色。 **Tips**:登陆控制台时,命令行里输入的是私钥明文,而使用grantPermissionManager命令输入的是“账户地址”,要注意区分。如: + +用户私钥:3bed914595c159cbce70ec5fb6aff3d6797e0c5ee5a7a9224a21cae8932d84a4 + +对应地址:0xf1585b8d0e08a0a00fff662e24d67ba95a438256 + +那么登陆控制台的命令行是: + +``` +./start.sh 1 3bed914595c159cbce70ec5fb6aff3d6797e0c5ee5a7a9224a21cae8932d84a4 +``` + +分配管理员权限的命令行是: + +``` +grantPermissionManager 0xf1585b8d0e08a0a00fff662e24d67ba95a438256 +``` + +当这个账户得到了链管理员权限后,退出当前控制台或切到另一个终端窗口,用这个账户的私钥登陆一次,即可作为链管理员进行后续的操作了。 + +**Tips**:一定要记住管理员地址和私钥的对应关系,否则一旦设置管理员权限,只有管理员可以为其他账户分配权限,其他账户的设置操作都会报告没有权限。 + +### step2 + +用链管理员账户登陆控制台,根据管理策略,依次给其他系统管理员账户分配节点管理权限,系统参数修改权限,CNS权限,部署合约和建表权限等。然后用一个有相应权限的系统管理员账户私钥登陆控制台,如有部署和建表权限的账号,以便进行下一步。 + +### step3 + +开发者编写CRUD的合约时,一旦合约在链上创建了用户表,则可以采用控制台的grantUserTableManager命令,由有权限的系统管理员指定哪些账号可以创建表和增删改该表的数据,命令行是 + +``` +grantUserTableManager t_order 0xf1585b8d0e08a0a00fff662e24d67ba95a438256 +``` + +授权0xf1585b8d0e08a0a00fff662e24d67ba95a438256这个账号可以操作**t_order**表,而其他账号不行,如要读写该表,继续添加权限,对一个表有读写权限的账号可以有多个。 + +### step4 + +对solidity合约里的某个接口,可以参考这样的代码进行控制: + +``` + function testFunction() public returns(int256) +{ + require(msg.sender == tx.origin); //这一行的效果是禁止了合约调合约 + if(msg.sender != address(0x156dff526b422b17c4f576e6c0b243179eaa8407) ) //这里为示例,直接写了账户地址明文,实际上开发时可以灵活处理。 + { return -1; } //如果调用者和预设的有权限的调用者不同,则返回 + } +``` + +msg.sender是当前合约调用者的地址,可以是用户也可以是另一个合约(合约调合约时);tx.origin则是本次交易的真正发起用户,给交易签名的用户。 + +## 小结及参考资料 + +本文介绍FISCOBCOS在基础层面上提供的一些接口和能力,权限控制的合理性和周密程度最终会取决于使用者,关于不同链的场景化治理和安全控制,可以继续深入探讨,以得出最佳实践。 + +#### 参考资料 + +- [P2P网络详细设计](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/p2p/p2p.html) + +- [权限控制设计](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/security_control/permission_control.html) + +- [控制台的文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html) + +- [权限控制实操介绍](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/permission_control.html) + +- [CRUD合约开发介绍](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html#crud) + +- [CRUD合约应用示例](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html) + +------ + +#### 群友问答 + +**@李翛然**:请问几个问题: + +1)管理员分配表权限,这个操作是不是在每个节点都可以进行? + +2)创建角色,这个操作是不是每个节点都可以操作? + +如果以上两个问题答案是肯定的,请问是不是只要有了一个节点的超级权限,就可以修改整个网络的数据? + +**@光路**:是肯定的,建立链之前就先协商好链管理员角色由哪一个或几个账号担任,链建立后第一时间进行角色分配,具体可以参见FISCO BCOS权限控制相关文档。 + +感谢参与本次话题讨论的小伙伴们!开源社区,因你们更美! + + + diff --git a/3.x/zh_CN/docs/articles/3_features/37_safety/certificate_description.md b/3.x/zh_CN/docs/articles/3_features/37_safety/certificate_description.md new file mode 100644 index 000000000..4fc8c3187 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/37_safety/certificate_description.md @@ -0,0 +1,98 @@ +# FISCO BCOS证书说明 + +作者:李昊轩|FISCO BCOS 核心开发者 + +联盟链中,链上的多方参与是一种协作关系;联盟链向授权的组织或机构开放,有准入机制。在准入机制中,证书是各参与方互相认证身份的重要凭证;可以说,**证书机制是联盟链网络安全的基石**。 + +## Part1:FISCO BCOS 证书结构 + +FISCO BCOS网络采用面向CA的准入机制,使用x509协议的证书格式,支持任意多级的证书结构,保障信息保密性、认证性、完整性及不可抵赖性。根据现有业务场景,FISCO BCOS默认采用三级的证书结构,自上而下分别为链证书、机构证书、节点证书。 + +![](../../../../images/articles/certificate_description/IMG_5540.PNG) + +▲ 图:x509协议的证书格式 + +证书内容包括了证书版本号、序列号、证书的签名算法、消息摘要算法等生成信息;同时包括了证书的颁发者、有效期、使用者、公钥信息、SSL通信需要用到的密码套件等信息。节点通过加载证书,在接受数据包时,根据证书规定的密码套件和其消息字段,对数据包中携带的证书进行验证。 + +## Part2:角色定义 + +FISCO BCOS的证书结构中有4种角色,分别是联盟链委员会、联盟链成员机构、联盟链参与方(节点和SDK)。 + +### 1. 联盟链委员会 + +联盟链委员会拥有联盟链的根证书ca.crt和私钥ca.key,通过使用ca.key对联盟链成员机构签发机构证书,负责完成联盟链成员机构的准入、剔除等操作。 + +### 2. 联盟链成员机构 + +联盟链成员机构为经过联盟链委员会许可,加入到联盟链的机构。联盟链成员机构拥有机构私钥agency.key和经过根私钥ca.key签发的机构证书agency.crt。联盟链成员机构可以通过机构私钥签发节点证书,从而配置本机构的节点和SDK。 + +### 3. 联盟链参与方 + +联盟链参与方可以通过运行节点或SDK联盟链交互,拥有与其他节点进行通信的节点证书node.crt和私钥node.key。联盟链参与方运行节点或SDK时,需要加载根证书ca.crt和相应的节点证书node.crt和私钥node.key;与其他成员进行网络通信时,使用预先加载的证书进行身份认证。 + +## Part3:证书生成流程 + +### 1. 联盟链委员会初始化根证书ca.crt + +- 本地生成私钥ca.key;自签生成根证书ca.crt。 + +![](../../../../images/articles/certificate_description/IMG_5541.PNG) + +### 2.联盟链成员机构获取机构证书agency.crt + +- 本地生成私钥agency.key; +- 由本地私钥生成证书请求文件agency.csr; +- 将证书请求文件agency.csr发送至联盟链委员会; +- 联盟链委员会使用ca.key对证书请求文件agency.csr进行签发,得到联盟链成员机构证书agency.crt; +- 联盟链委员会将联盟链成员机构证书agency.crt发送至对应成员。 + +![](../../../../images/articles/certificate_description/IMG_5542.PNG) + +### 3.节点/SDK获取证书node.crt + +![](../../../../images/articles/certificate_description/IMG_5543.PNG) + +- 本地生成私钥node.key; + +- 由本地私钥生成证书请求文件node.csr; + +- 将证书请求文件node.csr发送至联盟链成员机构; + +- 联盟链成员机构使用agency.key对证书请求文件node.csr进行签发,得到节点/SDK证书node.crt; + +- 联盟链成员机构将节点证书node.crt发送至对应实体。 + + ![](../../../../images/articles/certificate_description/IMG_5544.PNG) + +▲ 图:节点私钥相关说明 + +## Part4:证书生成实例 + +以生成联盟链成员机构机构证书为例: + +1.机构首先在本地使用机构私钥agency.key生成证书请求文件agency.csr; + +``` +openssl req -new -sha256 -subj "/CN=$name/O=fisco-bcos/OU=agency" -key ./agency.key -config ./cert.cnf -out ./agency.csr +``` + +2.联盟链委员会根据证书请求文件生成机构证书agency.crt; + +``` +openssl x509 -req -days 3650 -sha256 -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -in ./agency.csr -out ./agency.crt -extensions v4_req -extfile ./cert.cnf +``` + +上述过程中的cert.cnf为证书信息配置项,可以采用默认设置。 + +## Part5:小结及参考文档 + +本文介绍了FISCO BCOS采用的相关证书说明和其对应的层级架构;在后续文章中,我们会具体讲解SSL握手过程中如何使用这些数字证书。 + +------ + +#### 参考资料 + +- [证书说明](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/certificates.html) +- [权限控制](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/permission_control.html) +- [节点准入](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/node_management.html) + diff --git a/3.x/zh_CN/docs/articles/3_features/37_safety/disk_encryption.md b/3.x/zh_CN/docs/articles/3_features/37_safety/disk_encryption.md new file mode 100644 index 000000000..e0452dd5b --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/37_safety/disk_encryption.md @@ -0,0 +1,129 @@ +# FISCO BCOS的落盘加密 + +作者:石翔|FISCO BCOS 核心开发者 + +区块链部署是多方参与的,为了简化多方协作环境的搭建,通常会使用公有云部署区块链。机构将自己的节点部署到云上,让服务与云上的节点进行交互,实现多方协作。在这个架构中,机构内部的安全性是很高的,尤其是在金融机构。 +虽然通过网络的隔离机制,将节点限制在“内网”中,通过网络不能轻易地盗取数据,但是数据全部托管在云上,由于所有参与者都会保存一份数据,在网络和系统安全措施有疏漏或操作不当等极端情况下,可能出现某一份数据被越权访问的情况。 +为了防止数据盘被攻破或者盗取,避免数据泄露情况的发生,FISCO BCOS引入了“落盘加密”的功能。 + +## 背景架构 + +在联盟链的架构中,机构和机构之间搭建一条区块链,数据在联盟链的各个机构内是可见的。 +在某些数据安全性要求较高的场景下,联盟内部的成员并不希望联盟之外的机构能够获取联盟链上的数据。此时,就需要对联盟链上的数据进行访问控制。 + +联盟链数据的访问控制,主要分为两个方面: + +- 链上通信数据的访问控制 +- 节点存储数据的访问控制 + +对于链上通信数据的访问控制,FISCO BCOS是通过节点证书和SSL来完成。此处主要介绍节点存储数据的访问控制,即落盘加密。 + +![](../../../../images/articles/disk_encryption/IMG_4939.PNG) + +## 主要思想 + +落盘加密是在机构内部进行的。在机构的内网环境中,每个机构独立地对节点的硬盘数据进行加密。 +当节点所在机器的硬盘被带离机构,并让节点在机构内网之外的网络启动,硬盘数据将无法解密,节点无法启动,进而无法盗取联盟链上的数据。 + +## 方案架构 + +![](../../../../images/articles/disk_encryption/IMG_4940.PNG) + +落盘加密是在机构内部进行的,每个机构独立管理自己硬盘数据的安全。内网中,每个节点的硬盘数据是被加密的。所有加密数据的访问权限,通过Key Manager来管理。 +Key Manager部署在机构内网里,是专门管理节点硬盘数据访问秘钥的服务,外网无法访问。当内网的节点启动时,从Key Manager处获取加密数据的访问秘钥,来对自身的加密数据进行访问。 + +加密保护的对象包括: + +- 节点本地存储的数据库:rocksdb或leveldb +- 节点私钥:node.key,gmnode.key(国密) + +## 实现原理 + +具体的实现过程,是通过节点自身持有的秘钥(dataKey)和Key Manager管理的全局秘钥(superKey)来完成的。 + +### 节点 + +- 节点用自己的dataKey,对自身加密的数据(Encrypted Space)进行加解密。 +- 节点本身不会在本地磁盘中存储dataKey,而是存储dataKey被加密后的cipherDataKey。 +- 节点启动时,拿cipherDataKey向Key Manager请求,获取dataKey。 +- dataKey只在节点的内存中,当节点关闭后,dataKey自动丢弃。 + +### Key Manager + +持有全局的superKey,负责对所有节点启动时的授权请求进行响应。 + +- Key Manager在节点启动时必须在线,响应节点的启动请求。 +- 当节点启动时,发来cipherDataKey,Key Manager用superKey对cipherDataKey进行解密,若解密成功,就将节点的dataK返回给节点。 +- Key Manager只能在内网访问,机构外的外网无法访问Key Manager。 + +![](../../../../images/articles/disk_encryption/IMG_4941.PNG) + +## 相关操作 + +### Key Manager操作 + +在每个机构上启动一个key-manger程序,用如下命令启动,指定Key Manager: + +``` +# 参数:端口,superkey +./key-manager 31443 123xyz +``` + +### 节点操作 + +#### (1)配置新节点dataKey + +``` +# 参数:Key Manager IP,端口,dataKey +bash key-manager/scripts/gen_data_secure_key.sh 127.0.0.1 31443 12345 +``` + +得到cipherDataKey,脚本自动打印出落盘加密所需要的ini配置(如下)。此时得到节点的cipherDataKey:cipher_data_key=ed157f4588b86d61a2e1745efe71e6ea。 + +``` +[storage_security] +enable=true +key_manager_ip=127.0.0.1 +key_manager_port=31443 +cipher_data_key=ed157f4588b86d61a2e1745efe71e6ea +``` + +将得到的落盘加密的ini配置,写入节点配置文件(config.ini)中。 + +#### (2)加密新节点的私钥 + +执行脚本,加密节点私钥: + +``` +# 参数:ip port 节点私钥文件 cipherDataKey +bash key-manager/scripts/encrypt_node_key.sh 127.0.0.1 31443 +nodes/127.0.0.1/node_127.0.0.1_0/conf/node.key +ed157f4588b86d61a2e1745efe71e6ea +``` + +执行后,节点私钥自动被加密,加密前的文件备份到了文件node.key.bak.xxxxxx中,请将备份私钥妥善保管,并删除节点上生成的备份私钥。 + +**注意**: + +国密版比非国密版需要多加密一个文件: + +- 非国密版:conf/node.key +- 国密版:conf/gmnode.key和conf/origin_cert/node.key + +#### (3)启动节点 + +直接启动节点即可。如果这个节点所在的硬盘被带出机房(内网),将无法访问Key Manager。节点拿不到自己的dataKey,无法解密硬盘数据,也无法解密自己的私钥,因而无法启动。 + +## 注意事项 + +- Key Manager是一个demo版本,目前superKey是通过命令行在启动的时候指定,在实际应用中,需要根据安全要求,自己定制加载superKey的方式,比如使用加密机进行管理。 +- 落盘加密的配置只针对新生成的节点,节点一旦启动,将无法转换成带落盘加密的节点。 +- 国密版的落盘加密比非国密版多加密一个私钥。 + +------ + +#### 参考链接 + +[Key Manager源码](https://github.com/FISCO-BCOS/key-manager) + +[Key Manager源码gitee地址](https://gitee.com/FISCO-BCOS/key-manager) diff --git a/3.x/zh_CN/docs/articles/3_features/37_safety/index.md b/3.x/zh_CN/docs/articles/3_features/37_safety/index.md new file mode 100644 index 000000000..1cdf879ae --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/37_safety/index.md @@ -0,0 +1,44 @@ +### 安全控制 + +存储安全:支持落盘数据加密存储 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + disk_encryption.md +``` + + +通信安全:支持全流程SSL + +```eval_rst +.. toctree:: + :maxdepth: 1 + + tsl1.2_establish_process.md +``` + + +证书管理:支持证书颁发、撤销、更新 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + certificate_description.md + third-party-CA_node_deployment.md +``` + + +权限控制:支持细粒度权限控制 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + access_control_glance.md + role_authority_model_realization.md +``` + + diff --git a/3.x/zh_CN/docs/articles/3_features/37_safety/role_authority_model_realization.md b/3.x/zh_CN/docs/articles/3_features/37_safety/role_authority_model_realization.md new file mode 100644 index 000000000..93e21c0e7 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/37_safety/role_authority_model_realization.md @@ -0,0 +1,116 @@ +# FISCO BCOS 角色权限模型的实现 + +作者:白兴强|FISCO BCOS 核心开发者 + +## 引言 + +FISCO BCOS的权限控制是通过控制账号对系统中表的写权限来实现的。这种权限控制模型非常灵活且强大,用户几乎可以控制任意一项权限,例如,通过控制权限表的写权限管理分配权限;通过控制系统合约所对应表的写权限管理链配置、节点身份管理、合约部署、用户表创建等;通过控制合约表的写权限管理合约写接口的调用。 + +然而,绝对完美是不存在的。强大灵活的权限控制也带来较高的学习成本:用户需要理解每个权限项控制的内容以及如何设置,了解链管理员和系统管理员的区别……大量的概念和操作,对用户要求极高。 + +为了降低使用难度,提升用户体验,FISCO BCOS v2.5对此功能进行了优化,新增了基于角色的权限控制。把不同的权限统归到不同角色,用户根据账号所属角色即可判断其所拥有的权限。同时v2.5基于角色引入了链上治理投票模型,使治理操作更加方便。 + +## 什么是角色权限模型? + +使用角色权限模型后,用户只需记住角色,而角色对应的权限不言自明,例如,治理委员会委员拥有链治理相关权限,这极大降低用户理解难度与学习成本。 + +![](../../../../images/articles/role_authority_model_realization/IMG_5553.PNG) + +### 角色对应的权限 + +区块链上的参与者,可根据角色分为治理方、运维方、监管方和业务方。为避免既当裁判又当运动员,治理方、运维方应权责分离,角色互斥。 + +- 治理方:角色称为治理委员会委员,简称委员,负责区块链治理。 +- 运维方:负责区块链运维,该角色由委员添加。 +- 业务方:业务方账号由运维添加到某个合约,可以调用该合约的写接口。 +- 监管方:监管方监管链的运行,能够获取链运行中权限变更记录以及需要审计的数据。 + +各角色所对应权限具体如下表所示。 + +![](../../../../images/articles/role_authority_model_realization/IMG_5554.PNG) + +### 角色权限实现的细节 + +本小节将简单介绍委员、运维和业务角色的权限实现细节以及背后原理,以便更好理解与使用角色权限功能。 + +链初始无委员账号,当存在至少一个委员账号时,委员拥有的权限开始受到控制。联盟链实际应用中多个参与方的技术实力可能并不相同,从实际应用场景出发,我们引入了链上治理投票模型,所有治理操作需要有效投票数/委员数>生效阈值才能生效,用户通过新增的链治理预编译合约可以实现委员的增删、权重修改、投票生效阈值修改等操作。 + +投票模型有几处值得注意: + +- 每次投票操作,如果是委员投票,则记录操作内容和投票委员,不重复计票 +- 每次投票操作,计票结束后,计算有效投票数/委员数,如果大于此操作的生效阈值,则对应操作生效 +- 投票设置过期时间,根据块高,blockLimit的10倍,固定不可改 + +运维角色的新增与撤销必须由委员角色操作。链初始无运维账号,当存在至少一个运维账号时,运维拥有的权限开始受到控制。业务账号可以调用链上查询接口与运维指定合约的写接口。 + +### 兼容性说明 + +目前,角色权限模型基于对系统中各类表的写权限控制。我们做了最大努力与之前版本使用体验保持一致,但为了权限控制的完整严谨,对FISCO BCOS v2.5新建链,控制台grantPermissionManager指令不再有效,原PermissionManager的权限归属于委员角色。对于v2.5之前的链,该指令仍然有效。 + +## 如何使用角色权限? + +本节将以“委员增删”和“运维增删”为例进行简要的实操演示,文档含括了更丰富的角色权限相关操作,欢迎移步[查看](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/permission_control.html)。 + +### 增删委员 + +使用控制台v1.0.10以上版本中自带的get_account.sh脚本,生成3个如下账号,接下来的操作以这3个账号为例演示。配置好控制台后,使用控制台的-pem选项分别加载3个私钥启动3个控制台。 + +``` +# 账号10x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a.pem# 账号20x85961172229aec21694d742a5bd577bedffcfec3.pem# 账号30x0b6f526d797425540ea70becd7adac7d50f4a7c0.pem +``` + +#### 添加账号1为委员 + +增加委员需要链治理委员会投票,有效票大于阈值才可生效。此处由于只有账号1是委员,所以账号1投票即可生效。 + +![](../../../../images/articles/role_authority_model_realization/IMG_5555.PNG) + +#### 使用账号1添加账号2为委员 + +此处由于只有账号1是委员,所以使用账号1投票后,满足阈值判断立刻生效。 + +![](../../../../images/articles/role_authority_model_realization/IMG_5556.PNG) + +#### 撤销账号2的委员权限 + +此时系统中有账号1和账号2两个委员,默认投票生效阈值50%,所以需要两个委员都投票撤销账号2的委员权限,有效票/总票数=2/2=1>0.5才满足条件。 + +账号1投票撤销账号2的委员权限,如下图: + +![](../../../../images/articles/role_authority_model_realization/IMG_5557.PNG) + +账号2操作投票撤销账号2的委员权限,如下图: + +![](../../../../images/articles/role_authority_model_realization/IMG_5558.PNG) + +### 增删运维 + +委员可以添加与撤销运维角色,运维角色的权限包括部署合约、创建表、冻结解冻所部署的合约、使用CNS服务等。 + +#### 使用账号1添加账号3为运维 + +![](../../../../images/articles/role_authority_model_realization/IMG_5559.PNG) + + +#### 使用账号3部署HelloWorld + +账号3是运维角色,可以部署合约,具体操作如下图: + +![](../../../../images/articles/role_authority_model_realization/IMG_5560.PNG) + +#### 使用账号1部署HelloWorld + +账号1是委员,不具有部署合约的权限,部署合约失败,如下图: + +![](../../../../images/articles/role_authority_model_realization/IMG_5561.PNG) + + +#### 使用账号1撤销账号3的运维权限 + +账号1是委员可以撤销运维,如下图: + +![](../../../../images/articles/role_authority_model_realization/IMG_5562.PNG) + +## 总结 + +作为联盟链的重要特性,权限控制需要做到灵活且强大,但如何在此基础上达成良好的用户体验,需要不断地改进优化。FISCO BCOS v2.5前的权限控制实现了灵活且强大的功能,但同时,社区也收到不少反馈,认为权限控制的使用理解门槛过高。通过角色权限,我们希望能在保持原有功能的同时,降低学习门槛、提升大家的使用体验。整合优化权限控制的工作仍在进行,希望未来能实现从底层到应用全覆盖的权限控制解决方案。欢迎大家共同探讨交流,积极反馈使用体验与改进建议。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/37_safety/third-party-CA_node_deployment.md b/3.x/zh_CN/docs/articles/3_features/37_safety/third-party-CA_node_deployment.md new file mode 100644 index 000000000..d96a4fc52 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/37_safety/third-party-CA_node_deployment.md @@ -0,0 +1,152 @@ +# FISCO BCOS上使用第三方CA证书底层节点部署实操 + +作者:林宣名|FISCO BCOS开源社区贡献者 + +CA证书怎么生成?节点相互验证证书时会交叉验证吗?对于社区常遇到的此类问题,分享一些个人使用第三方CA证书部署底层节点的经验,希望可以给大家一些借鉴与参考。 + +## 为什么要对第三方CA证书进行改造? + +首先,说明一下我进行第三方CA证书改造的背景和原因: + +- 社区内经常有人会问到第三方CA证书的改造问题,个人感觉这是大家都关注的要点。 +- 在我们的一些项目中,业务方指定要使用第三方CA证书,实际的生产需求也要求我们进行CA改造。 +- 在司法领域区块链存证场景中,需要由具有电子认证许可证书机构出具的认证证书才能作为电子认证。 + +鉴于以上三点,我觉得大家对如何进行第三方CA证书改造都很关注。 + +FISCO BCOS技术文档中提供了CFCA证书改造的案例,但在一些细节上还待完善,因此我想写一篇教程,结合生产环境改造、第三方CA配合、合规性、技术实现等内容具体说明,看看能否对其他社区用户有所帮助。 + +### 除了司法领域存证,还有哪些场景需要由第三方CA机构参与? + +基本上用到CA证书的区块链场景都有可能用到第三方CA证书,是否采用第三方CA证书主要考虑: + +- 联盟链是否需要第三方CA机构背后的相关资质。 +- 联盟链中,参与方对节点准入管理、以及后续控管是否需要第三方CA机构作为公正机构来签发证书,防止自建CA体系中存在任意签发证书导致节点作恶等问题。 + +### 两级证书模式下,为什么需要配置白名单列表?如果不配置会有什么问题? + +两级证书模式下使用第三方提供CA证书作为链证书,如果不配置白名单,只要是CA证书签发节点证书都可以连接到这条链上,配置白名单可以实现准入拦截。 + +## 实操步骤教学 + +接下来,我们来看看使用第三方CA证书部署底层节点的具体实操步骤。 + +此次改造要点为: + +- FISCO BCOS的底层CA缺省提供的是三级模式,链证书-->机构证书-->节点证书; +- 现实环境中CA方虽然可以提供三级签发的证书,但在一些场景下有合规风险; +- 目前我们采用的做法是剔除机构证书,从链证书-->节点证书的签发,其中链证书由CA方提供的CA.crt,配合白名单机制使用完成基础底层节点部署。 + +### 环境准备 + +1. 两台测试服务器:118.25.208.8、132.232.115.126 + +2. 操作系统为ubuntu:18.04 + +3. openssl 工具使用ubuntu 18.04自带 openssl 1.1.1 + +4. 选用普通版FISCO BCOS 2.5.0 版本,节点使用的节点证书算法为EC secp256k1曲线 + +5. 结合【白名单机制】一起使用 + + https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/certificate_list.html#id2 + +备注:测试过程中节点私钥和请求证书文件统一管理,但在生产环境中节点私钥应由各机构管理员进行生成,提交给CA方,私钥各自留存。 + +### 基础证书准备 + +##### 生成基础节点私钥和节点证书请求文件 + +采用openssl 工具,要求1.0.2版本以上,生成对应的节点私钥和节点证书请求文件、以及对应的node.nodeid(nodeid 是公钥的十六进制表示)。(说明:以下每个节点第四步生成node.nodeid 中的node.key ,都是对应节点的cert_IP_port.key 修改的,该操作是底层要求的。) + +- 生产节点1 node_118.25.208.8_30300 相关文件 + +![](../../../../images/articles/third-party-CA_node_deployment/IMG_5545.PNG) + +- 生产节点2 node_118.25.208.8_30301 相关文件 + +![](../../../../images/articles/third-party-CA_node_deployment/IMG_5546.PNG) + +- 生产节点3 node_132.232.115.126_30300 相关文件 + +![](../../../../images/articles/third-party-CA_node_deployment/IMG_5547.PNG) + +- 生产节点4 node_132.232.115.126_30301 相关文件 + +![](../../../../images/articles/third-party-CA_node_deployment/IMG_5548.PNG) + +说明:FISCO BCOS V2.5版本中,采用了私钥及EC secp 256k1曲线算法。 + +### CA方进行节点证书签发 + +提交各个节点的node.csr 文件给CA方,CA方返回一张CA.crt 证书作为链证书,返回四张pem格式的节点证书。(说明:FISCO BCOS中,CA方返回证书的模式为:root -> node -issuer,节点证书中糅合issuer证书内容。) + +### 建链 + +- step 1 :下载国内镜像,cd ~/ && git clone https://gitee.com/FISCO-BCOS/generator.git + +- step 2 :完成安装,cd ~/generator && bash ./scripts/install.sh完成安装,如果输出 usage: generator xxx,则表示安装成功 + +- step 3 :获取节点二进制,拉取最新fisco-bcos二进制文件到meta中(国内cdn),如果输出 FISCO-BCOS Version : x.x.x-x,则表示成功 + +- step 4 :机构分配 + + 选用 118.25.208.8 所属机构作为机构A,并由机构A负责创世区块生成 + + 选用 132.232.115.126 所属机构作为机构B + +- step 5 :将CA方提供CA.crt 证书作为链证书 + + 在机构A所属目录手动创建dir_chain_ca目录,并将CA.crt 放到dir_chain_ca目录中 + +- step 6 :在机构A和机构B的meta目录下进行节点证书迁移 + + 在meta目录中,手动创建对应的节点目录,其中机构A为:node_118.25.208.8_30300、node_118.25.208.8_30301,机构B为:node_132.232.115.126_30300、node_132.232.115.126_30301 + + 每个目录需要存放对应的节点证书和节点私钥、节点Id,将CA方生成的节点证书、以及最初准备的节点id、节点私钥等文件统一分发至对应的节点目录,详细如图: + +![](../../../../images/articles/third-party-CA_node_deployment/IMG_5549.PNG) + +- step 7:机构A收集所有节点证书 + + 在机构A的meta目录下,收集对应的节点证书,用于后续生成创世区块。如图所示: + +![](../../../../images/articles/third-party-CA_node_deployment/IMG_5550.PNG) + + +- step 8:手动配置机构A修改conf文件夹下的group_genesis.ini,生成创世区块 + +- step 9:修改机构A、机构B的conf目录下的node_deployment.ini;其中p2p 地址为外网地址、rpc、channel 地址为内网地址 + +- step 10:在机构meta目录下手动创建peers.txt 文件 + + 机构A中创建 peers.txt、peersB.txt,机构B 创建 peers.txt、peersA.txt其中以机构A为例,peers.txt 内容如下: + +![](../../../../images/articles/third-party-CA_node_deployment/IMG_5551.PNG) + +- step 11:机构A和机构B中生成节点,在机构A的generator中执行命令./generator --build_install_package ./meta/peersB.txt ./nodeA生成机构A的对应节点;在机构B的generator中执行命令./generator --build_install_package ./meta/peersA.txt ./nodeB生成机构B的对应节点 +- step 12:运行两个机构的节点:bash ./nodeA/start_all.sh和bash ./nodeB/start_all.sh;共识状态正常则如图所示: + +![](../../../../images/articles/third-party-CA_node_deployment/IMG_5552.PNG) + +- step 13:控制台部署并进行合约部署测试 + + 针对机构A和机构B对应的控制台操作结果进行比对,两者数据一致,确保共识正常 + +- step 14:在对应节点的config.ini 配置白名单 + +至此,我们就完成了第三方CA证书结合底层节点部署的改造。从流程上看,主要是在链证书-->机构证书-->节点证书的生成流程改变了,以及需要在meta目录下进行手动创建peers.txt文件和节点目录等。 + +## 结缘FISCO BCOS开源社区 + +说起我与FISCO BCOS开源社区的结缘也源于CA证书,在一次政企项目对接中,业主方要求区块链底层需适配国密,并使用业主方指定的CA证书。 + +早期我们团队使用的是其他区块链底层,无法直接适配国密,且改造难度大、周期长、成本高;考虑到后续国内不少项目会涉及到适配国密和CA改造等,我们迫切需要一套完备的区块链底层支持上述需求。通过圈内朋友介绍,了解到FISCO BCOS,在进行深入技术调研、可行性分析后最终选择了FISCO BCOS。 + +FISCO BCOS开源社区中创设了开放交流的氛围,欢迎大家在社区与我交流讨论。 + +------ + +关于本期分享内容的更多详情,可通过[元磁之力](https://www.yc-l.com/article/49.html)进一步了解。 + +元磁之力论坛是由林宣名和他的团队为FISCO BCOS开源社区贡献的用户交流平台,主要用于分享和学习FISCO BCOS及相关的技术知识。感谢大家为社区做出的各类贡献,您的每一次参与都将成为社区成长的动力! \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/37_safety/tsl1.2_establish_process.md b/3.x/zh_CN/docs/articles/3_features/37_safety/tsl1.2_establish_process.md new file mode 100644 index 000000000..05df64d25 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/37_safety/tsl1.2_establish_process.md @@ -0,0 +1,141 @@ +# FISCO BCOS的TLS1.2握手流程 + +作者:李昊轩|FISCO BCOS 核心开发者 + +### 写在前面 + +之前我们说过,互联网上应该质疑一切,因此采用传统明文方式发送数据包无疑是非常不安全的。因此https协议中要求需要加密,那么加密前需要做什么,本文将对握手建立前,通信双方的具体流程进行分析。 + +SSL通信过程是TLS1.2 **[1]** 的内容。最终目的是安全的传输数据包。SSL通信的核心是通过证书验证身份,之后通过"握手"交互生成一个本次通信的非对称会话主密钥。然后在本轮通信过程中,通过这个会话主密钥对数据包进行加解密,并在网络上只传递密文。 + +本文将以FISCO BCOS节点通信双向认证为例,讲解通信双方如何加载、使用、验证证书,并如何生成会话主密钥。 + +## Part 1 主密钥设置 + +网络压缩主要在P2P网络层实现,系统框架如下: TLS中的主密钥是一个对称密钥,即client端和server端使用的密钥是相通的,握手的过程也就是双方通过交互一些随机数,来完成主密钥的设置。 + +我们以DH密钥交换算法x协商主密钥为例,设攻击者为Eve,Eve可以获取他们传输的中间值: + +1. Alice和Bob先协商公平一个大素数p,和生成元g,Eve可以获取p和g; +2. Alice选择随机整数a∈Zp,计算A=g^a modp,将A发送给Bob,Eve可以获取A +3. Bob选择随机整数b∈Zp,计算B=g^b modp,将B发送给Alice,Eve可以获取B +4. Alice计算S=B^a = g^(ab) modp +5. Bob计算S=A^b = g^(ab) modp + +通过上述过程,Alice和Bob协商出了一个密钥S,虽然Eve获取了中间值A,B,p,g,根据离散对数问题,Eve无法获取S具体的值。 + +## Part 2 证书验证 + +之前的文章中我们讲到 [证书的签发流程](https://mp.weixin.qq.com/s?__biz=MzU5NTg0MjA4MA==&mid=2247484692&idx=1&sn=3163aec2574ce0bf7d4f64e899e9bb6d&chksm=fe6a805bc91d094df15ed5c5988897d307ed519efbb0b26c2056ad35df3a491cea1e556ee70e&token=951660177&lang=zh_CN&scene=21#wechat_redirect)(点击阅读),在本节中将以三级证书为例,讲解证书的验证过程。TLS握手中的证书验证,即通过加载双方预先都信任的根证书,从而认证对方的身份。 + +![](../../../../images/articles/tsl1.2_establish_process/IMG_5532.PNG) + +▲感谢社区核心开发者黎连文贡献的图 + +- 在程序启动时,会首先加载本地的ca.crt和node.crt; +- 当节点验证对方的证书时,会首先使用对方node.crt中的公钥验证附带的签名,当验证通过时,可以确认对应节点拥有当前node.crt对应的node.key; +- 之后节点会使用agency.crt中的信息验证node.crt是否为合法的agency签发; +- 最后节点会使用本地加载ca.crt中的信息验证agency.crt是否为联盟链委员会签发; +- 当两者都验证通过时,表示节点接收到的node.crt是由本地加载的ca.crt签发的。 + +## Part 3 TLS握手流程 + +下图是我们采用对两台服务器进行抓包得到了TLS握手流程: + +![](../../../../images/articles/tsl1.2_establish_process/IMG_5533.PNG) + +▲Client端 + +![](../../../../images/articles/tsl1.2_establish_process/IMG_5534.PNG) + +▲server端 + +**在流程中我们一共看到了6个数据包,分别为:** + +- client向server发送的client hello +- server向client发送的server hello,发送server证书,进行参数协商 +- client向server发送的client证书,进行参数协商 +- server向client发送的结束标志,握手完成 + +### (1) client hello + +在这步中,client向server发起建连请求,并告知server以下信息: + +``` +{ +client端支持的TLS协议 +支持xxx加密算法 +密钥协商过程需要的随机数 +} +``` + +![](../../../../images/articles/tsl1.2_establish_process/IMG_5535.PNG) + + +### (2) server hello + +![](../../../../images/articles/tsl1.2_establish_process/IMG_5536.JPG) + +server端接收到client的请求后,对其进行回应,包括: + +``` +{ +我本次使用的TLS协议 +这是我的随机数 +本次会话我们的session id +本次我们使用的加密算法 +} +``` + +### (3) server communicate + +![](../../../../images/articles/tsl1.2_establish_process/IMG_5537.PNG) + +如图所示,共包含四个部分: + +``` +{ +server端证书certificate +密钥交换参数server key exchange +验证client端的请求 certificate request +server端 发送完毕 server hello done +} +``` + +(2)(3)两步的操作可以总结为:server端对client端做出了“我们使用xx算法协商会话主密钥,这是我的证书,这是我的协商参数,请把你的证书发给我”的回应。 + +### (4) client certificate + +client端收到server的certificate request后,会将自己的证书发送给对方。 + +### (5) client communicate + +![](../../../../images/articles/tsl1.2_establish_process/IMG_5538.PNG) + +在这步中,client会先使用本地加载的ca.crt 验证server证书,之后进行参数协商操作,数据包中内容有: + +``` +{ +client 密钥交换参数 +client 对server端证书的验证结果 +使用会话主密钥的密文传输内容 +client对(1)(2)(3)过程的签名 +} +``` + +### (6) server handshake established + +![](../../../../images/articles/tsl1.2_establish_process/IMG_5539.PNG) + +server端接收到数据包后,会开始使用会话主密钥对数据包进行加密传输。 + +------ + +#### 参考资料 + +[【1】TLS(Transport Layer Security)](https://baike.baidu.com/item/TLS/2979545?fr=aladdin):安全传输层协议用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。 + +[【2】Discrete Logarithm Problem](https://www.doc.ic.ac.uk/~mrh/330tutor/ch06s02.html) + + + diff --git a/3.x/zh_CN/docs/articles/3_features/38_privacy/index.md b/3.x/zh_CN/docs/articles/3_features/38_privacy/index.md new file mode 100644 index 000000000..497d2a065 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/38_privacy/index.md @@ -0,0 +1,9 @@ +### 隐私保护 + +物理隔离:群组间数据隔离 +隐私保护协议:支持群签名、环签名、同态加密 +场景化隐私保护机制:基于WeDPR支持隐匿支付、匿名投票、匿名竞拍、选择性披露等场景 + +- [FISCO BCOS隐私特性:群/环签名技术实现](./privacy_protection_group_and_ring_signature.md) +- [链上密文参与计算?同态加密尽显神通 | FISCO BCOS隐私特性](./privacy_protection_homomorphic_encryption.md) +- [隐私保护专题](http://mp.weixin.qq.com/mp/homepage?__biz=MzU0MDY4MDMzOA==&hid=5&sn=d9ae81771056e6fa4e196baefec33ada&scene=18#wechat_redirect) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/38_privacy/privacy_protection_group_and_ring_signature.md b/3.x/zh_CN/docs/articles/3_features/38_privacy/privacy_protection_group_and_ring_signature.md new file mode 100644 index 000000000..1abc3ce79 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/38_privacy/privacy_protection_group_and_ring_signature.md @@ -0,0 +1,148 @@ +# FISCO BCOS隐私特性:群/环签名技术实现 + +作者:贺双洪|FISCO BCOS 核心开发者 + +## 前言 + +安全与隐私一直是区块链领域的热点话题,也是各大主流区块链平台必争的战略高地。FISCO BCOS从底层到应用、架构到协议、存储到网络等多方面针对安全和隐私作出较大努力,目前已实现账户管理、落盘加密、安全通讯、权限控制等功能模块。本文将对FISCO BCOS隐私特性之一群环签名展开介绍。 + +群/环签名是一种特殊的签名算法,最初是为了实现隐匿支付而应用在区块链领域。其能很好地隐藏签名者身份,既能让节点验证交易签名的正确性,又不会暴露交易发起者的公钥信息。这一特性在联盟链中有着广阔的应用前景。 + +## 什么是群/环签名 + +了解群/环签名,得从匿名性说起。 + +在现实世界,匿名性是指主体的行为不会暴露主体的身份,这几乎是人类文明诞生伊始便存在的需求。 + +从密码学的角度,匿名性有两种含义: + +1. 给定一个密文,无法还原其公钥,主要用于密码算法的安全性分析; +2. 用户使用密码方案过程中不会发生身份信息的泄露,更符合现实世界的语义。 + +密码学中最早隐含身份概念的是电子签名,签名者通过私钥对消息签名,验证者可以使用签名者的公钥验证签名的合法性。在实际应用中,公钥往往和证书绑定(基于身份加密除外,因为身份即公钥,所以没有证书),证书的属性天然揭露属主的身份信息,所以传统的签名方案缺少匿名性。 + +上世纪九十年代初,Chaum和van Heyst在欧密会(EUROCRYPT)上提出了群签名的概念,有效解决了电子签名的身份隐私问题。 + +群签名中的“群”可以理解成一个组织。组织里有一个leader即群主,负责成员管理,组织里的每个成员都可以**匿名**地代表组织进行签名。群签名方案主要算法包括: + +- 创建群,由群主执行,生成群主私钥和群公钥; +- 新增群成员,由群主执行,生成群成员私钥和证书,证书用于证明群成员身份; +- 生成群签名,群成员通过私钥对信息签名; +- 验证群签名,验证者可通过群公钥验证签名的合法性,验证者可以判定这个签名确实来自这个群,但无法确定是哪一个群成员的签名; +- 打开群签名,群主可通过签名信息获取签名者证书,从而追踪到签名者身份。 + +![](../../../../images/articles/privacy_protection_group_and_ring_signature/IMG_4942.PNG) + +由于群签名存在一个拥有绝对权限的群主角色,所以群签名的匿名性是相对的。这种特性适用于需要监管介入的场景。 + +为了追求完全匿名性,Rivest于2001年提出了一种无群主方案,任何成员可自发地加入组织。该方案中签名隐含的某个参数按照一定规则组成环状,因而被命名成环签名。本质上“群”和“环”都可理解为多个成员组成的组织,区别在于是否存在一个能打开签名的leader。 +环签名算法流程如下: + +- 初始化环,由环成员执行,生成环参数,环参数就好比微信面对面建群的密码,任何知道该参数的成员都可以加入该环; +- 加入环,由环成员执行,通过环参数获得公私钥对; +- 生成环签名,环成员使用私钥和随意多个环公钥对信息签名; +- 验证环签名,验证者可通过环参数验证签名的合法性。 + +环签名方案将签名者公钥隐藏在了签名使用的公钥列表中,公钥列表越大,匿名性越高,适用于对隐私要求较高的多方协作场景。 + +## FISCO BCOS的技术选型 + +目前,群/环签名主要应用在投票、竞标、竞拍等场景以保障参与者身份隐私。对联盟链而言,同一联盟内的多个机构有协作也有博弈,在某些场景下,保护用户身份是非常必要的。 + +FISCO BCOS集成的群/环签名方案,为用户提供一种能够保证身份匿名性的工具。基于对方案复杂度和链上计算成本的考量,链上只保留了最有必要的步骤,即签名验证,其他算法则以独立功能组件形式提供给应用层。 + +应用于区块链的群签名方案需要满足以下两点: + +1. 为了方便成员管理,需要支持群成员的撤销; +2. 考虑到区块链存储资源有限,因此签名数据不能太大,可对齐标准的RSA签名。 + +因此,我们选择了首个兼具上述特性的群签名方案BBS04《Short Group Signatures》,该方案由Boneh于2004年在美密会(CRYPTO)上提出。 + +环签名不存在能够打开签名的第三方,为了方便追责,防止签名者被诬陷,需要一种具备指责关联性和抗诽谤性的方案,即基于相同公钥列表生成的两个环签名可判断是否来自同一个签名者。基于这层考虑,我们选择了Joseph在04年提出的首个可链接的环签名方案LSAG《Linkable Spontaneous Anonymous Group Signature for Ad Hoc Groups》。 + +BBS04方案基于双线性对构造,群管理员可根据不同的线性对初始化群。不同线性对类型下的群签名存储和计算开销如下: + +![](../../../../images/articles/privacy_protection_group_and_ring_signature/IMG_4943.PNG) + +其中各个线性对的群阶数可自由配置,上述实验使用了默认值。可以看到,链上验证的时间开销差距并不大,用户可根据自己安全性和性能需求,选择合适的线性对类型以及群阶数。 + +LSAG方案中,不同环大小的环签名存储和计算开销如下: + +![](../../../../images/articles/privacy_protection_group_and_ring_signature/IMG_4944.PNG) + +由于环签名长度、签名和验证时间与环成员数目呈线性关系,为防止超gas,环成员数量建议不超过32个。 + +## 如何在FISCO BCOS中使用群/环签名 + +FISCO BCOS 2.3版本开始以预编译合约的形式集成了BBSO4方案和LSAG方案的签名验证算法。由于这些隐私保护特性默认不开启,要启用这些功能需要打开CRYPTO_EXTENSION编译选项,并重新编译源码。**2.5及以上版本默认开启,不再需要用户编译源码**。 + +群/环签名预编译合约地址分配如下: + +![](../../../../images/articles/privacy_protection_group_and_ring_signature/IMG_4945.PNG) + +要完成预编译合约的调用,首先需要以solidity合约方式声明合约接口。 + +- ### 群签名 + +``` +// GroupSigPrecompiled.sol +pragma solidity ^0.4.24; +contract GroupSigPrecompiled { + function groupSigVerify(string signature, string message, string gpkInfo, string paramInfo) public constant returns(bool); +} +``` + +- ### 环签名 + +``` +// RingSigPrecompiled.sol +pragma solidity ^0.4.24; +contract RingSigPrecompiled { + function ringSigVerify(string signature, string message, string paramInfo) public constant returns(bool); +} +``` + +以验证环签名为例(请确保同级目录下已有上述的接口声明合约),在业务合约中通过地址实例化预编译合约对象以完成验证接口的调用: + +``` +// TestRingSig.sol +pragma solidity ^0.4.24; +import "./RingSigPrecompiled.sol"; + +contract TestRingSig { + RingSigPrecompiled ringSig; + function TestRingSig() + { + // 实例化RingSigPrecompiled合约 + ringSig = RingSigPrecompiled(0x5005); + } + function verify(string signature, string message, string paramInfo) public constant returns(bool) + { + return ringSig.ringSigVerify(signature, message, paramInfo); + } +} +``` + +除了预编译合约接口,FISCO BCOS还额外提供了两个核心模块供用户使用,分别是一个完整的群/环签名库以及一个群/环签名RPC服务端。签名库和服务端独立于区块链平台,用户也可以基于签名库定制化地开发自己的服务端。签名信息可在链上进行存储,然后通过在合约中调用验证接口,完成签名合法性的验证。 + +FISCO BCOS为用户提供了一个群/环签名的开发示例,以客户端为操作入口,示例架构如下图所示: + +![](../../../../images/articles/privacy_protection_group_and_ring_signature/IMG_4946.PNG) + +群/环签名客户端调用服务端的RPC接口完成群/环的创建、成员的加入以及签名的生成;同时客户端与区块链平台交互,将签名信息上链;最后客户端调用预编译合约验证链上的签名。更多的操作步骤和技术细节,请参阅群/环签名客户端指南。参考链接如下:https://github.com/FISCO-BCOS/group-signature-client/tree/master-2.0 + +## 改进的方向 + +在学术界,群/环签名的发展已经比较成熟,基于不同场景诞生了很多新的方案。 + +例如,支持群成员主动加入的方案能有效抵抗群主作恶的陷害行为;可撤销匿名性的环签名方案支持签名者在特定场合将环签名转换成一个普通签名,以证明自己的签署者身份;支持前项安全的方案能保证用户私钥泄露不对之前签名的匿名性产生影响。 + +目前,FISCO BCOS集成的群/环签名方案各有一种,未来对于更复杂的需求,会增加更多支持方案,为用户提供更多选择。同时,针对现有客户端示例可移植性不佳的情况,未来会考虑以插件的方式提供,方便业务快速接入。 + +## 结语 + +安全与隐私是一个复杂、广阔、充满挑战的领域。 + +群/环签名模块只是为用户身份提供了匿名性保护,如何结合其它密码协议构建更加可靠、健全的安全区块链平台?如何降低用户的使用成本和开销,提供多维度、高可用的隐私保护服务?以上问题需要我们不断研究探索。 + +最后,欢迎有志之士加入FISCO BCOS安全性建设,为构建牢不可破的隐私之墙添砖加瓦。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/38_privacy/privacy_protection_homomorphic_encryption.md b/3.x/zh_CN/docs/articles/3_features/38_privacy/privacy_protection_homomorphic_encryption.md new file mode 100644 index 000000000..da219d2e7 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/38_privacy/privacy_protection_homomorphic_encryption.md @@ -0,0 +1,92 @@ +# 链上密文参与计算?同态加密尽显神通 | FISCO BCOS隐私特性 + +作者:贺双洪|FISCO BCOS 核心开发者 + +## 前言 + +作为分布式系统,一方面区块链通过数据的共享、共治以及协作处理,充分发挥数据价值。而另一方面,由于资源和隐私的限制,区块链只适合保存最轻、最有必要、无隐私风险的数据,如哈希、元数据的密文等。数据可用性和隐私性之间的矛盾,在区块链中愈发明显。 + +常言:“鱼与熊掌不可兼得”,但是专治疑难杂症的密码学家们不答应,提出了一种密文也能参与计算的方案——**同态加密**(HE,Homomorphic Encryption)。本文将解释同态加密的定义以及在FISCO BCOS中的技术实现。 + +## 什么是同态加密 + +同态加密是上世纪七十年代就被提出的一个开放问题,旨在不暴露数据的情况下完成对数据的处理,关注的是**数据处理安全**。 + +想象一下这样一个场景,作为一名满怀理想的楼二代,你每天过着枯燥乏味的收租生活,希望摆脱世俗的枷锁、铜臭的苟且去追求诗与远方。你需要雇一个代理人去承担收租的粗活,但又不希望其窥探你每月躺赚的收入。于是,你请高人打造了一套装备,既能保证代理人顺利完成收租,又不会泄露收入信息。这套装备包括信封、胶水、皮夹和神奇剪刀,每一样东西都有奇特的功能: + +1. 信封一旦用胶水密封,只有神奇剪刀才能拆开。 +2. 不论信封里装了多少钱,信封的大小和重量都不会发生改变。 +3. 把多个信封放在皮夹里后,信封会在不拆开的情况下两两合并,最后变成一个信封,里面装的钱正好是合并前所有信封金额的总和。 + +![](../../../../images/articles/privacy_protection_homomorphic_encryption/IMG_5563.PNG) + +你把信封和胶水分发给所有租客,把皮夹交给代理人。到了约定交租的日子,租客把租金放到信封里密封后交给代理人;代理人收齐信封,放到皮夹中,最后得到一个装满所有租金的信封,再转交给你;你使用神奇剪刀拆开,拿到租金。 + +在这个场景中,信封的a、b两个性质其实就是公钥加密的特性,即使用公钥加密得到的密文只有掌握私钥的人能够解密,并且密文不会泄露明文的语义信息;而c则代表加法同态的特性,两个密文可以进行计算,得到的结果解密后正好是两个原始明文的和。到此,同态加密的全貌已经呼之欲出: + +- 同态加密本质是一种公钥加密方案,即加密使用公钥pk,解密使用私钥sk; +- 同态加密支持密文计算,即由相同公钥加密生成的密文执行f()函数的同态操作,生成的新密文解密后恰好等于两个原始明文计算f()函数的结果; +- 同态加密公式描述如下: + +![](../../../../images/articles/privacy_protection_homomorphic_encryption/IMG_5564.PNG) + +同态加密可分为全同态加密(FHE,Fully Homomorphic Encryption)和半同态加密(SWHE,Somewhat Homomorphic Encryption)。FHE顾名思义就是支持任意给定的f()函数,不过由于计算开销极大,目前学术界还没有一个实用型的FHE方案;SWHE只支持一些特定的f()函数,例如加法或者乘法等,由于开销小,在工业界尤其是云计算领域已有不少的应用。 + +## FISCO BCOS技术选型 + +在联盟链中,考虑到监管需求,链上机构可能需要将应用中的一些隐私数据上链,如营收账目、产品流量等。为了不泄露机密,机构可以使用监管方的公钥对这些信息进行加密,加密后,信息统计可交由代理机构完成。在这种场景下,由于需要针对密文进行计算,同态加密便可大展身手。 + +FISCO BCOS通过集成同态加密,为用户提供一种支持密文处理的隐私保护工具。加解密会暴露明文数据,基于安全性考量,只适合在链下完成,链上只保留同态运算接口,加解密接口则以独立算法库的形式提供给应用层。在同态加密方案的选择上,出于对计算开销的考虑,首选轻量级加法同态方案;鉴于区块链存储资源有限,密文不能太大,可对齐标准的RSA加密算法。 + +综合上述两点,我们选择了兼具以上特性的加法同态方案Paillier《Public-Key Cryptosystems Based on Composite Degree Residuosity Classes》,该方案由Paillier于1999年在欧密会(EUROCRYPT)上提出。Paillier方案的实验分析如下: + +![](../../../../images/articles/privacy_protection_homomorphic_encryption/IMG_5565.PNG) + +其中公私钥对通过RSA密钥生成算法得到,从上表中可以看到各项开销和秘钥长度正相关。目前1024位的RSA密钥已经不再安全,推荐使用2048位及以上的密钥。 + +## 如何在FISCO BCOS中使用同态加密 + +FISCO BCOS 2.3版本以预编译合约的形式集成了Paillier方案的密文同态加法接口。要启用同态加密功能需要打开CRYPTO_EXTENSION编译选项,并重新编译源码(**2.5及以上版本默认开启,不再需要用户编译源码**)。同态加密预编译合约地址分配如下: + +![](../../../../images/articles/privacy_protection_homomorphic_encryption/IMG_5566.PNG) + +要完成预编译合约的调用,首先需要以Solidity合约方式声明合约接口。 + +``` +// PaillierPrecompiled.sol +pragma solidity ^0.4.24; +contract PaillierPrecompiled{ + function paillierAdd(string cipher1, string cipher2) public constant returns(string); +} +``` + +然后可在业务合约中通过地址实例化预编译合约对象以完成同态加接口的调用。 + +``` +// CallPaillier.sol +pragma solidity ^0.4.24; +import "./PaillierPrecompiled.sol"; +contract CallPaillier { + PaillierPrecompiled paillier; + constructor() public + { + // 实例化PaillierPrecompiled合约 + paillier = PaillierPrecompiled(0x5003); + } + function add(string cipher1, string cipher2) public constant + returns(string) + { + return paillier.paillierAdd(cipher1, cipher2); + } +} +``` + +Paillier方案中的公私钥生成、加解密接口以独立的密码库提供给开发者。目前密码库内包含了一个Java语言的完整版Paillier方案,以及一个供预编译合约调用的C语言版同态加接口。[密码库如下](https://github.com/FISCO-BCOS/paillier-lib)。 + +## 未来改进的方向 + +开发者当下可触达的同态加密算法库只有Java版本,未来根据实际需求,我们将对齐FISCO BCOS的SDK语言种类,提供多语言版本的同态加密库。同态加密一直是密码学界难题,要实现全同态加密计算,在性能和可用性上还存在很大挑战,FISCO BCOS将持续关注该领域的技术进展。 + +## 结语 + +安全之道修远兮,FISCO BCOS将上下求索。目前,FISCO BCOS已配置包括群签名、环签名、同态加密等多种密码学工具,接下来将实现和集成面向特定场景的定制化隐私保护解决方案。欢迎大家一起使用和关注同态加密技术在隐私保护场景的应用,共同探讨交流,积极反馈、共建更为安全可靠的FISCO BCOS平台。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/3_features/39_wecross/index.md b/3.x/zh_CN/docs/articles/3_features/39_wecross/index.md new file mode 100644 index 000000000..313964470 --- /dev/null +++ b/3.x/zh_CN/docs/articles/3_features/39_wecross/index.md @@ -0,0 +1,8 @@ +### 跨链协议 + +SPV:提供获取SPV证明的接口 +跨链协议:基于WeCross支持同构、异构跨链 + +[WeCross跨链专题](https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1337945984353107969&__biz=MzU0MDY4MDMzOA==#wechat_redirect) + + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/41_webase/index.md b/3.x/zh_CN/docs/articles/4_tools/41_webase/index.md new file mode 100644 index 000000000..91040c38c --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/41_webase/index.md @@ -0,0 +1,13 @@ +### WeBASE + +```eval_rst +.. toctree:: + :maxdepth: 1 + + webase_release.md + webase-transaction.md + walk_in_webase_zoo.md + webase_data_output.md + webase_node_preposition.md +``` + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/41_webase/walk_in_webase_zoo.md b/3.x/zh_CN/docs/articles/4_tools/41_webase/walk_in_webase_zoo.md new file mode 100644 index 000000000..46b04fdf3 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/41_webase/walk_in_webase_zoo.md @@ -0,0 +1,146 @@ +# 在WeBASE的动物园漫步 + +作者:毛嘉宇|FISCO BCOS 核心开发者 + +**作者语**:开源软件,是大师心目中商业化大潮之外的伊甸园;是极客们聚集出没的大教堂和集市;是技术爱好者挚爱的隽永诗篇;但在我眼里,开源软件的世界就是一座动物园。 + +开源机构酷爱拿动物来命名软件或制作LOGO,这些名字早已似春雨般深入人心。比如一脸严肃,身手敏捷,酷似狮子的Tomcat。还有Python,两条肥胖蠢萌的蟒蛇形象火遍了全世界。而Linux用一个叫Tux的企鹅作为吉祥物,Tux 现在已经开始拍游戏视频、广告了,甚至还有个叫Gown的女朋友。开源社区动物园里的风景异彩纷呈,受此启发,我们将WeBASE中的两个数据导出相关组件分别取名为Monkey和Bee。 + +本文就为您介绍神通广大的Monkey和专注如一的Bee。**WeBASE是在区块链应用和FISCO BCOS节点之间搭建的中间件平台**,对技术和业务架构中的共性进行抽象,形成通用化且体验友好的组件,简化区块链应用开发流程。 + +## WeBASE-Codegen-Monkey之美猴王 + +WeBASE-Codegen-Monkey(以下简称Monkey)是WeBASE数据导出工具的代码生成组件。可帮助用户自动生成数据导出组件,更进一步地提升研发效率,帮助开发者减负。我们开发的Monkey,其命名灵感来自于美猴王——齐天大圣孙悟空。 + +Monkey提供可执行的shell脚本:generate_bee.sh。只需简单的配置,同时按要求提供智能合约文件,便可自动生成WeBASE-Collect-Bee。在执行完脚本后,Monkey会自动退出,仿佛化生变幻的美猴王,腾云而来,驾雾而去。Monkey的启动脚本,会自动下载代码、装载合约、构建生成业务代码、编译数据导出组件代码、启动数据导出的应用。generate_bee.sh的主要执行步骤如下图: + +![](../../../../images/articles/walk_in_webase_zoo/IMG_5611.PNG) + +其中,步骤3,脚本会自动将开发者的配置文件,放置到指定的配置路径。 步骤5,Monkey在启动后,会根据次序,生成日志、函数代码、配置和设置文件,并放置到Bee所需的路径上。步骤8,Bee在启动时,可随心所欲地加载所需的代码和配置文件。开发者也可以在预先约定的路径下,获得所需的各类脚本或参数的文件。 + +generate_bee.sh的执行过程,就如同《西游记》所述:『见他凶猛(数据导出定制化开发需求复杂),即使身外身法(读取环境和合约的配置),拔一把毫毛(下载代码、装配配置和编译Monkey代码),丢在口中嚼碎(运行monkey代码,自动生成Bee的配置和代码),望空喷去(编译Bee的代码),叫一声‘变!’(开始执行Bee的代码)即变做三二百个小猴,周围攒簇(自动建库建表并成功开始导出数据)。』 + +美猴王有七十二变的神通,Monkey有自动生成所需代码的功能,真正做到让数据导出系统开箱可用Monkey生成的代码等文件,可分为四大类: + +1. 基于合约和配置生成的具体日志解析的代码; +2. 基于合约和配置生成的具体函数解析的代码; +3. 基于配置生成的配置文件; +4. 基于合约和配置生成的设置文件。 + +![](../../../../images/articles/walk_in_webase_zoo/IMG_5612.PNG) + +上图中,不同类型的Paras会生成不同的代码文件。其中: + +- EventGenerateParas:包含了日志(Event)相关代码和脚本的生成。 + + 如合约文件中解析的日志entity和repository的定义、以及每个不同日志解析的代码、日志的BO类和日志的数据库建表语句。 + +- MethodGenerateParas:包含了函数(Method)相关代码和脚本的生成。 + + 如合约文件中解析的函数hibernate entity和repository的定义、以及每个不同函数解析的代码、函数的BO类和函数的数据库建表语句。 + +- ConfigGenerateParas: 包含了Bee工程的数据库建表脚本和数据库配置文件。 +- SettingsParas:包含了grafana dashboard和table_panel的json导入设置文件。 + +如上所述,为了开发者方便易用,一次配置。Monkey除了生成执行代码外,相关的区块链软件和数据导出组件的通用配置,也被放到了Monkey系统的配置中,并自动传递到Bee的配置文件中。Monkey系统集成了Beetl作为模板引擎,无论多么复杂的合约,多么繁琐的配置,都能化繁为简,快速生成。Monkey通过载入开发者编译后的solidy对应的Java文件,利用反射技术,获取合约文件的Class信息。 + +![](../../../../images/articles/walk_in_webase_zoo/IMG_5613.PNG) + +Monkey启动后,会创建一个代码生成的模板引擎,上述的AtomicParas则是引擎启动所必须的原料。如上图,通过这三个核心的调用步骤: + +1. 引擎通过调用getTemplateFilePath()方法,获得渲染模板的文件路径; +2. 通过getBindingMap()方法获得渲染所需的所有参数; +3. 通过getGeneratedFilePath()获得生成文件的具体路径。 + +代码生成引擎便可飞速启动,执行渲染,最终完成所需文件的自动生成。 + +当然,美猴王的传奇不会终结,Monkey系统提供了很多强大而灵活的配置,来满足拥有独特个性化需求的开发者。美猴王的征途也不会仅仅局限于数据导出,未来还将会涉足更多的领域,为大家带来更多的惊喜…… + +## WeBASE-Collect-Bee之蜜蜂 + +WeBASE-Collect-Bee(以下简称Bee) 是WeBASE中一个基于FISCO BCOS平台的数据导出组件,支持将区块链的数据导出到Mysql等数据库中。 + +为何取名『Bee』呢?古往今来,文人墨客留下了诸多歌咏蜜蜂的诗文:穿花度柳飞如箭, 粘絮寻香似落星。小小微躯能负重, 器器薄翅会乘风。——吴承恩 + +Bee系统恰如蜂群一般,专注如一,辛勤劳作。服务不停,数据导出的任务就不会停止。小蜜蜂们在区块链的花丛之中,来回穿行,在区块之间,寻找香甜、漂浮的业务数据,将海量的区块链数据,稳定高效地导出到存储之中,供开发者执行分析、计算和查询。小小微躯的蜜蜂是轻盈的,契合了Bee系统设计『轻』的气质。 + +在Monkey的协助下,遵循『契约优于配置』的原则,开发者只需修改极少的配置,辅以搭链后自带的证书和开发编译后的合约文件,执行脚本后就可以快速获得已打包的可执行Jar包,甚至可以直接启动运行。蜜蜂的轻盈还体现在,系统地提取和抽象了大量的配置项。按照开发者的个性化需求,灵活配置,按需而动。 + +系统架构图如下所示,除了核心的模块,Bee系统的模块都是可插拔的。例如是否需要引入可视化数据分析、集成测试界面、监控和Supervisor进程管理等增强功能模块。 + +![](../../../../images/articles/walk_in_webase_zoo/IMG_5614.PNG) + +为了让蜜蜂器器薄翅能够舞动地更加轻盈,我们在最新的V1.1.0中进行重构,将原有的单工程按照功能粒度进一步拆分。这样,开发者既可以选择直接部署一个可执行的Jar包。还可以按需引入Jar包,将指定功能模块嵌入到自己的工程中。上述的模块均基于Springboot2开发,支持个性化配置。 + +![](../../../../images/articles/walk_in_webase_zoo/IMG_5615.PNG) + +如上图所示,各个Jar的功能正如其名: + +- core:打包为一个可执行的BootJar包,内置开箱即用的Restful API,使得开发者更加便捷地获得数据导出的服务。同时,core自身也是一个示例,向开发者展示了,如何组合利用各个功能模块的Jar包,来开发一个功能完整的数据导出系统。 +- parser:封装了区块解析的功能。入口的方法签名可以传入一个区块Block,获得完整解析后的BlockInfoBO的Bean对象,其中包含了解析后的数据。 +- extractor:进一步封装了web3j的SDK的逻辑,可以便利地调用上链功能和获取区块链的数据。 +- db:封装了数据存储的逻辑,理论上支持各类主流的数据库,实际严格测试支持将数据存储到Mysql 5.6及以上社区版。 +- common:封装了一些公用的数据结构、工具类和公共参数等。 + +蜜蜂的微躯虽然轻盈,可是蜂群的协作却可以负重。 + +为了应对海量数据的存储,例如单表数据超过1KW条,单库容量超过1T的场景,Bee 集成了sharding-jdbc,支持可配置的多数据源存储、读写分离和分库分表。 + +为了加快数据导出的速度,Bee系统进行了多轮的性能优化,大幅提升了单机部署下数据导出的效率。同时,依托集成Elastic-Job后,获得分布式任务协调服务的能力,Bee支持实例多活部署,横向扩展,灵活伸缩。 + +蜜蜂的工作是三型分工,Bee系统的任务执行者也分为三类:任务的调度者、区块的采集者和区块的处理者。 + +![](../../../../images/articles/walk_in_webase_zoo/IMG_5616.PNG) + +如上图所示,具体的三类任务执行者的说明如下: + +**蜂王(Dispatcher)**: + +通过分布式协调服务,保证只有唯一的一个线程运行,负责检测区块链当前的块高和已拉取任务的明细,准备任务,检测区块的分叉状态,检测任务的超时状态和错误状态,并基于预先定义的策略执行重拉等。准备任务是指Dispatcher会基于区块的维度在数据库进行维护:为每个区块创建一条状态记录,并插入到block_task_pool的系统表中。 + +**雄蜂(Extractor)**: + +与Depot共用相同的线程,线程的总数可以通过配置文件来指定,但任务执行的分片由分布式协调服务自动调度。Extractor执行的任务职责是:从Dispatcher维护的block_task_pool系统表中拉取对应分片序号的区块任务,然后从区块链下载指定区块高度的Block数据,并修改block_task_pool系统表的任务执行状态。 + +**工蜂(Depot)**: + +与Extractor共用相同的线程,线程的总数可通过配置文件来指定,但任务执行的分片由分布式协调服务自动调度。Depot可以直接从Extractor获取到Block内容,然后执行数据导出的任务,先后执行区块解析、内容转换处理、存储数据库,最后修改block_task_pool系统表的任务执行状态。 + +这样设计的优点是隔离了不同区块在不同线程间切换的数据交换开销,大大提升了处理的效率。同时,可以通过增加部署实例、增加处理线程集合的数量,来提升数据导出的速度。如果把内容转换和内容存储比作花蜜的酿造和存储,那么区块解析就似花粉的采集——这项使工蜂日夜辛劳的工作任务,最能诠释『穿花度柳飞如箭, 粘絮寻香似落星』。 + +![](../../../../images/articles/walk_in_webase_zoo/IMG_5617.PNG) + +如上图所示,区块解析的结果共分为四类:区块基本信息、账户信息、函数信息、日志信息。以下为解析的简要思路: + +1、 合约加载:解析器在执行前,会加载合约的BIN、ABI和配置信息,并计算所有合约函数的MethodId。 + +2、 账户解析:根据Block可以获取区块的合约地址,根据合约地址获取runcode,再通过预先加载的合约BIN信息,识别账户的类型,最终解析出账户。 + +3、 函数解析:如果函数为构造函数,如1所述,可以解析出函数的值。 + +如果函数非构造函数,则transaction中的to字段即为合约地址。如2所述,根据合约地址可以获得函数所属的合约。再根据transaction中附带的input和预先加载的methodId进行比对,可获得函数名。 + +在精准定位了函数所属合约和函数名以后,会自动触发transactionHandler,并执行对应的解析工作。 + +4、 事件解析:基于步骤2已解析的transactionHash与合约名的映射,可以获取合约名称。根据特定的合约名称,会自动触发该合约下的eventHandler,并执行对应的解析工作。 + +5、 区块解析:根据获得的Block对象的属性解析,获得区块的概要信息。 + +所有的这些解析步骤,相同的区块都由一个工蜂来负责完成,每个工蜂为一个线程。这些线程通过线程集合,由分布式协调服务来统一分配和管理,从而达到『飞如箭』和『似落星』的效果。Bee系统严格遵循了『技能专一』的原则,致力于为FISCO BCOS提供数据导出服务,因为专一,所以极致。 + +## 总结 + +WeBASE的社区还在蓬勃发展中,欢迎来到WeBASE的动物园漫步,和我们一起发现和探索更多有趣的故事,期待未来动物园的故事里有你。 + +------ + +#### 链接指引 + +- [区块链底层平台FISCO BCOS代码仓库](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0) + +- [FISCO BCOS技术文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/) + +- [WeBASE代码仓库](https://github.com/WeBankFinTech/WeBASE) + +- [WeBASE技术文档](https://webasedoc.readthedocs.io/zh_CN/latest/index.html) + diff --git a/3.x/zh_CN/docs/articles/4_tools/41_webase/webase-transaction.md b/3.x/zh_CN/docs/articles/4_tools/41_webase/webase-transaction.md new file mode 100644 index 000000000..b355a1126 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/41_webase/webase-transaction.md @@ -0,0 +1,96 @@ +# 漫谈WeBASE之交易两三事 + +作者:刘明臻|FISCO BCOS 核心开发者 + +2019年7月2日,区块链中间件平台WeBASE正式对外开源,大家首先会想到的就是:WeBASE是什么,有什么用?WeBASE是WeBank Blockchain Application Software Extension的简写,是在区块链应用和FISCO BCOS节点之间搭建的一套通用组件。开发这套通用组件的目的是为了屏蔽区块链底层的复杂度,降低开发者的门槛,提高区块链应用的开发效率。WeBASE主要包含:节点前置、节点管理、交易链路,数据导出,Web管理平台等子系统。其完整部署架构如下图: + +![](../../../../images/articles/webase-transaction/IMG_5604.PNG) + +详细了解WeBASE请点击前往:《[FISCO BCOS迎来区块链中间件平台WeBASE,应用落地提速](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485307&idx=1&sn=40b0002d3d261be7c2daadd73697a131&chksm=9f2ef567a8597c719225f87a490ea3307a537518cbbcd04a1c5881828a3d4ba1ae7714609522&token=773706277&lang=zh_CN#rd)》。我们计划推送WeBASE系列文章,与你一道体验WeBASE的“简约而不简单”。本文是系列文章第一篇《漫谈WeBASE之交易两三事》,打算谈谈WeBASE在交易相关方面做的一些工作。 + +## 交易的概念、基本数据结构及过程 + +交易可认为是一段发往区块链系统的请求数据,用于部署合约,调用合约接口,以求达到维护合约的生命周期,管理资产,进行价值交换等目标。交易的基本数据结构包括发送者,接受者,交易数据等。 + +一个完整的交易过程可分为交易构建并**链上执行、交易展示、交易审计**三步: + +- 首先用户可以构建一个交易,用自己的私钥给交易签名,发送到链上(通过sendRawTransaction等接口);然后链收到交易并交由多个节点机制处理,执行相关的智能合约代码,生成交易指定的状态数据;最后将交易打包到区块里,和状态数据一起落盘存储。落盘交易即为被确认,被确认的交易通常被认为具备了事务性和一致性。 +- 随着交易确认,相应的还会有交易回执(receipt)产生,和交易一一对应且保存在区块里,用于保存一些交易执行过程中生成的信息,如:结果码、日志、消耗的gas量等。用户可以使用交易hash查询交易,交易回执展示给用户。 +- 随时间推移,链上交易越来越多,需要对链上交易进行分析,辅助监管和审计链上的行为,确保链的合理、合规运行。 + +大家对交易有了初步的了解,接下来我们就从交易的三步曲中,详细探讨WeBASE在其中充当的角色和发挥的作用。 + +## 交易上链 + +通过WeBASE有多种发送交易上链的方式,比较常见的有WeBASE管理平台和交易上链代理子系统等两种,前者由WeBAS管理平台提供一个合约IDE,可以部署和调用合约接口,这里就不赘述了。今天我们重点介绍下**交易上链代理子系统([WeBASE-Transaction](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Transaction/index.html))**。 + +目前,区块链开发者主要面临以下几个痛点: + +- 区块链学习成本高--不想关注区块链细节,想用传统的方式调用区块链服务。 + +- 现实业务的峰值可能超过区块链的处理能力--需要一套缓存系统来削峰平谷。 + +为了解决这些痛点,WeBASE-Transaction应运而生。WeBASE-Transaction是从很多区块链存证类型项目中总结出来的一套服务系统,以帮助大家快速搭建区块链应用,其功能主要是接收无状态交易请求,缓存到数据库中,再异步上链,服务支持分布式任务,多活部署,异地容灾。部署架构如下图: + +![](../../../../images/articles/webase-transaction/IMG_5605.PNG) + +从部署结构图可以看到,WeBASE-Transaction具有以下几大特性: + +- **异步上链,过载保护**:区块链请求先缓存数据库,削峰平谷,由服务使用合理速度异步上链。 + +- **多活部署,分布式任务**:使用Zookeeper做分布式任务协调,将上链分为多个分布式任务,多活部署,异地容灾。 + +- **错误重试,实时对齐**:服务自动查验上链状态,错误重试,达到数据库和链上状态的实时对齐。 + +## 交易展示 + +交易上链代表着终于把数据写入区块链了。兴冲冲地跑去给老板汇报:我们数据上链啦!老板听了既高兴,也很好奇。区块链这么高深,写入区块链的数据如何展示出来?区块链交易长啥样? + +此时你可以搭建一套WeBASE管理平台。搭建方法可以查看《[安装部署文档](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Install/index.html)》。使用方法可以查看《[WeBASE管理平台使用手册](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Console-Suit/index.html#webase)》。搭建完成后,打开WeBASE管理平台,你会发现交易是这样的:发送者、接受者、交易输入数据等。交易执行后,会产生交易回执。交易回执里面有event,记录了交易执行过程中的事件日志。 + +![](../../../../images/articles/webase-transaction/IMG_5606.PNG) + +![](../../../../images/articles/webase-transaction/IMG_5607.PNG) + +老板看后第一感觉,肯定是五味杂陈。此时你轻点“解码”按钮,把交易从一串“0x的天书”翻译成人类能读懂的模样。哪个用户通过哪个合约方法上链的,一目了然。老板看后必投来赞许的目光。此时你想必会有一种普天之下,舍我其谁的感觉。 + +![](../../../../images/articles/webase-transaction/IMG_5608.PNG) + +![](../../../../images/articles/webase-transaction/IMG_5609.PNG) + +## 交易审计 + +交易上链了,也展示了,但这还不够。联盟链中各个机构,按照联盟链委员会制定的规章,在链上共享和流转数据。这些规章往往是字面的,大家是否遵守,缺乏监管和审计。因此为了规范大家的使用方式,避免链的计算资源和存储资源被某些机构滥用,急需一套服务来辅助监管和审计链上的行为。WeBASE管理平台提供的交易审计,就是一套辅助监管和审计链上行为的服务。它结合区块链数据、WeBASE管理平台的私钥管理和合约管理三者的数据,以区块链数据为原材料,以私钥管理和合约管理为依据,做成的一个综合性的数据分析功能。 + +交易审计主要指标: + +| 用户交易数量统计 | 监控链上各个外部交易账号的每日交易量 | +| -------------------- | ------------------------------------------------------------ | +| 用户子类交易数量统计 | 监控链上各个外部交易账号的每种类型的每日交易量 | +| 异常交易用户监控 | 监控链上出现的异常交易用户(没在区块链中间件平台登记的交易用户) | +| 异常合约部署监控 | 监控链上合约部署情况,非白名单合约(没在区块链中间件平台登记的合约) | + +交易审计界面如下 + +![](../../../../images/articles/webase-transaction/IMG_5610.PNG) + +WeBASE管理平台提供可视化的去中心化合约部署、交易监控、审计功能,方便识别异常的用户、异常的合约,还有异常的交易量,为联盟链治理提供依据。 + +## 回归初心 + +到这里,我们可以看到一条交易,从组装发到区块链节点,然后节点执行落盘成交易回执,交易和state,再到交易展示,交易事后审计和监管。WeBASE参与了其中的组装上链、交易展示、交易审计,基本上可以说WeBASE参与了交易的全过程。 + +在组装上链过程中提供了交易上链代理子系统,其有效屏蔽了区块链底层的复杂度,降低了开发者的门槛,助力开发者高速搭建联盟链应用。在交易展示过程中,WeBASE搭建了可视化的管理平台,对交易进行了立体化展示,方便开发者实时监控和查看交易数据。在交易事后审计和监管过程中,还提供了综合的数据分析功能,辅助监管和审计链上的行为,高效治理联盟链。 + +------ + +#### 链接指引 + +- [区块链底层平台FISCO BCOS代码仓库](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0) + +- [FISCO BCOS技术文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/) + +- [WeBASE代码仓库](https://github.com/WeBankFinTech/WeBASE) + +- [WeBASE技术文档](https://webasedoc.readthedocs.io/zh_CN/latest/index.html) + diff --git a/3.x/zh_CN/docs/articles/4_tools/41_webase/webase_data_output.md b/3.x/zh_CN/docs/articles/4_tools/41_webase/webase_data_output.md new file mode 100644 index 000000000..c327e3a19 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/41_webase/webase_data_output.md @@ -0,0 +1,242 @@ +# WeBASE数据导出:助力区块链大数据场景快速落地 + +作者:张龙|FISCO BCOS 核心开发者 + +随着区块链技术的快速发展,各类应用如雨后春笋般涌现,链上数据呈指数级增长,基于区块链的大数据场景成为兵家必争之地,数据分析也成为刚需。 + +然而由于链上数据的存储特点,只能通过接口方式从链上直接获取,这种方式需要针对智能合约接口编写大量的代码,成本很高;同时从链上读取数据,除过网络开销,还需要进行解码操作,甚至遍历MPT树等,读取性能差;更重要的是,不能直接在链上进行全局数据处理,从而无法满足大数据场景的需求,比如复杂查询、大数据挖掘和分析等。 + +针对用户的需求,我们致力于提供一种自动化、智能化的数据导出解决方案,并通过不断迭代完善,满足用户基于数据导出的各种诉求,助力区块链大数据场景快速落地。本文将从用户需求出发,逐层揭开**WeBASE数据导出**组件功能、特性和架构演进的神秘面纱。 + +WeBASE是在区块链应用和FISCO BCOS节点之间搭建的中间件平台,对技术和业务架构中的共性进行抽象,形成通用化且体验友好的组件,简化区块链应用开发流程。 + +### 用户说:链上获取数据性能差,不便于大数据处理,便有了WeBASE-Collect-Bee + +对于用户而言,希望有原始数据支持大数据处理,但由于区块链特有的链式存储结构及出于安全性而设计的编解码操作及状态树等,使得从链上读取数据性能很差,于是我们设计了[WeBASE-Collect-Bee](https://github.com/WeBankFinTech/WeBASE-Collect-Bee/tree/master ) 。 + +WeBASE-Collect-Bee初步架构如下图所示,其目的在于降低获取区块数据的开发门槛,提升数据获取效率,支持大数据处理,用户只需要进行简单配置,就可以把区块数据导出到指定的存储介质上,比如支持复杂的关系查询、大数据挖掘的数据库或大数据平台上。 + +![](../../../../images/articles/webase_data_output/IMG_5618.PNG) + +WeBASE-Collect-Bee包括三个模块:区块获取模块、区块处理模块和持久化模块。 + +- 区块获取模块:根据区块ID获取相应的区块; +- 区块数据处理:解析区块数据、区块交易数据; +- 账户数据处理:解析区块链账户数据。 + +用户只需要提供链的相关配置及数据库配置,就可以一键导出链上的数据,后续可以采用SQL的方式对数据库中的数据进行操作,同时只要确保WeBASE-Collect-Bee服务正常运行,数据库可以几乎实时同步链上的数据。 + +### 用户说:业务数据获取工作量大,且不便于维护和复用,便有了WeBASE-Codegen-Monkey + +只有区块数据是远远不够的,用户更关心业务数据,即交易数据。交易数据通过调用智能合约方法上链,同时为了便于查看交易执行情况,交易中存在大量的log数据,即event数据,event数据对业务分析至关重要。 + +要想获取交易数据和event数据,必须针对区块链上的每一笔交易和event,根据智能合约进行解析,核心模块至少包括:交易/event和数据解析、数据库访问接口、POJO、SQL几个模块。 + +如下图所示,假设我们的业务包含2个智能合约、每个智能合约包含2个接口和2个event,每个模块都需要独立编写代码,那么至少需要编写32个代码文件或脚本,工作量相当大,维护复杂,且不能复用。 + +![](../../../../images/articles/webase_data_output/IMG_5619.PNG) + +基于此,我们设计了[WeBASE-Codegen-Monkey](https://github.com/WeBankFinTech/WeBASE-Codegen-Monkey) 。WeBASE-Codegen-Monkey用于生成解析和存储交易/event数据的所有核心代码。用户无需编写任何代码,只需要提供智能合约文件,WeBASE-Codegen-Monkey会自动解析合约,生成获取交易/event数据的所有代码文件,并自动和WeBASE-Collect-Bee组装成为一个独立的服务。WeBASE-Codegen-Monkey架构如下图所示。 + +![](../../../../images/articles/webase_data_output/IMG_5620.JPG) + +WeBASE-Codegen-Monkey包括合约解析模块、代码模板模块、代码生成模块、组件组装模块。 + +- 合约解析模块:解析智能合约文件,获取合约中的交易和event对象; +- 代码模板模块:用于生成获取交易/event数据的代码模板; +- 代码生成模块:根据获取的交易和event对象,填充代码模板,生成代码文件; +- 组件组装模块:用于将生成的代码和WeBASE-Collect-Bee组装成一个独立的服务。 + +由于新增了交易/event数据的获取,相应的WeBASE-Collect-Bee架构演进如下,新增交易数据处理模块和事件(event)数据处理模块。用户只需要提供智能合约文件,就可以获取几乎链上的所有数据。 + +![](../../../../images/articles/webase_data_output/IMG_5621.PNG) + +从用户使用的角度来讲,只需要将链的证书文件和智能合约文件放在指定的目录下,然后进行节点和数据库配置,并设置智能合约的包名即可。 + +``` +#### 节点的IP及通讯端口、组号。NODE_NAME可以是任意字符和数字的组合 +system.nodeStr=[NODE_NAME]@[IP]:[PORT] +system.groupId=[GROUP_ID] + +#### 数据库的信息,暂时只支持mysql;serverTimezone 用来设置时区 +system.dbUrl=jdbc:mysql://[IP]:[PORT]/[database]?useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8 +system.dbUser=[user_name] +system.dbPassword=[password] + +# 合约Java文件的包名 +monitor.contractPackName=[编译Solidity合约时指定的包名] +``` + +### 用户说:有了数据,要使用还需要开发数据访问接口,不方便,便有了用户接口 + +对于用户而言,尽管我们已经将用户关心的所有数据导出到DB中,且每一张表的名称和交易方法/event名称对应,字段名称直观易懂,但如果用户想在自己的系统中使用数据,还需要编写大量的数据库访问接口。基于此,WeBASE-Collect-Bee中增加了**用户接口模块**,如下图所示。 + +![](../../../../images/articles/webase_data_output/IMG_5622.JPG) + +用户接口模块提供两种数据访问方式,一种是API方式,支持用户系统本地调用;另一种为REST方式,可通过http方式访问,降低了业务的耦合性,支持跨平台调用。 + +用户接口按照数据类型分成四类接口:区块数据接口、账户数据接口、交易数据接口和事件数据接口。其中,每类接口中都支持基于块高、hash或账户的查询,同样也支持基于时间、特定字段的复杂查询。用户接口使得用户在使用数据导出组件时,可以和自身系统零成本对接。 + +除此之外,为了便于用户进行可视化数据验证和查看,数据导出组件集成了Swagger插件,当用户完成数据导出服务部署后,可在浏览器中输入http://your_ip:port/swagger-ui.html,查看所有用户接口,并输入查询条件,进行可视化查询,如下图所示。 + +![](../../../../images/articles/webase_data_output/IMG_5623.JPG) + +### 用户说:有了数据和查询接口,但是不够直观,老板看不懂,便有了Grafana集成 + +为了更加实时、可视化的展示区块链数据,满足产品、运营等非技术人员的需求,基于轻量化考虑,最终我们选择了可视化数据插件Grafana。 + +然而Grafana展示数据需要针对每一张表数据编写Dashboard模板,学习和编写模板成本很高。不过不用担心,WeBASE-Code-Monkey会自动生成Grafana脚本。用户只需要安装Grafana并进行数据源配置,然后导入生成的Dashboard模板脚本即可,实现数据可视化可在1分钟内完成,如下图所示。 + +![](../../../../images/articles/webase_data_output/IMG_5624.JPG) + + +### 用户说:一个服务导出数据太慢,服务挂了怎么办,便有了多线程处理和分布式部署 + +对于数据导出服务,一旦链的性能很高,超过单机数据导出的TPS,那么DB中永远获取不到最新的数据,且数据会越来越旧,显然无法满足业务对数据的诉求。同时单机处理的风险在于系统稳定性很差,一旦单机服务挂掉,就无法获取最新数据,且无法使用用户接口进行交互。因此我们引入了多线程处理和分布式部署,架构演进如下图所示。 + +![](../../../../images/articles/webase_data_output/IMG_5625.JPG) + +#### 线程管理 + +线程管理相对简单,只需要关闭多活开关,开启单节点任务模式,同时对独立线程处理的区块数进行设置即可。如下,系统默认开启4个线程,进行区块抓取和处理。 + +``` +#### 当此参数为false时,进入单节点任务模式 +system.multiLiving=false +#### 多线程下载的分片数量,当完成该分片所有的下载任务后,才会统一更新下载进度。 +system.crawlBatchUnit=100 +``` + +#### 多活管理 + +为了进一步提升数据导出效率,确保系统稳定性和容错性,我们集成了Elastic-Job,支持分布式部署、任务分片、弹性扩容、并行调度和定制化流程任务。数据导出组件在分布式环境下,首先通过一个SimpleJob对区块进行抓取,然后通过DataflowJob对区块进行处理。 + +考虑到使用Elastic-Job的成本,系统会自动生成任务分片和执行策略的所有配置,除过几个必要配置,用户不需要做任何事情就可以完成多活配置和部署。必要配置如下。 + +``` +#### 当此参数为true时,进入多节点任务模式 +system.multiLiving=true + +#### zookeeper配置信息,ip和端口 +regcenter.serverList=ip:port +#### zookeeper的命名空间 +regcenter.namespace=namespace +``` + +### 用户说:导出的数据量太大,查询和存储性能跟不上,容易崩,便有了分库分表 + +当区块链上存在海量的数据时,导出到单个数据库或单个业务表会对运维造成巨大的压力,造成数据库性能的衰减。一般来讲,单一数据库实例的数据阈值在1TB之内,单一数据库表的数据阈值在10G以内,是比较合理的范围。 + +如果数据量超过此阈值,建议对数据进行分片。将同一张表内的数据拆分到多个或同个数据库的多张表中,即分库分表。数据导出引入数据管理模块,架构演进如下图所示。 + +![](../../../../images/articles/webase_data_output/IMG_5626.JPG) + +数据管理模块集成Sharding-JDBC,支持分库分表和读写分离。用户只需要设置分片数,系统会自动生成分片策略配置。如果需要支持读写分离,可以在生成的WeBASE-Collect-Bee中进行配置,可参考[数据导出高级配置](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Collect-Bee/install.html)。在用户接口层,用户可以无感使用同一套接口,感觉是在同一个库或表中操作一样。 + +``` +#### 交易和event数据分片配置 +system.contractName.[methodName or eventName].shardingNO=XXX +#### 区块和账户数据分片配置 +system.sys.[sysTableName].shardingNO +``` + +### 用户说:链上出现临时分叉或服务异常,DB数据不一致,便有了异常处理和监控报警 + +数据导出服务旨在导出链上数据。在确保性能、稳定性、可扩展性的前提下,如果选择了非高度一致性的共识机制,链上会有一定概率出现临时分叉,导致数据库出现脏数据;或者由于网络/服务异常等原因,导致数据导出服务无法导出链上最新数据。 + +为了确保数据正确性、数据一致性,数据导出组件新增异常管理模块和监控脚本,至此,数据导出组件功能已非常强大,完整架构如下图所示。 + +![](../../../../images/articles/webase_data_output/IMG_5627.JPG) + +#### 异常处理 + +异常处理主要为了校验导入DB数据的正确性,如果选择了非高度一致性的共识机制,链上会有一定概率出现临时分叉,可能导致DB中的数据和链上的数据不一致。 + +基于6个区块后链上分叉概率趋近于0的理论,每次导出数据之前,异常管理模块会针对最近6个区块进行hash校验,如果一致,则继续导出。如果不一致,则回滚大于等于异常区块高度的所有区块数据,然后重新拉取和导入。 + +#### 监控报警 + +即使有分布式部署保证数据导出服务的稳定性,但无法保证链上数据是否真正的导出。监控脚本monitor.sh用于监控链上数据是否真正的导出。主要基于两个维度: + +- 一段时间内,DB中的数据开始落后于链上数据,直到达到某个阈值; +- 链上块高增加,一段时间内,DB中块高不变。 + +用户可以根据实际情况自行配置,如下所示。 + +``` +#### 数据导出的进度落后于链高度的报警阈值,输出报警日志 +threshold=20 +#### 如当前块高增长,但完成导出的区块数量增长小于等于1,则输出报警日志 +warn_number=1 +``` + +## 用户你尽管说 + +### 用户说:链上历史数据没有价值,全量抓取浪费资源,只想要最近的数据。 + +数据导出组件支持从特定时间或特定块高拉取数据,只需要进行简单配置即可,如下。 + +``` +#### 设置数据导出的起始高度 +system.startBlockHeight=XXXX +#### 设置数据导出的起始时间 +system.startDate=XXXX +``` + +### 用户说:我只想要部分交易/event的数据,或者只要交易/event中的部分字段数据。 + +在实际场景中,用户可能并不需要全量数据,只需要特定交易/event的数据,或者特定交易/event中的特定字段数据,数据导出支持个性化导出,可按如下配置。 + +``` +#### 设置特定交易或event数据是否导出,默认全部导出 +monitor.[contractName].[methodName/eventName].generated=on/off +#### 忽略特定合约特定event的特定字段不进行抓取 +monitor.[contractName].[methodName/eventName].ignoreParam=XXX,XXX +``` + +### 用户说:链上数据增长的不快,线程一直空转浪费机器资源。 + +数据导出组件可以灵活配置数据抓取任务的频率,可通过如下配置项进行修改。 + +``` +#### 所有method和event的抓取频率,默认5秒轮询一次 +monitor.default.frequency=5 +``` + +### 用户说:交易/event的个别字段采用string类型,数据库默认255,会导致入库报错。 + +数据导出对于智能合约中的bytes和string类型默认采用VARCHAR(255),这种设计是为了节省数据库资源,能满足绝大部分场景,但同时也存在个别字段超过255长度,导致数据不一致。因此数据导出组件针对超长字段提供配置,可有效合理利用数据库存储空间,避免资源浪费。 + +``` +#### 配置特定合约中特定交易/event的特定字段在数据库中的长度 +length.[contractName].[methodName or eventName].[paraName]=1024 +``` + +### 用户说:导出原始数据不是我想要的,比如某个账户的最新余额,而不是所有变更历史。 + +数据导出组件会导出链上的全量数据,包含所有的历史数据。针对用户的特定数据需求,数据导出组件支持本机编译,复制执行包到其他服务器上运行,在执行generate_bee.sh后,会生成完整的WeBASE-Collect-Bee服务工程,用户可基于工程源码进行二次开发,修改导入数据的策略。 + +### 用户说:整体服务功能很强大,但是我只想把部分功能集成到自己的系统中。 + +数据导出服务考虑到模块耦合性,将整个WeBASE-Collect-Bee拆分成为区块获取、数据解析,数据库操作和公共模块,用户可按照自己的需求直接使用独立的模块。 + +## 用户不仅仅可以说 + +对于任何一个方案,没有最完美的,只有最适合的。数据导出组件致力于解决区块链大数据场景问题,不仅可以适用于具体的业务诉求,对于一个区块链项目而言,还可以作为贯穿开发、测试和运营的利器,提升研发、测试和运营的效率。 + +对于用户的需求,我们的一贯态度是:欢迎说,但也不怕说,必要时你必须得说。面对志同道合的小伙伴,我们也早已给出答案:聊,随时恭候;来,双手欢迎。 + +除了积极参与区块链领域的技术开源,我们也致力于和广大用户共建开源生态,用户不仅仅可以说,还可以加入我们,这里不仅有前沿的黑科技,还有诗和远方! + +------ + +#### 链接指引 + +- [区块链底层平台FISCO BCOS代码仓库](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0) + +- [FISCO BCOS技术文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/) + +- [数据导出代码仓库]( https://github.com/WeBankFinTech/WeBASE-Codegen-Monkey) + +- [数据导出技术文档](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Codegen-Monkey/index.html) + diff --git a/3.x/zh_CN/docs/articles/4_tools/41_webase/webase_node_preposition.md b/3.x/zh_CN/docs/articles/4_tools/41_webase/webase_node_preposition.md new file mode 100644 index 000000000..26710d7f8 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/41_webase/webase_node_preposition.md @@ -0,0 +1,94 @@ +# WeBASE节点前置组件功能解析 + +作者:何硕彦|FISCO BCOS 核心开发者 + +FISCO BCOS搭链脚本已经让开发者有极致的搭链体验,怎样能快速搭建一个区块链可视化界面,以便跟区块链交互,WeBASE-Front就是可以最快满足这个期望的组件。WeBASE-Front为开发者提供区块链交互最小功能的子集,安装轻量便捷,无需安装任何第三方组件。在搭完节点之后搭建WeBASE-Front,可以在浏览器打开界面,快速开启区块链体验之旅。 + +WeBASE-Front还提供了很多友好且实用的功能: + +- 在WeBASE-Front首页界面,开发者可以查看到区块链的区块信息、交易信息、群组信息、节点数量、节点状态等,**对区块链网络的核心信息一目了然**。 +- WeBASE-Front提供了合约开发IDE,方便开发者在上面编写调试智能合约,**快速开发自己的区块链应用**。 +- WeBASE-Front集成了Web3SDK,并对Web3SDK接口进行了封装,开发者可通过HTTP请求,调用WeBASE-Front接口和区块链节点进行交互。这种方式屏蔽了SDK语言的限制,**任意语言的开发者都可以通过调用WeBASE-Front的接口与区块链交互**。 + +当然,WeBASE-Front的功能不限于此。作为WeBASE家族成员之一,该组件配合WeBASE-Node-Manager和WeBASE-Web一起使用,作为节点前置,对区块链网络的全方位监控,实现企业级区块链监控功能。 + +## 功能介绍 + +WeBASE-Front主要有以下五大功能: + +### 一、数据概览 + +显示开发者关心的常用数据:**区块块高、节点数量、交易总数、待交易数量,**并支持区块信息和交易信息的查询。 + +![](../../../../images/articles/webase_node_preposition/IMG_5628.PNG) + +### 二、节点管理 + +显示区块链网络的**节点数量、节点ID、块高、pbftview和节点运行状态**,并支持区块链群组的动态切换。 + +### 三、合约管理 + +此为WeBASE-Front的核心功能,开发者可以在上面**编写、编译、调试合约**,以及**一键生成合约的JAVA类**,已部署合约会存在H2嵌入式数据库里,可以在合约列表里查询历史合约。 + +![](../../../../images/articles/webase_node_preposition/IMG_5629.PNG) + +### 四、系统监控 + +系统监控分为两方面监控: + +1. 节点服务器的性能指标监控,包括**CPU、硬盘、内存、上行带宽、下行带宽**; +2. 区块链节点的性能指标监控,包括**区块高度、pbftview、待打包交易数**。 + +节点长久运行后,可以通过此功能查看服务器的性能。 + +### 五、私钥管理 + +生成椭圆曲线公私钥对,支持**导入导出私钥**,并支持给地址取别名,方便地址记忆。部署合约前需要先创建公私钥对。 + +![](../../../../images/articles/webase_node_preposition/IMG_5630.PNG) + + +## 技术剖析 + +WeBASE-Front是基于FISCO BCOS提供的**spring-boot-starter**(请参考文末链接)项目的一个开发实例。**Web3SDK接口封装、动态切换群组、部署调用合约(无需生成JAVA类)、公私钥对产生,**这些通用功能请参考WeBASE-Front代码,开发者可以借鉴并编写自己的springboot应用。 + +为了方便安装和使用,WeBASE-Front采用了轻量级的**H2嵌入式数据库**,后端使用SSH框架,使用JPA访问数据库;前端采用**VUE**框架开发,前端资源内置在后端springboot服务中,无需安装配置nginx和mysql这些步骤,直接启动JAVA服务即可访问界面。 + +产生的公私钥和已部署的合约都会存储在H2数据库中,方便查询历史记录。性能监控功能采用的是**sigar**数据收集组件。采集的数据也会存在H2数据库中,但只保存最近一周的监控数据。 + +## 部署方式 + +作为节点前置,WeBASE-Front需要跟节点同机部署。一台机器部署多个节点时,建议只部署一个WeBASE-Front服务即可。 + +WeBASE-Front部署方式有以下三种: + +1. 单独部署作为独立控制台使用,并配有界面,部署简单快捷,只需下载WeBASE-Front应用,替换节点证书即可启动。推荐初学者和开发者使用此种部署方式,使用此组件查询区块链的相关信息和开发调试智能合约。(安装请参考文末链接) + +2. 方式1中,WeBASE-Front作为可视化控制台使用,私钥默认加密存储在H2数据库中,如果需要更安全的私钥保护方案,可以结合WeBASE-Sign服务一起部署使用,私钥保存在WeBASE-Sign中,WeBASE-Sign服务负责对交易数据进行签名,提供更安全的私钥保护方案。 + + 此方式在方式1的基础上再部署WeBASE-Sign服务,如果对私钥安全性要求较高,请采用此种部署方式。(WeBASE-Sign服务请参考文末链接) + +3. 结合WeBASE-Node-Manager和WeBASE-Web服务一起部署使用,这里WeBASE-Front只作为节点前置,多个节点前置统一由WeBASE-Node-Manager管理,WeBASE-Node-Manager有一套spring security实现的鉴权登录系统,并会拉取链上的区块信息和交易信息,存储在Mysql数据库中。生产环境下建议使用此种方式,架构图如下所示。(WeBASE安装部署请参考文末链接) + +![](../../../../images/articles/webase_node_preposition/IMG_5631.PNG) + +## 总结 + +WeBASE-Front作为一个搭建便捷、功能强大的区块链组件,既可以独立使用,作为可视化控制台,方便开发者与区块链交互,也可以配合WeBASE-Node-Manager和WeBASE-Web一起使用,实现生产环境的区块链监控功能。 + +WeBASE-Front还在持续优化开发中,未来会增加越来越丰富的功能,如联盟链增删节点的系统管理功能、交易解析功能等。当然,持续迭代升级中也会保持它的易用性和便捷性。欢迎社区朋友提PR和ISSUE,一起参与优化。 + +------ + +#### 链接指引 + +- [Spring-boot-starter](https://github.com/FISCO-BCOS/spring-boot-starter/tree/master-2.0) + +- [Sigar数据收集组件](https://www.jianshu.com/p/c3d88dd617bf) + +- [WeBASE-Front单独安装部署说明](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Install/developer.html#) + +- [WeBASE-Sign服务](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Sign/index.html) + +- [WeBASE安装部署](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Install/enterprise.html) + diff --git a/3.x/zh_CN/docs/articles/4_tools/41_webase/webase_release.md b/3.x/zh_CN/docs/articles/4_tools/41_webase/webase_release.md new file mode 100644 index 000000000..e5f5bd62e --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/41_webase/webase_release.md @@ -0,0 +1,102 @@ +# FISCO BCOS迎来区块链中间件平台WeBASE,应用落地提速 + +随着区块链技术的发展,越来越多的开发者基于稳定和高效的区块链底层平台,结合智能合约和链上接口,开发各种丰富的应用,随之而来的是对区块链系统的易用性、应用开发速度、业务组件丰富性产生了更多的需求。 + +直面底层平台,“裸写”智能合约和底层代码,在技术上是可行的,而进一步提供“所见即所得”、“开箱即用”这种无门槛体验的动力,则来自社区开发者的反馈,比如: + +- 缺乏好用的智能合约开发工具,合约的开发和调试效率不高,难以便捷地管理链上各节点配置信息,观察其运行状态。 + +- 区块链上的区块、交易、回执等数据的呈现方式不够友好,对链上的海量数据难以进行灵活和多维度的分析。 + +- 针对参与到业务的各账号及其进行的交易行为,需要通用的审计工具,以便及时发现和杜绝异常。 + +为响应开源社区里持续的需求,同时将自身长期探索的成果开放分享, FISCO BCOS开源工作组成员单位——微众银行,为社区贡献一条从区块链底层通往应用落地的高速通道。 + +**7月2日,微众银行正式开源自研的区块链中间件平台——WeBASE,该平台适配支持FISCO BCOS底层平台**,面向多种对象,如开发者、运营者,并根据不同的场景,包括开发、调试、部署、审计等,打造丰富的功能组件和实用工具,提供友好的、可视化的可操作环境。 + +基于FISCO BCOS底层平台,部署WeBASE,可以简化区块链应用开发流程,大大降低企业搭建区块链应用,以及进行运营分析的时间成本、人力成本,使开发者可得心应手的操控区块链网络,更专注投入到应用开发和业务落地中。 + +**WeBASE代码仓库地址**:https://github.com/WeBankFinTech/WeBASE + +## WeBASE简介 + +**WeBASE(WeBank Blockchain Application Software Extension) 是在区块链应用和FISCO BCOS节点之间搭建的中间件平台,**如下图所示,开发者可在区块链节点上层部署WeBASE的可交互模块如浏览器、管理台和其他工具等,也可以基于WeBASE内置的组件和API,进行应用的开发。 + +![](../../../../images/articles/webase_release/IMG_4950.PNG) + +WeBASE的“**简约而不简单**”,体现在以下几个方面: + +一 、提供友好的智能合约开发平台,支持在线编译、调试、测试、部署智能合约,具有高效的编辑环境,率先支持Solidity智能合约语言。 + +![](../../../../images/articles/webase_release/IMG_4951.PNG) + +二、在SDK基础上封装Restful风格的API接口,Restful接口更直观,有良好的可扩展性,可轻松适配多种编程语言。通过接口可对交易数据进行编解码,可在包括网页、手机终端等设备上全方位、多维度展示链上数据细节。 + +![](../../../../images/articles/webase_release/IMG_4952.PNG) + +三、区块链管理平台是运营管理员的首选工作台,可查看链上的数据统计、每个区块的详情、各个节点多维度的统计数据,对节点的健康度做到全方位监控。 + +![](../../../../images/articles/webase_release/IMG_4953.PNG) + +四、数据导出组件可配置式的导出链上数据到关系型数据库、大数据处理等系统,以便对链上数据进行多元化处理,如进行数据挖掘,构建商业模型等。 + +## WeBASE的整体架构和设计原则 + +WeBASE的完整架构如下图所示: + +![](../../../../images/articles/webase_release/111.PNG) + +WeBASE的设计理念是一个子系统解决一个问题,无需部署所有子系统就能跑起来,因此在设计之初就遵循如下原则: + +**按需部署**:WeBASE抽象对应用开发通用共性进行抽象,形成各类服务组件,如业务接入、私钥管理、交易队列、合约开发、数据导出、审计等,开发者根据需要部署所需组件。 + +**微服务架构**:WeBASE采用微服务架构,基于spring-boot框架,提供Restful风格接口。 + +**零耦合**:WeBASE所有子系统独立存在,均可独立部署,独立运行,面向不同的场景提供服务,避免出现“全家桶”式的冗余负担。 + +**可定制**:前端体验往往带有开发者自身的业务表现,如不同的样式、不同的交互风格、不同的品牌表现等,因此WeBASE采用前后端分离的设计,后端接口保持稳定和可扩展,前端页面则由开发者自由定制。 + +## 基于WeBASE的应用开发流程 + +基于WeBASE的应用开发流程有全新的体验,下图直观比对两种开发流程的不同: + +![](../../../../images/articles/webase_release/640.jpeg) + +显然,基于WeBASE的应用开发,流程大大简化。智能合约开发工具、完善的数据可视化平台、简易的交易上链方式,降低了开发门槛,使得开发效率大幅提升。而且对于应用上线后的交易审计、数据导出、立体监控等方面的管理,WeBASE为其提供一系列完善的组件,能有效避免开发者和企业重复破荒造路。 + +## WeBASE的下一步 + +今天,**WeBASE开源只是一小步,未来,WeBASE将有计划地开放更多功能**: + +- 提供更多直面商业领域的、经过业务验证的组件,便于集成到有共通模式的应用中,建立区块链应用开发最佳实践和标准架构; +- 提供各类行业解决方案和参考实现; +- 为云厂商提供更友好的接入方式。 + +## 社区开发者体验 + +- **网络技术总监 林冬艺** 广州市品高软件股份有限公司 + +> 品高软件是一家云计算公司,正在探索云计算与区块链的融合创新。WeBASE具有友好的界面设计、便捷的管理以及云生态的良好融合等特点,使得区块链上云变得更轻松,我们得以更专注于区块链与云计算的业务场景。 + +- **架构师 魏巍** 宝付网络科技(上海)有限公司 + +> WeBASE操作简便,社区文档非常完善,涵盖企业所需的各类组件,可插拔式的架构设计,根据所需组合使用,帮助我们解决区块链技术的后顾之忧,缩短业务数据化进程,快速实现业务价值。 + +- **CTO 金兆康** 杭州亦笔科技有限公司 + +> WeBASE的联盟治理、前置管理功能使得管理区块链就像管理聊天群一样简单。社区的及时响应、功能的快速迭代,处处体现出国内顶级区块链服务提供商的实力。 + +- **区块链架构师 孙耀普** 全链通有限公司 + +> WeBASE各系统模块都提供了丰富的部署文档,明确的部署步骤,按照部署文档就可以很快部署和使用,系统的UI设计和布局也非常合理。 +> +> 注册和登录功能,满足了客户关于区块链信息查询权限管理需求,减少了开发的工作量;系统集成了FISCO BCOS的java接口,提供了丰富的调用接口,减轻了开发工作量,降低了区块链的使用难度。 +> +> 系统提供智能合约的编辑和编译和部署功能,使智能合约开发更加便捷。 + +- **创始人 张泷** 聚滴成海(广州)信息技术有限公司 + +> 聚滴成海是一家专注区块链深层次挖掘的中间件提供服务商,我们需要直接对客户提供封装好的接口,来降低他们的开发工作量。由于我们产品性质的特殊,需要兼容多种生态、包容多种共识机制,因而我们的开发工作量非常庞大! +> +> 但是WeBASE将各种接口已经封装的非常完善,只需稍作暴露就可以快速连接!希望WeBASE可以继续坚持对开源社区的支持,我们也愿意为之不断付出和贡献。 + diff --git a/3.x/zh_CN/docs/articles/4_tools/42_buildchain/fast_build_chain.md b/3.x/zh_CN/docs/articles/4_tools/42_buildchain/fast_build_chain.md new file mode 100644 index 000000000..71b6a7a76 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/42_buildchain/fast_build_chain.md @@ -0,0 +1,87 @@ +# FISCO BCOS快速建链实现之路 + +作者:白兴强|FISCO BCOS 核心开发者 + +跟很多开发者一样,团队刚开始搭链时,也经历过迷之困惑的阶段:安装哪个版本,怎么编译这么久还容易出错?配几个节点,都用什么IP端口?证书从哪里来,放到哪里去?怎么验证我的链确实搭起来了?... + +相信从FISCO BCOS1.X版本上手的工程师们,内心都有一座小火山,面对超长的文档、超多的操作步骤……每次版本部署,耗费大量时间,工程师头上都快能摊熟一枚鸡蛋。而数据表明,一个软件如果15分钟还使用不起来,用户就会流失。 +为了浇灭大家心中的小火山,一起愉快地玩耍区块链,FISCO BCOS的易用性优化势在必行。团队的第一个目标是让开发者**在5分钟内搭起开发测试链**,这就需要一个《哈利•波特》里召唤术一样的命令,我们把它称为**build_chain**。 +本文将聊聊build_chain脚本的诞生记,以及当前脚本能够提供的帮助。 + +## build_chain脚本的诞生 + +首先是去掉编译步骤,源码编译不但需要安装下载依赖,还需要配置开发环境,即便这两步一切顺利,编译过程中还可能因为内存不足而失败,更何况下载依赖经常受到网速影响导致下载失败。于是我们提供了预编译的二进制发布包,让用户跳过冗长的编译阶段。 +马上我们又发现了新的问题,即使针对不同平台都提供二进制发布包,用户的环境是千变万化的,预编译程序所依赖的动态库的安装又成了问题。 +于是我们想到了提供静态编译的二进制发布包,兼容多种Linux64位操作系统,不依赖任何其他库,省时又省力。为了实现静态编译,我们不惜重新实现部分功能,以去掉对不提供.a的外部库的依赖。 +接下来我们尝试减少部署步骤,减轻对用户的压力。 + +配置项太多太灵活,我们优化配置,所有配置都提供合适的默认值,删除不需要灵活定制的配置项。 +json格式的配置文件阅读不够直观,手工修改容易因为格式问题导致错误,我们替换为更清晰的ini文件。 +系统合约手动部署太麻烦,我们借助预编译合约实现内置系统合约来管理链上配置。 +手工搭建和工具脚本搭建的节点目录结构不统一,我们整理文档,统一工具创建的目录结构,提供辅助脚本。 + +经过上述这些优化,我们认为可以有更轻量级的部署方式,可以尝试通过一个脚本来完成部署过程中的所有事情。 +相比于大而全的部署工具,脚本更轻更快;而相比于手工部署的繁琐,脚本能够更简单。这样,build_chain脚本就诞生了。 + +## build_chain脚本提供的帮助 + +这个脚本能够完成环境检查、参数解析、FISCO BCOS二进制发布包下载、公私钥证书生成、配置文件生成和工具脚本生成等功能,支持MacOS、Linux 64bit、docker模式和国密版本搭建。 +然而实际使用后,我们发现在家里的网络条件下,脚本下载二进制发布包需要很长时间,导致5分钟内无法完成搭起一条FISCO BCOS的链。 +为了能达成5分钟建链的目标,我们又新增了CDN支持,在哪怕网络条件不是很好的情况下,也可以顺畅地在5分钟内完成建链。心中的小火山熄灭了。 + +具体而言,build_chain脚本能够提供的帮助包括以下几个: + +### 环境检查 + +build_chain脚本需要使用OpenSSL来生成节点所需要使用到的相关证书文件,而FISCO BCOS 2.0要求使用OpenSSL 1.0.2以上版本。只有找到符合要求的程序版本,脚本才能继续执行。 +需要注意的是,MacOS自带的是LibreSSL,所以需要用户使用brew install OpenSSL安装OpenSSL。 + +### 解析参数 + +build_chain脚本支持很多自定义参数,例如-p指定节点使用的端口范围、-f搭建指定配置的网络、-g搭建国密版本、-v指定FISCO BCOS程序版本号、-o指定输出路径等,[可参考详情](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/build_chain.html#id4) + +![](../../../../images/articles/fast_build_chain/IMG_4954.PNG) + +### 获取FISCO BCOS可执行程序 + +FISCO BCOS提供标准版和国密版本的预编译可执行程序,可以在大部分x64的Linux机器上运行。另外,为方便开发人员调试,同时提供了MacOS版本的可执行程序。 + +- build_chain脚本会根据操作系统和是否国密下载对应的可执行程序。 +- 当从GitHub下载可执行程序较慢时,会自动切换到CDN下载。如下图可以看到fisco-bcos.tar.gz只有7.72M。 +- 当不使用-v选项指定版本时,脚本会自动拉去GitHub上FISCO BCOS发布的最新版本,使用-v选项时,则下载指定版本的可执行程序。 + +对除官方明确的Ubuntu 16.04+和CentOS 7.2+以外的平台,上生产时建议使用源码编译获得的可执行程序,然后通过-b选项和-f选项搭建区块链网络。 + +![](../../../../images/articles/fast_build_chain/IMG_4955.PNG) + +### 生成私钥证书 + +FISCO BCOS支持证书链,默认使用三级证书链结构,使用自签CA证书作为链的根证书,使用CA签发的机构证书用于区分机构,然后使用机构私钥签发节点所使用的证书。 +节点的conf目录下会有ca.crt、node.key、node.crt三个文件,节点使用这三个文件建立双向SSL链接,使用node.key在共识过程中为区块签名。 +如果是国密版本,则脚本会下载TaSSL工具,生成国密版本的证书文件。 + +### 生成配置文件和工具脚本 + +build_chain脚本中内置了FISCO BCOS节点所需要使用的配置文件模板,根据用户指定的参数修改,生成节点所使用的配置文件([可查看配置文件的介绍](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/configuration.html))。 + +同时,为方便用户启动和停止节点,节点目录下还会生成start.sh和stop.sh([可查看节点目录结构说明](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/build_chain.html#id5))。 + +## 总结 + +下面来总结一下,FISCO BCOS团队提升部署速度、实现快速建链的几个要诀: + +- 1.提供静态编译的二进制发布包,兼容多种操作系统,让用户跳过冗长的编译阶段。 +- 2.简化配置,极大限度采用能保证最大成功率的默认参数,最小化用户需要关注的信息,用户只需关注少量网络配置。 +- 3.标准化目录结构,无论是用一键搭链、企业级搭链、手工搭链...生成的目标都是一样的,降低了差异化带来的复杂度。 +- 4.巧用脚本,build chain脚本可自动串起从准备环境到启动所有链节点一系列常规操作步骤,自动处理各种可能的小异常,让整个过程显得行云流水。 +- 5.优化依赖库地址、网络速度等,极大减少用户的等待消耗,谈笑间,链已经搭好。 + +对于想通过手工搭建进一步学习的同学和生产环境使用,建议使用我们提供的企业级部署工具generator。 +在性能和易用性方面,做再多努力都是值得的,我们会继续努力优化,非常欢迎各位社区的参与者提优化建议和bug。 + +------ + +#### 参考链接 + +**企业级部署工具generator**:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/enterprise_tools/index.html + diff --git a/3.x/zh_CN/docs/articles/4_tools/42_buildchain/index.md b/3.x/zh_CN/docs/articles/4_tools/42_buildchain/index.md new file mode 100644 index 000000000..56e521013 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/42_buildchain/index.md @@ -0,0 +1,9 @@ +### 一键搭链脚本工具 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + fast_build_chain.md +``` + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/43_console/console_details.md b/3.x/zh_CN/docs/articles/4_tools/43_console/console_details.md new file mode 100644 index 000000000..eb5c7d5bd --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/43_console/console_details.md @@ -0,0 +1,96 @@ +# FISCO BCOS 控制台详解,飞一般的区块链体验 + +作者:廖飞强|FISCO BCOS 核心开发者 + +我们对Linux系统中的命令行终端已经很熟悉了,通过shell终端可以顺畅地使用Linux。类似地,FISCO BCOS联盟链中,也有这样的命令行终端,称为控制台。控制台是开发者探索区块链世界的助推器,其提供的各种功能有助于跨越横在区块链入门到精通之间的座座高山,带来“开箱即用”的顺滑体验。 + +## Why: 为什么要做控制台? + +### 体验环境影响用户从“入门到放弃”,或者“入门到精通”。 + +当学习一个新技术或产品时,除了读文档之外,尝试上手操作,获得第一手体验也尤为重要。如果体验环境配置复杂、操作繁琐,很可能导致用户从“入门到放弃”;而体验环境简单易配置、功能丰富,则会为用户迅速打开一扇新世界的大门,加速用户从入门到精通。 + +选择何种形式承载这种极速且友好的体验方式呢?如果我们有一个控制台,只要输入单条命令或代码,然后按下回车键就可以返回结果显示在用户面前。这种 “开箱即用”的效果,正是我们所期待的体验方式。 + +### 可以为FISCO BCOS实现极速体验的控制台吗? + +FISCO BCOS 1.3版本其实已经具备快速体验的功能,由两部分组成,分别是ethconsole和Node.js工具。其中,ethconsole可以查询链上信息,包括节点、区块和交易信息;Node.js工具提供了部署和调用合约的模板js文件,协助用户实现合约的部署与调用。 + +但是这种体验方式还不够友好,那一版的ethconsole只能查询非常有限的链上信息,并不能发送交易和管理区块链,功能比较单一;通过Node.js工具需要手工编写部署和调用合约的模板js文件,操作较为繁琐,体验和ethconsole割裂,不那么顺畅。 + +因此,FISCO BCOS 2.0版本规划时,重点设计了FISCO BCOS 2.0控制台,目标是做一个易用、友好、且功能强大的全新控制台,给FISCO BCOS提供一种极速体验方式。 + +## What: 控制台实现了哪些功能? + +控制台每一个功能的实现都源于一个个朴素的操作,一切按实际需求出发,对用户有价值的功能,一一实现。 + +### 需求1:区块链是什么,在哪里?看得见吗? + +实现查询区块链相关的一系列命令,让区块链看得见摸得着!例如查询区块高度、区块、交易、节点等等,并且根据不同参数,提供不同的查询方式以满足不同条件下的查询需求。 + +值得关注的是,对于交易和交易回执信息查询命令(getTransactionByHash,getTransactionReceipt等),提供按ABI定义解析详细数据的功能,让交易的输入、输出和event日志信息以解码的方式呈现,而不再是满屏十六进制的天文数字。 + +### 需求2:部署和调用合约是使用区块链最核心的诉求,控制台可以直接部署和调用合约吗? + +必须可以。控制台推出之前,部署和调用合约有两种选择:一种是借助Node.js工具,即写Node.js客户端部署和调用合约;一种是使用Java SDK, 写Java 客户端部署和调用合约。这两种方式都很强大,但并不是为极速体验设计的,用户需要编写合约之外的部署和调用代码。 + +因此,控制台实现的效果是,用户写好合约,放入指定路径,在控制台输入一个命令(deploy)即可完成部署,再用call指令就能调用合约接口,不需要其他任何额外的工作(例如将solidity合约转为java代码,编写部署和调用合约的客户端代码等)。 +deploy命令部署合约之后,会显示一个合约地址,考虑到后续调用合约时还会用到这个合约地址,控制台本地会记录部署的合约地址,并提供getDeployLog命令查看部署过的合约地址列表信息。 + +另外,FISCO BCOS区块链提供CNS功能,即合约命令服务功能。链上可以记录部署的合约名、版本号和对应的合约部署地址;部署合约时,指定合约名和版本号;调用合约时,指定合约名和版本号(若不指定,使用最近部署的合约版本号)。 + +这是一种更高级的部署和调用合约方式,也是推荐的部署和调用合约方式。因此控制台实现了利用CNS部署合约命令deployByCNS和利用CNS调用合约命令callByCNS。 +值得关注的是,为了开发者便于查看处理信息和调试合约,控制台会自动解析合约的输出和event日志信息。 + +### 需求3:FISCO BCOS 2.0支持多群组,控制台可以在线切换群组吗? + +控制台登录之后,其命令提示符前面显示当前群组号。通过提供switch命令在线切换多群组,即不需要退出控制台就能完成无缝切换。切换之后,命令提示符前面的群组号自动更新,而后可以在切换后的群组中发送命令。 + +### 需求4:控制台可以管理区块链吗? + +FISCO BCOS 2.0 提供节点管理、系统参数管理、权限管理功能,控制台均提供对应的命令进行操作,方便用户通过简单的命令轻松管理区块链。 +其中,节点管理的命令是addSealer(添加共识节点)、addObserver(添加观察节点)、removeNode(移除群组中的节点);系统参数管理的命令是setSystemConfigByKey(设置系统参数);权限管理有一系列的命令,管理区块链系统相关功能的操作权限,其具体是以grant开头的赋予权限命令,以revoke开头的撤销权限命令,以及以list开头的查询权限命令。 + +[具体使用参考这里](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html#grantpermissionmanager) + +### 需求5:可以不用写CRUD合约,操作区块链中的用户表吗? + +FISCO BCOS 2.0提供分布式存储,其核心在于表存储设计。CRUD合约是面向表存储的一种合约写法,合约的数据存储在用户表中,合约接口面向表进行增删改查操作。 +为了让用户不用写CRUD合约,就可体验分布式存储功能,控制台提供类似mysql语句的形式,提供创建表(create)、查看表(desc)和表的增删改查(insert, delete, update, select)命令。 +创建表和增删改命令均是发送一条需要区块链节点共识的交易,与用户编写CRUD合约操作表等效。 + +### 需求6:控制台支持国密方式发生交易吗? + +控制台提供修改配置文件的国密开关,并下载国密版合约编译器以及替换,这就成为了国密版控制台。因此,当区块链节点是国密版本时,控制台可以连接国密节点并支持部署和调用国密版合约,发送国密版交易。 + +### 需求7:...等你来提? + +欢迎社区用户积极提意见、建议以及需求(issue或微信社群的方式),同时也可以直接提pull request到官方console仓库,修改和新增你们需要的功能,甚至可以fork源码然后单独定制个人或组织的控制台,开源社区的共建和共享依靠社区用户广泛而积极的参与。 + +## Where: 控制台的价值在哪里 + +现在,用户只要启动控制台,就可以查询丰富的链上信息,快速部署和调用合约,轻松管理区块链,这些特性给用户带来什么价值呢? + +- **面向初学人员**:不用搭建复杂的开发环境,只要简单的节点ip和端口配置,非常轻量级,就可以极速体验区块链功能。当启动控制台后便呈现出一个炫酷的FISCO BCOS标志图案时,会顿时感觉自己成功地与FISCO BCOS产生了第一次连接,从而信心倍增地继续探索区块链。 + + [配置和启动控制台请参考这里](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html#id8) + +- **面向开发人员**:开发人员可以利用控制台部署和调试合约,当写好合约后,可以在控制台先部署,采用call指令调用验证合约逻辑,观察合约运行过程和结果。如果业务端采用Java开发应用,可以利用控制台的合约编译工具将Solidity合约一键编译为Java客户端代码文件,供客户端的java工程调用。 + +- **面向测试和运维人员**:可以在搭建区块链环境后,利用控制台查看链状态,操作区块链配置,测试或检查相关区块链功能。 + +**总之,控制台已成为FISCO BCOS的一个极速体验的窗口,一件强有力的利器,为用户持续带来实际价值**。 + +------ + +#### **注**: + +1、控制台已是FISCO BCOS SDK的一个标配功能,目前已提供Java版控制台(已单独成立了一个console仓库),Python版控制台和Node.js控制台。上文主要是针对Java版控制台进行的介绍,其他控制台相关功能大体相同。 + +**2、控制台文档列表**: + +[Java版控制台使用文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html ) + +[Python版控制台使用文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/python_sdk/console.html) + +[Node.js版控制台使用文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/nodejs_sdk/install.html#node-js-cli**) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/43_console/index.md b/3.x/zh_CN/docs/articles/4_tools/43_console/index.md new file mode 100644 index 000000000..c98ed1deb --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/43_console/index.md @@ -0,0 +1,9 @@ +### 交互式控制台Console + +```eval_rst +.. toctree:: + :maxdepth: 1 + + console_details.md +``` + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/44_sdk/index.md b/3.x/zh_CN/docs/articles/4_tools/44_sdk/index.md new file mode 100644 index 000000000..64be7ac27 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/44_sdk/index.md @@ -0,0 +1,15 @@ +### 多语言SDK + +```eval_rst +.. toctree:: + :maxdepth: 1 + + multilingual_sdk.md + use_javasdk_in_eclipse.md + node.js_sdk_quick_start.md + python-sdk_origin_function_and_realization.md + javasdk_performance_improvement_8000-30000.md + talking_about_java-contract-code.md + python_blockchain_box.md +``` + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/44_sdk/javasdk_performance_improvement_8000-30000.md b/3.x/zh_CN/docs/articles/4_tools/44_sdk/javasdk_performance_improvement_8000-30000.md new file mode 100644 index 000000000..7f63374f1 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/44_sdk/javasdk_performance_improvement_8000-30000.md @@ -0,0 +1,152 @@ +# 记一次JavaSDK性能从8000提升至30000的过程 + +作者:李辉忠|FISCO BCOS 高级架构师 + +## 缘起 + +FISCO BCOS在中国信通院可信区块链测评中达到2万+ TPS的交易处理能力,在同类产品中处于领先水平。此次测试标的是底层平台,目的是压测得出底层平台的性能上限,主要评估目标是底层平台的交易处理能力。 + +交易构造是由客户端(集成了SDK)完成,客户端通常可以非常容易实现平行扩展。SDK要完成交易构造的过程,实现交易组包、编码、签名、发送等一系列操作,这些过程本身是无状态的,客户端可以通过多线程的方式进行扩展,一个客户端性能达到瓶颈,可以增加更多客户端进行扩展。 + +虽然“堆机器”的平行扩展方式可以解决发送端的性能问题,但是机器本身就是珍贵的资源,进一步优化算法效率,提高资源利用率,将大有裨益。于是,我们打算先测试一下JavaSDK目前的性能,主要评测生成交易的性能。生成交易包括交易组包、参数编码、交易编码、交易签名等过程,其中,交易签名是最重要的环节,测试数据如下: + +- 8核机器,测试本地生成50W笔交易的耗时 +- 完全并行:每秒生成**8498笔**交易,平均每笔交易耗时0.12毫秒 +- 完全串行:每秒生成1504笔交易,平均每笔交易耗时0.66毫秒 + +对比C++实现交易签名,这个性能实属不高。根据以往经验判断,这里大有优化空间啊!于是团队开始了一次JavaSDK的性能优化之路。 + +## 过程 + +关于性能优化,社区做过多次分享,可以补充阅读下列文章: + +- [FISCO BCOS共识优化之路](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485295&idx=2&sn=46cff7fcdf2e807325532941fcbc98fe&chksm=9f2ef573a8597c65d159c17298ecec02097aafeedfd0192154d9d530c9a0d0a79a22c33894a0&scene=21#wechat_redirect) +- [区块链的同步及其性能优化方法](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485283&idx=1&sn=c2028923dc7ec7d8bfa808febc57e596&chksm=9f2ef57fa8597c6911f629b324e466f7058e4ae5da06aab8484c1d7db3203496ffebd9562ecb&scene=21#wechat_redirect) +- [FISCO BCOS中交易池及其优化策略](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485255&idx=1&sn=3947f289f75813c13a2f58fb00d2018e&chksm=9f2ef55ba8597c4de0a3e427f03af7b7b327a54cf440a36d38b62f520591f81463e6aca772fd&scene=21#wechat_redirect) +- [FISCO BCOS性能优化——工具篇](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485323&idx=1&sn=d63421fa2353d0e9a1506f01516f3416&chksm=9f2ef597a8597c8134f17053236863c501fb6e4f7480cca1a37926e7cfc309f8faacadf1786a&scene=21#wechat_redirect) +- [FISCO BCOS的速度与激情:](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485329&idx=1&sn=4bb6c31ff10ae1ae03cd0dbeaf023a4c&chksm=9f2ef58da8597c9bcda115382624012c240ce56a5f84450d9808281b8736bd2e9b8833eab5f2&scene=21#wechat_redirect)[性能优化方案最全解密](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485329&idx=1&sn=4bb6c31ff10ae1ae03cd0dbeaf023a4c&chksm=9f2ef58da8597c9bcda115382624012c240ce56a5f84450d9808281b8736bd2e9b8833eab5f2&scene=21#wechat_redirect) +- [让木桶没有短板,FISCO BCOS全面推进并行化改造](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485324&idx=1&sn=94cdd4e7944f1058ee01eadbb7b3ec98&chksm=9f2ef590a8597c86af366b6d3d69407d3be0d3d7e50455d2b229c1d69b1fdc6748999601cd05&scene=21#wechat_redirect) + +这些性能优化的过程中,感触最深的有两句话:『过早的优化是万恶之源』『没有任何证据支撑的优化是万恶之源』 + +优化要靠数据说话,而获取数据需要靠有效的分析工具,所以此次JavaSDK的性能优化,首要任务就是确定采用什么性能分析工具。 + +### 工具:发现java自带的分析工具挺管用 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5722.PNG) + + +采用HPROF跑了一次,得到下面这样的数据报告: + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5723.JPG) + + +数据显示,热点在很底层的库函数。这个结论并不符合预期,说明 SDK本身代码不是热点,性能优化比较难入手。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5724.JPG) + +幸运的是,很快好消息就来了:采用java自带的另一个工具jvisualvm,较好地可视化输出性能分析数据,同时也很直观地显示出JavaSDK本身存在热点。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5725.JPG) + + +### 分析:找到一个“伪热点” + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5726.JPG) + +通过jvisualvm工具分析出来,最大的热点是在生成随机数,这让我等有些吃惊。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5727.JPG) + +上面分析的是国密版本,对于非国密如何呢?跑了一遍,热点依旧可见在createTransaction,那就试试uuid吧。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5728.JPG) + +但是,打脸,来得是那叫一个快,UUID的实现也是基于SecureRandom。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5729.JPG) + +群聊出现好长时间的静默……那就研究一下SecureRandom吧,看看为什么它会这么慢,也了解Java随机数的一些相关背景知识。终于,下面这个知识点让我们重拾兴奋。([https://zhuanlan.zhihu.com/p/72697237](https://zhuanlan.zhihu.com/p/72697237)) + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5730.JPG) + + +我那句“采用ThreadLocalRandom替换SecureRandom计算Nonce”还未敲字出去,新一轮打脸已经开始了。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5731.PNG) + +这个方向的讨论为本次性能优化之旅豁开了另一扇思考之门~ + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5732.JPG) + + +讨论很有道理,再仔细看数据,从数据层面也印证了这个想法。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5733.JPG) + + +实验测试证明这是一个正确的方向,线程数降下来,这个热点就消失了。随机数那里出现热点是因为压测并发线程数开启太多,太多线程抢占资源导致随机数获取较慢。 + +### 再分析:找到令人震惊的热点 + +经过第一轮分析,算是找到一个“伪热点”,但性能提升依旧收效甚微。革命尚未成功,同志还需努力!降低线程数再跑一次性能分析,得到性能数据如下: + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5734.JPG) + +乍一看,热点分布又是很底层的基础库操作,焦虑又弥漫心头…伴着凌晨的静谧,群聊再一次陷入了无言的沉默……直到,我又抛出一个疑问。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5735.JPG) + +章鱼哥(王章)秒回,团队的激情苏醒了~为他这个回复速度,也为这个回复结果! + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5736.JPG) + +签名算法的实现,居然是先签名然后再做验签,而验签就是为了获得一个叫recoveryID的值(关于ECDSA的recovery原理,将在另一篇详细展开)。这里讲述一下我们为什么会兴奋。recoveryID设置的目的是为了给未来使用者可以从签名快速恢复出公钥,如果没有这个recoveryID,恢复公钥就需要遍历4种可能性,然而,这里的实现方式在生成签名的时候是通过遍历查找来计算出recoveryID。这种做法完全没有减小实际开销,只是采用“乾坤大挪移”把开销转移到签名环节了而已。实际上,recoveryID是有更快的计算方式可得到的,下一节可见。【这部分代码继承自web3j,之前没有深入考究其实现方式,当前web3j还仍然是这种实现】。出于老码农的本能,发现症状就想要第一时间先搞清楚问题影响边界在哪里,于是就有了这样的分析和尝试: + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5737.JPG) + +同样老司机的章鱼哥快速给出了可喜的结论: + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5738.JPG) + +到这里,心里有底了!至少把recoverFromSignature干掉是能够翻倍提升性能的,至于怎么干掉,额…再说呗。出于好奇,想再看看此时的性能数据会怎样(幸亏好奇了一下)。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5739.JPG) + +重新调整姿势(换成采用ThreadLocalRandom生成nonce,以及线程并发数降低为10的版本),再来一发,再次获得惊喜的数据。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5740.JPG) + + +这种情况下,性能分布也比较均匀了,没有明显的热点。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5741.JPG) + +凌晨一点,总算收获满意的成果,心情是棒棒的…一秒之后,脑回路蹦出来个问题“国密的会怎样呢?明天再说吧(国密的优化会在另一篇再详细讲)。 + +![](../../../../images/articles/javasdk_performance_improvement_8000-30000/IMG_5742.JPG) + + +### 填坑:recoveryID的计算方法 + +由于对Java密码学算法库(bc-java)不够熟悉,此处也遇到不少坑,最终通过继承密码算法库,将更多所需参数暴露返回给上层,总算实现了Java版本的recoveryID计算。 + +``` +// Now we have to work backwards to figure out the recId needed to recover the signature. + ECPoint ecPoint = sig.p; + BigInteger affineXCoordValue = ecPoint.normalize().getAffineXCoord().toBigInteger(); + BigInteger affineYCoordValue = ecPoint.normalize().getAffineYCoord().toBigInteger(); + + int recId = affineYCoordValue.and(BigInteger.ONE).intValue(); + recId |= (affineXCoordValue.compareTo(sig.r) != 0 ? 2 : 0); + if (sig.s.compareTo(halfCurveN) > 0) { + sig.s = Sign.CURVE.getN().subtract(sig.s); + recId = recId ^ 1; + } +``` + +关于ECDSA算法的recover机制和recoveryID生成原理,将在后续的推送中详细展开,敬请期待。 + +## 后话 + +每一次做性能优化,都是一次很爽的体验,少不了熬夜,但永不缺激情。对代码进行抽丝剥茧,经历反复多次的发现瓶颈、无情打脸、重拾信心过程,最后到达柳暗花明。 再次用那两句话结尾:过早的优化是万恶之源,没有任何数据支撑的优化是万恶之源。共勉! \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/44_sdk/multilingual_sdk.md b/3.x/zh_CN/docs/articles/4_tools/44_sdk/multilingual_sdk.md new file mode 100644 index 000000000..3253035dc --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/44_sdk/multilingual_sdk.md @@ -0,0 +1,226 @@ +# 麻雀虽小五脏俱全 | 从Python-SDK谈谈FISCO BCOS多语言SDK + +作者:张开翔|FISCO BCOS 首席架构师 + +FISCO BCOS 2.0从发布起就自带官方控制台,经过社区持续使用打磨,已经足够强大、完善、友好。 + +社区还有用各种开发语言开发的区块链应用,为满足开发者方便管理区块链节点的需求,目前Python-SDK和Nodejs-SDK已经上架,go语言版本已经在路上。 + +---- + +本文以笔者最熟悉的Python-SDK为例,分享一些SDK开发的点滴,涵盖应用开发流程、协议编解码、网络通信和安全事项等。 + +FISCO BCOS自带快速搭建特性,五分钟一键搭链后,开发者只需连上区块链节点,写合约、发交易。 + +控制台和SDK的定位,是帮助用户快速访问区块链,开发测试智能合约,实现业务逻辑。根据“**奥卡姆剃刀**”原则,设计哲学应尽量轻、模块化、浅层次,不引入多余的功能,不给用户和二次开发者造成额外负担。 + +客户端控制台和SDK就像一辆操控好、配置精的快车,供开发者和用户驾驭,轻松惬意,尽情驰骋于区块链应用之路。 + +## 控制台体验 + +首先结合从准备环境到调用合约的全流程,体验下控制台,命令行交互界面风格如下: + +![](../../../../images/articles/multilingual_sdk/IMG_4956.PNG) + +#### 1. 准备环境 + +在开始之前,请先**通读使用手册和开发文档(非常重要!链接在文末)**,根据文档介绍,step by step初始化环境,安装依赖库,目前Python-SDK支持linux/mac/windows操作系统。 + +为了连上区块链节点,需要修改本地配置文件,填写区块链节点的对应网络端口,如果选择Channel协议,则需要配置相应的客户端证书。 + +#### 2. 在线体验 + +配置好网络后,可以运行console的get系列命令。试下手感,与FISCO BCOS亲密接触。确认链在正常工作,常用的指令有getNodeVersion、getBlockNumber、getPeers、getSyncStatus等,可以用console的usage或help命令了解所有支持的指令。 + +#### 3. 创建账户 + +创建一个新的帐户,即代表自己身份的公私钥对,发送交易时会采用私钥签名。创建的帐户用keystore格式保存在本地文件系统里,用户可以设定密码保护这个文件,注意记住创建帐户时使用的密码。 + +控制台提供的帐户相关命令是**newaccount, showaccount**(参数为账户名和密码)。如果要使用刚创建的新帐户为交易签名,记得把它配置到client_config.py文件的相应位置。 + +另外,如果账户信息需要高等级保护,则可以进行二次开发。将其放入加密机、TEE等安全区,以及开发秘钥分片、助记词等方案。 + +#### 4.编写合约 + +编写一个智能合约,或者参照SDK里自带的智能合约例子修改定制,实现自己的业务逻辑。本文重点关注solidity智能合约,FISCO BCOS还有一种“预编译合约”,采用C++开发,需要和FISCO BCOS底层代码联合编译。 + +#### 5. 编译部署 + +对合约进行编译,获得合约的ABI接口文件和BIN二进制代码文件。Python-SDK里有bcos_solc.py文件可帮助开发者简化编译器配置和调用,同时,只要正确配置了合约路径和编译器路径信息,直接运行控制台的部署或调用合约接口指令,也会尝试自动去编译合约,操作体验相当行云流水。 + +独立部署合约的话,可使用控制台的deploy指令,部署指令成功后会得到新的合约地址。参考命令是./console.py deploy SimpleInfo save,其中SimpleInfo是合约名(不需要带后缀),最后的"**save**"为可选,如果指定了"**save**",则将合约新地址记录到本地文件里,以便后续使用。 + +#### 6. 调用合约: + +用call或sendtx命令,指定合约名、合约地址、方法名、对应的参数,调用链上合约。 + +参考命令./console.py sendtx SimpleInfo last setbalance 100,即选择SimpleInfo合约,指向其最近部署成功的地址(用"**last**"指代,可以省掉复制粘贴合约地址的繁琐操作),调用setbalance接口,传入参数100。 + +交易在链上共识完成后,控制台会自动打印交易回执里的方法返回码、交易Event log信息列表等,供用户查看,如果错误,则打印异常信息。 + +如果一切正常,到此即可基本走通区块链应用之路。 + +值得一提的是,FISCO BCOS几个语言版本的控制台,都支持按Tab键提示指令和自动完成,帮助使用者流畅无错地操作,提升用户体验。 + +再进一步,如果希望有丰富多彩的、可视化交互式页面体验,不妨使用WeBASE中间件平台。 + +## 深入了解(Dive Deeper) + +整个SDK的模块组合如下,可谓是麻雀虽小五脏俱全。 + +![](../../../../images/articles/multilingual_sdk/IMG_4957.PNG) + +### 功能接口 + +支撑控制台等交互模块的,是已经封装完备、开箱即用的功能接口API,包括: + +#### 1. get系列 + +诸多的“get”开头的接口,用于获取链上的各种信息,包括区块、交易、回执、状态、系统信息等等。虽然几十个get接口,但其实现逻辑基本一致,都是指定命令字和参数列表,请求和处理回应,实现起来也很快。 + +#### 2. call + +对应合约的常量方法。所谓常量方法,是指合约里对应代码不修改状态,该请求不会全网广播,仅在指定节点上运行。 + +#### 3. sendRawTransaction + +构建一个交易,用账户私钥签名,发送到链上,这种交易会被广播,进行共识处理,生成的状态数据会被全网确认。部署新合约这个操作,实际上也是一种交易,只是不需要指定目标合约地址。 + +相关的是**sendRawTransactionGetReceipt**,名字很长,在**sendRawTransaction**基础上增加了获取回执的流程**,**用于简化从发交易到获取回执的闭环流程。 + +#### 4.更多 + +针对FISCO BCOS的全局系统配置、节点管理、CNS、权限等系统级功能的API,其原理是读写链上的系统合约,详细指令列表见文末。 +开发者可以参考控制台和client/bcosclient.py等代码,进行二次开发,实现更多更酷炫的功能。另外,SDK里内置了一系列的开发库和小工具,帮助管理帐户、输出日志、统一异常处理、简单的性能和耗时统计等。 + +## 合约开发相关 + +围绕着合约开发,Python-SDK实现了合约编译部署、合约地址本地化管理、ABI接口文件的管理,支持代码自动生成(参考codegen.py),一个命令行即可生成供业务端直接使用的代码,如 + +python codegen.py contracts/SimpleInfo.abi。 + +solidity合约编译后的ABI文件是个好东西。ABI 全称是 **Application Binary Interface**(应用程序二进制接口),里面详细描述了合约的接口信息,包括方法名、参数列表和类型、方法类型(常量方法,还是交易方法),以及Event log格式定义等等。 + +对ABI的管理,参见client/datatype_parser.py,加载和解析ABI文件(默认为JSON格式),根据方法名、方法4字节签名、方法类型等维度,灵活查询方法列表和方法定义,并针对方法定义、输入数据等进行编码解码,解析交易返回值、Event logs等。 + +有ABI定义在手,对合约的操控简直是可以随心所欲,开发者读懂了ABI描述,基本就能全面理解一个合约的输入输出,和合约毫无障碍地对话,这种“**面向远程接口编程**”的思想,很类似WSDL、IDL、ACE、ProtoBuffer和gRPC等经典软件设计。 + +事实上,整个SDK中最繁琐的是ABI编解码部分,为了兼容EVM,FISCO BCOS在交易处理时沿用了ABI编码,以及兼容RLP协议。 + +ABI、RLP制定了严格的规范,对基础数据类型、数组和变长数据、函数方法、参数列表等都有特定的编解码方式,否则组件之间无法通信,数据无法解析,虚拟机“不认识”所输入的交易,则不能执行合约。 + +如果自行手写这里的编解码,即使是熟手也得花不少时间,还要能保证测试通过、保持版本兼容,所幸github上已经有eth-abi、eth-utils、rlp等一系列开源项目(多为MIT宽松许可协议),可以引入这些项目且根据具体的需要进行修订(保留原作者声明和版权开源许可),能节约不少工作量,向这些项目作者们致谢,开源就是爽! + +## 交易数据结构相关 + +在搞定了基础编解码之外,还需要实现 FISCO BCOS交易结构,重点注意支持并行处理交易增加的randomid、blocklimit字段,为支持群组特性增加的fiscoChainId和groupId字段,在交易的receipt里增加的交易output等。 + +其中,交易的blocklimit定义为“交易生命周期,该交易最晚被处理的块高”,SDK需要定期到链上查询当前块高,以确定当前交易的生命周期(比如,此交易允许在后续一百个区块内被处理)。 + +对于开发者来说,清晰理解交易的输入(tx.input)、交易回执(tx.receipt)、交易输出(tx.output)是非常重要的。 + +![](../../../../images/articles/multilingual_sdk/IMG_4958.JPG) + +交易调用合约里的某一个方法时,首先将方法名字和参数类型列表组合,如**'set(string,uint256,address)'**,对这一段文本进行Keccak-256 (SHA-3)计算,并截取前4个字节做为“方法签名”(signature),然后对传入的参数,根据类型定义依次进行ABI编码,并和"方法签名"拼接一串二进制数据,做为交易的输入数据。 + +和交易结构体的其他字段(from、to、groupid、randomid等)一起再进行RLP编码,并用帐户私钥进行签名,得到一段二进制请求数据,由sendRawTransaction发往节点,节点收到后,立刻返回交易Hash给到客户端。 + +交易在链上被网络共识确认,处理完成后,通过getTransactionReceipt接口(传入之前获得的交易Hash),可以获得交易处理的详细结果。 + +![](../../../../images/articles/multilingual_sdk/IMG_4959.JPG) + +在交易回执中,以下几个字段尤为关键: + +#### 1. contractAddress + +仅在部署合约交易时有效,表示新合约的地址。 + +#### 2. output + +对应方法的return值,可用于判断业务逻辑的最终处理结果(取决于合约的写法)。 + +#### 3. Logs + +如果在合约代码里,写了一些Event log, 则receipt的logs字段里可以解码出详细的信息。Event log可用于帮助客户端监听、跟踪交易的处理结果,甚至可以帮助开发者调试合约执行过程,相当于在合约里打调试日志。当然,在合约正式发布时,应清除调试的Event log,只保留必要的log,避免冗余信息存到链上。 + +Python-SDK客户端里内置了解析“方法签名”(根据4字节的signature,找到对应的方法定义)、交易input/output、receipt.logs等字段的方法。 + +在使用控制台命令行时,只要是查询交易和回执的指令,在命令行后面附带合约名(前提是使用者知道这个交易调用的是什么合约),也可以自动解析出相关的数据来,例如:./console.py getTransactionReceipt 0x79b98dbb56d2eea289f756e212d5b6e5c08960beaa8ea8331740fdcfaa8dcab1 SimpleInfo,最后这个“SimpleInfo”为可选合约名,不需要带后缀,要求在contracts/目录下有SimpleInfo.sol文件。 + +这个贴心小设计,可以帮助开发者直观探秘区块链交易的脉络,对各种信息一目了然,不会迷失在天书一样的十六进制字符海洋里。 + +## 网络协议 + +最后聊聊FISCO BCOS的两种网络协议:JSON RPC和Channel长连接。 + +![](../../../../images/articles/multilingual_sdk/IMG_4960.PNG) + +JSON RPC连接没有证书验证和通信加密,建议在本身安全可信的环境里使用,比如本机或内网,一般用于运维管理和统计分析场合。 + +JSON RPC的格式相当简单通用,各种语言库都内置了JSON编解码以及HTTP请求协议实现,一般不需要自行开发,甚至可以采用curl、telnet等工具进行收发,如: + +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getBlockNumber","params":[1],"id":1}' http://127.0.0.1:8545 |jq +// Result +{ "id": 1, "jsonrpc": "2.0", "result": "0x1" } +``` + +Channel协议是FISCO BCOS独有的协议,Channel协议的特点是安全高效,支持双向实时通信,可用于远程调用乃至公网的通信。 + +如果使用Channel长连接方式,则需要从区块链节点上获取SDK证书,放置到SDK项目的对应路径下,证书详见文末。 + +这个协议的数据包格式示意图如下,是一种TLV(Tag/Length/Value)风格的扩展实现: + +![](../../../../images/articles/multilingual_sdk/IMG_4961.JPG) + +**格式说明:** + +1. 所有整形数编码都是网络序,大端(Big endian); +2. Length实际上包含了从第一个字段到最后一个字段(data)的整个数据包的长度; +3. 包头(Length+Type+Seq+Result)为定长,为(4+2+32+4) = 42字节; +4. 数据体的实际长度根据具体内容而变,字节数为Length-42字节。 + +**Channel长连接通信和数据收发的要点如下:** + +- 1. 采用TLSv1.2安全传输,SDK和节点之间需要加载证书,用证书握手、验证后才能建立长连接。 + +- 2. 长连接用心跳包维护,需要定期发起心跳包。 + +- 3. 数据按包为单位,编码成流数据传输,那么在收发数据时,需要持续从socket流里获取数据,按照数据包的格式,判断长度是否合法,数据是否收全,是否能正确的解析,对“部分收取”的数据,要保留在接受缓冲区里,待收取完成后再进行解析,不能丢弃,否则可能导致解析错误。 + +![](../../../../images/articles/multilingual_sdk/IMG_4962.JPG) + +- 4. Channel协议支持双向通信,SDK可以主动请求节点,节点也可能往SDK推送消息,如区块链系统通知、数据更新通知、AMOP跨机构消息等。 + +- 5. 设计异步的、队列化、回调式消息处理机制,根据消息的序列号、指令类型、状态码等维度,正确处理消息。Python-SDK用了多线程以及Promise库,以尽量高速优雅地处理各种消息。 + +对socke流数据编程有一定经验的开发者,理解这个协议和实现它并不会很难。对Channel协议实现,数据包解析参见client/channelpack.py,通信和数据收发参见client/channelhandler.py。 + +## 总结 + +Python-SDK的开发始于今年6月中旬,写出第一个可用版本只花了一个星期,然后雕琢用户交互细节,以及进行代码优化、文档完善,并进行多轮测试保证质量,团队其他同学实现Nodejs版本SDK的用时也差不多。 +总的来说,在有一些基础代码参考的前提下,开发一个FISCO BCOS 特定语言版本SDK,还是挺敏捷写意的事情,一点儿也不难,Just for fun。 +在各语言版本SDK开发和迭代过程中,FISCO BCOS团队和社区开发者一直保持沟通交流,纳入优质pull request,在体验中持续优化。 + +欢迎社区开发者根据自身使用场景的实际情况,继续完善现有SDK,或贡献更多语言类型的FISCO BCOS SDK,帮助更多开发者顺畅地走在区块链之路上。 +最后,感谢杰哥、安总、小白、wheat等同学,以及多位社区开发者对Python-SDK的重要贡献。 + +------ + +#### 参考资料 + +- [FISCO BCOS官方控制台](https://github.com/FISCO-BCOS/console/tree/master-2.0) +- [Python-SDK](https://github.com/FISCO-BCOS/python-sdk) +- [Nodejs-SDK](https://github.com/FISCO-BCOS/nodejs-sdk) +- [FISCO BCOS安装](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html#fisco-bcos) +- [合约开发教程](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html) +- [WeBASE](https://fintech.webank.com/webase) +- [ABI](https://solidity.readthedocs.io/en/latest/abi-spec.html) +- [RLP](https://github.com/ethereum/wiki/wiki/RLP) +- [交易数据结构](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/protocol_description.html) +- [RPC原理](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/rpc.html) +- [Channel协议定义](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/protocol_description.html#channelmessage-v1) +- [SDK证书](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/certificates.html) +- [AMOP跨机构](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/amop_protocol.html) + diff --git a/3.x/zh_CN/docs/articles/4_tools/44_sdk/node.js_sdk_quick_start.md b/3.x/zh_CN/docs/articles/4_tools/44_sdk/node.js_sdk_quick_start.md new file mode 100644 index 000000000..0d3c0b18d --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/44_sdk/node.js_sdk_quick_start.md @@ -0,0 +1,113 @@ +# 一文快速入门FISCO BCOS Node.js SDK + +作者:李陈希|FISCO BCOS 核心开发者 + +SDK一般是指为了方便开发者为系统开发应用而提供的API、开发辅助工具以及文档的集合。面对不同的开发者群体,FISCO BCOS已经相继推出了面向企业级应用开发者的Java SDK(功能丰富、稳定),以及面向个人开发者的Python SDK(上手迅速、轻便)。在实际推广过程中,我们发现有部分开发者习惯使用JavaScript构建应用前端,倘若此时能有一个支持使用JavaScript进行后端开发的SDK,那么前后端的语言壁垒能够进一步被打破——开发者只需了解JavaScript,便能完成整个FISCO BCOS应用程序的前后端开发。在此背景下,FISCO BCOS Node.js SDK诞生了。本文将会介绍Node.js SDK的设计及使用。 + +## 一、SDK的设计 + +Node.js SDK遵循分层设计原则,层与层之间界限清晰、功能明确,下图为Node.js SDK的架构示意图: + +![](../../../../images/articles/node.js_sdk_quick_start/IMG_5709.JPG) + +图中自底向上依次为: + +- **基础层**:提供网络通信、交易构造及签名、合约编译等基础功能; +- **API层**:基于基础层提供的功能,对FISCO BCOS常用功能进行了进一步地封装,暴露出API用于给上层的应用层调用。这些API覆盖基本的JSON RPC功能(查询链状态、部署合约等)及预编译合约功能(权限管理、CNS服务等); +- **应用层**:使用Node.js SDK进行二次开发的应用程序均属于此层,如Node.js SDK自带的CLI(Command-Line Interface,命令行界面)链管理工具。 + +## 二、SDK的安装 + +### 2.1 环境准备 + +Node.js SDK依赖下列软件: + +- 8.10.0或以上的版本的Node.js,5.6.0或以上的版本的NPM; +- Python2、g++及make。Solidity编译器solc需要编译后才能使用,编译所需基础软件需要用户提供,其中Python2用于运行构建工具node-gyp,g++和make则是用于编译solc。对于没有g++和make的Windows用户,可以安装 windows-build-tools再进行构建。 + +### 2.2 安装SDK + +- 从https://github.com/FISCO-BCOS/nodejs-sdk下载sdk; + +- 进入nodejs-sdk目录; + +- 执行npm i。Node.js SDK使用lerna管理依赖项,此步用于安装lerna; + +- 执行npm repoclean。初次安装时无需执行该命令,但如果出现了安装到一半被打断等情况,建议先执行该命令以清除所有依赖项; + +- 执行npm run bootstrap,此命令会安装SDK的所有依赖项。 + +上述所有命令执行完后,API层的目录结构如下图所示: + +![](../../../../images/articles/node.js_sdk_quick_start/IMG_5710.PNG) + + +对于应用开发者,可以重点关注 nodejs-sdk/packages/api/web3j 及 nodejs-sdk/packages/api/precompiled目录,SDK提供的所有API均位于这两个目录下的模块中,应用开发过程中通过require语句导入相应模块即可。 + +## 三、使用SDK进行开发 + +### 3.1 初始化 + +使用Node.js SDK的所有功能前,必须对SDK进行配置,配置以.json格式配置文件的形式提供。主要包括以下配置项: + +- **privateKey**:FISCO BCOS基于公私钥体系,每个账户(公钥)均有一个对应的私钥,SDK需要使用该私钥对交易进行签名; +- **nodes**:SDK连接的节点,可以有多个,当节点数大于1时,SDK的每次请求都会随机从nodes调出一个节点发送; +- **authentication**:SDK使用Channel协议与节点进行通信,Channel使用SSL安全传输协议传输数据,在双方建立通信前,需要进行必要的身份验证。因此这个配置项中需要指明SDK私钥文件、证书文件、CA根证书文件的路径,这些文件通常是在生成链的阶段自动生成; +- **groupID**:FISCO BCOS使用多群组架构,同一个节点可以隶属于多个群组,因此需要指明SDK需要连接的链的群组ID; +- **timeout**:受限于网络环境,SDK的请求有可能超时,因此可能会导致调用SDK接口的程序陷入无尽等待,因此需要指定一个超时时间,SDK在请求超时后强制返回并向调用者返回错误。 + +开发者需要在初始化阶段将配置文件载入Configuration对象中,Configuration对象是全局唯一的且被所有模块共享。 + +### 3.2 调用示例 + +以一个简单的获取当前块高的程序为例,调用步骤如下: + +1、初始化Configuration对象,将配置文件路径传入Configuration对象的setConfig函数: + +``` +const Configuration = require('./nodejs-sdk/packages/api/common/configuration').Configuration; +Configuration.setConfig(path.join(__dirname, args.config)); +``` + +2、获取当前块高的API位于Web3jService中,构造一个该对象: + +``` +const Web3jService = require('./nodejs-sdk/packages/api').Web3jService; +let web3jService = new Web3jService(); +``` + +3、调用Web3jService的getBlockNumber接口,获取返回值并在控制台中输出: + +``` +web3jService.getBlockNumber().then(blockNumber => { + console.log(blockNumber) + }); +``` + +需要注意的是,上述代码中使用了Promise.protoype.then方法。Promise正如其名字所示,封装了一个异步的操作,并且“承诺”在这个操作结束后,一定会调用用户在then或者catch中指定的回调函数。 + +由于Node.js天然支持异步的特性,Promise的概念在Node.js SDK处处存在(细心的读者可能已经注意到,Node.js SDK基础层中负责Channel通信的模块叫做channelPromise)。Node.js SDK的API调用约定是:所有的API调用时均返回Promise对象,开发者需要使用await或then...catch...方法才获取到调用结果。因此开发者在调用API时需要小心,如果直接使用了API的返回值,会很容易导致bug。 + +## 四、使用CLI工具 + +Node.js SDK除了提供API外,还提供了一个小巧的CLI工具供用户直接在命令行中对链进行操作,同时CLI工具也是一个展示如何使用Node.js SDK进行二次开发的示例。CLI工具位于packages/cli目录下,若需要使用则需要进入该目录并执行./cli.js脚本,使用之前同样需要进行配置,配置文件位于packages/cli/conf/config.json文件中。以下给出了几个使用示例: + +1、查看所连节点的版本: + +![](../../../../images/articles/node.js_sdk_quick_start/IMG_5711.PNG) + +2、获取当前块高: + +![](../../../../images/articles/node.js_sdk_quick_start/IMG_5712.PNG) + +3、部署合约,部署之前合约需要放置于packages/cli/contracts目录中。 + +![](../../../../images/articles/node.js_sdk_quick_start/IMG_5713.PNG) + +4、调用HelloWorld合约的get方法: + +![](../../../../images/articles/node.js_sdk_quick_start/IMG_5714.PNG) + +## 五、Node.js SDK的未来需要你 + +当前,Node.js SDK还在成长,在某些地方仍然需要进一步打磨,比如需要CLI工具能够解析SQL语句,或者SDK的性能需要优化……秉承开源的精神,我们相信社区的能量能够将Node.js SDK 变得更加方便易用,欢迎广大开发者踊跃在issue或PR中贡献自己的idea和力量! \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/44_sdk/python-sdk_origin_function_and_realization.md b/3.x/zh_CN/docs/articles/4_tools/44_sdk/python-sdk_origin_function_and_realization.md new file mode 100644 index 000000000..89fd7178d --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/44_sdk/python-sdk_origin_function_and_realization.md @@ -0,0 +1,162 @@ +# Python SDK的前世今生 + +作者:陈宇杰|FISCO BCOS 核心开发者 + +今年6月,在已有Java SDK的基础上,FISCO BCOS相继推出了Python SDK和Go SDK,不少开发者表示,这两个组件极大降低了开发区块链应用的难度,让更多开发者可以参与到FISCO BCOS的开源共建中。今天,本文就来科普一下Python SDK的前世今生,看看这个简单易上手又发挥着极大作用的组件是如何实现功能的。 + +## Why: 为什么要做Python SDK + +众所周知,Python语言简单明了,几乎接近自然语言,可以快速上手;Java语言虽然功能强大,但语法、组件相对复杂,一般会在企业级应用中使用。为了融合两者优势,FISCO BCOS首席架构师张开翔经过两周集中开发,成就了Python SDK的第一个版本。这个版本在今年7月份社区的黑客松比赛中发挥了极大作用,帮助参赛者更好聚焦在开发项目本身。在高强度的黑客松比赛中,参赛者只有36小时去完成区块链相关项目。在和选手交流中,我们发现大多数极客开发者均是从比特币、以太坊等公链开始入门,对Java语言不是很熟悉,反而精通Python、Go、Node.JS。当时团队主推Java SDK、控制台和WeBASE等基于Java的区块链开发工具,可是短短36小时,要求不熟悉Java的极客开发者基于这些工具完成开发,确实有些强人所难。在这种情况下,已经初见雏形Python SDK就成了开发者的救命良药。最终,很多参赛项目就是基于Python SDK完成的。 + +## What: Python SDK实现了哪些功能 + +Python SDK经过不同版本的演进优化,逐步实现丰富的功能。 + +### 基础版本Python SDK + +第一版的Python SDK主要基于Windows平台开发,实现了访问FISCO BCOS链RPC服务的接口,通过Python SDK接口,用户可以获取区块链的基本信息(如区块高度、区块、交易、交易回执等),还可以部署和调用合约。但该版本的SDK不支持Channel协议,因此无法保证SDK与节点间通信安全;且Python SDK无法接收FISCO BCOS区块链节点推送的回执、区块高度信息,因此发送交易后,必须轮询节点获取最新信息。 + +### 支持Channel协议的Python SDK + +为了提升SDK与节点通信的安全性,Python SDK在基础版本上,实现了Channel协议。支持Channel协议后的SDK在发送交易后,不需轮询节点获取交易执行结果,直接从节点接收执行结果的推送即可,这样SDK发送交易后,不会阻塞在状态轮询,实现了异步发送交易的功能。 + +### 支持Precompile合约调用 + +为了突破区块链虚拟机性能瓶颈,大幅度提升交易处理吞吐量,FISCO BCOS实现了预编译合约框架,现有的预编译合约包括命名服务合约、共识合约、系统配置合约、权限控制合约、CRUD等,为方便用户使用这些预编译合约,Python SDK提供了访问Precompile合约的接口。 + +### Python SDK控制台 + +以上功能ready后,Python SDK已经可以实现与FISCO BCOS链的所有交互,但用户仍无法通过Python SDK直观感受FISCO BCOS链,于是在实现以上所有接口的基础上,Python SDK集成了控制台console,console通过命令去调用以上接口,用户可通过命令行获取区块链节点信息、部署和调用合约。 + +### Python SDK多平台支持 + +众所周知,Python是跨平台语言,支持Windows、MacOS、 CentOS、Ubuntu等各种开发平台。而Python SDK是基于Windows系统开发的基础版本,因此部署在MacOS、CentOS系统还有一些问题,比如说:各平台依赖包要求不一致、符合Python SDK版本的Python安装方式有差异、合约编译器安装方式不相同等。 + +以上这些问题,会使部分开发者的精力在安装基本环境上消耗殆尽,为了解决这个问题,Python SDK提供了部署脚本`init_env.sh`,用户可使用该脚本,一键初始化Python SDK环境。 + +脚本`init_env.sh`的主要功能包括: + +- 若运行Python SDK的系统Python版本小于3.6.0,安装3.7.3版本的Python虚拟环境python-sdk; +- 安装v0.4.25版本的solidity编译器。 + +## How: Python SDK如何实现 + +上节介绍了Python SDK的主要功能,这节就来说说Python SDK的实现。 + +罗马不是一日建成的,Python SDK在开发过程中参考了[以太坊客户端](https://github.com/ethereum/web3.py)部分模块,包括: + +- ABI编解码模块 +- RLP编解码模块 +- 账户和密钥生成模块 + +### 实现Channel协议 + +Python SDK在以上模块的基础上,实现了支持FISCO BCOS Channel协议的RPC接口和发送交易接口。Channel消息包类型定义实现于模块`client.channelpack.ChannelPack`,主要消息包类型包括: + +- 0x12: RPC类型消息 +- 0x13: 节点心跳消息包 +- 0x30: AMOP请求包 +- 0x31: 失败的AMOP消息的包体 +- 0x32: SDK topics +- 0x35: AMOP消息包包体 +- 0x1000: 交易上链通知(包含交易回执) +- 0x1001: 区块高度推送包 + +Channel协议的实现位于`client.channel.handler.ChannelHandler`模块,为了支持异步发送交易,Python SDK引入了`pymitter`和`Promise`组件,用于管理异步事件,该模块发送交易并获取交易回执的主要工作流程如下: + +- 1. Python SDK调用`sendRawTransactionAndGetReceipt`接口,对交易进行编码和签名,并将编码好的数据作为`ChannelHandler`模块发送socket请求包的参数; +- 2. ChannelHandler接收到1的数据后,将数据包的uuid注册到异步事件队列后,将消息包放入发送缓冲区发送并发送; +- 3. 节点处理完交易后,向SDK发送类型为0x1001的交易上链通知; +- 4. SDK端ChannelHandler收到消息类型为0x1001的回包后,取出消息包的uuid,并触发该uuid对应的异步事件,将交易执行结果返回给上层应用。 + +### 实现控制台 + +Python SDK控制台实现位于`console`模块,主要调用了一下模块接口实现与区块链的交互: + +- `client.bcosclient`:Python SDK基本接口类,提供了访问FISCO BCOS RPC服务的接口、部署和调用合约的接口; +- `console_utils.precompile`:提供了访问Precompile预编译合约的功能; +- `console_utils.rpc_console`: 封装了`client.bcosclient`,实现命令行调用RPC服务功能。 + +## Python SDK使用展示 + +了解了Python SDK的由来、功能和实现,下面从控制台角度直观感受下Python SDK: + +### 获取节点版本 + +命令行终端输入`./console.py getNodeVersion`可获取节点版本: + +![](../../../../images/articles/python-sdk_origin_function_and_realization/IMG_5715.PNG) + + +### 部署HelloWorld合约 + +Python SDK内置HelloWorld合约,命令行终端输入`./console.py deploy HelloWorld`可部署`HelloWorld`合约,若用户需要部署自编写合约,则需将该合约放置于`contracts`子目录,并使用命令`./console.py deploy 【合约名】`来部署合约。下图是HelloWorld合约部署输出,从中可看出,合约地址为: `0xbbe16a7054c0f1d3b71f4efdb51b9e40974ad651` + +![](../../../../images/articles/python-sdk_origin_function_and_realization/IMG_5716.JPG) + + +### 调用HelloWorld合约 + +Python SDK控制台通过`sendtx`子命令发送交易,使用call子命令调用合约常量接口。HelloWorld合约代码如下,主要包括`set`和get两个接口,前者用于设置合约局部变量`name`,后者是常量接口,获取局部变量name的当前值。 + +``` +pragma solidity^0.4.24; +contract HelloWorld{ + string name; + constructor() public{ + name ="Hello, World!"; + } +# get interface + function get() constant public returns(string){ + return name; + } +# set interface + function set(string n) public{ + name = n; + } +} +``` + +### 调用HelloWorld set接口 + +由于`set`接口改变了合约状态,因此使用`sendtx`子命令调用,`sendtx`用法如下: + +``` +./console.py sendtx [contract_name][contract_address] [function][args] +``` + +参数包括: + +- contract_name:合约名 +- contract_address:合约地址 +- function:函数接口 +- args:参数列表 + +使用`./console.py sendtx HelloWorld 0xbbe16a7054c0f1d3b71f4efdb51b9e40974ad651 set "Hello,Fisco"`命令可将`HelloWorld`合约的`name`成员变量设置为"Hello, Fisco",输入如下: + +![](../../../../images/articles/python-sdk_origin_function_and_realization/IMG_5717.PNG) + +### 调用HelloWorld get接口 + +`HelloWorld`的get是常量接口,因此使用`call`子命令调用,call用法如下: + +``` +./console.py call [contract_name] [contract_address] [function] [args] +``` + +参数包括: + +- contract_name:合约名 +- contract_address:调用的合约地址 +- function:调用的合约接口 +- args:调用参数 + +使用./console.py call HelloWorld 0xbbe16a7054c0f1d3b71f4efdb51b9e40974ad651 get获取HelloWorld合约name成员变量的最新值: + +![](../../../../images/articles/python-sdk_origin_function_and_realization/IMG_5718.PNG) + + +## 小结 + +本文介绍了Python SDK的前世今生,包括Python SDK的由来、功能和实现,可参考[Python SDK详细使用方法](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/python_sdk/index.html)。当然,目前Python SDK还处于不断完善过程,欢迎社区爱好者关注[相关issue](https://github.com/FISCO-BCOS/python-sdk/issues),为Python SDK的优化贡献宝贵PR。 + diff --git a/3.x/zh_CN/docs/articles/4_tools/44_sdk/python_blockchain_box.md b/3.x/zh_CN/docs/articles/4_tools/44_sdk/python_blockchain_box.md new file mode 100644 index 000000000..1b76293d0 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/44_sdk/python_blockchain_box.md @@ -0,0 +1,195 @@ +# FISCO BCOS即拆即用的“Python区块链盒子” + +作者:汤会枫|FISCO BCOS开源社区贡献者 + +作者为Python开发者,将FISCO BCOS Python SDK封装成镜像,以提升配置环境的速度,提高易用性。 + +## 前言 + +作为一个 Python 开发者,我一直想通过 Python 去了解区块链。机缘巧合下,在 2019 年一次开源年会上,我接触并加入了 FISCO BCOS 开源社区,此后,一直用课余时间琢磨 FISCO BCOS 的 Python-SDK。 + +在配置环境的时候,我耗费了一些时间,因此也萌生了将整个框架封装成一个 docker 镜像的想法,我为它取名“Python 区块链盒子”,就像 Minecraft 的“工作台”一样, 可以提升配置环境的速度,提高易用性。有了这样的想法,我便开始利用课余的时间着手去编写 Dockerfile。 + +![](../../../../images/articles/python_blockchain_box/IMG_5746.PNG) + + +我把搭建好的 docker 镜像分享给周围的同学体验,“即拆即用”的特性反响很好,大家不会因为环境配置难而退怯,能像Minecraft里的Steve一样,放下“工作台”就可以制造出一堆有用的工具出来。 + +## 什么是“Python 区块链盒子”? + +在回答这个问题之前,先来了解一下 Python-SDK。这是由 FISCO BCOS 开源,帮助开发者运用 Python 语言开发区块链应用的组件。既然是通过 Python 语言开发,我相信它将有持续不断的生命力。 + +![](../../../../images/articles/python_blockchain_box/IMG_5747.PNG) + + +Python 的阅读难度相对比较低,特别方便学生、初学者通过 Python-SDK 去了解、学习区块链。可尝试按以下环境要求安装搭建。 + +- Python 环境:python 3.6.3, 3.7.x +- FISCO BCOS 节点:请参考 [FISCO BCOS 安装搭建](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html) + +关于 Python-SDK,可点击参考 FISCO BCOS 团队推出的开发教程。 + +- [《麻雀虽小五脏俱全 | 从 Python-SDK 谈谈 FISCO BCOS 多语言 SDK》](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485291&idx=1&sn=c359380a89621d1a64856183568825ee&chksm=9f2ef577a8597c61e5dd5e458d489926138a42808a06517f4d6515d4666dc11a08646ccebea2&scene=21#wechat_redirect) +- [《Python-SDK 的前世今生》](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485256&idx=1&sn=f1e70be6c53ea7e690392ce1ac8b5f5e&chksm=9f2ef554a8597c4278c630f60923a683b9e47499319e31aab41ccfd98715a9db2300e7d782e3&scene=21#wechat_redirect) + +“Python 区块链盒子”相当于将配置好的 Python-SDK 和部署好的区块链打包成一个包裹,类似于将一个大房子整理成一辆房车。通过这种方式,用户无需关注环境配置问题,可减少部署时间——不用一分钟就能获得镜像,方便开发者快速上手使用,便于自动化运维。你也可以尝试将这个服务和 JenKins 结合,进一步优化运维过程。“Python 区块链盒子”可以当成 Python 区块链开发的工作台,一个现拆现用的工具箱,而且可以保证开发环境的整洁,最重要的是它很轻,就像 Minecraft 里的工作台。 + +只要你有一台计算机,就可以随时随地打开这个工具箱。安装工具箱的过程也变成了享受:只需一行代码就能上手直接研究开发,不必过多关注环境配置的繁杂,能节省大量时间,解放双手。 + +## 获得并运行“Python 区块链盒子” + +可以通过以下部署来获得这个“盒子”。 + +``` +docker run -it -p 20200:20200 --name python_sdk fiscoorg/playground:python_sdk +``` + +进入容器后,首先需要启动节点,启动节点后就可以“食用”了。在这个过程中,请注意不要使用 sh。 + +``` +bash /root/fisco/nodes/127.0.0.1/start_all.sh +``` + +随后,在/python_sdk 中进行调试,调试过程中的小贴士:console.py 添加了 tab 自动补全。 + +``` + +# 查看 SDK 使用方法 +./console.py usage + +# 获取节点版本 +./console.py getNodeVersion +``` + +``` +bash-5.0# ./console.py getNodeVersion + +INFO >> user input : ['getNodeVersion'] +INFO >> getNodeVersion >> { "Build Time": "20190923 13:22:09", "Build Type": "Linux/clang/Release", "Chain Id": "1", "FISCO-BCOS Version": "2.1.0", "Git Branch": "HEAD", "Git Commit Hash": "cb68124d4fbf3df563a57dfff5f0c6eedc1419cc", "Supported Version": "2.1.0" } +``` + +完成这些之后就成功了,前前后后,相当于在几秒内就搭建了一个开源的区块链框架。你可以把自己的合约放到/python-sdk/contracts 中,更多可以参考 [Python-SDK 的使用方法](https://github.com/FISCO-BCOS/python-sdk)。这个即拆即用的“区块链盒子”对于要使用 Python 来开发区块链应用或者学习区块链的开发者很有帮助。开发者可以通过调用/python-sdk/client 中的函数使用 ./console.py 命令行并与盒子中正在运行的区块链进行交互。 + +下面将会以 Python-Flask 开发作为例子,实现调用 HelloWorld 合约的功能。 + +- step1 进入容器 + +``` +docker run -it -p 20200:20200 -p 80:80 --name flask_web fiscoorg/playground:python_sdk +``` + +- step2 启动节点 + +``` +bash /root/fisco/nodes/127.0.0.1/start_all.sh +``` + +- step3 部署 HelloWorld 合约 + +/python-sdk/contract 下存放了 HelloWorld.sol,可以直接使用这个合约进行测试。首先,查看 HelloWorld.sol 合约的内容。 + +``` +pragma solidity ^0.4.24; + +contract HelloWorld{ + string name; + + constructor() public{ + name = "Hello, World!"; + } + + function get() constant public returns(string){ + return name; + } + + function set(string n) public{ + name = n; + } +} +``` + +可以通过 get 接口返回字符串 name 的值,通过 set 更新 name 的值。有 Solidity 编程基础的开发者还可以自己定制合约内容。然后,就可以部署 HelloWorld 合约。 + +``` +$ ./console.py deploy HelloWorld save + +INFO >> user input : ['deploy', 'HelloWorld', 'save'] + +backup [contracts/HelloWorld.abi] to [contracts/HelloWorld.abi.20190807102912] +backup [contracts/HelloWorld.bin] to [contracts/HelloWorld.bin.20190807102912] +INFO >> compile with solc compiler +deploy result for [HelloWorld] is: +{ + "blockHash": "0x3912605dde5f7358fee40a85a8b97ba6493848eae7766a8c317beecafb2e279d", + "blockNumber": "0x1", + "contractAddress": "0x2d1c577e41809453c50e7e5c3f57d06f3cdd90ce", + "from": "0x95198b93705e394a916579e048c8a32ddfb900f7", + "gasUsed": "0x44ab3", + "input": "0x6080604052...省略若干行...c6f2c20576f726c642100000000000000000000000000", + "logs": [], + "logsBloom": "0x000...省略若干行...0000", + "output": "0x", + "status": "0x0", + "to": "0x0000000000000000000000000000000000000000", + "transactionHash": "0xb291e9ca38b53c897340256b851764fa68a86f2a53cb14b2ecdcc332e850bb91", + "transactionIndex": "0x0" +} +on block : 1,address: 0x2d1c577e41809453c50e7e5c3f57d06f3cdd90ce +address save to file: bin/contract.ini +``` + +完成后可得到 HelloWord 合约部署的地址,通过这个地址调用函数接口。 + +- step4 在/python-sdk 文件夹下编辑 app.py + +``` +$ vi app.py + +# -*- coding:utf-8 -*- +from client.common import transaction_common +from flask import Flask, request +from jinja2 import escape + +app = Flask(__name__) + +tx_client = transaction_common.TransactionCommon("0x2d1c577e41809453c50e7e5c3f57d06f3cdd90ce","contracts","HelloWorld") +# tx_client = transaction_common.Transaction_Common("地址","合约路径","合约名称") + +@app.route('/') +def index(): + ''' + 调用 get 接口,获得 HelloWorld 的字符串 + ''' + new_str = request.args.get('new_str') + # 通过 new_str 的值更新 HelloWorld 的字符串 + if new_str: + tx_client.send_transaction_getReceipt("set",(new_str,)) + # 若 new_str 不为空则更新字符串 + return escape(str(tx_client.call_and_decode("get"))) + +if __name__ == '__main__': + app.run(host="0.0.0.0", port=80) +``` + +- step5 安装 app.py 依赖/运行程序 + +``` +pip install flaskpython app.py +``` + +这样就通过 Python-Flask 框架实现了调用 HelloWorld 合约,通过调用 get 接口查看字符串,调用 set 接口更新字符串。FISCO BCOS 的 Python-SDK 十分适合像我这样的学生党或者初学者去研究和了解区块链技术。十分期待更多开发者参与其中,用它搭建出更多有趣好玩的开源项目。Dockerfile 地址请参考文末,最近我也会对其做一些更新,提升其操作易用性,最新操作手册和消息将在GitHub上发布,欢迎大家关注。点击参考[更多Python Demo](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/python_sdk/demo.html)。 + +## 3. 提交 pr 体验 + +关于如何在 FISCO BCOS 中提交 pr 可点击参考开源社区整理的内容,这里不多做说明。详情请见[《揭秘 FISCO BCOS 开源项目开发协作》](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485380&idx=1&sn=1f32ddad49b542206d24739f3de98b95&chksm=9f2ef5d8a8597cce973c9321543174de0e9a0bfebf1750cef4f6ae1641f4d189ea22d616cf98&scene=21#wechat_redirect) + +我想分享一下个人提交 pr 的体验,整个过程既新奇又有趣。萌生“区块链盒子”的 idea 之后,我很快就编写了第一个 Dockerfile,随即就提交了 pr。很快社区的小哥哥石翔就回复了我,刚开始我以为是国外友人,就一直用" Poor English "和他交流。他十分欢迎我的pr,还不断给我点赞和支持,他不但解决了许多在配置过程中的问题,还时不时分享一些小故事鼓励我。在合并我的pr过程中,十分感谢团队的热情帮助,及时向我提出review意见,并细心给我介绍需要添加的内容功能,这让我充分感受到 FISCO BCOS 社区和睦共处、互帮互助的氛围。 + +目前,“Python 区块链盒子”还有一些有待优化的地方,例如,每次启动一个容器都需要手动操作,启动节点的条件是-->机器暴露所需端口,默认是 20200, 8045, 30300。后期可能会考虑对默认启动节点的功能进行优化,添加数据卷,以及优化容器大小,使 fiscoorg/playground:python_sdk 更精致。如果你有不错的优化想法,欢迎提交 pr,来一次有趣新奇的 pr 体验 + +------ + +#### 参考链接 + +- [Dockerfile](https://github.com/FISCO-BCOS/python-sdk/blob/master/Dockerfile) + diff --git a/3.x/zh_CN/docs/articles/4_tools/44_sdk/talking_about_java-contract-code.md b/3.x/zh_CN/docs/articles/4_tools/44_sdk/talking_about_java-contract-code.md new file mode 100644 index 000000000..b62a5c43a --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/44_sdk/talking_about_java-contract-code.md @@ -0,0 +1,82 @@ +# 杂谈Java合约代码 + +作者:王章|FISCO BCOS 核心开发者 + +FISCO BCOS提供了多种语言的SDK,包括Go、NodeJS、Python和Java。Java SDK不同于其他语言SDK,调用合约时,用户需要使用合约编译工具将Solidity合约源码生成对应的Java代码。这个由合约编译工具生成的与Solidity合约同名的Java代码,我们俗称Java合约代码,本文将介绍如何生成以及使用这份代码。 + +## 如何生成Java合约代码 + +合约编译工具可将Solidity源码生成对应的Java代码,具体使用方式可参考[以下链接](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html#id10)。在说明合约编译工具如何生成Java合约代码之前,先介绍合约ABI的概念。ABI的定义为: + +``` +The Contract Application Binary Interface (ABI) is the standard way to interact with contracts in the Ethereum ecosystem, both from outside the blockchain and for contract-to-contract interaction. +``` + +ABI是以太坊生态系统中与合约交互的标准方式,包括了外部客户端与合约的交互、合约与合约之间的交互。更通俗的理解,ABI是合约接口的具体描述,包含合约的接口列表、接口名称、参数名称、参数类型、返回类型等等。这种描述通常为JSON格式,见[ABI格式详情](https://solidity.readthedocs.io/en/develop/abi-spec.html#json)。在EVM生态中,Solidity编译器可以生成合约ABI信息。合约编译工具生成Java代码时,编译Solidity合约生成ABI信息,并解析ABI文件,根据ABI文件的描述内容,确定合约包含的接口列表、各个接口的输入参数名称/类型列表、返回类型等信息。根据这些信息,合约编译工具为生成的Java合约合约类生成接口。具体可参考以下例子。 + +``` +// 示例合约 HelloWorld.sol +pragma Solidity ^0.4.25; + +contract HelloWorld { + string name; + function HelloWorld(){ + name = "Hello, World!"; + } + + function get()constant returns(string){ + return name; + } + function set(string n){ + name = n; + } +} +``` + +HelloWorld合约ABI: + +``` +[{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function","stateMutability":"view"},{"inputs":[],"type":"constructor","payable":true,"stateMutability":"payable"}] +``` + +上述代码包含三个接口的描述信息:set、get、constructor(默认构造函数,无参数不处理)。关于set与get接口的生成可参考如下图示。 + +### set接口 + +![](../../../../images/articles/talking_about_java-contract-code/IMG_5743.PNG) + + +### get接口 + +![](../../../../images/articles/talking_about_java-contract-code/IMG_5744.PNG) + +最终生成的HelloWorld.java类: + +``` +// HelloWorld.java +// 注意:这里省略了无关内容,只保留了核心接口 +public class HelloWorld { + public RemoteCall set(String n); + public RemoteCall get(); +} +``` + +**HelloWorld.java类中set、get分别是对HelloWorld合约get、set调用的封装。**从上述介绍中可以看出,合约编译工具通过编译获取合约ABI信息,通过解析ABI内容获取合约接口描述信息,为Java类生成对应接口。 + +## 面向Java对象 + +了解了如何生成Java合约代码,接下来将会说明如何通过生成的接口实现对合约的调用。这里仍然以HelloWorld合约说明如何调用接口: + +``` +HelloWorld helloWorld; // 初始化HelloWorld对象,省略 +TransactionReceipt receipt = helloWorld.set("HelloWorld").send(); // 调用set接口 +``` + +Java SDK这种调用合约的姿势可以总结为:面向Java对象操作合约。在这种方式下,用户只需使用合约编译工具生成Java合约类,对合约的所有操作基于构造的Java合约对象,不需要再关注合约ABI,发送接受细节、交易打包编码、结果返回的解码等屏蔽的细节。具体调用合约方式请参考[Java SDK教程](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk.html)。值得一提的是,在特定场景下,面向对象的Java调用方式显然无法满足需求,比如:无法预先生成Java合约代码,或者,交易签名与交易构造服务需要分离。在这些场景下,使用类似nodejs/python sdk的姿势会更灵活。但最灵活的还是,用户自己关心交易编解码、打包、签名、发送、收回包、解码的整体流程。 + +![](../../../../images/articles/talking_about_java-contract-code/IMG_5745.PNG) + + +## 总结 + +Java SDK的使用,帮助用户屏蔽编码、签名、发送、接收、解码等流程的细节,通过前期合约ABI转换生成Java合约代码,可以做到一次转义多处使用。但是也有用户希望能够掌握交易发送的全过程,或者是在特定场景下要实现交易发送各个流程的解耦。这种情况下,NodeJS、Python、Go版本的客户端对这些细节的支持更为完善,Java SDK也会逐步开放各个模块的接口,敬请期待。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/44_sdk/use_javasdk_in_eclipse.md b/3.x/zh_CN/docs/articles/4_tools/44_sdk/use_javasdk_in_eclipse.md new file mode 100644 index 000000000..a9067b33a --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/44_sdk/use_javasdk_in_eclipse.md @@ -0,0 +1,174 @@ +# 手把手教你在Eclipse中使用JavaSDK + +作者:王章|FISCO BCOS 核心开发者 + +Eclipse是当前主流的Java IDE之一,本文将进行上手实操,指导如何在Eclipse中创建FISCO BCOS的JavaSDK应用。 + +本文首先介绍如何在Eclipse创建新的工程,在工程中引入JavaSDK依赖,通过配置与区块链进行交互,最后通过获取区块链的块高验证创建的项目。同时,本文也会介绍实际开发中更加便捷的使用方式,将已经提供的示例项目导入Eclipse。 + +**注意:** + +文章项目以Gradle方式进行构建,请确认以下环境正确安装:1、Java 1.8或者以上版本;2、 + +##### 前置条件: + +参考[安装文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html):完成FISCO BCOS区块链的搭建,功能测试需要与区块链节点进行交互。 + +## **Eclipse 创建新工程** + +### 创建Gradle工程 + +打开Eclipse,右键选择New下Project选项,如下图所示: + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5632.PNG) + + +在弹出的新建New Project界面,选择Gradle => Gradle Project,点击Next : + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5633.PNG) + + +再次点击Next,在接下来的界面输入项目名称,这里项目名为sample。 + + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5634.PNG) + + +点击Finish,然后等待项目初始化。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5635.PNG) + +项目初始化之后,一个新的Gradle工程已经创建完成。接下来,我们需要修改项目的build.gradle文件,引入JavaSDK的maven库以及依赖版本。 + +### 项目引入JavaSDK依赖 + +打开build.gradle文件,在repositories添加需要的maven库: + +``` +repositories { + // 其他maven库 + // solidity编译器maven库 + maven { url"https://dl.bintray.com/ethereum/maven/" } + // JavaSDK snapshot版本 maven库 + maven{ url "https://oss.sonatype.org/content/repositories/snapshots"} + // JavaSDK maven库 + maven { url"http://maven.aliyun.com/nexus/content/groups/public/" } + // 通用maven库 + mavenCentral() + } +``` + +在dependencies添加JavaSDK的依赖版本: + +``` +dependencies { + // 其他依赖 + + // 日志依赖 + compile ('org.slf4j:slf4j-log4j12:1.7.25') + // JavaSDK依赖, 2.1.0版本 + compile ("org.fisco-bcos:web3sdk:2.1.0") + } +``` + +然后右键点击项目名:Gradle=> Refresh Gradle Project刷新项目。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5636.PNG) + + +**注意**:刷新项目可能需要从远程maven库下载项目依赖jar的包,请确保网络畅通,下载过程会需要一些时间。 + +### 证书与配置文件 + +JavaSDK服务运行需要依赖applicationContext.xml配置文件以及证书。查看[配置参考](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk.html#fisco-bcos)。将配置文件applicationContext.xml,证书文件ca.crt sdk.crt sdk.key拷贝到项目src/main/resources目录下。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5637.PNG) + +### 创建运行测试类 + +到此,我们已经完成了新项目的创建,引入并完成了JavaSDK的配置,现在我们来测试项目的功能。 + +### 创建类包package + +右键点击项目名称选择New => Package然后输入包名,这里使用org.fisco.bcos.test。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5638.JPG) + +### 创建测试类 + +右键点击类包名选择 ‘New => Class’。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5639.PNG) + +输入类名,点击Finish,这里类名使用NodeVersionTest。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5640.JPG) + + +测试类的功能为调用getBlockNumber接口获取当前的块高: + +``` +package org.fisco.bcos.test; + +import org.fisco.bcos.channel.client.Service; +import org.fisco.bcos.web3j.protocol.Web3j; +import org.fisco.bcos.web3j.protocol.channel.ChannelEthereumService; +import org.fisco.bcos.web3j.protocol.core.methods.response.BlockNumber; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class NodeVersionTest { + public static void main(String[] args) throws Exception { + + ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); + Service service = context.getBean(Service.class); + service.run(); + + ChannelEthereumService channelEthereumService = new ChannelEthereumService(); + channelEthereumService.setChannelService(service); + // Web3j对象 + Web3j web3j = Web3j.build(channelEthereumService, service.getGroupId()); + // 调用 getBlockNumber 接口获取 + BlockNumber blockNumber = web3j.getBlockNumber().send(); + System.out.println("BlockNumber: " + blockNumber.getBlockNumber()); + System.exit(-1); + } +} +``` + +右键点击NodeVersionTest.java文件选择Run As => Java Application运行测试类。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5640.JPG) + +运行结果: + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5641.JPG) + +## Eclipse导入项目 + +上面流程可以看出创建新项目的过程需要比较多的配置流程,为了便于用户使用,我们提供已有的示例项目asset-app,用户可以将其快速导入Eclipse,在示例基础上快速修改开发自己的应用。请参考[asset-app项目详情](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html)。 + +### 下载asset-app项目工程 + +下载[asset-app](https://github.com/FISCO-BCOS/LargeFiles/raw/master/tools/asset-app.tar.gz),下载之后本地解压至指定路径。 + +[asset-app gitee下载](https://gitee.com/FISCO-BCOS/LargeFiles/raw/master/tools/asset-app.tar.gz) + +### 导入工程 + +打开Eclipse选择: File => Import => Gradle => Existing Gradle Project。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5642.PNG) + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5643.JPG) + +点击Next,选择asset-app路径,点击Finish等待项目加载。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5644.JPG) + +项目加载完成之后,右键点击项目名:Gradle=> Refresh Gradle Project刷新项目。 + +![](../../../../images/articles/use_javasdk_in_eclipse/IMG_5645.JPG) + +ok! asset-app项目已经被正常加载。 + diff --git a/3.x/zh_CN/docs/articles/4_tools/45_othertools/contract_analysis_tool_guide.md b/3.x/zh_CN/docs/articles/4_tools/45_othertools/contract_analysis_tool_guide.md new file mode 100644 index 000000000..36663fb5e --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/45_othertools/contract_analysis_tool_guide.md @@ -0,0 +1,120 @@ +# FISCO BCOS 交易解析工具指南 + +作者:廖飞强|FISCO BCOS 核心开发者 + +> 本文将介绍 FISCO BCOS的交易解析工具,帮助开发者简单快捷地解析交易和交易回执中的input、output、 logs字段,助力区块链应用开发。 + +社区用户经常询问:FISCO BCOS的智能合约支持发送交易后,直接获取返回值吗?交易和交易回执中的input、output和logs字段存的是什么,挺好奇,可解吗?怎么解? + +现在,让FISCO BCOS交易解析工具来揭开这神秘的面纱! + +## What: 解析什么? + +解析工具解析的是交易和交易回执中的三个重要字段,分别是input、output和logs。这个三个字段分别代表什么,与智能合约有什么关系?下面请出一张图进行分析。 + +![](../../../../images/articles/contract_analysis_tool_guide/IMG_4963.PNG) + +图中为了突出重点,只显示TableTest.sol合约中涉及到交易解析字段的关键代码(TableTest.sol合约是控制台提供的示例合约,用于创建示例表t_test,并提供增删改查方法。完整合约代码可以到控制台目录contracts/solidity/下查阅,或直接通过文档查阅,请参考:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html#crud)。 + +交易和交易回执字段,同样只突出要解析的input、output和logs字段,其他字段省略。其中交易信息包含input字段,交易回执信息包含input、output和logs字段**(注:**FISCO BCOS 2.0.0及以上版本返回的交易回执包含input字段**)。 + +从图中可以看到,蓝色部分是insert方法的签名,方法签名部分和调用该方法传入的参数,将编码到交易和交易回执的input字段(十六进制字符串)。 + +绿色部分是方法的返回值,这部分将编码到交易回执的output字段(十六进制字符串)。这里可以解答用户的一个疑问,**即FISCO BCOS的智能合约支持发送交易后获取返回值,该返回值将会编码保存在交易回执的output字段,并且利用交易解析工具可以解析返回值**。 + +橙色部分是方法调用的event,可以记录event log信息,这部分将编码到交易回执的logs字段(其中address为调用的合约地址,data是event log数据的十六进制编码,topic是event签名的十六进制编码)。 + +由此可知,合约方法的输入,输出以及event log均编码到了交易和交易回执对应的input、output和logs字段。要知道一个交易或交易回执是调用了合约的哪个方法,输入、输出和event log分别是什么数据,只要解析这个三个字段即可,这正是交易解析工具要解决的问题! + +## How: 如何使用? + +交易解析是web3sdk 2.0.4及以上版本提供的功能。其使用非常简单,三步曲如下: + +### step 1: 引入web3sdk 2.0.5依赖 + +**Gradle 项目**: + +compile ('org.fisco-bcos:web3sdk:2.0.5') + +**Maven 项目**: + + + + org.fisco-bcos + + web3sdk + + 2.0.5 + + + +### step 2: 创建交易解析对象TransactionDecoder + +使用TransactionDecoderFactory工厂类创建交易解析对象TransactionDecoder,提供两种方式: + +1. TransactionDecoder buildTransactionDecoder(String abi, String bin),传入的参数分别是合约的abi和bin字符串(bin字符串暂不使用,可以直接传入空字符串)。 +2. TransactionDecoder buildTransactionDecoder(String contractName),传入合约名称。需要在应用的根目录下创建solidity目录,将交易相关的合约放在solidity目录,通过指定合约名获取交易解析对象。 + +**注意**:创建交易解析对象前,请确定解析该交易对应的合约(即该交易是由调用该合约产生的),可以直接提供solidity合约或者用户自行编译,然后传入合约的abi,两种方式均可创建交易解析对象。 + +### step 3: 调用交易解析对象进行解析任务 + +TransactionDecoder对input,output和logs的解析结果均分别提供返回java对象和json字符串(java对象的json字符串形式)的方法。详细设计文档请参考:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/sdk.html#id11。 + +java对象方便服务端处理数据,json字符串方便客户端处理数据。 + +交易解析对象的方法列表如下: + +| 解析input | InputAndOutputResult decodeInputReturnObject(String input) | +| ---------- | ------------------------------------------------------------ | +| | String decodeInputReturnJson(String input) | +| 解析output | InputAndOutputResult decodeOutputReturnObject(String input, String output) | +| | String decodeOutputReturnJson(String input, String output) | +| 解析logs | Map>> decodeEventReturnObject(List logList) | +| | String decodeEventReturnJson(List logList) | + +其中InputAndOutputResult类,ResultEntity类和EventResultEntity类的结构如下: + +``` +public class InputAndOutputResult { + private String function; // 方法签名 + private String methodID; // 方法签名编码的字符串,用于方法选择器 + private List result; // 数据列表 + } +public class ResultEntity { + private String name; // 字段名称 + private String type; // 字段类型 + private Object data; // 字段值 + } +public class EventResultEntity extends ResultEntity { + private boolean indexed; // indexed标志位,true表示event字段使用了indexed关键字修饰 + } +``` + +根据交易对象,可以获取其input字段;根据交易回执对象,可以获取其input、output和logs字段。调用交易解析对象对应的方法即可解析相关字段。 + +**注意**:如果解析FISCO BCOS 2.0.0之前的版本(即rc1、rc2、rc3版本)返回的交易回执中的output字段,因为解析output字段的方法需要传入input字段,但交易回执中缺少input字段,则可以根据交易回执中的hash字段,查询一次web3j对象的getTransactionByHash方法获取交易对象,然后从交易对象获取input字段,即可解析output字段。 + +解析示例: + +下面示例解析调用TableTest合约的insert方法,输入参数为(fruit, 1 ,apple),返回值为1(代表新增1条记录)时产生的交易和交易回执。解析其input、outout和logs字段,其解析结果如下: + +| input | java对象:[function=insert(string,int256,string), methodID=0xebf3b24f, result=[ResultEntity [name=name, type=string, data=fruit], ResultEntity [name=item_id, type=int256, data=1], ResultEntity [name=item_name, type=string, data=apple]]] | +| ------ | ------------------------------------------------------------ | +| | json字符串:{"function":"insert(string,int256,string)","methodID":"0xebf3b24f","result":[{"name":"name","type":"string","data":"fruit"},{"name":"item_id","type":"int256","data":1},{"name":"item_name","type":"string","data":"apple"}]} | +| output | java对象:[function=insert(string,int256,string), methodID=0xebf3b24f, result=[ResultEntity [name=, type=int256, data=1]]] | +| | json字符串:{"function":"insert(string,int256,string)","methodID":"0xebf3b24f","result":[{"name":"","type":"int256","data":1}]} | +| logs | java对象:{InsertResult(int256)=[[EventResultEntity [name=count, type=int256, data=1, indexed=false]]]} | +| | json字符串:{"InsertResult(int256)":[[{"name":"count","type":"int256","data":1,"indexed":false}]]} | + +由解析结果可知,根据TableTest.sol合约的abi和交易回执中的input、output以及logs字段,通过交易解析工具可以解析出其调用的合约方法名、参数类型、参数值、返回类型、返回值以及event log数据。这就是我们期待的交易解析效果! + +## Where: 使用场景在哪里? + +是英雄,一定有用武之地!交易解析工具入场的地方包括如下场景: + +- **控制台**:控制台1.0.4版本已使用交易解析工具解析查询的交易、交易回执以及调用合约时的相关字段。[具体用法](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html#call) +- **区块链浏览器、WeBASE管理平台**:用于解码交易和交易回执中的字段,便于交易详情展示。 +- **基于web3sdk的区块链应用**:比较重要的意义是用于获取合约方法的返回值,以往一般对于发送交易的方法,习惯用event记录数据,而方法的返回值处于闲置状态。现在可以使用返回值,并利用交易解析工具解析返回值,助力业务开发。 + +总之,哪里需要交易字段解析,哪里就可以调用交易解析工具! \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/45_othertools/index.md b/3.x/zh_CN/docs/articles/4_tools/45_othertools/index.md new file mode 100644 index 000000000..0622b8f70 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/45_othertools/index.md @@ -0,0 +1,10 @@ +### 其他工具 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + contract_analysis_tool_guide.md + [ChainIDE](https://fiscoide.com/)合约开发工具 +``` + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/46_stresstest/caliper_stress_test_practice.md b/3.x/zh_CN/docs/articles/4_tools/46_stresstest/caliper_stress_test_practice.md new file mode 100644 index 000000000..fe4a61539 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/46_stresstest/caliper_stress_test_practice.md @@ -0,0 +1,104 @@ +# 性能压测工具Caliper在FISCO BCOS平台中的实践 + +作者:李陈希|FISCO BCOS 核心开发者 + +**Hyperledger Caliper在发布的0.2.0版本中,正式宣布支持FISCO BCOS平台**。 + +关于如何使用Caliper对FISCO BCOS进行压测,开发小哥已经呕心沥血对如何部署Caliper及如何自定义测试用例进行了全面总结,欢迎猛戳[FISCO BCOS官方文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/stress_testing.html)学习如何使用: + +本文将深入解析Caliper,以便大家更好使用Caliper压测FISCO BCOS。 + +## 为何要适配Caliper? + +对于区块链开发者和用户而言,性能是评价一个区块链平台重要的考量条件。一直以来,FISCO BCOS都是通过Java SDK中自带的压力测试程序及压测脚本来对FISCO BCOS进行持续的性能追踪。 + +虽然这些压测手段已经完全能够胜任FISCO BCOS底层开发人员评估性能的需求,但是当压测需求从底层开发人员向需要对自定义的合约及场景进行测试的外部用户延伸时,传统的压测方法则会有些力不从心,需要改善的地方主要集中在以下几点。 + +### 扩展测试场景的方式需要精简 + +目前压测程序直接支持的测试场景是具有代表性的转账场景及增删改查数据表的模拟,如果用户想对自定义的合约及场景进行测试,则需要按照模板自行编写测试程序。 +SDK自身已经提供了丰富的API来帮助用户编写这类程序,但是仍然需要用户自己处理合约编译及API转换、压力线程池等细节。 +尽管一个用户可能只会有一个测试需求点,但是千人千面,当不同用户的需求累积起来时,重复的工作量就变得相当可观。 + +**因此,我们希望有一套测试框架帮助我们处理这些琐碎的细节,从而使我们的精力能更加聚焦在构造压测场景本身**。 + +### 性能指标的定义需要统一 + +对于性能指标如何计算的问题,FISCO BCOS内部已经形成了一套规范的计算方法,但是当用户自行编写测试程序时,由于测试程序本身的灵活性,用户可以自己定义性能指标该如何计算。 +以交易处理能力指标TPS为例,有的用户可能会觉得交易的本地签名时间不应该归到远端节点处理交易的耗时中,也有用户可能会认为总交易量/总时间的计算方式不够精确,而倾向于使用在压测过程中多次采样最后计算平均值的方式。 +可以看出,灵活性带来的负面效应是导致各方缺少性能的统一度量衡。 +**因此,我们希望能有一套自带标准性能指标定义的测试体系,且最好用户无法直接干预性能指标的计算流程**。 + +### 结果的展示方式需要优化 + +基于命令行的压测程序在编写时更多是面向FISCO BCOS的底层开发人员,因此在使用方式上也显得较为『底层』。当外部用户想使用Java SDK中自带的压力测试程进行测试时,可能会看到如下测试结果: + +![](../../../../images/articles/caliper_stress_test_practice/IMG_4964.JPG) + +尽管理解每项统计数据的含义并不难,但是如果是向外界进行展示和介绍的话,仍然会显得有一些笨拙和不便。 +**因此,我们希望有一个测试工具能在测试完成后输出直观的测试报告,方便用户理解和传播** 。 +秉承『不要重复造轮子』的精神,我们将目光投向了开源社区,以期能有现成的工具解决FISCO BCOS测试工具的痛点。在经过充分调研后,我们发现了Hyperledger Caliper项目。 + +Caliper是一个通用区块链性能测试工具。"Caliper"一词的原意就是标尺,Caliper旨在为区块链平台的测试提供一个公共的基准线。Caliper完全开源,因此用户不需要担心由于测试工具不开源导致无法对压测结果进行验证的问题。 +同时,Hyperledger项目下设了性能及可扩展性工作组(PWSG),专门负责对各种性能指标(TPS、延迟、资源利用率等)进行形式化、规范化的定义,Caliper在设计也采用这一套性能指标体系并内嵌进了框架中。 +Caliper能够方便地对接多种区块链平台并屏蔽了底层细节,用户只需要负责设计具体的测试流程,即可获取Caliper输出的可视化性能测试报告。可以看出,拥有这些特点的Caliper,能恰好满足FISCO BCOS对压测工具的需求。 + +FISCO BCOS对Caliper框架的适配工作随即展开,回顾来看,整体工作量并不算繁重,最主要的时间开销反倒是花在开发小哥因为不熟悉Node.js(Caliper主要使用Node.js进行开发)而学习了一段时间,这也从侧面也印证了Caliper易于集成的特点。 + +## Caliper长啥样? + +![](../../../../images/articles/caliper_stress_test_practice/IMG_4965.PNG) + +Caliper的架构图如上图所示。在Caliper中,Caliper CLI负责为内部的Caliper Core(接口及核心层)提供方便易用的命令行工具。接口及核心层包含区块链适配接口、资源监控模块、性能分析模块及报告生成模块。 + +### 区块链适配API + +包含诸如在后端区块链上部署智能合约、调用合约、从账本查询状态等操作的接口,这些接口主要由区块链支配器提供。每个区块链适配器使用相应的区块链SDK或RESTful API来实现这些接口,Caliper也正是通过这些适配器提供的接口实现将区块链系统集成进Caliper框架中,目前除FISCO BCOS外,Caliper还支持Fabric、Iroha等区块链系统。 + +### 资源监控模块 + +提供启动/停止监视器和获取后端区块链系统资源消耗状态的支持,资源监控的范围包括CPU、内存、网络IO等。目前Caliper提供两种监视器,一种是监视本地/远程docker容器,另一种则是监控本地进程。 + +### 性能分析模块 + +提供读取预定义性能统计信息(包括TPS、延迟、成功交易数等)和打印基准测试结果等操作的支持。在调用区块链适配接口时,每个交易的关键指标(如创建交易的时间、交易提交时间、交易返回结果等)都会被记录下来,并用于生成最终的预定义性能指标统计信息。 + +### 报告生成模块 + +主要负责对从性能分析模块获取到的性能数据进行美化加工,生成HTML格式测试报告。 +Caliper的上层便是应用层,负责对区块链系统实施测试。每次测试都需要设置对应的测试配置文件以及定义后端区块链网络信息的测试参数。基于这些配置,Caliper便可以完成区块链系统的性能测试。 +Caliper预置了一个默认的基准测试引擎以帮助测试人员快速理解框架并实施自己的测试,下一节将介绍如何使用基准测试引擎。当然,测试人员也可以不使用测试框架,直接使用区块链适配API完成自有区块链系统的测试。 + +## 测试流程 + +![](../../../../images/articles/caliper_stress_test_practice/IMG_4966.PNG) + +Caliper默认的基准测试引擎采用Master/Client模式来实施测试流程。 + +整个测试流程由Master进程负责驱动,包含以下三个阶段。 + +- **准备阶段**:在此阶段,Master进程使用区块链配置文件创建并初始化内部区块链对象,按照配置中指定的参数部署智能合约,并启动监控对象以监控后端区块链系统的资源消耗; + +- **测试阶段**:在此阶段,Master进程根据配置文件执行测试,将根据定义的负载生成任务并将其分配给客户端子进程。最后将存储各个客户端返回的性能统计信息以供后续分析。 + +- **报告阶段**:分析每个测试轮次的所有Client进程的统计数据,并自动生成HTML格式报告。 + +Client进程主要负责与后端区块链系统进行具体的交互。在Local模式下,Master进程使用Node.js集群模块启动多个本地Client(子进程)来执行实际的测试工作。 + +由于Node.js本质上是单线程的,因此本地Client子进程集群用来提高Client在多核机器上的性能。在实际使用中,Client子进程的数量越多(在CPU核数能够支持的情况下),Caliper的交易发送及处理能力越高。 + +在此模式下,总工作负载被平均分配给子进程,每个子进程相当于区块链客户端,子进程拥有临时生成的上下文,可以独立地后端区块链系统交互。子进程上下文通常包含客户端的标识和加密信息,在测试结束后上下文将被自动释放,这些细节并不需要用户关心。 + +Client进程在第一轮测试时启动,并在完成所有测试后被销毁。 + +图中最右侧的用户自定义测试模块用于实现交易生成和上链的功能。通过这种方式,测试人员可以实现自己的测试逻辑并将其与基准测试引擎集成。测试模块主要实现3个函数,所有这些函数都应该返回一个Promise对象: + +- **init**:将在每个测试轮次开始时由Client调用。所需参数包括当前区块链对象、上下文以及从基准配置文件中读取的用户定义的参数。在该函数内可以保存区块链对象和上下文供以后使用,其他初始化工作也可在此处实现; + +- **run**:使用Caliper的区块链适配API处生成交易并将交易上链。Client将根据工作负载重复调用此函数; + +- **end**:用于在每轮测试结束时调用,任何结束时需要清理环境的工作都在此处执行。 + +Caliper使得压测FISCO BCOS的方式变得优雅,同时,FISCO BCOS在适配Caliper的过程中也对Caliper的一些bug和性能问题进行了修复和改进。 + +Caliper目前仍然在不断地进化中,后续还会陆续添加友好的GUI界面、分布式测试框架、Prometheus监控系统等功能,FISCO BCOS也会持续迭代优化测试工具,以满足用户性能测试的需求。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/46_stresstest/index.md b/3.x/zh_CN/docs/articles/4_tools/46_stresstest/index.md new file mode 100644 index 000000000..7a073fc15 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/46_stresstest/index.md @@ -0,0 +1,10 @@ +### 压测工具 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + caliper_stress_test_practice.md +``` + + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/47_maintenance/access_control_glance.md b/3.x/zh_CN/docs/articles/4_tools/47_maintenance/access_control_glance.md new file mode 100644 index 000000000..0bf917e4e --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/47_maintenance/access_control_glance.md @@ -0,0 +1,157 @@ +# FISCO BCOS权限控制一览 + +作者:张开翔|FISCO BCOS 首席架构师 + +**作者语** + +在多方参与的联盟链上,各方分工协作的同时也要做到**职责分明、各司其职**。链的管理者没有必要“既当裁判又当运动员”的参与业务交易,只参与交易的用户也不必很操心智能合约的开发部署。同时,"DO分离"(开发和运维分离)已经是业界成熟的做法,越权操作会带来风险,最终可能破坏信誉和造成资产损失。 + +清晰、易用、周全的**权限控制能力**,无论是对于信息安全,还是为了完善联盟治理,都至关重要。 + +本期文章讲的就是FISCO BCOS权限控制这点事,作者从FISCO BCOS的权限分类、典型的联盟链角色设计、权限控制操作基本步骤等角度进行了解析。 + +## FISCO BCOS的权限分类 + +FISCO BCOS在链刚建立起来的时候,为了方便快速地进行开发和体验,默认并没有做任何权限控制。但如果这条链是用来提供企业级服务,则从一开始就要设计权限控制的策略并落实之。 FISCO BCOS的权限分类: + +![](../../../../images/articles/access_control_glance/IMG_4967.PNG) + + +### 1. 链管理员权限 + +即**分配权限的权限**,如定义账户A作为链管理员,A可以为账户B、C、D分配权限;可以设置多个管理员,如果不设置管理员,任何账户都可以无差别修改各种权限。 + +### 2. 系统管理权限 + +目前包括4种: + +- 节点管理权限(增删共识节点或观察节点) +- 系统参数修改权限 +- 修改CNS合约命名权限 +- 能否部署合约和建表的权限 + +其中部署合约和建表是“二合一”的控制项,在使用CRUD合约时,我们建议部署合约的时候一起把合约里用到的表建了(写在合约的构造函数里),否则接下来读写表的交易可能会遇到“缺表”错误。如果业务流程需要动态创建表,动态建表的权限也应该只分配给少数账户,否则链上可能会出现各种废表。 + +### 3. 用户表权限 + +以用户表为粒度,控制某些账户能否**改写某个用户表**,以避免用户表被他人意外修改,这个权限要依赖FISCO BCOS的CRUD合约写法。另外,**读用户表**不受权限控制;如果要进行数据的隐私控制,需要引入数据加密、零知识等技术。 + +### 4.合约接口权限 + +一个合约可以包括多个接口,由于合约里的逻辑和业务密切相关,接口粒度的权限控制由开发者实现,开发者可对msg.sender或 tx.orgin进行判断,决定是否允许本次调用继续处理。 + +FISCO BCOS的控制台提供了一系列控制权限的命令,可以很方便的为用户**授予(grant)、取消(revoke)、查看(list)**各种权限,可以参见控制台的文档。 + +## 联盟链中典型的权限管理角色设计 + +在联盟链里,不同的角色各司其职,分工协作,典型的角色设计可参照: + +### 1. 链管理员 + +通常是参与链的多方共同选出一个委员会,一个或多个机构可获得管理员权限,以进行人员管理和权限分配。链管理员并不负责任节点管理,修改系统参数,部署合约等系统管理操作。 + +### 2. 系统管理员 + +指定的业务运营人员或系统运维人员,按需分配各种权限,负责日常的链上管理,包括节点增删,系统参数修改等。由链管理员根据大家约定的治理规则来分配权限,比如只允许指定的账户部署合约,则给他们设定合约部署权限,这样其他账户则不能随意部署合约了。 + +### 3.交易用户 + +用户向区块链发送业务交易请求,业务交易主要是调用合约和读写用户表,可以根据业务逻辑,结合用户表权限和合约接口权限来进行灵活的控制。 + +### 4. 监管方 + +给监管方分配哪些系统和用户表权限,可参考具体的监管规则,如监管方只读所有数据,则不用设定特殊的权限。 + +管理不同角色的帐户又是另一个复杂的问题,既要清晰区分,又要便于使用,还要保证帐号安全;万一帐号丢失后要支持找回,帐号泄漏后重置,以后会另文介绍。 + +## 权限控制操作基本步骤 + +### step1 + +首先采用控制台grantPermissionManager命令设置一个或多个链管理员角色。 **Tips**:登陆控制台时,命令行里输入的是私钥明文,而使用grantPermissionManager命令输入的是“账户地址”,要注意区分。如: + +用户私钥:3bed914595c159cbce70ec5fb6aff3d6797e0c5ee5a7a9224a21cae8932d84a4 + +对应地址:0xf1585b8d0e08a0a00fff662e24d67ba95a438256 + +那么登陆控制台的命令行是: + +``` +./start.sh 1 3bed914595c159cbce70ec5fb6aff3d6797e0c5ee5a7a9224a21cae8932d84a4 +``` + +分配管理员权限的命令行是: + +``` +grantPermissionManager 0xf1585b8d0e08a0a00fff662e24d67ba95a438256 +``` + +当这个账户得到了链管理员权限后,退出当前控制台或切到另一个终端窗口,用这个账户的私钥登陆一次,即可作为链管理员进行后续的操作了。 + +**Tips**:一定要记住管理员地址和私钥的对应关系,否则一旦设置管理员权限,只有管理员可以为其他账户分配权限,其他账户的设置操作都会报告没有权限。 + +### step2 + +用链管理员账户登陆控制台,根据管理策略,依次给其他系统管理员账户分配节点管理权限,系统参数修改权限,CNS权限,部署合约和建表权限等。然后用一个有相应权限的系统管理员账户私钥登陆控制台,如有部署和建表权限的账号,以便进行下一步。 + +### step3 + +开发者编写CRUD的合约时,一旦合约在链上创建了用户表,则可以采用控制台的grantUserTableManager命令,由有权限的系统管理员指定哪些账号可以创建表和增删改该表的数据,命令行是 + +``` +grantUserTableManager t_order 0xf1585b8d0e08a0a00fff662e24d67ba95a438256 +``` + +授权0xf1585b8d0e08a0a00fff662e24d67ba95a438256这个账号可以操作**t_order**表,而其他账号不行,如要读写该表,继续添加权限,对一个表有读写权限的账号可以有多个。 + +### step4 + +对solidity合约里的某个接口,可以参考这样的代码进行控制: + +``` + function testFunction() public returns(int256) +{ + require(msg.sender == tx.origin); //这一行的效果是禁止了合约调合约 + if(msg.sender != address(0x156dff526b422b17c4f576e6c0b243179eaa8407) ) //这里为示例,直接写了账户地址明文,实际上开发时可以灵活处理。 + { return -1; } //如果调用者和预设的有权限的调用者不同,则返回 + } +``` + +msg.sender是当前合约调用者的地址,可以是用户也可以是另一个合约(合约调合约时);tx.origin则是本次交易的真正发起用户,给交易签名的用户。 + +## 小结及参考资料 + +本文介绍FISCOBCOS在基础层面上提供的一些接口和能力,权限控制的合理性和周密程度最终会取决于使用者,关于不同链的场景化治理和安全控制,可以继续深入探讨,以得出最佳实践。 + +#### 参考资料 + +- [P2P网络详细设计](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/p2p/p2p.html) + +- [权限控制设计](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/security_control/permission_control.html) + +- [控制台的文档](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html) + +- [权限控制实操介绍](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/permission_control.html) + +- [CRUD合约开发介绍](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html#crud) + +- [CRUD合约应用示例](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html) + +------ + +#### 群友问答 + +**@李翛然**:请问几个问题: + +1)管理员分配表权限,这个操作是不是在每个节点都可以进行? + +2)创建角色,这个操作是不是每个节点都可以操作? + +如果以上两个问题答案是肯定的,请问是不是只要有了一个节点的超级权限,就可以修改整个网络的数据? + +**@光路**:是肯定的,建立链之前就先协商好链管理员角色由哪一个或几个账号担任,链建立后第一时间进行角色分配,具体可以参见FISCO BCOS权限控制相关文档。 + +感谢参与本次话题讨论的小伙伴们!开源社区,因你们更美! + + + diff --git a/3.x/zh_CN/docs/articles/4_tools/47_maintenance/index.md b/3.x/zh_CN/docs/articles/4_tools/47_maintenance/index.md new file mode 100644 index 000000000..4b0b6c538 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/47_maintenance/index.md @@ -0,0 +1,14 @@ +### 运维支持 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + access_control_glance.md + 4702.md + 4703.md + 4704.md + 4705.md +``` + + \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/4_tools/five_step_to_develop_application.md b/3.x/zh_CN/docs/articles/4_tools/five_step_to_develop_application.md new file mode 100644 index 000000000..628136257 --- /dev/null +++ b/3.x/zh_CN/docs/articles/4_tools/five_step_to_develop_application.md @@ -0,0 +1,137 @@ +# FISCO BCOS零基础入门,五步轻松构建应用 + +作者:李辉忠|FISCO BCOS 高级架构师 + +本文面向零区块链基础入门 FISCO BCOS的开发者,以高纯度、超浓缩的极简方式,分享如何快速基于 FISCO BCOS 构建你的第一个DAPP应用。 + +社区经常有人会问:FISCO BCOS项目有10W+行源代码,10W+字说明文档,几十个子项目,我该如何下手,怎样入门 ? +莫慌,五步入门宝典已备好!!! + +## 第一步:构建一条FISCO BCOS的链 + +安装文档里给了一箩筐事无巨细的介绍,但此文就是要简明扼要地告诉你:**三步就能召唤FISCO BCOS !** + +(请先在home目录创建fisco目录,接下来都在这个目录操作) + +```bash +$ curl -LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.9.1/build_chain.sh && chmod u+x build_chain.sh +``` + +```eval_rst +.. note:: + - 如果因为网络问题导致长时间无法下载build_chain.sh脚本,请尝试 `curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master-2.0/tools/build_chain.sh && chmod u+x build_chain.sh` +``` + +执行`build_chain.sh`脚本,启动四个节点: + +```bash +$ bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 +$ bash nodes/127.0.0.1/start_all.sh +``` + +你可以通过执行`*ps -ef | grep -v grep | grep fisco-bcos*`查看到四个节点已经在运行。 + +![](../../../images/articles/five_step_to_develop_application/IMG_4947.JPG) + +当然,如果你还是需要阅读详细文档,请参考【安装】:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html#fisco-bcos + +## 第二步:安装一个交互式控制台 + +控制台是一个可以交互式访问区块链,进行区块链数据读写请求的工具。无需太多解释,**四步完成控制台安装:** + +下载控制台: + +```bash +$ curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v2.9.2/download_console.sh && bash download_console.sh -c 1.2.0 +``` + +```eval_rst +.. note:: + - 如果因为网络问题导致长时间无法下载控制台,请尝试命令 `curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master-2.0/tools/download_console.sh && bash download_console.sh -c 1.2.0` +``` + +配置并启动控制台: + +```bash +$ cp -n console/conf/applicationContext-sample.xml console/conf/applicationContext.xml +$ cp nodes/127.0.0.1/sdk/* console/conf/ +$ cd console && ./start.sh +``` + +此时,你已经进入控制台界面,可以通过help查看命令列表,通过getPeers获取节点连接列表,通过exit或quit命令退出控制台。 + +同时,控制台内置了一个HelloWorld合约,可以直接调用deploy HelloWorld进行部署,然后调用call HelloWorld进行访问。 + +![](../../../images/articles/five_step_to_develop_application/IMG_4948.PNG) + +## 第三步:编写一个Solidity合约 + +教程文档依然是循序渐进地指导,但其实!遵循业务合约编写**三部曲:****存储设计->接口设计->逻辑实现,**就足以顺利完成业务合约。 + +如果你还是习惯阅读详细文档,请参考【教程】:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html + +以文档中的资产转移应用为例,支持链上用户的资产登记、查询、转移功能: + +- **存储设计:基于分布式存储,设计存储表结构** + +| account | asset_value | +| ------- | ----------- | +| alice | 10000 | +| bob | 20000 | + +- **接口设计:基于业务需求,设计合约接口** + +``` +// 查询资产金额 +function select(string account) public constant returns(int256, uint256) + +// 资产注册 +function register(string account, uint256 amount) public returns(int256) + +// 资产转移 +function transfer(string from_asset_account, string to_asset_account, uint256 amount) public returns(int256) +``` + +- **逻辑实现:基于CRUD接口,实现业务逻辑** + +asset.sol合约:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html + + + +## 第四步:合约编译与部署 + +Solidity合约需要通过编译器转换成机器(虚拟机)可执行的二进制,这些二进制是一系列OpCode的组合,虚拟机将解析执行这些OpCode实现合约业务逻辑。 + +编译之后的合约需要通过工具部署到区块链(写入区块链账本),之后才可以根据合约接口描述文件(ABI)进行调用访问。 + +额,老毛病犯了,又唠唠叨叨讲原理,还是讲讲**如何无脑一键完成合约编译与部署吧:** + +参考说明文档【控制台】的deploy命令:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html + +将Assert.sol放置在console/solidity/contract目录,在控制台执行deploy Assert.sol即可完成合约的编译以及部署。 + +![](../../../images/articles/five_step_to_develop_application/IMG_4949.PNG) + +## 第五步:开发业务 + +继续假设采用Java开发业务,当然也假设你熟悉eclipse、gradle、spring等常用工具。 + +1、建立一个Gradle Java工程asset-client,通过IntelliJ IDEA或者Eclipse; + +2、编译build.gradle,增加maven库依赖; + +**repositories增加**:maven {url "http://maven.aliyun.com/nexus/content/groups/public/"}maven{url "https://dl.bintray.com/ethereum/maven/" } + +**dependencies增加**:compile ('org.fisco-bcos:web3sdk:2.0.4'){exclude group: 'org.ethereum'} + +3、将第二步中控制台配置目录(console/conf/)的相关配置文件(applicationContext.xml,log.properties,ca.crt,node.crt,node.key)拷贝到asset-client项目的main/resource目录; + +4、将第四步中一键编译生成的java文件(console/solidity/java/*)拷贝到asset-client项目的main/java目录; + +5、在main/java目录新建AssetClient类,Asset.java已经实现了有deploy,load,select,register,transfer接口,通过调用这些接口实现业务相关逻辑。 + +具体代码可参考示例工程:https://github.com/FISCO-BCOS/LargeFiles/raw/master/tools/asset-app.tar.gz + +[示例工程gitee下载地址]https://gitee.com/FISCO-BCOS/LargeFiles/raw/master/tools/asset-app.tar.gz + +到这里,你已经完成第一个基于FISCO BCOS的应用开发!如你对开发流程有疑问或优化建议,可以通过公众号进入技术交流群和我们一起探讨。 diff --git a/3.x/zh_CN/docs/articles/5_corporation/how_to_submit_pr.md b/3.x/zh_CN/docs/articles/5_corporation/how_to_submit_pr.md new file mode 100644 index 000000000..c6863d140 --- /dev/null +++ b/3.x/zh_CN/docs/articles/5_corporation/how_to_submit_pr.md @@ -0,0 +1,118 @@ +# 揭秘FISCO BCOS开源项目开发协作 + +作者:石翔|FISCO BCOS 核心开发者 + +**作者语** + +从FISCO BCOS 2.0的第一个版本开发至今,在各位程序猿(媛)的猛烈输出下,FISCO BCOS的节点代码已经达到了11万多行,并且代码仍在快速迭代着。 + +如此大的代码输入量,对于开发流程来说,是一个巨大的考验。如何保证代码质量?如何做到井然有序呢? + +本文将为大家揭秘提交PR的流程,看看在这个过程中,程序猿(媛)是如何进行开发协作的。 + +## PR是什么? + +每个人各自在本地开发自己的代码,当代码准备好后,会向FISCO BCOS主仓库提交一个“请求单”,请求主仓库拉取开发好的代码进行合入,此“请求单”就是PR(Pull Request,拉取代码请求)。 + +在PR中,其它开发者会Review代码,CI(持续集成工具)会对代码的规范和正确性进行初步的检查。当PR达到要求后,就可合入了。 + +当我们打开FISCO BCOS的PR列表,我们可以看到很多大家的PR记录。有经验老道的老司机(wheatli)在掌控全局,有曾经都想为他生猴子的廖老师(fqliao)在精益求精,有程序媛小姐姐(cyjseagull)在救死扶伤,还有初来乍到的爱猫人士(vita-dounai)在小试牛刀。 + +![](../../../images/articles/how_to_submit_pr/IMG_4968.JPG) + +下面我们来看看程序媛小姐姐cyjseagull提的一个PR。这个PR处在Open的状态,表示正在审核中。她请求将开发好的代码合入到feature-2.3.0分支。JimmyShi22、wheatli等小哥哥正在Review,同意了,后面会打钩。 + +![](../../../images/articles/how_to_submit_pr/IMG_4969.PNG) + +我们向下继续看这个PR,cyjseagull小姐姐的代码遭受到了小哥哥们的挑战,给出了一些Review的意见。共识模块和同步模块彼此独立,不会有依赖。她开发的节点树状拓扑逻辑TreeTopology.h应该放到更底层的模块中去。小姐姐愉快答应了。 + +通常来说,一个PR需要根据Review反复的修改后才能合入。 + +![](../../../images/articles/how_to_submit_pr/IMG_4970.PNG) + +此外,PR还会被各种CI(集成测试)检查,cyjseagull小姐姐很稳,通过了所有的检查。但是,一个PR需要至少两个Review的人同意才能合入。 + +这个PR还缺一个人的同意,合入的按钮是灰的,不能点击。正常情况下,如果同意的人数足够,就可以点击合入按钮,代码合入到相关的分支上。 + +![](../../../images/articles/how_to_submit_pr/IMG_4971.PNG) + + +## FISCO BCOS分支策略 + +在明白了PR的概念之后,我们有两个问题需要解决: + +- 多人同时开发,如何做到互不影响的情况下进行代码整合呢? +- 合入的代码,还需要进一步的人工测试才能发布,测试在什么阶段介入,能够更有效地进行测试,同时不影响其它人的开发呢? + +FISCO BCOS采用了经典的分支策略Gitflow去管理整个开发、测试和发布的流程,下面我们来看看Gitflow。 + +![](../../../images/articles/how_to_submit_pr/IMG_4972.JPG) + +在Gitflow中,有5种类型的分支:master、develop、feature、release、hotfix。不同分支具有不同的功能。 + +FISCO BCOS代码的开发、测试和发布的阶段,则对应了上述的分支。 + +### feature分支 + +FISCO BCOS的代码开发,是基于一个个特性(feature)的。 + +多个人同时进行开发,是基于自己的feature-xxx分支进行。在FISCO BCOS的主仓库上,我们可以看到有很多这些特性分支,每个特性分支归属于一个(或多个)程序猿(媛)。 + +他们平时在自己本地的仓库写代码,写好后以PR的形式提交到各自的feature-xxx分支上。上节中cyjseagull小姐姐提交的PR正是处在这个状态。 + +当feature-xxx分支开发好后,测试介入,进行“特性测试”。测试期间修的bug同样以PR的方式提交到此feature分支。特性测试的目的,是为了保证此特性的功能正确。 + +![](../../../images/articles/how_to_submit_pr/IMG_4973.PNG) + +### develop分支 + +develop分支(在FISCO BCOS中为dev),是用来合并多个feature分支的分支。 + +当“特性测试”测试通过后,feature-xxx分支就可合入dev分支了。 + +合并过程同样以PR的方式进行。多个feature同时合入dev分支时,需按照顺序依次合入。先合入dev的feature分支会给后合入的feature分支带来冲突。后合入的feature分支需要解决冲突后再合入dev。 + +### release分支 + +当我们积累了一些开发好的特性后,需要将代码发布出去。此时从dev分支拉取出release-xxx分支,进行“发布测试”。 + +在feature分支合并入dev分支时,只能保证特性的完整,但不能保证特性与特性间的影响。当多个特性合并入dev分支后,需要在发布前做最后的总体测试。此时发现的bug直接以PR的方式合入release分支。 + +通过此种方式,release分支在进行测试时,不会影响到其它开发者在feature分支上的开发,也不影响feature往dev分支的合入。 + +### master分支 + +master是主分支,向外提供可用的代码。 + +当“发布测试”完成后,即可将releaes分支合入master分支。 + +release分支同样以PR的方式合入master分支。同时,release分支也会合入dev分支。当合入master分支后,根据新的master分支打tag。发布完成!最终发布的版本以tag为准,代码可直接从tag上下载。 + +![](../../../images/articles/how_to_submit_pr/IMG_4974.JPG) + +### hotfix分支 + +当代码发布后,若出现改动较小的bug或进行小的优化,从master分支上拉出一个hotfix-xxx分支,在其上快速修复。 + +修复并测试完成后,同时合入master和dev分支。master打小版本的tag。若出现改动范围较大的bug,根据目前项目的发布状态,在feature或release分支上进行修复。 + +## FISCO BCOS分支策略 + +了解了PR与分支策略,接下来就到提PR的阶段。 + +- 如果你只是想修改小bug,进行小优化,那么可以直接PR到master分支。 +- 如果你是要针对某一特性进行开发,可以与社区沟通方案后,从dev上拉取出自己的feature-xxx分支,就可以开始撸了!然后用PR来提交代码。为了避免Review时大改,需尽量多的提PR来表明自己的思路。PR不要求功能完全可用,只需要最后开发完成时feature分支可用即可。 + +提PR的具体步骤也可参考[《如何为FISCO BCOS做贡献》](https://mp.weixin.qq.com/s/_w_auH8X4SQQWO3lhfNrbQ) + +欢迎大家积极提PR,一起让FISCO BCOS变得更好。 + +------ + +#### 参考资料 + +[FISCO BCOS仓库](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0) + +[cyjseagull小姐姐的PR](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/1316) + +[git-flow](https://nvie.com/posts/a-successful-git-branching-model/) \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/6_application/application_bsn_officially_designated.md b/3.x/zh_CN/docs/articles/6_application/application_bsn_officially_designated.md new file mode 100644 index 000000000..12941d65f --- /dev/null +++ b/3.x/zh_CN/docs/articles/6_application/application_bsn_officially_designated.md @@ -0,0 +1,39 @@ +# BSN首批“官方指定区块链应用”出炉,FISCO BCOS社区四个应用入选 + +历经一个多月的征集,BSN于近日公布了首批“官方指定区块链应用”名单,其中4个应用基于FISCO BCOS区块链底层研发,覆盖存证、防伪溯源、供应链管理等领域。本着“把最合适的区块链应用,展示给最需要的用户”的目的,BSN发展联盟开发者委员会根据应用准入机制对提交作品进行了审核及综合考量,本次优先选出9种分类的12个区块链应用,作为首批入选BSN的指定应用。 + +基于FISCO BCOS区块链底层研发的4个应用分别是:链动时代区块链存证服务系统、农业产业全过程溯源云平台区块链应用、惠运链、伊OS透明建造平台。 + +![](../../../images/articles/application_bsn_officially_designated/IMG_5268.JPG) + +## 链动时代:区块链存证服务系统 + +链动时代区块链存证服务系统(以下简称“inBC存证系统”)基于BSN上的FISCO BCOS联盟链构建。inBC存证系统帮助用户基于API接口扩展已有业务系统,实现电子证据的存证保全、调用核验。可广泛应用到电子合同、版权保护、证件证书、防伪溯源、公益捐赠等场景和领域。 + +![](../../../images/articles/application_bsn_officially_designated/IMG_5269.PNG) + +## 天演维真:农业产业全过程溯源云平台区块链应用 + +该平台充分结合物联网、区块链、云计算、大数据和地理信息等技术,在图形界面的软件环境下,实现信息采集、审核处理、控制执行、科学决策的“集成化、可视化、网络化和桌面化”。平台通过连接生产、加工、仓储、物流和消费各个环节,梳理统一的产品标准和管控流程,规范企业生产经营行为,提升企业质量管控能力,切实保障产品品质。同时,将这些信息同步开放给消费者,增强消费者认知,打造消费信任。 + +![](../../../images/articles/application_bsn_officially_designated/IMG_5270.PNG) + +目前,苏州市阳澄湖大闸蟹行业协会集体商标防伪追溯体系、赣南脐橙质量安全追溯示范项目等应用均使用该平台。 + +## 安链数据:惠运链 + +惠运链是安链科技在为物流无车承运平台、保险、银行等企业提供的物流保险供应链金融解决方案。在货运交易和运输物流管理业务场景下,提炼多方协同的单据和信息,通过区块链技术的应用,将物流公司、保险机构、金融机构等生态链节点接入联盟链中,优化资源利用率,提高物流行业整体协作效率,利用可信数据推动保险和金融机构与物流行业融合。 + +![](../../../images/articles/application_bsn_officially_designated/IMG_5271.PNG) + +目前惠运链合作用户包括南京融贸通智慧物流科技有限公司、江苏新宁现代物流股份有限公司、太平洋保险、招商银行等。 + +## 建信筑和:伊OS透明建造平台 + +伊OS透明建造平台是深圳市建信筑和科技有限公司研发的一款基于区块链技术应用的建造行业全生命周期管理系统。该平台着力为工程项目构建完整的信用生态系统,运用区块链、大数据等前沿科技技术,协助甲方执行项目全生命周期的管理,让项目责任可追溯,项目管理透明化,让过程变得公平公正。目前平台已为中国雄安集团、深圳建科院未来大厦项目提供服务。 + +![](../../../images/articles/application_bsn_officially_designated/IMG_5272.PNG) + +## 什么是“BSN官方指定应用”? + +BSN发展联盟开发者委员会根据客户需求和业界产品的分布,划分了14个相对通用的区块链应用分类以及“其它”分类,共计15个应用分类。分类覆盖供应链管理、供应链金融、司法存证、电子合同、防伪溯源等方面。每个区块链应用分类下只引入3个有代表性的产品解决方案。方案经开发者委员会审核通过后,将作为BSN官方指定推荐的区块链应用,在BSN的各个渠道进行广泛推荐。第二批指定应用也在紧锣密鼓的上线准备中,如您也想加入BSN官方指定应用,欢迎与社区小助手联系。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/6_application/application_construction_industry_digitalization_jianxinzhuhe.md b/3.x/zh_CN/docs/articles/6_application/application_construction_industry_digitalization_jianxinzhuhe.md new file mode 100644 index 000000000..ecf7c6fcc --- /dev/null +++ b/3.x/zh_CN/docs/articles/6_application/application_construction_industry_digitalization_jianxinzhuhe.md @@ -0,0 +1,49 @@ +# 打造全场景透明管理,建信筑和联手FISCO BCOS助力建造业数字化 + +作者:房少君|建信筑和 CTO + +![](../../../images/articles/application_construction_industry_digitalization_jianxinzhuhe/IMG_5276.PNG) + +公众号对话框回复【建信筑和】获取方案PDF + +随着工业4.0时代持续推进,区块链逐渐挥别纯粹的技术自赏和金融标签,渗透进各类实体产业。 + +在传统建造场景下,行业信息不透明、管理协同性差、信息化水平不高等“痼疾”,使得建造项目的推进过程存在管理难、追责难、监管难、信任难的问题。“区块链+建造”的结合,利用区块链技术,瞄准这些行业痛点,提出了应用层面的切实解决方案。 + +深圳市建信筑和科技有限公司(以下简称:建信筑和)基于FISCO BCOS区块链平台开发的“伊OS透明建造解决方案”,正是区块链技术在建造行业场景化应用的典型代表。 + +该方案凭借全场景管理模式的领先优势,入选区块链服务网络BSN首批官方指定应用,并在工信部中国电子技术标准化研究院主办的2020年第四届中国区块链开发大赛上,斩获桂冠。 + +![](../../../images/articles/application_construction_industry_digitalization_jianxinzhuhe/IMG_5277.JPG) + +## 信息不对称+管理难协同,建造业痛点待破局 + +在传统建造业中,“信息不对称+管理难协同”是制约行业发展的重要因素。建造业上下游链条很长,如果产业链上每个环节的参与者之间信息不透明,无形中提高了工作协同的沟通、管理成本。诸如施工方和设计方对于设计方案的扯皮、各主体间款项账期的节点把控模糊等问题层出不穷,拖慢整体工程进度。同时,信息不透明也使甲方难以实现全流程式管理穿透,管理不及时、不到位为项目埋下了违规风险,进一步推高信任成本,反过来又加重了工作协同难度。 + +在传统行业中,建造业信息化程度一直处于较低水平,建设过程中涉及业主投资方、监管方、代建方、咨询方、设计方、施工方、监理方、运营方等众多单位,同时随着当前各类工程项目投资规模的不断扩大,项目管理和资金监管方面压力大,这些问题制约着建造业生态的健康成长。因此,传统建造业的破局路径之一,就是尽快打破现状,利用信息化手段推动建造业实现项目管理“全场景、全主体、全流程透明协同”,而区块链,则是加速技术化进程的独特手段。 + +在此背景下,建信筑和加入FISCO BCOS区块链开源生态,基于FISCO BCOS区块链技术打造了面向建造行业的全生命周期管理系统——“伊OS透明建造解决方案”,以推进建造行业实现“全场景透明化管理”。该解决方案运用区块链分布式存储/共享、智能合约等技术,与建造行业已有成熟的IT工具如设计软件、造价系统、智慧工地、BIM系统等进行整合,同时结合大数据和人工智能等先进技术,有效破除了行业痛点,构建了一个具有管理穿透、公开透明、信息共享、信用评价的全过程透明建设平台。 + +## 区块链技术助力,建造实现全场景穿透管理 + +“伊OS透明建造解决方案”采取了场景式存证、数字签名、加密算法、智能合约等区块链技术,打破了原有单线任务框架,实现了去中心化的任务协同和数据流转。将原有项目链条(产业链条)上的参与者,例如项目方、设计、施工、勘察、总包、分包、监理、班组等,置于同一任务场景中,不再具有严格的上下游流程关系,原来极易形成彼此掣肘的“物流、资金流、信息流”也能做到有机协同。 + +![](../../../images/articles/application_construction_industry_digitalization_jianxinzhuhe/IMG_5278.PNG) + +同时由于智能合约触发机制的存在,工程资金流向有了明确的监管方向,资金流转的每一步都可透明,这将进一步确保资金使用的合理、合规、合法。同时,工程资金透明也使得工程质量和安全更有保障,形成建造产业良性循环。 + +“伊OS透明建造解决方案”不仅能够实现单项目多标段管理,还可以实现多项目管理,目前已被广泛运用在建造行业,有效提升项目运行效率。截止2020年5月底,伊OS平台上运行项目超300个,参建单位达400多家。在某集团在建的100+个管网项目中,伊OS系统协助项目负责人全面的管理现场施工的过程、进度、质量、安全进行,通过奖惩机制成功落地执行,让项目问题解决率从60%提升到80%。 + +建信筑和CTO房少君表示,区块链技术遇见建造行业,不仅可以对项目全过程实施文件共享、资金监管、工程量申报、质量安全、绩效考核等全场景“俯瞰”,而且能有效点亮原先项目管理、工程结算及资金监管上的“盲区”,“事前任务分布-事中实时监督-事后责任追溯”自此形成了高效协同的有机闭环。 + +## 万字报告选定FISCO BCOS,携手重塑建造信用生态 + +为了有效地打造“伊OS透明建造解决方案”,建信筑和选择了FISCO BCOS。“为了甄选区块链底层平台,我们团队专门做了一份过万字的研究报告,最终选定FISCO BCOS,主要是因为它拥有不可多得的语言优势,生态组件、节点部署和技术支持等都非常丰富、易用和高效。”房少君介绍,在FISCO BCOS技术底层上,建信筑和有效地完成了五大业务场景的系统化构建:场景式存证、工程量申报、资金监管、数据交易确权和票据流转。 + +![](../../../images/articles/application_construction_industry_digitalization_jianxinzhuhe/IMG_5279.PNG) + +基于FISCO BCOS区块链技术的“伊OS透明建造解决方案”能够确保项目实施过程中物流流转和信息流转一一对应、资金流向透明监管、物流全程可追溯和资金到账的高度匹配,不仅是区块链在建造行业中的项目管理流程再造,更是新型“全场景”式管理模式下的信用生态重塑。 + +------ + +**社区长期征集基于FISCO BCOS研发的区块链应用,如果您有正在研发或已经上线的应用,欢迎点击“阅读原文”告诉我们,您的应用值得被更多人看见。** \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/6_application/application_manufacturing_changhong.md b/3.x/zh_CN/docs/articles/6_application/application_manufacturing_changhong.md new file mode 100644 index 000000000..55df7aca5 --- /dev/null +++ b/3.x/zh_CN/docs/articles/6_application/application_manufacturing_changhong.md @@ -0,0 +1,152 @@ +# 长虹启思实验室:制造业生产协同及质量溯源方案 + +作者:启思实验室 + +## 为什么选择生产协同及质量溯源场景? + +我们(下文“我们”均指启思实验室团队)的作品是在生产制造数据信息化的基础上,通过区块链技术,在企业内部建立可信的、合约化信息流,再用多级链打通制造企业供应链和产品下游的数据信息管理,建立多个节点,实现制造企业规则合约执行与数据可信管理,从而达到降低成本、提升效益的效果。 + +说到这,很多朋友可能会好奇,我们为什么选择这个场景切入?首先,启思实验室(由四川长虹电器股份有限公司信息安全实验室的区块链研究小组的成员组成)本身就专注于区块链技术应用研究,且与主流区块链基础技术提供方合作,提供基于区块链的智慧家庭和工业互联网解决方案。同时,在整个工业互联网和5G发展驱动下,传统制造能力面临一次较大程度的迭代升级,团队注意力一直集中在生产制造,力争从中找到突破点,利用区块链技术助力这一波生产制造升级。其次,在传统制造业中,当产品出现质量问题时,往往会面临物料零部件质量无法溯源、难以追责的难点。具体痛点如下图所示:图中A公司为产品公司和销售公司;B公司为A公司产品的委托生产方;供应商C、供应商D和供应商E为A公司的指定物料供应商。 + +![](../../../images/articles/application_manufacturing_changhong/IMG_5273.PNG) + +经过分析和研究,我们梳理了传统制造业中的几大需求: + +**需求1:生产计划和物料匹配自动化** + +B公司根据A公司的订单与现有成品库产品库存,分析出差额后制定生产计划。根据产品的生产数量计算出所需物料。生产物料除去物料库的库存后直接向供应商反馈出所需物料的数量,并且预付款项。 + +**需求2:物料供应商及时响应物料标识上链** + +供应商C、供应商D、供应商E收到物料需求订单,准备发货入库。同时供应商C、供应商D、供应商E的物料匹配唯一标识,信息上链。 + +**需求3:财务可信清算** + +在订单下发、物料采购、物流运送、订单交货等环节建立财务自动按约定清算的机制。 + +**需求4:售后质量溯源** + +售后基于物料唯一标识的可信责任确权和质量溯源,做到及时响应。 + +## 底层选型的几点考量 + +了解需求后,下一步就是技术实现,在底层选型上,团队架构师康红娟主要从以下几点进行考量: + +- 良好的实际可操作性。区块链应用层与实际业务贴合紧密,尤其是在合约层,重新开发部署业务型合约必然会带来反复调试。因此,底层的完备支持,对于项目成功非常重要。 +- 完善的服务层功能组件。用户层与链层的交互,必须经过中间服务层的“嫁接”,而这些“嫁接模块”具备通用性,除了基本的链层功能外,服务层通用组件的完备也至关重要。 +- 友好的开源氛围。对于技术极客而言,最大的快乐就是开源。 + +通过了解评估,团队最终选择了FISCO BCOS作为底层,主要是两方面的原因: + +- FISCO BCOS是安全可控的国产开源联盟链,能很好满足、贴合国内企业的使用需求; +- 社区活跃度高,应用场景丰富,对于开发者的技术支持响应及时。 + +除此之外,FISCO BCOS还具备版本迭代及时、性能强劲、服务中间件丰富等优势。 + +## 智能合约解决方案 + +综上所述,我们从实际业务需求出发,结合区块链技术优势,构建“基础层、核心层、服务层、用户层”等四个关键层级,覆盖核心数据库、业务型合约、数据解析、消息解析、用户管理、业务管理等功能,构建工业互联网领域的订单式生产协同垂直解决方案。 + +本文我们重点分享其中的智能合约方案,方案如下图。这个方案里包括了产品合约、结算合约、生产合约、备货合约和授权合约,下面将对这几个合约逐一展开介绍。 + +![](../../../images/articles/application_manufacturing_changhong/IMG_5274.JPG) + +### 产品合约 + +本合约用于完成产品生产过程中产品注册及产品所有权变更、产品溯源。 + +步骤如下: + +- 完成对相关合约的关系设置; +- 合约的admin向某些address授权成为product生产商; +- product生产商调用updateProductPrice对产品价格进行设定; +- customer需要向生产商下产品生产订单前会先getProductPrice来比对价格的高低,然后通过payment合约向生产商下产品生产订单; +- 生产商通过payment合约获取到订单后,进行产品生产; +- 在生产产品前,生产商会通过Material合约来检查自己的产品原料储备是否充足,如果充足就消耗原料进行产品的生产注册registerProduct上链; +- 产品生产商进行交付,customer确认收到货品,确认订单,完成资金及产品所有权的变更。 + +``` +// 厂商msg.sender更新自己productType产品的价格 +function updateProductPrice(uint256 productType, uint256 newPrice) public +​ +// 获取厂商 _to的productType的价格 +function getProductPrice(address _to, uint256 productType) public view returns(uint256 price) +​ +// 设置供应商的原材料合约 +function setMaterialContract(address _materialContract) public onlyOwner +​ +// 设置支付合约 +function setPaymentContract(address _paymentContract) public onlyOwner +​ +// 产品生产商设置自己产品的批次号,ID,所用材料批次等信息 +function registerProduct(uint256 productType, uint256 id, uint256 batchNumber, uint256[] memory materialBatches) public +​ +// 更换产品所有权,交付产品 +function transferProducts(address from, address to, uint256 productType, uint256 count) public +​ +// 获取产品详情 +function details(uint256 id) public view returns(Product memory) +​ +// 获取msg.sender所拥有的产品数组 +function getMyProducts(uint256 productType) public view returns(uint256[] memory myProductIDs) +​ +// 获取某种产品的原材料用于哪些产品了 +function trace(uint256 materialBatchNum) public view returns(uint256[] memory ids) +``` + +### 结算合约 + +负责用户资产,具体步骤如下: + +- 余额与预付款队列; +- 产品所有权变化(手动确认)过程中的自动结算; +- 资金如果不足,不能进行诸如备货,入库等的操作; +- 充值/直接消费/预付款, 余额查询等相关功能。 + +### 生产合约 + +拥有库存生产个数和已拥有产品队列, 和原材料批次队列: + +- 获取待生产订单,判断原料库存是否满足需求,不满足则通过结算合约向备货合约预付款下生产订单; +- 通过计算原材料队列,外部唯一标识生成,将原材料的批次信息写入产品进行生产(外部)、入库(调用产品合约的生成入口)。对库存生产个数和已拥有产品队列进行维护; +- 出库(外部调用产品合约的产品所有权变更入口),对本合约的生产个数和已拥有产品队列库存合约的已拥有产品队列进行维护,通过结算合约进行结算。 + +### 备货合约 + +负责对上游厂商进行备货: + +- 通过调用生产备货数对厂家B进行备货,计算已有零件数,外部调用零件入库(填入批次,数量等信息); +- 出库(外部调用),将零件信息的批次信息写入到厂家B, 并维护自身数据队列,完成后自动调用结算合约进行结算。 + +补充:因为零件不像产品一物一码,多个零件只对应到某个批次就可以,不需要单独的零件合约对零件进行维护。 + +### 授权合约 + +通过不同的权限等级,对各个合约中的函数进行访问限制,各种合约间角色的约定及调用权限。比如普通用户没有权限去向供货商下订单,而供货商也不可能向普通用户提供生产完成的商品。 + +``` +// address是否有role权限 +function hasRole(bytes32 role, address account) public view returns (bool) +​ +// 获取role权限的成员数 +function getRoleMemberCount(bytes32 role) public view returns (uint256) +​ +// 根据role和index获取成员 +function getRoleMember(bytes32 role, uint256 index) public view returns (address) +​ +// 获取role角色的管理者 +function getRoleAdmin(bytes32 role) public view returns (bytes32) +​ +// 向某个account授予role权限 +function grantRole(bytes32 role, address account) public virtual +​ +// 移除account的role权限 +function revokeRole(bytes32 role, address account) public virtual +​ +// account放弃持有的role权限 +function revokeRole(bytes32 role, address account) public virtual +``` + +## 智能合约解决方案 + +整个智能合约开发过程中,最主要其实是对整个生产流程的梳理。首先我们先进行了需求梳理,然后针对solidity语言开发出一个可用的版本,在此基础上对相关调用建立一个简单的restful服务器,完成对各个接口的测试,有一套完整的可演示流程,最后进行相关开发完成对合约的复现。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/6_application/application_on-chain_collaboration_multiple_enterprises_jianxinzhuhe.md b/3.x/zh_CN/docs/articles/6_application/application_on-chain_collaboration_multiple_enterprises_jianxinzhuhe.md new file mode 100644 index 000000000..ca4aad7a9 --- /dev/null +++ b/3.x/zh_CN/docs/articles/6_application/application_on-chain_collaboration_multiple_enterprises_jianxinzhuhe.md @@ -0,0 +1,72 @@ +# 多企业间如何实现 “链上协同与治理” + +作者:朱立派|区块链资深开发者(深圳市建信筑和科技有限公司 ) + +## 为什么选择企业间多方协同治理场景? + +很多朋友可能会好奇,为什么会有“区块链上的联合公司”这样看起来天马行空的想法?首先,区块链技术很适用于“多方协同治理”场景。多中心化自治组织开放式治理能力体现在任何人只要有相应的凭证,就可以公开行使治理。受此启发,我想基于联盟链实现类似功能:联盟各方都具备事先约定的治理能力,通过区块链技术保证治理过程的公平、公正、公开、可追溯和不可抵赖。其次,公司实际业务往来之间对“多方协同治理”存在真实场景需求。 + +比如一般公司间的业务往来常涉及项目、资金两大类,如果多家公司需要联合管理某个项目,且有资金往来,就可以考虑使用区块链技术实现“链上协同与治理”。大家可保持对项目进展的全局视野一致,同时,任何签字确认的流程都由对应私钥签名后触发,更容易实现责任到人。 + +## 链上协同与治理实现思路 + +各家公司在区块链上以单独的“公司合约”形式存在,只要实现了“公司合约接口”便可自定义公司内部业务逻辑与内部组织关系。公司想要加入联合公司时,首先提出申请,部署自己的“公司合约”;然后由已在联合公司中的成员以新部署的“公司合约地址”作为参数发起提案;在得到联合公司中大多数成员投票通过后,便可以正式成为联合公司中的一员。各家公司参与的项目将单独以“联合项目合约”的形式存在,联合公司内任一家成员公司都可以发起联合项目。 + +首先依据“项目合约接口”开发“联合项目合约”,部署到区块链上;并以“联合项目合约的地址”作为提案中的参数,发起提案;联合公司中每一家公司可以根据提案中的合约地址查看合约,决定是否投票该提案;当得到联合公司中大多数成员公司投票通过后,即成为“联合项目合约”。 + +## 区块链智能合约设计思路与关键逻辑 + +### 合约设计思路 + +在合约设计上,参考了 FISCO BCOS开源社区《[智能合约编写之Solidity的编程攻略](http://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485719&idx=1&sn=2466598f695c56d2865388b7db423196&chksm=9f2efb0ba859721d757cd12f9ff19b3f2af21c00781f31970b1fa156de73d72ca49b12fc0200&scene=21#wechat_redirect)》文章里的思路,采用“数据、管理、控制”分层的设计方法。本智能合约方案主要有三大模块:联合治理模块、公司模块、项目模块,合约交互主要发生在这三大模块的合约之间。 + +![](../../../images/articles/application_on-chain_collaboration_multiple_enterprises_jianxinzhuhe/IMG_5275.PNG) + +- **联合治理模块**:提案与投票系统,联合公司成员管理系统,联合公司间资金流转系统; +- **公司模块**:单个公司管理系统,单个公司内部资金流转系统; +- **项目模块**:多个公司的联合项目管理,单个公司的内部项目管理。 + +其中,“联盟管理模块”集中管理“公司模块”合约和“项目模块”合约,管理机制主要为“投票-注册”;公司合约、项目合约在实现对应接口合约方法的基础上自定义业务逻辑,并以单独合约的形式上链。 + +合约功能上,主要有以下几点: + +- 投票注册功能,只有投票数超过一定比率,新公司才能成为联合公司一员,新项目才能认定为联合项目; +- 项目管理功能,如项目管理员的设置; +- 基于角色的权限控制,自定义角色和权限; +- 资金流转,包括公司之间的资金流转(涉及跨合约调用)和公司内部的资金流转; +- 资金发行功能,依据投票决定是否发行资金。 + +### 关键逻辑的合约代码实现 + +这里介绍项目中一些关键逻辑的合约代码实现,以“存储类智能合约”的所有权转移为例。本项目采取了“存储、逻辑、控制”分层设计的思路,部署者在部署“存储类智能合约”后必须转移合约所有权关系给控制器类智能合约,存储类合约方法如下: + +``` +function transferOwnership(address newOwner) public onlyOwner { +require(newOwner != address(0), "Ownable: new owner is the zero address"); +emit OwnershipTransferred(_owner, newOwner); +_owner = newOwner; +} +``` + +上述“newOwner”参数必须为对应的“控制器合约”地址。这样,“存储类智能合约”通过修饰器“modifier onlyOwner()”保证了只有对应的“控制器智能合约”才可以修改“存储类智能合约”的数据。部署完成后在“控制器合约”中通过如下方法可验证是否已具备“存储类合约”的所有权。 + +``` + +function checkUCOBNodeStorageSafety() public view returns (bool) { +return ucobNodeStorage.owner()==address(this); +} +``` + +控制器类智能合约的代码逻辑可以升级,通过投票来决定是否升级。 + +``` + +function changeUCOBNodeStorageOwner(bytes32 proposalId) public { +require(proposalPassed(proposalId,...)); +... +ucobNodeStorage.transferOwnership(UCOBNodeControllerAddress); +... +} +``` + +当投票通过后,“存储类智能合约”的所有权关系会转移到新的“控制器合约”地址上,数据不变,但是业务逻辑“升级”了。 diff --git a/3.x/zh_CN/docs/articles/6_application/application_online_lending_platforms.md b/3.x/zh_CN/docs/articles/6_application/application_online_lending_platforms.md new file mode 100644 index 000000000..f46769a1d --- /dev/null +++ b/3.x/zh_CN/docs/articles/6_application/application_online_lending_platforms.md @@ -0,0 +1,39 @@ +# FISCO BCOS助力深圳破解网贷良性退出难题 + +读特记者 沈勇 + +FISCO BCOS区块链底层开源平台在金融领域再添重磅应用!落地网贷机构投票系统,有效解决网贷平台良性退出过程中涉众决策难的问题。该系统今年上半年在深圳率先落地,有望推广至全国。 + +以下是深圳成功应用的报道,内容整理自读特新闻。原标题:《深圳成功应用区块链技术破解网贷良性退出难题》 + +------ + +虽然区块链技术热度方兴,而深圳已经成功应用于网贷机构良性退出工作中。记者昨日从深圳地方金融监管局获悉,今年上半年,深圳率先全国推出以区块链技术为核心的P2P网贷机构良性退出统一投票表决系统,至今已在全市20家网贷机构投入应用,导入出借人8万余人,待收本金102亿余元。 + +## 投票系统让万千出借人有了“表决权” + +面对网贷机构退出的兑付方案,普通出借人如何表达自己的意见和诉求?今年上半年,在深圳市、区两级地方金融监管部门的指导和推动下,深圳率先全国推出P2P网贷机构良性退出统一投票表决系统(下称“投票系统”)。 + +该系统是《深圳市网络借贷信息中介机构良性退出指引》(下称《良性退出指引》)的配套技术支持平台,旨在有效解决平台良性退出过程中涉众决策难的问题,为网贷良性退出工作打响了“开山炮”。 + +“P2P网贷机构良性退出面临的首要难题是涉众决策难。”深圳市互联网金融协会秘书长曾光介绍,网贷机构管理的资产权属属于出借人,但出借人数量庞大,分布在全国各地,结构复杂诉求不一,平台与出借人沟通成本高、出借人对平台不信任。 + +为提供涉众决策统一规则,深圳市互联网金融协会率先推出《良性退出指引》,创新设置出借人监督委员会、“三分之二加双过半”的表决规则等一系列良性退出规则要求。 + +在《良性退出指引》基础上,再度推出“网贷机构投票系统”,使涉及出借人重大利益事项的投票表决成为可能。“在以前的出借人表决实际操作中,往往通过微信群、QQ群、社交网站的投票软件,少数代表的现场会等形式进行投票,其合法性和公正性倍受质疑,执行过程也常有反复。”曾光介绍,在此情况下,新的投票系统为出借人提供投票表决服务,致力于实现公平、公开、透明的投票表决环境。出借人监督委员会负责对相关事项进行审核监督,网贷机构授权协会提供信息披露及投票表决服务。 + +记者了解到,目前深圳市已经有20家网贷机构使用投票系统。曾光介绍,“使用投票系统的大部分网贷机构都按照《退出指引》要求,积极推动了第一次重大事项投票表决,确认退出流程,选举监委会成员并对清退组和监委会授权。”另外部分平台已通过投票系统完成第二轮投票表决事项,各平台的良性退出工作进展有序。 + +## **区块链技术好钢用在刀刃上** + +宝剑锋从磨砺出,区块链技术的应用,正是“网贷机构投票系统”破解涉众决策难的刀锋。据悉,投票系统是基于FISCO BCOS区块链开源底层平台搭建,同时引入人工智能、生物识别、数字认证等多项国内领先技术,拥有完全自主知识产权。 + +FISCO BCOS区块链开源底层平台由金融区块链合作联盟(深圳)(简称“金链盟”)开源工作组牵头推出。FISCO BCOS代码已于2017年完全开源并持续迭代更新,目前其开源社区拥有上万名社区成员,超过500家企业参与,成功落地超过60个生产环境应用案例,已经发展成为最大最活跃的国产联盟链开源生态圈。 + +网贷机构投票系统在设计中成功运用了该平台的技术成果,并融合多项其他前沿技术,集中打造了纯线上、智能化、政府和金融机构共同参与、具备司法仲裁效力的多功能投票决策系统。 + +首先,投票系统引入智能语音交互机器人和线上人脸识别技术,搭建投票人身份标识链,记录投票人身份标识。一方面,通过利用机器人与出借人进行语音交互,确认债权信息并留存语音记录;另一方面,利用人脸识别和数字证书认证方式确认出借人身份,并将投票人的身份标识记载上区块链,既可防止投票过程中存在他人伪冒的情况,又避免了将投票人的全部敏感信息上链,在保护用户隐私的同时,确保了投票结果的公信力。 + +其次,投票系统充分利用区块链技术防篡改、去中心化的技术优势,搭建司法存证仲裁链。通过将所有投票记录和结果的数据摘要在链上进行记录,同样在保障用户隐私情况下,使得每笔投票结果准确被记录且无法被篡改;同时,每笔存证均有权威仲裁机构参与链上司法存证,从法律角度确保了投票结果的证据保存,最终保障了全过程投票数据的司法有效和真实可信。 + +最后,投票系统还搭建了独立的投票验证服务,任何人都可以通过此服务,来验证投票系统的数据和区块链上存证的数据,是否一致,从而从每个人的角度监督整个投票过程,增强投票结果的公信力。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/6_application/application_people_copyright.md b/3.x/zh_CN/docs/articles/6_application/application_people_copyright.md new file mode 100644 index 000000000..d23eb4689 --- /dev/null +++ b/3.x/zh_CN/docs/articles/6_application/application_people_copyright.md @@ -0,0 +1,40 @@ +# “人民版权”存证原创新闻超200万篇 | FISCO BCOS应用案例 + +**FISCO BCOS开源社区公众号回复【案例】,下载FISCO BCOS最新案例精编** + +2019年7月,基于FISCO BCOS区块链底层技术研发的一站式版权管理平台“人民版权”正式上线。至2020年第一季度,该平台在版权原创存证、侵权监测、司法维权方面取得一系列成果: + +**“人民版权”已为超过200万篇新闻稿件进行版权存证;可自动识别的新闻数超过1亿条,相当于3年的新闻总量;全网监测数据量日均近300万条, 全年总监测量超过10亿条。** + +目前,“人民版权”已经通过国家网信办境内区块链信息服务备案。未来,平台将持续通过区块链、人工智能等创新技术与知识产权保护深度融合,对抗侵权问题,助力构建版权保护新生态。 + +### 区块链助力版权保护 存证新闻报道200万篇 + +近年来,近六成原创媒体作者遭遇过内容侵权,原创稿件被侵权频次高达每篇作品3.64次。网络的虚拟性使得侵权行为难以被及时发现和识别;网络的即时性和裂变传播,令侵权的发展更为迅速,为版权溯源、取证维权也带来了困难。 + +“人民版权”利用区块链技术的完整性、可追溯性、不可篡改性等特点,综合应用基于区块链的分布式身份解决方案WeIdentity,实现了数字作品链上信息追溯和全网数据监测在内的版权保护全流程管理。 + +自上线以来,“人民版权”已为2,030,890篇原创新闻报道进行了版权存证保护。全网实时对比监测稿件量达日均2,871,903篇,全年总监测量超过10亿条。识别采集媒体总量达9,988,781家,覆盖了将近全部的电子报刊、网络媒体以及主流客户端。海量信息的实时监测,为快速识别侵权转载并取证上链提供了前提。 + +### 首创梯度化司法服务 低成本完成侵权诉讼 + +“人民版权”首创“梯度化司法综合服务”。面向数字版权维权需求,“人民版权”提供了一套创新司法服务,形成了包含互联网法院、公证、司法鉴定、律师、仲裁为一体的权威司法梯度化服务体系,为版权保护在数权时代的司法维权奠定坚实基础。 + +此外,与传统的维权模式相比,“人民版权”采用电子证据管理、线上调解、互联网法院诉讼等新模式,以智能电子化代替传统人工模式降低成本,用传统版权服务1/2的价格便可完成确权、维权全流程,帮助用户以最小成本、最高效率维权,提升版权维权的司法效率。 + +今年初,“人民版权”还正式接入了北京互联网法院“天平链”电子证据平台,成为首个实现版权存证、侵权监测、线上版权交易、司法维权全链条打通的媒体版权平台。 + +### 媒体年交易额可达百万 打造线上最大版权交易平台 + +“人民版权”平台将版权交易环节引入线上。版权交易中心利用区块链技术对内容生产传播全流程的记录,能够进一步帮助媒体实现在信息分发链条上的价值再分配。据悉,线上引入交易环节,媒体单位版权交易年均收益额预估可达七百万元,市场效益可观。 + +目前,“人民版权”平台已经完成北京歌华有线电视网络股份有限公司、山东数字出版传媒有限公司、微众银行等五大一级节点接入。2019年10月,“北京云·融媒体”成为第一家接入“人民版权”的省级融媒体平台。同时,人民在线/人民网舆情数据中心发起的“人民版权联盟”已有100多家党媒正在对接中。 + +“人民版权”运用区块链、大数据与AI 识别等创新技术,即将实现视频版权保护功能。目前,“人民版权”正在与西部国家版权交易中心、北方国家版权交易中心、中广电传媒有限公司等进行视频版权方面的合作,携手共促视频版权生态的良性发展。 + +文章来源:人民网 + +- [FISCO BCOS代码仓库](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0) + +- [WeIdentity代码仓库](https://github.com/WeBankFinTech/WeIdentity) + diff --git a/3.x/zh_CN/docs/articles/6_application/application_westlake_longjingtea_yifei.md b/3.x/zh_CN/docs/articles/6_application/application_westlake_longjingtea_yifei.md new file mode 100644 index 000000000..6854d18bf --- /dev/null +++ b/3.x/zh_CN/docs/articles/6_application/application_westlake_longjingtea_yifei.md @@ -0,0 +1,95 @@ + +# “数字贡牌”西湖龙井茶 5G+ 区块链溯源体系 + +作者:易飞|天演维真 CTO + +##
***01 项目背景*** +#### 1.1 业务需求 + +西湖龙井是十大名茶之首,也是杭州独具特色名片之一。位于龙井村狮峰山脚下之龙井路上的杭州西湖龙井茶叶有限公司,是一家实力雄厚,颇具规模的西湖龙井茶生产企业。公司打造的“贡”牌西湖龙井,作为国家的礼茶,在国内外享有盛誉。希望通过数字化转型利用前沿技术,打破传统茶叶产业链格局,逐步朝着数字化、智慧化发展 。 + +
+ + +
+ +#### 1.2 解决方案 +- 建立以打造“数字贡牌”为目标,围绕品种保护、生态茶园、生产管理、茶文旅等方面,构建“数字贡牌”产业数字化基础,运用物联网、区块链、5G等技术作为“数字贡牌”建设的技术支撑。用数字赋能产业,提升产业价值。 + +- 建立“数字茶园”、“数字生产”、“数字展示”等三大数字化体系,可为生产经营、监管服务、决策分析提供多维度、多场景的品牌建设服务,实现“用数据说话、用数据决策、用数据管理、用数据创新”,用数据赋能“数字贡牌”品牌建设。 + +##
***02 技术方案*** +
+ +
+ +#### 2.1 数字茶园 +- 气象环境监测 +- 土壤墒情监测 +- 可视化视频监控 +- 病虫害监测预警 + +
+ + +
+ +#### 2.2 数字生产-生产计划管理 +生产计划管理系统是对企业计划的管理,具体包括制定计划、执行计划、完成计划等三方面的工作。企业生产计划主要分为田间管理计划、灌溉计划、植保计划、施肥计划、采收计划等方面。只有制定生产计划,企业才能合理安排产品生产过程的操作与管理。 +
+ +
+ +#### 2.3 数字生产-种植管理 +系统实现对种植产品种植过程提供专业和标准的生产档案信息表格,生产档案按照茶树特点和生产标准及企业标准进行定制,按照企业生产批次采集生产档案,实现生产档案数据的完整性,确保企业的每一个生产批次都有据可查。 + +
+ +
+ +#### 2.4 数字展示-大数据平台 +
+ +
+ +#### 2.5 数字展示-溯源 +
+ +
+ +##
***03 区块链 + 溯源*** +#### 3.1 什么是溯源 +
+ +
+ +#### 3.2 如何溯源 +消费者买到产品后,只需扫一扫产品上的二维码身份证,即可了解产品源产地、生产者、种养殖信息、农药施肥信息各类检测和流通信息、生产企业、产品品牌故事等。 +
+ +
+ +#### 3.3 业务痛点 +有了追溯体系,每件地方特色产品从哪来到哪去,中间经过哪些流通环节,皆可全程跟踪溯源 +
+ +
+ +#### 3.4 区块链 + 溯源 +
+ +
+利用区块链的去中心化和防篡改的特性。将农产品溯源的过程数据上链。当溯源过程数据上链后,数据将被痕迹化且不可篡改,这样可以有效的证明溯源数据的真实有效。 + +##
***04 技术探讨*** +#### 4.1 区块链+IoT +通过IoT设备自动化采集农情数据,对比传统的人工填报方式,从源头上保障了过程数据来源真实性,基于BSN联盟链,我们通过智能合约机制进行数据上链,保障了上链过程的透明化,同时基于拜占庭容错的共识机制实现数据防篡改。在面向消费者的溯源码中,“兴农码”基于一品一码模式,为每一份茶叶商品提供了具有全球唯一标识的区块链认证证书,电子证书中详细记录了茶叶种植过程各个环节的上链数据hash,上链时间戳等信息, 证书中的全过程溯源数据都存储于BSN联盟链的城市节点上,通过“物链网”解决方案区块链+溯源应用的落地性得到了很大提升。 +
+ +
+ +#### 4.2 5G、AI技术融合 +
+ +
+ diff --git a/3.x/zh_CN/docs/articles/6_application/industry_application_case.md b/3.x/zh_CN/docs/articles/6_application/industry_application_case.md new file mode 100644 index 000000000..a2d5c0938 --- /dev/null +++ b/3.x/zh_CN/docs/articles/6_application/industry_application_case.md @@ -0,0 +1,138 @@ +# 区块链已革新哪些行业?附应用案例下载 + +据新华社10月25日晚消息,中共中央政治局10月24日下午就区块链技术发展现状和趋势进行第十八次集体学习。中共中央总书记习近平在主持学习时强调,区块链技术的集成应用在新的技术革新和产业变革中起着重要作用。**我们要把区块链作为核心技术自主创新的重要突破口,明确主攻方向,加大投入力度,着力攻克一批关键核心技术,加快推动区块链技术和产业创新发展。** + +**报道指出,区块链技术应用已延伸到数字金融、物联网、智能制造、供应链管理、数字资产交易等多个领域。** + +作为集实践大成的开源底层平台,FISCO BCOS自2017年开源以来,已汇集上万名社区成员、超1000家企业及机构共同参与区块链产业生态构建,在各行各业广泛落地成熟应用案例,包括政务、金融、公益、医疗、教育、交通、版权、商品溯源、供应链、招聘、农业、社交、游戏等。 + +我们甄选其中较为典型的应用场景出品区块链应用案例精编,带您迅速了解区块链的行业应用现状和前景。 + +**[FISCO BCOS开源社区】公众号后台回复“案例”,可下载高清全本。** + +## 《FISCO BCOS案例精编》全文 + +![](../../../images/articles/industry_application_case/IMG_5117.JPG) + +![](../../../images/articles/industry_application_case/IMG_5118.PNG) + +![](../../../images/articles/industry_application_case/IMG_5119.PNG) + +![](../../../images/articles/industry_application_case/IMG_5120.PNG) + +![](../../../images/articles/industry_application_case/IMG_5121.PNG) + +![](../../../images/articles/industry_application_case/IMG_5122.PNG) + +![](../../../images/articles/industry_application_case/IMG_5123.PNG) + +![](../../../images/articles/industry_application_case/IMG_5124.PNG) + +![](../../../images/articles/industry_application_case/IMG_5125.PNG) + +![](../../../images/articles/industry_application_case/IMG_5126.PNG) + +![](../../../images/articles/industry_application_case/IMG_5127.PNG) + +![](../../../images/articles/industry_application_case/IMG_5128.JPG) + +![](../../../images/articles/industry_application_case/IMG_5129.PNG) + +![](../../../images/articles/industry_application_case/IMG_5130.PNG) + +![](../../../images/articles/industry_application_case/IMG_5131.PNG) + +![](../../../images/articles/industry_application_case/IMG_5132.PNG) + +![](../../../images/articles/industry_application_case/IMG_5133.PNG) + +![](../../../images/articles/industry_application_case/IMG_5134.PNG) + +![](../../../images/articles/industry_application_case/IMG_5135.PNG) + +![](../../../images/articles/industry_application_case/IMG_5136.PNG) + +![](../../../images/articles/industry_application_case/IMG_5137.PNG) + +![](../../../images/articles/industry_application_case/IMG_5138.PNG) + +![](../../../images/articles/industry_application_case/IMG_5139.PNG) + +![](../../../images/articles/industry_application_case/IMG_5140.PNG) + +![](../../../images/articles/industry_application_case/IMG_5141.PNG) + +![](../../../images/articles/industry_application_case/IMG_5142.PNG) + +![](../../../images/articles/industry_application_case/IMG_5143.PNG) + +![](../../../images/articles/industry_application_case/IMG_5144.PNG) + +![](../../../images/articles/industry_application_case/IMG_5145.PNG) + +![](../../../images/articles/industry_application_case/IMG_5146.PNG) + +![](../../../images/articles/industry_application_case/IMG_5147.JPG) + +![](../../../images/articles/industry_application_case/IMG_5148.JPG) + +![](../../../images/articles/industry_application_case/IMG_5149.JPG) + +![](../../../images/articles/industry_application_case/IMG_5150.PNG) + +![](../../../images/articles/industry_application_case/IMG_5151.JPG) + +![](../../../images/articles/industry_application_case/IMG_5152.JPG) + +![](../../../images/articles/industry_application_case/IMG_5153.PNG) + +![](../../../images/articles/industry_application_case/IMG_5154.JPG) + +![](../../../images/articles/industry_application_case/IMG_5155.PNG) + +![](../../../images/articles/industry_application_case/IMG_5156.PNG) + +![](../../../images/articles/industry_application_case/IMG_5157.PNG) + +![](../../../images/articles/industry_application_case/IMG_5158.JPG) + +![](../../../images/articles/industry_application_case/IMG_5159.PNG) + +![](../../../images/articles/industry_application_case/IMG_5160.PNG) + +![](../../../images/articles/industry_application_case/IMG_5161.PNG) + +![](../../../images/articles/industry_application_case/IMG_5162.PNG) + +![](../../../images/articles/industry_application_case/IMG_5163.PNG) + +![](../../../images/articles/industry_application_case/IMG_5164.PNG) + +![](../../../images/articles/industry_application_case/IMG_5165.PNG) + +![](../../../images/articles/industry_application_case/IMG_5166.PNG) + +![](../../../images/articles/industry_application_case/IMG_5167.PNG) + +![](../../../images/articles/industry_application_case/IMG_5168.PNG) + +![](../../../images/articles/industry_application_case/IMG_5169.PNG) + +![](../../../images/articles/industry_application_case/IMG_5170.PNG) + +![](../../../images/articles/industry_application_case/IMG_5171.PNG) + +![](../../../images/articles/industry_application_case/IMG_5172.PNG) + +![](../../../images/articles/industry_application_case/IMG_5173.PNG) + + +## 案例征集 + +如果您有应用案例或应用计划,敬请通过公众号联系我们,FISCO BCOS开源社区将给予资源、技术等全方位支持。 + +## 关于我们 + +FISCO BCOS是首个由国内企业主导研发、对外开源、安全可控的企业级金融联盟链底层平台,为各行各业开展区块链应用提供可靠、免费的基础设施,源码在github完全开放:https://github.com/fisco-bcos,欢迎下载体验。 + +平台由金融区块链合作联盟(深圳)(简称:金链盟)成立的开源工作组协作打造,于2017年12月正式对外开源,工作组成员包括博彦科技、华为、深证通、神州数码、四方精创、腾讯、微众银行、亦笔科技和越秀金科等金链盟成员机构。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/articles/7_community/group_deploy_case.md b/3.x/zh_CN/docs/articles/7_community/group_deploy_case.md new file mode 100644 index 000000000..42f160fb4 --- /dev/null +++ b/3.x/zh_CN/docs/articles/7_community/group_deploy_case.md @@ -0,0 +1,313 @@ +# 多机部署-单群组双机构双节点组网模式实战 + +作者:蒲沧龙(肖越)|上海对外经贸大学区块链与应用研究中心成员 + +## 0.需求分析 + +有两台服务器,那么每台机子下一个机构生成一个节点,两个连一块,即:双机构双节点单群组。 + +## 1.下载安装运维部署工具 + +> *这里假设机子上什么都没有,因为使用源码编译客户端的用户不用最后一步* + +下载 + +``` bash +cd ~/ && git clone https://github.com/FISCO-BCOS/generator.git +``` + +安装(此操作要求用户具有sudo权限) +``` bash +cd ~/generator && bash ./scripts/install.sh +``` + +检查是否安装成功,若成功,输出 usage: generator xxx + +``` bash +./generator -h +``` + +获取节点二进制 +拉取最新fisco-bcos二进制文件到meta中 + +```bash +./generator --download_fisco ./meta +``` + +检查二进制版本 + +若成功,输出 FISCO-BCOS Version : x.x.x-x + +```bash +./meta/fisco-bcos -v +``` + +这里遇到的问题是,二进制文件拉取贼慢。 +然后我再本机把generator克隆下来,发现是: + +![](../../../images/articles/group_deploy_case/3.png) + +工具类的download_fisco函数这里卡主了。没有cdn的朋友可以vim修改下这个url为: + +```bash +fisco官方cdn: +https://www.fisco.com.cn/cdn/fisco-bcos/releases/download/ +or直接下载: +https://xiaoyue-blog.oss-cn-hangzhou.aliyuncs.com/fisco-bcos.tar.gz +``` + +这是俺的OSS,开放使用师傅们轻点敲啊。 + +一秒不到就下完了。然后这个就是装好了: + +![](../../../images/articles/group_deploy_case/4.png) + +--- + +## 2.联盟链初始化 + +来康康拓扑图: + +![](../../../images/articles/group_deploy_case/1.png) + +因为官方教程是在一个机子上配的,是节点1,2。分起来的话实际上没有1,2之分的。因为是在两台机子上,也不会存在端口冲突的情况。如果端口没有打开可能会报错,这边建议把两台机子添加白名单就行了。详情可参考:[FSICO BCOS多机部署之端口开放](https://blog.csdn.net/xiaoyue2019/article/details/107401334) + +|机构|节点|rpc端口|channel端口|p2p端口| +|---|---|---|---|---| +|机构A|节点1|8545|20200|30300| +|机构B|节点2|8545|20200|30300| + +### 2.1 机构初始化 + +初始化机构AB + +```bash +cd ~/generator +cp -r ~/generator ~/generator-A +cp -r ~/generator ~/generator-B +``` + +### 2.2 链初始化 + +生成链证书ca.crt&链私钥ca.key + +```bash +./generator --generate_chain_certificate ./dir_chain_ca +``` + +链证书和链私钥在`./dir_chain_ca` + +--- + +## 3.构建群组 + +### 3.1 初始化机构A + +生成机构A的证书 + +```bash +./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyA +``` + +证书授权机构将机构证书发送给机构,机构放到meta目录下面 + +```bash +cp ./dir_agency_ca/agencyA/* ~/generator-A/meta/ +``` + +### 3.2 初始化机构B + +生成机构B的证书 + +```bash +./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyB +``` + +证书授权机构将机构证书发送给机构,机构放到meta目录下面 + +```bash +cp ./dir_agency_ca/agencyB/* ~/generator-B/meta/ +``` + +### 3.3 机构A修改配置文件 + +进入机构A修改node_deployment.ini节点配置文件、生成节点配置文件夹。 + +```bash +cd ~/generator-A +cat > ./conf/node_deployment.ini< ./conf/node_deployment.ini< ./conf/group_genesis.ini<< EOF +[group] +group_id=1 +;i am xiaoyue +;my blog-s cnmf.net.cn +;yea i love you~ +[nodes] +node0=you_ip:30300 +node1=you_ip_b:30300 +EOF +./generator --create_group_genesis ./group +``` + +把group1的创世区块发送给B机构 + +```bash +cp ./group/group.1.genesis ~/generator-B/meta +``` + +## 3.8 机构A生成所属节点 + +生成机构A的节点 + +```bash +cd ~/generator-A +./generator --build_install_package ./meta/peersB.txt ./nodeA +``` + +启动节点 + +```bash +bash ./nodeA/start_all.sh +``` + +上面有两个需要注意的地方: +1. 在生产节点配置文件和创世区块配置文件时端口一致是没问题的,因为我不在一台机子上做测试,不会存在端口冲突的情况。但这样在复制B机构到B机子上的时候跑不起来就很尴尬。 +2. rpc的ip默认是127.0.0.1,如果硬要开启的话会报警告: + +![](../../../images/articles/group_deploy_case/6.png) + +如果非要开启rpc测试的话,也可以参照上面说的开启防火墙ip白名单。 + +--- + +## 4.B机构转移并生成节点 + +压缩:`tar cvf B.tar generator-B` +解压:`tar xvf B.tar` +然后上传下载操作 + +### 4.1 生成&启动节点: + +```bash +./generator --build_install_package ./meta/peersA.txt ./nodeB +``` + +机构B启动节点: + +```bash +bash ./nodeB/start_all.sh +``` + +--- + +### Z.查看共识状态 + +```bash +tail -f ./node*/node*/log/log* | grep +++ +``` + +正确回显如下: + +![](../../../images/articles/group_deploy_case/5.png) + +这里还有一个问题。就是上面说的对自己自信不进行测试,导致ip输错了导致共识失败,这时候是没有回显的。把后面的正则删掉就行了。能看到日志报错,通过报错去找不能共识的原因。 + +--- + +你可以从以下方式联系到我: + +**Blog:** [https://cnmf.net.cn/](https://cnmf.net.cn/) + +**GitHub:** [https://github.com/xiaoyue2019](https://github.com/xiaoyue2019) + +**CSDN:** [https://blog.csdn.net/xiaoyue2019](https://blog.csdn.net/xiaoyue2019) + +欢迎来俺们社区吹水鸭: + +![](../../../images/articles/group_deploy_case/7.bmp) + +*参考:* diff --git a/3.x/zh_CN/docs/articles/7_community/suibe_blockchain_center_toolbox.md b/3.x/zh_CN/docs/articles/7_community/suibe_blockchain_center_toolbox.md new file mode 100644 index 000000000..4d557f092 --- /dev/null +++ b/3.x/zh_CN/docs/articles/7_community/suibe_blockchain_center_toolbox.md @@ -0,0 +1,130 @@ +# 开发者如何善用小工具提速应用开发效率 + +作者:上海对外经贸大学区块链技术与应用研究中心 + +## 为什么做区块链开发工具箱? + +我们(下文“”我们“均指上海对外经贸大学区块链技术与应用研究中心)注意到,区块链开发者在区块链学习和开发过程中,往往面临以下四个痛点: + +- 开发工具繁杂:目前区块链相关的各类开发工具错综复杂,需要占用开发者较多时间熟悉、学习各类工具,影响开发效率。 +- IDE功能简单:智能合约开发/区块链开发IDE尚处于早期阶段,功能相对简单,对开发者不够友好。 +- 系统学习资料缺乏:当前可供开发者学习的各种资料良莠不齐,且比较零散,缺乏系统性。 +- 学习成本高:现阶段智能合约开发/区块链开发IDE更多是面向有一定基础的专业人士,对初学者有一定学习成本。 + + + +因此我们有了这样的想法:能不能做一个集成性强、方便快捷的区块链开发工具箱,来解决区块链开发者在学习和开发过程遇到的这些常见问题? + + + +## 区块链开发工具箱实现思路 + +相对于传统计算机领域的开发工具,区块链开发存在开发工具多、杂、许多功能需要使用特定的工具或者需要自己手动开发工具等问题。因此,我们研发的区块链开发工具箱共由4个部分组成——1个工具箱+2个子平台+1个CA系统,通过该工具箱集成多种功能,解决开发过程中经常遇到的问题,最终目标是实现使用一个主流编译器(如Remix)+一个开发工具箱即能完成整个区块链应用开发流程。 + + + +- 1个工具箱:指区块链开发工具箱,该工具箱可配合主流IDE使用,为开发者提供一些在开发过程中经常会用到的服务,如模拟地址生成、数据转换、区块链配置文件智能生成等。 +- 2个子平台:分别为多用户可运行图书馆、多链虚拟控制台。多用户可运行图书馆可以为开发者提供在线学习智能合约、联盟链、共识算法等区块链文章与书籍等,同时也支持开发者自行生产内容;多链虚拟控制台则可以帮助开发者通过Web访问各主流区块链的虚拟控制台。 +- 1个CA系统:基于WeIdentity 的 CA 系统,负责用户账户管理、用户行为记录与奖励等。 + +*WeIdentity是一套基于区块链的分布式多中心的技术解决方案,提供分布式实体身份标识及管理、可信数据交换协议等一系列的基础层与应用接口,可实现实体对象(人或物)数据的安全授权与交换,由微众银行自主研发并完全开源。 + +github地址: + +技术文档: + + + +![](../../../images/articles/suibe_blockchain_center_toolbox/0.jpg) + + + + + +## 区块链开发工具箱主要功能 + +一起来看一下区块链开发工具箱各组成部分的主要功能。 + +- **开发者工具箱** + +该工具箱力求覆盖整个区块链开发环节,缩短开发周期,提升开发者效率与舒适度。 + +以FISCO BCOS开发全环节举例: + +**-启链阶段** + +区块链应用开发时通常需要先启动一条测试链,此时开发者可使用工具箱>配置文件智能生成工具,快速生成区块链网络的配置文件。 + +**-区块链网络情况监测** + +启动测试链后,可通过工具箱>区块链网络情况监测,一键监测区块链网络是否正常运行。 + +**-合约案例库** + +编写智能合约前,可使用工具箱>合约案例库,查找是否有其它合约已实现相同或者相似的功能,避免重复造轮子。 + +**-地址生成、模拟数据生成、数据转换、签名验证** + +合约开发过程中,通过工具箱提供的各类生成、转换、验证功能进行开发调试。 + +**-性能测试工具** + +开发完成后,通过工具箱>性能测试工具,测试代码性能并进行调优。 + +![](../../../images/articles/suibe_blockchain_center_toolbox/1.png) + +目前工具箱已实现或规划实现如下功能:地址生成、模拟数据生成、数据转换、签名验证、配置文件智能生成、区块链网络情况监测、合约案例库、区块链网络管理、性能测试工具等。 + + + +- **多用户可运行图书馆** + +多用户可运行图书馆以JupyterHub为开发基础,集成多种语言内核,如Python、Java等,可支持Ipynb格式图书的上传、阅读或运行书中代码。 + +它可以帮助用户快速上手区块链开发。例如,某用户想在该图书馆中进行学习,他可以在图书馆公共知识库中找到自己感兴趣的内容,如《联盟链技术入门指南》,并通过文字+可运行代码的方式进行学习和操作;同时也可以将自己的学习笔记提交到公共知识库,反哺社区。 + +对团队而言,团队可共同运维一个内部共享的图书馆,所有成员可以在该图书馆上共享书籍、文章等,激活群体学习效能,解决孤立学习效率低下、新人培训成本高等问题。 + +![](../../../images/articles/suibe_blockchain_center_toolbox/2.png) + + + +- **多链虚拟控制台** + +区块链开发者在初学阶段,并不一定需要自己去建一条链,因为目前能支持快速建链的区块链底层并不多,大部分底层平台建链还是一个比较繁琐的操作。 + +多链虚拟控制台可以提供这样的功能:开发者可以和他人共同使用一条测试链,通过web访问虚拟控制台并进行开发,当有多个开发者需要通过控制台在同一条测试链进行开发时,只需访问在线多链虚拟控制台即可。 + +目前已支持通过web访问FISCO BCOS控制台。 + +![](../../../images/articles/suibe_blockchain_center_toolbox/3.png) + +- **CA系统** + +区块链开发工具箱CA系统基于区块链技术,对用户在多用户可运行图书馆的学习行为、学分奖励、电子证书等进行记录和管理。通过该系统,用户各项学习数据一目了然,结合电子政府和学分奖励系统,可以激励用户更积极地进行学习,反哺社区。 + +目前已实现或规划实现如下功能:基于WeIdentity的DiD数字身份、用户学习行为记录、学分奖励系统、基于区块链的电子证书等。 + + + +这套区块链开发工具箱已完全开源,并贡献给FISCO BCOS开源社区,目前项目正在持续完善中,我们也非常期待社区各路开发朋友能一起拥抱开源,携手共建项目,更多详情欢迎通过项目github主页了解: + + + +## 嘉宾Q&A + +**Q: 在做底层技术选型时,您主要考虑哪些因素?** + +**A:** 一方面,我觉得需要考虑底层技术主导公司的界限感。区块链技术和其它传统技术有一个很大不同是:区块链生态建设不仅要靠主导公司努力,更要靠各方参与,如果底层技术主导公司没有设定好界限,什么都做了,其它人只能承担用户的角色,其实是有悖区块链精神的。 + + + +另一方面,底层技术需要有足够的兼容性,因为大家不会把自己绑死在某个底层平台上,所以底层平台所采用的的技术最好不被该平台所独占,例如Solidity智能合约目前很多链都在用,选择区块链底层技术框架的时候,是否支持Solidity就是很重要的参考指标。 + +抛开上述所说的选型要考虑的两点,FISCO BCOS最大的优势在于战略方向正确。很多细节问题可以持续优化完善,但战略方向是否正确,是这个技术底层平台是否有发展前景的重点。 + + + +**Q:对于国内开源的发展,您怎么看?** + +**A:** 在这次第四届中国区块链开发大赛的参赛过程中,我们在作品准备过程中得到了FISCO BCOS开源社区很好的支持和帮助,这其实就是开源精神的一种体现。目前国内开源发展尚处于起步阶段,给开发者们带来了机遇与红利,但还有很多有意思的开源玩法有待尝试,希望开源爱好者们能一起加油,促进国内开源生态与开源精神的发展。 diff --git "a/3.x/zh_CN/docs/articles/7_community/\346\231\272\346\205\247\345\233\255\345\214\272\345\214\272\345\235\227\351\223\276\345\273\272\350\256\276/\346\212\200\346\234\257\346\236\266\346\236\204.png" "b/3.x/zh_CN/docs/articles/7_community/\346\231\272\346\205\247\345\233\255\345\214\272\345\214\272\345\235\227\351\223\276\345\273\272\350\256\276/\346\212\200\346\234\257\346\236\266\346\236\204.png" new file mode 100644 index 000000000..013593ddd Binary files /dev/null and "b/3.x/zh_CN/docs/articles/7_community/\346\231\272\346\205\247\345\233\255\345\214\272\345\214\272\345\235\227\351\223\276\345\273\272\350\256\276/\346\212\200\346\234\257\346\236\266\346\236\204.png" differ diff --git "a/3.x/zh_CN/docs/articles/7_community/\346\231\272\346\205\247\345\233\255\345\214\272\345\214\272\345\235\227\351\223\276\345\273\272\350\256\276/\346\225\260\346\215\256\346\236\266\346\236\204.png" "b/3.x/zh_CN/docs/articles/7_community/\346\231\272\346\205\247\345\233\255\345\214\272\345\214\272\345\235\227\351\223\276\345\273\272\350\256\276/\346\225\260\346\215\256\346\236\266\346\236\204.png" new file mode 100644 index 000000000..9b89c399c Binary files /dev/null and "b/3.x/zh_CN/docs/articles/7_community/\346\231\272\346\205\247\345\233\255\345\214\272\345\214\272\345\235\227\351\223\276\345\273\272\350\256\276/\346\225\260\346\215\256\346\236\266\346\236\204.png" differ diff --git "a/3.x/zh_CN/docs/articles/7_community/\346\231\272\346\205\247\345\233\255\345\214\272\345\214\272\345\235\227\351\223\276\345\273\272\350\256\276/\346\226\260\350\207\264\345\214\272\345\235\227\351\223\276.md" "b/3.x/zh_CN/docs/articles/7_community/\346\231\272\346\205\247\345\233\255\345\214\272\345\214\272\345\235\227\351\223\276\345\273\272\350\256\276/\346\226\260\350\207\264\345\214\272\345\235\227\351\223\276.md" new file mode 100644 index 000000000..594c84ec8 --- /dev/null +++ "b/3.x/zh_CN/docs/articles/7_community/\346\231\272\346\205\247\345\233\255\345\214\272\345\214\272\345\235\227\351\223\276\345\273\272\350\256\276/\346\226\260\350\207\264\345\214\272\345\235\227\351\223\276.md" @@ -0,0 +1,37 @@ +## 新致区块链 - 数字智慧园区的可信基石 +作者:刘靖毅 | 上海新致软件 -- 项目总监 + +### 智慧园区发展的现状分析 +  智慧园区的信息化建设是个系统化工程,区块链技术需要从实际需求来考虑应用方案,利用创新方式来完成技术进阶。 +因此,挖掘区块链优势与特点,将区块链技术应用到智慧园区建设中就至关重要。 +  数字智慧园区发展多年,各式各样的园区越来越多。数字园区发展迅猛主要得益于以下因素:从经济因素看,下游行业发展迅猛,促进园区快速发展;政治因素来看,“十三五规划”中智慧园区被提出,最近几年获得政策支持,因此得以快速发展。从技术来看,大数据、 AI、 5G等前沿技术已经从一线城市慢慢渗透到二、三线甚至四线城市的园区建设中,所以数字智慧园区建设整体发展势头还是比较迅猛。 +  面对如此迅速的发展,国内的数字智慧园区发展仍然存在一些痛点,主要体现在: +- 首先,各大园区地域上比较分散,信息孤岛问题比较严重。此外,过去建设中堆积大量的应用系统,包括硬件系统、物联网软件等,有传统的也有新建的,各种系统下,运维效率却不见得高。 +- 其次,园区建设同质化。所谓同质化,就是最早一批智慧园区在发展时,被作为当地标杆,其他园区就开始模仿标杆建设,因此建设出来的园区非常相似,没有太多创新。 +- 再次,没有构建园区生态,难以形成闭环。最早的智慧园区建设还没提及生态,只是将整体设计更智能。 +- 最后,需要更前瞻规划,对外扩展性低。 + +### 链上园区解决方案 +  数据产生价值是智慧园区建设的核心,在这个过程中,如何保证数据的可信度和真实可靠性,区块链技术的可追溯、不可篡改等特点在这里就可以发挥它的作用。 +![](数据架构.png) + +  智慧园区建设的整体数据架构图,最左边是大家比较熟悉的数据源、基础数据、平台数据,园区的数据从感知层开始,将基础数据收集起来,包括政府数据和企业自有数据,上传到新致链上去,通过验证数据真实,上传存证后可以保证数据不可篡改。在这种前提下,我们再进行数据挖掘,进而产生有价值的数据。最右边我们看到是数据挖掘之后推导出的资产画像、园区画像、企业画像、人员画像,以便相关机构给用户提供更好服务。 +![](技术架构.png) + +  园区建设的整体系统架构如上图所示,整个架构大体可以分为园区外部协同、园区内部运营协同以及底层感知技术/云链技术协同三大部分,我们可以看到,区块链其实是在云端服务这层架构里,最底层是感知技术,跟物联网相关,会收集基础数据再进行上链,保证数据的不可篡改且可追溯。再往上一层就是在园区内部的运营协同,将业务内容串连起来,包括线上线下的业务数据,最外部就是平台的用户系统。 + +### 区块链在实施过程中的应用 +  首先,整个底层其实是区块链BaaS平台,包括网络节点,还有链的管理。最关键的,就是园区的联盟链,不仅是把园区作为一个认证节点,而且要把企业甚至是一些政府机构,也纳入到认证节点里,加入到整个区块链生态里,这样才能确保真正建立出一个完整的区块链园区生态。 +  在底层上我们选用了FISCO BCOS,主要是以联盟链的业务场景进行选型比较,经过对比,我们发现FISCO BCOS具有以下几大优势: +- 节点扩展性高,可以方便进行节点的增和删。 +- 智能合约支持EVM,可使用当前流行语言Solidity编写智能合约,易上手。 +- 支持分布式数据库,支持KV数据库,可方便查询数据,保留历史可追溯。 +- 支持国密,对国内监管需求友好。 +- 支持节点准入控制,有灵活的权限控制,实现全面的安全保障。 +- 支持监管和审计机构作为观察节点加入联盟链,获取实时数据进行监管审计。 +- 社区成熟,项目迭代速度快,对应生态工具多,社区有超40000名成员和超2000家企业参与。 + +  链上园区效果与前景 +  经过几年的发展,数字智慧园区1.0阶段基本已完成,这个阶段主要进行了数字化建设,加入5G、物联网技术,未来,区块链会渗入到园区建设中,从而实现从1.0向2.0建设方向迈进。 +  作为基础设施,区块链一定要与实际应用场景相结合,与各项前沿技术融合,真正解决园区建设中的痛点问题。现在大多数园区的云建设已经比较成熟,如何通过区块链与现有云技术结合,在这个过程中发挥更大价值,将是2.0阶段探索的重要命题 +  就区块链技术而言,未来的想象空间还是比较大的,根据不同类型的园区,收集不同类型的数据,挖掘不同的潜在价值,为需求方提供更具参考意义的信息价值。 diff --git a/3.x/zh_CN/docs/articles/7_practice/ansible_FISCO-BCOS_Webase-deploy.md b/3.x/zh_CN/docs/articles/7_practice/ansible_FISCO-BCOS_Webase-deploy.md new file mode 100644 index 000000000..77318d47e --- /dev/null +++ b/3.x/zh_CN/docs/articles/7_practice/ansible_FISCO-BCOS_Webase-deploy.md @@ -0,0 +1,390 @@ +# Ansible for FISCO BCOS + Webase-deploy 高效搭建企业级生产环境联盟链 +作者:无缺|深圳市缦星链盟软件工程责任有限公司西安研发中心 + +## 1 背景介绍 +工欲善其事必先利其器,神器在手,天下我有! + +### 1.1 Ansible for FISCO BCOS +Ansible for FISCO BCOS提供了自动化生成企业级配置文件的 ansible-playbook。2 群组 3 机构 6 节点的环境,可以在 30 秒内(除下载时间)生成配置,极大简化了部署难度,避免了手工配置容易发生的错误。 + +[Github 访问地址](https://github.com/newtouch-cloud/ansible-for-fisco-bcos) + +[Gitee 社区开发者提供访问地址](https://gitee.com/hailong99/ansible-for-fisco-bcos) + +Gitee 社区开发者提供源码下载地址 https://gitee.com/hailong99/ansible-for-fisco-bcos.git + +``` +git clone https://gitee.com/hailong99/ansible-for-fisco-bcos.git +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy728.png) + +### 1.2 Webase-deploy +一键部署WeBASE可以在 同机 快速搭建WeBASE管理台环境,方便用户快速体验WeBASE管理平台。一键部署搭建:节点(FISCO-BCOS 2.0+)、管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、节点前置子系统(WeBASE-Front)、签名服务(WeBASE-Sign)。其中,节点的搭建是可选的,可以通过配置来选择使用已有链或者搭建新链。 + +[Github 访问地址](https://github.com/WeBankFinTech/WeBASE) + +一键下载命令 +``` +wget https://github.com/WeBankFinTech/WeBASELargeFiles/releases/download/v1.4.2/webase-deploy.zip +``` +Gitee 社区开发者提供源码下载地址 https://gitee.com/hailong99/WeBASE.git + +``` +git clone https://gitee.com/hailong99/WeBASE.git +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy1389.png) + + +## 2 实验架构设计 +### 2.1 网络拓扑设计 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy1428.png) + +## 3 环境准备 +### 3.1 硬件准备 +服务器A: +IP 192.168.9.11 + +系统 Centos8.3 + +服务器B: +IP 192.168.9.207 + +系统 Centos7.6 + +两台服务器在同一局域网中,网络互相访问正常。 + +### 3.2 软件准备 +两台服务器都安装基本组件如:Openssl、Java8、Python3、Git、Vim等。 + +服务器A: +数据库 mysql + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy1618.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy1621.png) + +## 4 使用Ansible工具搭链 +### 4.1 下载Ansible + +``` +git clone https://gitee.com/hailong99/ansible-for-fisco-bcos.git +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy1794.png) + +### 4.2 安装Ansible +按照GitHub访问地址中的安装说明进行 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy1834.png) + +``` +python3 get-pip.py +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy1863.png) + +``` +cd ansible-for-fisco-bcos/ +pip install --user -U -r requirements.txt +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy1947.png) + +``` +pip install --user -U ansible +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy1996.png) + +### 4.3 联盟链初始化 +复制一份 inventory 配置。假设新环境是 'my_inventory'。 +``` +cp -R inventories/sample inventories/my_inventory +``` + +### 4.4 编辑 init.yml 配置文件 +``` +nano inventories/my_inventory/group_vars/init.yml +或 +vim inventories/my_inventory/group_vars/init.yml +``` +经过实地实验路径是:inventories/my_inventory/group_vars/all/init.yml + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2288.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2291.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2293.png) + +根据业务实际需求编辑链属性各项,如:二进制文件版本、是否生成控制台、是否生成SDK。文件中的注释写的很清楚,结合业务理解。 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2357.png) + +根据业务实际需求编辑链盟链属性各项,如:机构、节点、群组。文件中的注释写的很清楚,结合业务理解。 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2417.png) + +### 4.5 生成架构图 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2438.png) + +``` +ansible-playbook -i inventories/my_inventory/hosts.ini fisco_bcos.yml -t archimate +``` + +机构与群组的关系: + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2539.png) + +机构iMeshx 生成的配置图: + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2551.png) + +机构HaiLong 生成的配置图: + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2571.png) + +### 4.6 生成联盟链底层文件 + +``` +cd /home/ansible-for-fisco-bcos/ +ansible-playbook -i inventories/my_inventory/hosts.ini fisco_bcos.yml +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2745.png) + +生成的配置信息 + +注意命令执行完成以后node_list.yml文件会显示机构和群组尚未初始化,需要再次执行命令,就会正常显示群组和机构已初始化。 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2844.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2846.png) + +按照配置信息已经生成了联盟链底层文件 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy2869.png) + +### 4.7 在生产环境服务器运行联盟链底层服务 + +#### 4.7.1 先打包整体机构文件 + +``` +cd /home/ansible-for-fisco-bcos/inventories/my_inventory/deploy +tar -zcf agency_HaiLong.tar.gz agency_HaiLong/ +tar -zcf agency_iMeshx.tar.gz agency_iMeshx/ +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3110.png) + + +#### 4.7.2 把打包的文件上传到对应的联盟链生产服务器上 +``` +cp -r agency_iMeshx.tar.gz /home/ +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3179.png) + +192.168.9.207 服务器直接用ssh 终端工具上传并且移动到规划的路径下。 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3236.png) + +#### 4.7.3 在生产服务器解压被打包的机构文件 +``` +tar -xf agency_iMeshx.tar.gz +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3296.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3298.png) + +#### 4.7.4 启动节点 +``` +cd /home/agency_iMeshx/fisco_deploy_agency_iMeshx +./start_all.sh +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3384.png) + +192.168.9.11 服务器上查看共识 +``` +cd /home/agency_iMeshx/fisco_deploy_agency_iMeshx +tail -f node*/log/log* |grep ++++ +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3502.png) + +192.168.9.207 服务器上启动节点查看共识 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3533.png) + +至此,我们两台服务器使用Ansible for FISCO BCOS神器已经完成链的搭建,其中工具自动完成了很多文件的生成、复制的命令,非常简洁高效 ^_^ ! + +## 5 使用Webase-deploy工具搭建Webase +已经有联盟链底层服务了,需要用Webase 来进行管理 +### 5.1 安装webase-deploy + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3768.png) + +#### 5.1.1 下载webase-deploy +``` +wget https://github.com/WeBankFinTech/WeBASELargeFiles/releases/download/v1.4.2/webase-deploy.zip +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3917.png) + +#### 5.1.2 解压webase-deploy +``` +unzip webase-deploy.zip +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy3971.png) + +### 5.2 配置webase + +#### 5.2.1 配置各子系统版本信息和数据库信息 +编辑配置文件:/home/webase-deploy/common.properties +按照官方教程以及配置文件提示分别先配置子系统版本信息和数据库信息。 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4090.png) + +#### 5.2.2 配置各子系统端口号、加密方式、是否已经存在链、证书路径、链程序版本 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4133.png) + +#### 5.2.3 文件调整 +(1) 把/home/agency_iMeshx/script/gm拷贝到/home/agency_iMeshx/meta/sdk + +(2) 把/home/agency_iMeshx/meta/sdk拷贝到节点目录/home/agency_iMeshx/fisco_deploy_agency_iMeshx下 + +(3) 把meta/sdk/下的3个证书拷贝到webase-front/conf下 (需要先执行安装命令下载了webase-front文件以后才能拷贝成功) + +#### 5.2.4 配置Nginx +根据规划配置nginx的代理ip地址与端口号 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4419.png) + +#### 5.2.5 配置webase-front (需要先执行安装命令下载了webase-front文件以后才能配置) +SDK的ip地址默认是127.0.0.1 需要改为192.168.9.11后保存 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4534.png) + +### 5.3 安装部署 +#### 5.3.1 执行安装命令 + +``` +cd /home/webase-deploy +python3 deploy.py installAll +``` + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4638.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4640.png) + +注意:webase-node-mgr的数据库初始化非常重要,初次运行一定要选择 y + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4685.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4687.png) + +发现有错误时根据提示查看log信息。 + +## 6 功能测试 +### 6.1 访问地址:192.168.9.11:5000 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4743.png) + +初次登录需要更新管理员密码 + +### 6.2 查看群组信息 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4771.png) + +### 6.3 查看节点信息共识状态 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4795.png) + +### 6.4 查看系统版本信息 +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4811.png) + +### 6.5 添加测试用户 +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4824.png) + +### 6.6 合约编译正常 +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4839.png) + +### 6.7 合约部署正常 +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4854.png) + +### 6.8 交易正常 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4875.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4877.png) + +### 6.9 简体中文上链正常 +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4907.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4910.png) + +### 6.10 首页信息统计正常 +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4944.png) + +### 6.11 节点监控正常 +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4959.png) + +### 6.12 群组2节点信息正常 +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy4987.png) + +### 6.13 群组2 用户添加正常 +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5006.png) + +### 6.14 群组2 数据上链、查询正常 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5040.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5049.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5050.png) + +### 6.15 控制台使用正常 + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5094.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5096.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5098.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5100.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5102.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5104.png) + +![](../../../images/articles/ansible_FISCO-BCOS_Webase-deploy/ansible_FISCO-BCOS_Webase-deploy5106.png) + +至此我们完成了使用webase-deploy 对联盟链的管理与功能测试,大功告成!^_^ 。 + + +## 7 开发感悟 + +#### 天之道,损有余而补不足,是故虚胜实,不足胜有余! + +#### 不积跬步,无以至千里, + +#### 不积小流,无以成江海! + +#### 假舆马者,非利足也,而致千里, + +#### 假舟楫者,非能水也,而绝江河! + +#### 君子生非异也,善假于物也! + + + + + + diff --git a/3.x/zh_CN/docs/articles/7_practice/build_chain_with_wsl_on_windows.md b/3.x/zh_CN/docs/articles/7_practice/build_chain_with_wsl_on_windows.md new file mode 100644 index 000000000..fa54061a7 --- /dev/null +++ b/3.x/zh_CN/docs/articles/7_practice/build_chain_with_wsl_on_windows.md @@ -0,0 +1,363 @@ +# 基于wsl/wsl2的Windows-10搭建Fisco-Bcos区块链心得 + +作者:黄一(四川万物数创科技有限公司)|FISCO BCOS 开发者 + +## 一:概述 + +最近有一些朋友在FISCO的社区提到,因为某些限制,只能使用Windows平台进行开发,希望有一个基于Windows的Fisco-Bcos部署教程。正好@power林宣名老师 的C# SDK也趋于成熟,因此写下了这篇文章,希望能让Windows部署Fisco开发环境变得更加简单。 + +本文介绍了采用**适用于Windows的Linux子系统(wsl/wsl2)**,在Windows-10平台上无双系统/虚拟机负担搭建Fisco-Bcos的流程和心得,届时可以将Visual Studio和Fisco的开发结合起来,搭建一个较为舒适的Windows开发环境。 + +wsl与wsl2在底层实现上完全不同,区别请参看https://docs.microsoft.com/zh-cn/windows/wsl/compare-versions。 + +基于wsl第一代使用linux中间件翻译的性能和兼容性考虑,推荐使用基于轻量级hyper-v的wsl2,对于不想使用hyper-v的朋友,可以只使用wsl,至少在当前阶段尚未发现有兼容性问题。 + +由于二者在搭建fisco的步骤上完全一致,本文会先在wsl上搭建fisco单机4节点区块链,再切换到wsl2安装控制台以展示二者可随时切换的性质。 + + +## 二:配置要求 + +硬件: +``` +家用机级别的CPU即可,内存达到8GB以上,推荐16GB+,考虑到wsl只能安装在系统盘上,尽量拥有50G+的空闲系统盘空间。 +``` + +软件: +``` +操作系统:Windows 10 Professional/Enterprise(版本1903+),或Windows Server 2019(版本1709+)。 +其他工具:如要使用.Net Sdk,推荐免费且支持.Net5的Visual Studio 2019 Community及Visual Studio Code。 +``` + +## 三:在Windows10上安装wsl/wsl2及linux分发子系统(以Ubuntu 20.04 LTS为例) + +以管理员方式打开PowerShell + +![](../../../images/articles/build_chain_with_wsl_on_windows/open_powershell.png) + +键入如下命令,打开wsl/wsl2支持 + +```powershell +dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart +dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart +``` + +![](../../../images/articles/build_chain_with_wsl_on_windows/enable_wsl.png) + +成功启用后,重启计算机,下载并安装wsl2内核更新包 + +链接: + +打开Microsoft Store,下载并安装Ubuntu 20.04 LTS子系统 + +链接: + +![](../../../images/articles/build_chain_with_wsl_on_windows/install_ubuntu20.png) + +安装后,至少启动一次Ubuntu 20.04,此时会要求设置初始用户的账户密码 + +![](../../../images/articles/build_chain_with_wsl_on_windows/init_ubuntu20.png) + +设置完成,在Powershell中键入如下命令查看linux分发包情况 + +```powershell +wsl --list --verbose +``` + +![](../../../images/articles/build_chain_with_wsl_on_windows/check_wsl_state_1.png) + +可以看到现在ubuntu使用的是wsl版本1,接下来将在这个系统上安装配置fisco,并演示如何切换到wsl2。 + +## 四:基于wsl在ubuntu20.04子系统上搭建fisco单机4节点 + +官方推荐使用Windows Termintal进行操作,也可以使用windows自带的shell或powershell,下载链接: + +打开终端,直接键入 + +```powershell +wsl +``` + +进入ubuntu子系统,如下图所示 + +![](../../../images/articles/build_chain_with_wsl_on_windows/windows_terminal_wsl.png) + +这里可以看到wsl的特性之一:可以直接访问NTFS文件系统中的文件(起始位置位于c:\Users),并可以调用以.exe为后缀的windows应用程序。 + +在开发期,出于管理方便,可以把fisco放到NTFS文件系统下,如“我的文档”,但切勿在生产环境中如此配置,linux子系统访问跨文件系统会降低性能。 + +因为是本机子系统,无需进行任何网络配置,参考[搭建第一个区块链网络](../../installation.md),快速部署fisco单机4节点区块链 + +```bash +cd ~ +sudo apt install -y openssl curl +cd ~ && mkdir -p fisco && cd fisco +curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.9.1/build_chain.sh && chmod u+x build_chain.sh +bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 +``` + +最终输出All Completed + +![](../../../images/articles/build_chain_with_wsl_on_windows/build_chain_wsl.png) + +接下来启动fisco节点,并观察日志输出 + +```bash +bash nodes/127.0.0.1/start_all.sh +tail -f nodes/127.0.0.1/node0/log/log* | grep +++ +``` + +![](../../../images/articles/build_chain_with_wsl_on_windows/start_node_wsl.png) + +同时,由于我们使用的是wsl-1,可以在任务管理器中查看到4个节点的linux进程fisco-bcos及其资源占用 + +![](../../../images/articles/build_chain_with_wsl_on_windows/taskmgr_fisco.png) + +通过右键点击进程,可以快速定位到Ubuntu子系统的Home目录,**不要在Windows中修改这个目录里的任何文件**,要访问wsl的Home,在资源管理器的地址栏中输入:\wsl$ + +## 五:wsl与wsl2之间的切换 + +本部分介绍如何在wsl和wsl2之间切换,本书中所有教程同时适用于wsl及wsl2,可以在任意一步切换wsl版本并继续教程 + +首先停止刚才启动的fisco节点,并退出Ubuntu子系统 + +```bash +bash nodes/127.0.0.1/stop_all.sh +exit +``` + +接下来,将Ubuntu系统的启动方式切换为wsl2 + +```powershell +wsl --set-version Ubuntu-20.04 2 +``` + +等待系统转换 + +![](../../../images/articles/build_chain_with_wsl_on_windows/wsl_to_wsl2.png) + +再次启动刚才安装的fisco节点,观察输出 + +```bash +wsl +cd ~/fisco && bash nodes/127.0.0.1/start_all.sh +tail -f nodes/127.0.0.1/node0/log/log* | grep +++ +``` + +![](../../../images/articles/build_chain_with_wsl_on_windows/wsl_to_wsl2.png) + +同理,在停止fisco之后,可使用如下代码切换回wsl + +```powershell +wsl --set-version Ubuntu-20.04 1 +``` + +## 六:安装fisco控制台 + +安装教程请参照[搭建第一个区块链网络](../../installation.md)中安装控制台部分,本文尽量简短的做一个整合介绍 + +由于Ubuntu子系统自带的源在国外,对国内的用户来说,jdk下载速度会很慢,在此更换为国内阿里的镜像 + +```bash +sudo chmod 777 /etc/apt/sources.list +notepad.exe /etc/apt/sources.list +``` + +若记事本显示无法找到源文件目录,则使用如下代码 +```bash +sudo chmod 777 /etc/apt/sources.list +sudo vim /etc/apt/sources.list +``` + +在记事本/vim中将文件整个替换为 + +``` +deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse +``` + +保存并关闭,依次执行 + +```bash +sudo apt update && sudo apt install -y default-jdk +cd ~/fisco && curl -LO https://github.com/FISCO-BCOS/console/releases/download/v2.9.2/download_console.sh && bash download_console.sh +cp -n console/conf/config-example.toml console/conf/config.toml +cp -r nodes/127.0.0.1/sdk/* console/conf/ +cd ~/fisco/console && bash start.sh +``` + +启动后,看到如下画面,控制台部署成功 + +![](../../../images/articles/build_chain_with_wsl_on_windows/console_start.png) + +## 七:使用csharp-sdk进行Visual Studio开发示例 + +本篇使用了@power老师的csharp-sdk及其教程,感谢power老师的辛勤工作。 + +git地址: + +教程地址: + +### 1. 建立新工程,引入C#-SDK + +打开vs2019,建立一个基于.net core 3.1的控制台工程,打开nuget程序包控制器,搜索“fiscobcos” + +![](../../../images/articles/build_chain_with_wsl_on_windows/nuget_csharp_sdk.png) + +选择FISCOBCOS.CSharpSdk包,安装到工程 + +![](../../../images/articles/build_chain_with_wsl_on_windows/check_csharp_sdk.png) + + +### 2. 编译示例合约HelloWorld + +编译工程,在工程输出目录下,建立一个contracts文件夹 + + +![](../../../images/articles/build_chain_with_wsl_on_windows/mkdir_contracts.png) + +切换到Terminal,将刚才下载的console中带有的HellowWorld.sol合约复制到刚才建立的contracts文件夹下 + +```bash +cp ~/fisco/console/contracts/solidity/HellowWorld.sol [你的contracts目录] +``` + +使用vscode打开HelloWorld.sol,安装solidity插件并切换到0.4.25版本 + +![](../../../images/articles/build_chain_with_wsl_on_windows/install_solidity_plugin.png) + +![](../../../images/articles/build_chain_with_wsl_on_windows/change_solidity_version.png) + +按F5,编译合约,会在contracts下生成bin文件夹,并生成编译好的的HelloWorld.bin和HelloWorld.abi + +### 3. 和fisco交互 + +修改Program.cs如下 + +```C# +using System; +using FISCOBCOS.CSharpSdk; +using FISCOBCOS.CSharpSdk.Dto; +using FISCOBCOS.CSharpSdk.Utis; + +namespace FiscoSdkTest +{ + class Program + { + static void MakeAccount() + { + var account = AccountUtils.GeneratorAccount("testAdmin"); + var accountString = account.ToJson(); + Console.WriteLine($"生成账号信息:\n{accountString}\n---------------"); + } + + static void Main(string[] args) + { + MakeAccount(); + } + } +} +``` + +编译执行,观察输出 + +![](../../../images/articles/build_chain_with_wsl_on_windows/create_account.png) + +使用账号的私钥,尝试部署刚才的HelloWorld合约,修改代码如下 + +```C# +using System; +using FISCOBCOS.CSharpSdk; +using FISCOBCOS.CSharpSdk.Dto; +using FISCOBCOS.CSharpSdk.Utils; +using FISCOBCOS.CSharpSdk.Utis; + +namespace FiscoSdkTest +{ + class Program + { + static void MakeAccount() + { + var account = AccountUtils.GeneratorAccount("testAdmin"); + var accountString = account.ToJson(); + Console.WriteLine($"生成账号信息:\n{accountString}\n---------------"); + } + + static void DeployContract(string privateKey) + { + + var contractService = new ContractService("http://127.0.0.1:8545", BaseConfig.DefaultRpcId, BaseConfig.DefaultChainId, BaseConfig.DefaultGroupId, privateKey); + string binCode = ""; + string abi = ";"; + FileUtils.ReadFile(Environment.CurrentDirectory + "\\contracts\\bin\\" + "HelloWorld.bin", out binCode); + FileUtils.ReadFile(Environment.CurrentDirectory + "\\contracts\\bin\\" + "HelloWorld.abi", out abi); + var result = contractService.DeployContract(binCode, abi); + Console.WriteLine($"部署合约结果:\n{result}"); + } + + static void Main(string[] args) + { + string privateKey = args[0]; + DeployContract(privateKey); + } + + + } +} +``` + +编译执行,观察输出 + +![](../../../images/articles/build_chain_with_wsl_on_windows/deploy_contract.png) + +接下来我们查看刚才部署合约这个交易的结果,修改代码如下 + +```C# +using System; +using FISCOBCOS.CSharpSdk; +using FISCOBCOS.CSharpSdk.Utis; + +namespace FiscoSdkTest +{ + class Program + { + static void TestGetTranscationResult(string txHash,string privateKey) + { + var contractService = new ContractService("http://127.0.0.1:8545", BaseConfig.DefaultRpcId, BaseConfig.DefaultChainId, BaseConfig.DefaultGroupId, privateKey); + var result = contractService.GetTranscationReceipt(txHash); + Console.WriteLine($"查询交易结果:\n{result.ToJson()}"); + } + + static void Main(string[] args) + { + string txHash = args[0]; + string privateKey = args[1]; + TestGetTranscationResult(txHash,privateKey); + } + } +} +``` + +可以看到本次交易的回执,返回码为0x0,部署的合约地址为0x1fc600d62388602620bb52c1fe6eea579b65d498 + +![](../../../images/articles/build_chain_with_wsl_on_windows/deploy_contract_result.png) + +切换到上一节中的控制台,尝试调用一下HelloWorld的get + +```bash +call HelloWorld 0x1fc600d62388602620bb52c1fe6eea579b65d498 get +``` + +结果如下 + +![](../../../images/articles/build_chain_with_wsl_on_windows/run_deployed_contract.png) + +至此,在Windows上使用Visual Studio联合csharp-sdk进行fisco本地开发告一段落,关于charp-sdk的其他功能,请参见本节开始的链接 + diff --git a/3.x/zh_CN/docs/articles/7_practice/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0.md b/3.x/zh_CN/docs/articles/7_practice/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0.md new file mode 100644 index 000000000..c19769a7f --- /dev/null +++ b/3.x/zh_CN/docs/articles/7_practice/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0.md @@ -0,0 +1,331 @@ +# 鲲鹏平台编译并运行FISCO-BCOS 2.6.0 + +## 一:申请鲲鹏服务器(已经有鲲鹏服务器略过此步) + +### 1. 注册 + +打开 [鹏城实验室官网](https://dw.pcl.ac.cn/#/home/index) 进行账户注册,注册过程中需要填写真实名称、工作单位、邮箱,收到激活邮件后需要手动点击激活连接地址激活账户 +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/1.png) + +### 2. 登录 + +登陆注册的账户以后点击 "开发者云" 按钮 +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/2.png) + +### 3. 填写申请订单 + +在打开的页面中自己填写 "需求申请" 订单,按照自己实际项目需求规划硬件配置、系统版本、使用多长时间 +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/3.png) + +### 4. 等待通知 + +需求订单填写无误提交以后,等待官方批准,批准完成以后会收到批准结果邮件通知 +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/4.png) + +### 5. 通过申请 + +登录鲲鹏服务器查看服务器信息,至此鲲鹏服务器准备完成 +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/5.png) + +## 二:在鲲鹏服务器安装基础软件 + +### 1. 更新软件 + +以 Centos 为例,使用 yum 进行更新(此过程会下载更新包,请保持网络畅通并耐心等待) +```. +yum update +``` + +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/6.png) + + +### 2. 安装基础依赖 + +``` +sudo yum install -y epel-release centos-release-scl +sudo yum install -y openssl-devel openssl cmake3 gcc-c++ git flex patch bison gmp-static devtoolset-7 +``` + +### 3. 安装鲲鹏版本jdk-1.8 + * 安装 jdk + 从 [oracle官网](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) 下载 jdk-1.8 + +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/13.png) + + * 解压文件到/usr/local中 +``` +tar -xf jdk-8u261-linux-arm64-vfp-hflt.tar.gz -C /usr/local/ +``` +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/14.png) + + * 设置环境变量 +``` +vim /etc/profile + +// 在文件最后添加: +export JAVA_HOME=/usr/local/jdk1.8.0_261 +export PATH=$JAVA_HOME/bin:$PATH + +//使变量生效 +source /etc/profile +``` +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/15.png) + + +## 三:编译 FISCO-BCOS 源码 + +### 1. 下载编译依赖 + + * FISCO 编译依赖许多的文件,直接从 git 上下载的话会很慢,所以这里先从 gitee 下载相应的依赖,后面编译时,直接进行 copy +``` +cd +git clone https://gitee.com/FISCO-BCOS/LargeFiles.git +``` + +### 2. 下载源码 + + * 克隆 FISCO BCOS 代码 + +```bash +git clone https://gitee.com/FISCO-BCOS/FISCO-BCOS.git +``` + +### 3. 执行预编译 + +``` +cd FISCO-BCOS +git checkout master-2.0 +mkdir -p build && cd build + +// CentOS请执行此命令,其他系统不需要 +source /opt/rh/devtoolset-7/enable + +cmake3 .. -DARCH_NATIVE=on +``` + +### 4. 执行编译 + + * 执行 make, 执行到下载文件这里会出现卡顿,这里直接 ctrl + c 取消 +``` +# make +Scanning dependencies of target jsoncpp +[ 0%] Creating directories for 'jsoncpp' +[ 0%] Performing download step (download, verify and extract) for 'jsoncpp' +-- Downloading... + dst='/root/FISCO-BCOS/deps/src/jsoncpp-1.7.7.tar.gz' + timeout='none' +-- Using src='https://github.com/open-source-parsers/jsoncpp/archive/1.7.7.tar.gz' +-- verifying file... + file='/root/FISCO-BCOS/deps/src/jsoncpp-1.7.7.tar.gz' +-- Downloading... done +-- extracting... + src='/root/FISCO-BCOS/deps/src/jsoncpp-1.7.7.tar.gz' + dst='/root/FISCO-BCOS/deps/src/jsoncpp' +``` + +### 5. 复制依赖包到相应目录 + +``` +//如果提示是否覆盖,输入 y +cp ${HOME}/LargeFiles/libs/* ${HOME}/FISCO-BCOS/deps/src +``` + +### 6. 继续执行编译 + + * 首次编译速度比较慢,需要耐心等待 +``` +cd ${HOME}/FISCO-BCOS/build +make +``` + +### 7 解决编译GroupSigLib 报错 + + * 编译过程中,如果出现编译 GroupSigLib 失败的问题,会出现一下报错 +``` +[ 24%] Performing configure step for 'GroupSigLib' +-- GroupSigLib configure command succeeded. See also /root/FISCO-BCOS/deps/src/GroupSigLib-stamp/GroupSigLib-configure-*.log +[ 25%] Performing build step for 'GroupSigLib' +CMake Error at /root/FISCO-BCOS/deps/src/GroupSigLib-stamp/GroupSigLib-build-RelWithDebInfo.cmake:49 (message): + Command failed: 2 + + 'make' + + See also + + /root/FISCO-BCOS/deps/src/GroupSigLib-stamp/GroupSigLib-build-*.log + + +make[2]: *** [CMakeFiles/GroupSigLib.dir/build.make:115:../deps/src/GroupSigLib-stamp/GroupSigLib-build] 错误 1 +``` + + * 解决方法: +``` +cp /usr/share/automake-1.13/config.guess ${HOME}/FISCO-BCOS/deps/src/GroupSigLib/deps/src/pbc_sig/config.guess +``` + +### 8. 查看编译结果 + + * 编译完成效果 +![](../../../images/articles/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0/20.png) + + * 查看编译结果的版本号 +``` +# cd bin +# ./fisco-bcos -v +FISCO-BCOS Version : 2.6.0 +Build Time : 20200810 09:17:18 +Build Type : Linux/g++/RelWithDebInfo +Git Branch : master-2.0 +Git Commit Hash : a2c2cd3f504a101fbc5e97833ea0f4443b68098e +``` + +## 四 : 鲲鹏平台运行2群组3机构6节点底层FISCO-BCOS联盟链服务 + +### 1. 创建联盟链底层二进制可执行文件存放目录 + +``` +cd +mkdir bin +``` + +### 2. 复制编译的fisco-bcos 文件到创建的目录中 + +``` +cp ${HOME}/FISCO-BCOS/build/bin/fisco-bcos bin +``` + +### 3. 下载 build_chain.sh 脚本 + +``` +curl -LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.1/build_chain.sh && chmod u+x build_chain.sh +``` + +### 4. 运行一键搭建2群组3机构6节点底层FISCO-BCOS联盟链服务脚本 + +``` +# ./build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -e bin/fisco-bcos +``` + +### 5. 脚本运行完成效果 + +``` +# ./build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -e bin/fisco-bcos +Checking fisco-bcos binary... +Binary check passed. +============================================================== +Generating CA key... +============================================================== +Generating keys and certificates ... +Processing IP=127.0.0.1 Total=4 Agency=agency Groups=1 +============================================================== +Generating configuration files ... +Processing IP=127.0.0.1 Total=4 Agency=agency Groups=1 +============================================================== +[INFO] FISCO-BCOS Path : bin/fisco-bcos +[INFO] Start Port : 30300 20200 8545 +[INFO] Server IP : 127.0.0.1:4 +[INFO] Output Dir : /root/nodes +[INFO] CA Path : /root/nodes/cert/ +============================================================== +[INFO] Execute the download_console.sh script in directory named by IP to get FISCO-BCOS console. +e.g. bash /root/nodes/127.0.0.1/download_console.sh -f +============================================================== +[INFO] All completed. Files in /root/nodes +``` + +### 6. 启动节点 + +``` +cd nodes/127.0.0.1/ +./start_all.sh +``` + +### 7. 查看节点状态 + +``` +# ps -aux |grep fisco +root 17241 1.1 0.7 729792 31168 pts/1 Sl 17:32 0:00 /root/nodes/127.0.0.1/node2/../fisco-bcos -c config.ini +root 17242 1.0 0.7 729792 31360 pts/1 Sl 17:32 0:00 /root/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini +root 17243 1.0 0.7 729792 31168 pts/1 Sl 17:32 0:00 /root/nodes/127.0.0.1/node3/../fisco-bcos -c config.ini +root 17244 1.1 0.7 729408 31296 pts/1 Sl 17:32 0:00 /root/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini +``` + +### 8. 查看共识状态 + +``` +# tail -f node*/log/*|grep ++ +info|2020-09-04 17:34:19.452001|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=2,hash=40f8c3c5... +info|2020-09-04 17:34:18.449782|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=85ab01ec... +info|2020-09-04 17:34:17.446976|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=d7d2cfa2... +info|2020-09-04 17:34:20.454172|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=87efbeb5... +info|2020-09-04 17:34:21.456586|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=4a9c4f2d... +info|2020-09-04 17:34:22.459794|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=d1dd4738... +``` + +## 五 : 鲲鹏平台安装FISCO-BCOS 控制台 + +说明:控制台程序依赖 java-1.8 需要提前安装好鲲鹏版本(arrch64)的java-1.8 + +```bash +# 下载控制台 +$ curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v2.9.2/download_console.sh && bash download_console.sh +$ cd console + +# 拷贝证书 +cp ~/nodes/127.0.0.1/sdk/* conf + +# 修改配置文件 +# 如果端口没有冲突,直接复制配置文件即可,否则复制之后,修改 config.toml中的network.peers配置项为相应的 channel 端口 +$ cp conf/config-example.toml conf/config.toml +``` + +**启动控制台** + +``` +# cd ~/console/ && bash start.sh +============================================================================================= +Welcome to FISCO BCOS console(2.6.1)! +Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console. + ________ ______ ______ ______ ______ _______ ______ ______ ______ +| | \/ \ / \ / \ | \ / \ / \ / \ +| $$$$$$$$\$$$$$| $$$$$$| $$$$$$| $$$$$$\ | $$$$$$$| $$$$$$| $$$$$$| $$$$$$\ +| $$__ | $$ | $$___\$| $$ \$| $$ | $$ | $$__/ $| $$ \$| $$ | $| $$___\$$ +| $$ \ | $$ \$$ \| $$ | $$ | $$ | $$ $| $$ | $$ | $$\$$ \ +| $$$$$ | $$ _\$$$$$$| $$ __| $$ | $$ | $$$$$$$| $$ __| $$ | $$_\$$$$$$\ +| $$ _| $$_| \__| $| $$__/ | $$__/ $$ | $$__/ $| $$__/ | $$__/ $| \__| $$ +| $$ | $$ \\$$ $$\$$ $$\$$ $$ | $$ $$\$$ $$\$$ $$\$$ $$ + \$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ + +============================================================================================= +[group:1]> +``` + +## 六 : 鲲鹏平台通过控制台发送交易 + + * 查看 FISCO 版本 +``` +[group:1]> getNodeVersion +{ + "Build Time":"20200904 14:43:15", + "Build Type":"Linux/g++/RelWithDebInfo", + "Chain Id":"1", + "FISCO-BCOS Version":"2.6.0", + "Git Branch":"master-2.0", + "Git Commit Hash":"a2c2cd3f504a101fbc5e97833ea0f4443b68098e", + "Supported Version":"2.6.0" +} +``` + + + * 部署并调用合约 +``` +[group:1]> deploy HelloWorld +transaction hash: 0xa71f136107389348d5a092a345aa6bc72770d98805a7dbab0dbf8fe569ff3f37 +contract address: 0xd22aa109bc0708ad016391fa5188e18d35b16434 + +[group:1]> call HelloWorld 0xd22aa109bc0708ad016391fa5188e18d35b16434 set "asfdas" +transaction hash: 0x72f4f8c980fd0d63d57bdbcc89d6b82dda79e301f25a65f0f49726105184b596 + +[group:1]> call HelloWorld 0xd22aa109bc0708ad016391fa5188e18d35b16434 get +asfdas +``` diff --git "a/3.x/zh_CN/docs/articles/7_practice/\346\213\206\350\247\243build_chain.sh\350\247\243\350\257\273FISCO-BCOS\345\273\272\351\223\276\350\277\207\347\250\213.md" "b/3.x/zh_CN/docs/articles/7_practice/\346\213\206\350\247\243build_chain.sh\350\247\243\350\257\273FISCO-BCOS\345\273\272\351\223\276\350\277\207\347\250\213.md" new file mode 100644 index 000000000..59ec3e73d --- /dev/null +++ "b/3.x/zh_CN/docs/articles/7_practice/\346\213\206\350\247\243build_chain.sh\350\247\243\350\257\273FISCO-BCOS\345\273\272\351\223\276\350\277\207\347\250\213.md" @@ -0,0 +1,141 @@ +# 拆解build_chain.sh解读FISCO-BCOS建链过程 +作者:重庆电子工程职业学院 | 向键雄 + +这里是本教程的:[配套视频](https://space.bilibili.com/335373077) + +# 起链 +我们在这里就不完整的去讲起链的方式,挑重点讲如果大家对起链感兴趣或者不熟悉,可以去看我的另一篇文章 +[【教程】完美的FISCO-BCOS区块链网络如何启动,单机四节点,联盟链](https://blog.csdn.net/qq_57309855/article/details/126180787?spm=1001.2014.3001.5501) + +首先我会下载build_chain.sh脚本 + +使用建链命令进行建链(在这里使用一个节点目录方便教学) + +``` + +bash build_chain.sh -l 127.0.0.1 -p 30300,20200,8545 +我们可以先看一下窗口中返回的信息 + +``` +![build_chain sh反馈截图](https://user-images.githubusercontent.com/111106471/184881953-bcacb07b-f6b5-4ab2-9166-20aebe5bcc37.png) + + + + +## 第一段 + +``` + +[INFO] Downloading fisco-bcos binary from https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.9.0/fisco-bcos.tar.gz ... +curl: (7) Failed to connect to github.com port 443: Connection refused ` + +[INFO] Download speed is too low, try https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.0/fisco-bcos.tar.gz + +这里讲了我们去访问GitHub中下载FISCO-BCOS的压缩包,结果发现链接失败所以跳转到国内的码云中去下载 + +``` + +这里对应这我们build_chain.sh中的1633行 +![download_bin代码截图](https://user-images.githubusercontent.com/111106471/184882007-e90f1b3c-0bb9-407d-b2ad-194c1c0a21d5.png) +![download_link代码截图](https://user-images.githubusercontent.com/111106471/184882027-38fe8614-632d-4335-9e50-7bc86f187529.png) + + + + 这里的cdn_download_link在上面环境变量中有指定 + + + + 在下面有许多的判断就是为了预防在国内无法访问GitHub的情况发生 + +## 第二段 + +``` + +============================================================== +Generating CA key... +============================================================== + +``` + +生成CA秘钥对应脚本1677行,在脚本内的运行流程就是找到${output_dir}下的cert目录将CA证书存放进去,${output_dir}在上面定义的是nodes目录,所以我们进入后就可以看见我们的CA证书,具体CA证书的生成会有专栏来讲解。 + +![prepareCA代码截图](https://user-images.githubusercontent.com/111106471/184881843-f81179d6-945f-4e2e-b64c-6b1e86a3cd50.png) +![output_dir截图](https://user-images.githubusercontent.com/111106471/184881884-f3ff536b-0d61-46de-af3b-832f2982b129.png) +![nodes目录截图](https://user-images.githubusercontent.com/111106471/184881899-d5980b81-7f54-487b-b280-5cb435df7c36.png) + + + + +## 第三段 + +``` + +============================================================== +Generating keys and certificates ... +Processing IP=127.0.0.1 Total=1 Agency=agency Groups=1 +============================================================== + +``` + +生成秘钥和证书对应在脚本的1793行,脚本内的运行流程就是在输入起链命令后将他们赋给变量$OPTARG接收,确定起链模式,节点数量,确定IP,群组等参数,开始创建节点目录节点目录由node_count来确定这个node_count就是我们在起链时输入的节点数量我们是默认单节点,所以建起来的目录就是一个目录 + +​ +![秘钥证书代码截图](https://user-images.githubusercontent.com/111106471/184882272-d8c63950-9576-42c8-bff5-5b11349f6b9c.png) +![秘钥证书生成代码截图2](https://user-images.githubusercontent.com/111106471/184882282-2bb1ed99-5605-478c-9d64-015e6b1a2ec9.png) +![127 0 0 1文件夹截图](https://user-images.githubusercontent.com/111106471/184882372-f5230d39-98aa-4b27-9b5b-b18a1212e134.png) + + +​ + +​ + +## 第四段 + +``` + +============================================================== +Generating configuration files ... +Processing IP=127.0.0.1 Total=1 Agency=agency Groups=1 +============================================================== + +``` + +生成配置文件对应在脚本的1925行,脚本内的运行流程就是先确定证书的输出目录的位置,用node_count和node_dir进行接收之后就将生成的证书发送到目录下,生成的证书有群组证书,group.X.genesis、group.x.ini、config.ini、和agency目录 + + + +## 第五段 + +``` + +============================================================== + [INFO] Start Port : 30300 20200 8545` + [INFO] Server IP : 127.0.0.1 + [INFO] Output Dir : /home/fisco223/fisco/nodes + [INFO] CA Path : /home/fisco223/fisco/nodes/cert/ + [INFO] RSA channel : true` +============================================================== + +``` + +这里是将所有的端口和服务以及最终的工作目录反馈给使用者,用于自身确定是否达到预期以及预防工作量过大后配置文件等找不到的情况,对应脚本226行 +![生成配置文件代码截图](https://user-images.githubusercontent.com/111106471/184882563-01bbca48-4460-408d-878e-4214e5563777.png) + + + +第六段 + +``` + + ============================================================== + [INFO] Execute the download_console.sh script in directory named by IP to get FISCO-BCOS console. +e.g. bash /home/fisco223/fisco/nodes/127.0.0.1/download_console.sh -f + ============================================================== + [INFO] All completed. Files in /home/fisco223/fisco/nodes + + ``` + +这里就是提醒使用者在IP命名的目录中使用sh脚本获取FISCO-BCOS控制台。并且举了个例子e.g.讲解了用法,最终提示用户所有的流程已经结束,搭建完成工作目录在${output_dir}下。 +![反馈信息截图](https://user-images.githubusercontent.com/111106471/184882668-3f673308-042c-419d-9bc0-2b1fc49c3500.png) + + diff --git a/3.x/zh_CN/docs/articles/index.md b/3.x/zh_CN/docs/articles/index.md new file mode 100644 index 000000000..521d9417e --- /dev/null +++ b/3.x/zh_CN/docs/articles/index.md @@ -0,0 +1,120 @@ +# 4. 社区历史文章资源 + +## 介绍 + +新的一年已经开启,为了感谢大家的长久陪伴和倾力支持,我们将FISCO BCOS开源社区成立至今超400篇技术干货和经典篇章整理成文,作为区块链干货合辑,分享给大家! 请点击这里查阅[完整版](https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247493260&idx=1&sn=b042be04819c89169b81bcee99eb2a18&chksm=9e3a71e6e1d2ad682bf8fde9f178c91160e5d7cdf187a81cedb191b8da1605f206f9bfd98ec0&from=industrynews&version=4.1.7.6018&platform=win#rd) + +《深入浅出FISCO BCOS》分为六大章节,由社区全体成员共创完成并不断优化,社区开发者可以在GitHub上提交PR贡献文章,分享FISCO BCOS开发经验与使用心得。 + +## 区块链的概念与原理 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + 1_conception/understandable_blockchain.md + 1_conception/distributed_system.md + 1_conception/what_to_trust.md + 1_conception/what_should_not_trust.md + 1_conception/why_blockchain_slow.md + 1_conception/point_to_point.md + 1_conception/safe_and_controllable.md + 1_conception/on_and_off_the_blockchain.md + 1_conception/the_truth_of_tampering.md + 1_conception/simplify_blockchain.md +``` + +## 区块链学习必读 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + 2_required/practical_skill_tree.md + 2_required/entry_to_master.md + 2_required/go_through_sourcecode.md +``` + +## FISCO BCOS的原理和特性 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + 3_features/30_architecture/index.md + 3_features/31_performance/index.md + 3_features/32_consensus/index.md + 3_features/33_storage/index.md + 3_features/34_protocol/index.md + 3_features/35_contract/index.md + 3_features/36_cryptographic/index.md + 3_features/37_safety/index.md + 3_features/38_privacy/index.md + 3_features/39_wecross/index.md +``` + + +## FISCO BCOS的部署运维与实战工具 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + 4_tools/five_step_to_develop_application.md + 4_tools/41_webase/index.md + 4_tools/42_buildchain/index.md + 4_tools/43_console/index.md + 4_tools/44_sdk/index.md + 4_tools/45_othertools/index.md + 4_tools/46_stresstest/index.md + 4_tools/47_maintenance/index.md +``` + +## 如何参与社区开发协作 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + 5_corporation/how_to_submit_pr.md + 5_corporation/5002.md +``` + +## FISCO BCOS应用实践 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + 6_application/industry_application_case.md + 6_application/application_online_lending_platforms.md + 6_application/application_people_copyright.md + 6_application/application_bsn_officially_designated.md + 6_application/application_manufacturing_changhong.md + 6_application/application_on-chain_collaboration_multiple_enterprises_jianxinzhuhe.md + 6_application/application_construction_industry_digitalization_jianxinzhuhe.md +``` +## 社区开发实践 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + 7_practice/kunpeng_platform_compiles_and_runs_fisco-bcos-2.6.0.md + 7_community/group_deploy_case.md + 7_community/suibe_blockchain_center_toolbox.md + 7_practice/build_chain_with_wsl_on_windows.md + 7_practice/ansible_FISCO-BCOS_Webase-deploy.md +``` + +## 社区写作指南 + +### 文章贡献选题 + +基础科普类——分享你对区块链基础概念和原理进行科普和介绍; + +开发实操类——分享你的开发、部署、运维等实操经验,包括但不限于踩坑经历和闭坑经验。 + +应用实践类——如果你对某个场景有深入研究和探索积累,欢迎分享该应用场景下的解决方案与思路。 + + diff --git a/3.x/zh_CN/docs/change_log/3_2_0.md b/3.x/zh_CN/docs/change_log/3_2_0.md deleted file mode 100644 index 5835c8b8d..000000000 --- a/3.x/zh_CN/docs/change_log/3_2_0.md +++ /dev/null @@ -1,84 +0,0 @@ -# v3.2.0 - -#### 新增 - -* CRUD 新增更多接口 -* 网关内白名单 -* 适配硬件加密机 -* 适配麒麟操作系统 -* 新增EVM的analysis缓存,降低大合约的执行开销 -* 出块时间可配置上限 -* 数据归档工具 -* tikv 读写工具 -* max支持手动部署 - -#### 更改 - -* 配置文件中重要字段去除默认值,必须在配置文件中进行配置 -* INFO 日志优化日志大小 - -#### 修复 - -* 超过3级跳转的消息路由问题 -* rpc sendTransaction接口的交易哈希校验问题 - -#### 兼容性 - -* 历史版本升级 - - 需要升级的链的“数据兼容版本号([compatibility_version](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/change_log/3_1_2.html#id5))”为如下版本时: - - * 3.2.0:数据完全兼容当前版本,直接替换二进制即可完成升级 - * 3.1.x/3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/change_log/3_2_0.html#id5) - * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 - * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 - -* 组件兼容性 - -| | 推荐版本 | 最低版本 | 说明 | -| ---------- | --------- | ------------------------ | ---------------------------------- | -| Console | 3.2.0 | 3.0.0 | | -| Java SDK | 3.2.0 | 3.0.0 | | -| CPP SDK | 3.2.0 | 3.0.0 | | -| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | -| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | - -#### 升级方法 - -该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 - -##### 查询数据兼容版本号(compatibility_version) - -用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.1 - -``` -[group0]: /apps> getSystemConfigByKey compatibility_version -3.0.1 -``` - -##### 替换节点二进制 - -需将**所有节点**的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 - -##### 设置数据兼容版本号(compatibility_version) - -用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.1.0。 - -``` -[group0]: /apps> setSystemConfigByKey compatibility_version 3.1.0 -{ - "code":0, - "msg":"success" -} - -注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 -``` - -设置成功,再次查询,得到当前版本已升级为3.1.0 - -``` -[group0]: /apps> getSystemConfigByKey compatibility_version -3.1.0 -``` - -当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 diff --git a/3.x/zh_CN/docs/change_log/index.rst b/3.x/zh_CN/docs/change_log/index.rst deleted file mode 100644 index 3a8be3590..000000000 --- a/3.x/zh_CN/docs/change_log/index.rst +++ /dev/null @@ -1,177 +0,0 @@ -############################################################## -版本和兼容性 -############################################################## - -标签:``版本特性`` ``Release Note`` - ------------- - -.. important:: - 相关软件和环境版本说明!`请查看 `_ - -升级指南 ------------- -FISCO BCOS 版本迭代,支持版本之间的兼容升级,支持可灰度升级,且灰度升级过程中,系统可以正常共识、出块。详情可参考`升级指南 `_ - - -.. toctree:: - :hidden: - :maxdepth: 0 - - upgrade.md - - -v3.2.x ------------------- - -.. admonition:: FISCO BCOS 3.x Releases - - - `FISCO BCOS v3.2.0 <./3_2_0.html>`_ [`release `_] - - -.. admonition:: 查看节点和数据版本 - - - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` - - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` - - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` - - 查看轻节点二进制版本:``../fisco-bcos-lightnode --version`` - - 查看轻节点相关文档,请参考 [`轻节点搭建工具`_] - - -.. toctree:: - :hidden: - :maxdepth: 0 - - 3_2_0.md - -v3.1.x ------------------- - -.. admonition:: FISCO BCOS 3.x Releases - - - `FISCO BCOS v3.1.2 <./3_1_2.html>`_ [`release `_] - - `FISCO BCOS v3.1.1 <./3_1_1.html>`_ [`release `_] - - `FISCO BCOS v3.1.0 <./3_1_0.html>`_ [`release `_] - - -.. admonition:: 查看节点和数据版本 - - - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` - - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` - - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` - - -.. toctree:: - :hidden: - :maxdepth: 0 - - 3_1_2.md - 3_1_1.md - 3_1_0.md - -v3.0.x ------------------- - -.. admonition:: FISCO BCOS 3.x Releases - - - `FISCO BCOS v3.0.1 <./3_0_1.html>`_ [`release `_] - - `FISCO BCOS v3.0.0 <./3_0_0.html>`_ [`release `_] - - -.. admonition:: 查看节点和数据版本 - - - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` - - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` - - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` - - -.. toctree:: - :hidden: - :maxdepth: 0 - - 3_0_1.md - 3_0_0.md - -v3.0.0-rc4 ------------------- - -.. admonition:: FISCO BCOS 3.x Releases - - - `FISCO BCOS v3.0.0-rc4 <./3_0_0_rc4.html>`_ [`release `_] - - -.. admonition:: 查看节点和数据版本 - - - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` - - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` - - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` - - -.. toctree:: - :hidden: - :maxdepth: 0 - - 3_0_0_rc4.md - - -v3.0.0-rc3 ------------------- - -.. admonition:: FISCO BCOS 3.x Releases - - - `FISCO BCOS v3.0.0-rc3 <./3_0_0_rc3.html>`_ [`release `_] - - - v3.0.0-rc3不包括 ``FISCO BCOS Max`` 版本,Max版本的FISCO BCOS会在后续版本中推出 - - -.. admonition:: 查看节点和数据版本 - - - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` - - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` - - -.. toctree:: - :hidden: - :maxdepth: 0 - - 3_0_0_rc3.md - - -v3.0.0-rc2 ------------------- - -.. admonition:: FISCO BCOS 3.x Releases - - - `FISCO BCOS v3.0.0-rc2 <./3_0_0_rc2.html>`_ [`release `_] - - - v3.0.0-rc2不包括 ``FISCO BCOS Max`` 版本,Max版本的FISCO BCOS会在后续版本中推出 - - -.. admonition:: 查看节点和数据版本 - - - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` - - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` - - -.. toctree:: - :hidden: - :maxdepth: 0 - - 3_0_0_rc2.md - - - -v3.0.0-rc1 ------------------- - -.. admonition:: FISCO BCOS 3.x Releases - - - `FISCO BCOS v3.0.0-rc1 <./3_0_0_rc1.html>`_ [`release `_] - - - v3.0.0-rc1不包括 ``FISCO BCOS Max`` 版本,Max版本的FISCO BCOS会在后续版本中推出 - -.. toctree:: - :hidden: - :maxdepth: 0 - - 3_0_0_rc1.md diff --git a/3.x/zh_CN/docs/change_log/upgrade.md b/3.x/zh_CN/docs/change_log/upgrade.md deleted file mode 100644 index 42f627765..000000000 --- a/3.x/zh_CN/docs/change_log/upgrade.md +++ /dev/null @@ -1,25 +0,0 @@ -# 升级指南 -FISCO BCOS 版本迭代,为支持版本之间的兼容升级,设计了[兼容性方案](../design/compatibility.md), 支持可灰度升级,且灰度升级过程中,系统可以正常共识、出块。 - -具体系统版本升级步骤如下: -1. 升级二进制:停止需要升级版本的节点,需将所有节点的二进制逐步替换为当前版本。为不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。 -2. 升级数据兼容版本号:当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本,步骤如下: -- 通过控制台连接节点,执行升级兼容版本号命令:```setSystemConfigByKey compatibility_version 3.x.x``` - -``` -[group0]: /apps> setSystemConfigByKey compatibility_version 3.x.x -{ - "code":0, - "msg":"success" -} - -注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 -``` -- 设置成功,再次查询,得到当前版本已升级 - -``` -[group0]: /apps> getSystemConfigByKey compatibility_version -3.x.x -``` - -当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/community.md b/3.x/zh_CN/docs/community.md index de4d739cd..a0e73c5cb 100644 --- a/3.x/zh_CN/docs/community.md +++ b/3.x/zh_CN/docs/community.md @@ -4,18 +4,12 @@ FISCO BCOS是国内企业主导研发、对外开源、安全可控的企业级 ## FISCO BCOS社区资源 -- [Github主页](https://github.com/FISCO-BCOS/bcos-tars-services)  -- [技术文档](https://fisco-bcos-documentation.readthedocs.io) +- [Github主页](https://github.com/FISCO-BCOS/FISCO-BCOS)  +- [技术文档(3.0)](https://fisco-bcos-doc.readthedocs.io/) - [深度解析系列文章](http://mp.weixin.qq.com/mp/homepage?__biz=MzA3MTI5Njg4Mw==&hid=2&sn=4f6d7251fbc4a73ed600e1d6fd61efc1&scene=18#wechat_redirect) - [贡献代码](https://mp.weixin.qq.com/s/_w_auH8X4SQQWO3lhfNrbQ) -- [反馈问题](https://github.com/FISCO-BCOS/bcos-tars-services/issues) +- [反馈问题](https://github.com/FISCO-BCOS/FISCO-BCOS/issues) - [应用案例集](https://mp.weixin.qq.com/s/cUjuWf1eGMbG3AFq60CBUA) -## 加入FISCO BCOS社区 - -![](../../../2.x/images/community/qr_code1.png) -![](../../../2.x/images/community/qr_code2.1.png) -![](../../../2.x/images/community/changeable_body.png) -![](../../../2.x/images/community/tailer.png) diff --git a/3.x/zh_CN/docs/community/MVP_list_new.md b/3.x/zh_CN/docs/community/MVP_list_new.md new file mode 100644 index 000000000..e9a0b79db --- /dev/null +++ b/3.x/zh_CN/docs/community/MVP_list_new.md @@ -0,0 +1,23 @@ +## 1. MVP + +---- + +**2023年度 | FISCO BCOS MVP榜单** + +作者:小助手 + +为了鼓励为开源社区贡献高质量技术内容的意见先锋与意见领袖,开源社区开放FISCO BCOS MVP认定,截止2023年,开源社区共认定63位MVP 。 + +这些优秀的贡献者或是将FISCO BCOS技术落地到各领域应用中,助力产业数字化,或是在多渠道布道,将开源社区精神传播到更远的地方。 + +下面,让我们一起来认识这些技术的践行者、社区的布道者。 + +![](../../images/community/mvp_review_2023.png) +
+ +![](../../images/community/mvp_2023.png) + +![](../../images/community/mvp_2022.png) + +![](../../images/community/mvp_2021.png) +
diff --git a/3.x/zh_CN/docs/community/app_example.md b/3.x/zh_CN/docs/community/app_example.md new file mode 100644 index 000000000..7c5faddd2 --- /dev/null +++ b/3.x/zh_CN/docs/community/app_example.md @@ -0,0 +1,9 @@ +# 6. 应用案例集 + +![](../../images/community/development_report_2023.jpeg) + + + +公众号对话框回复【2023发展报告】下载全文 + +![](../../../../2.x/images/community/qr_code1.png) \ No newline at end of file diff --git a/3.x/zh_CN/docs/community/contributor_list_new.md b/3.x/zh_CN/docs/community/contributor_list_new.md new file mode 100644 index 000000000..2f83aa240 --- /dev/null +++ b/3.x/zh_CN/docs/community/contributor_list_new.md @@ -0,0 +1,129 @@ +## 2. 贡献者 + +----- +**2023年度 | FISCO BCOS贡献者榜单** + +作者:小助手 + +2023年,世界风云变幻,科技日新月异。FISCO BCOS秉承对区块链技术的信仰,汇聚超过5000家企业机构、10万余名个人成员共建共治共享,打造更加活跃更加繁荣的开源联盟链生态圈。 + +过去一年,一大批开源贡献者加入我们,从代码、工具、方案和布道多个方向支撑FISCO BCOS开源发展。百余位小伙伴为FISCO BCOS贡献代码,为社区带来了更健壮、更强大的FISCO BCOS;十余个团队为开源社区贡献工具组件和解决方案,进一步丰富开源生态组件和应用案例;六十多位伙伴成为FISCO BCOS的“自来水”,自发输出技术解读、操作实践和应用案例,以社区布道者身份推广FISCO BCOS。 + +我们整理了2023年FISCO BCOS贡献者荣誉榜,感谢大家的热情参与和积极贡献! + +向上生长,向下扎根。来自社区的力量是支撑FISCO BCOS技术领先和生态繁荣的坚实底座。我们相信,一个更有活力、更加繁荣的区块链行业正在到来。期待更多小伙伴加入我们,共建区块链美好未来。 + +以下名单排名不分先后,如有错漏,敬请联系小助手【FISCOBCOS010】完善。 + +### 代码贡献 + +代码贡献是指围绕FISCO BCOS项目,以及社区生态项目代码仓库所作的贡献,贡献形式包括但不限于提交PR修改源代码、贡献新代码、共建技术文档等。 + +![](../../images/community/contributors_2023.png) + +### 工具贡献 +在FISCO BCOS基础之上,社区开发者不断探索,开发出多种实用的组件、工具,便捷开发流程的同时也拓展了平台功能。目前,这些工具已全部开源并贡献给社区开发者使用,极大降低了应用开发的门槛和成本。 + +**项目名称:WeCross-BCOS3-Stub** + +贡献方:科大讯飞股份有限公司、微众银行 + +核心参与者:詹大卫、方洋、韩林波、郭锐 + +项目介绍: + +WeCross-BCOS3-Stub是WeCross用于适配FISCO BCOS v3.0及以上版本的插件,成功实现了FISCO BCOS v3.0及以上版本的跨链适配。 +https://github.com/WeBankBlockchain/WeCross-BCOS3-Stub + +**项目名称:SmartDev-Contract 智能合约库组件** + +贡献方:宁夏为教科技有限公司、广东工业大学、厦门哈希科技有限公司、深圳职业技术大学、江西师范大学、北京伽罗华域科技有限公司、京北方信息技术股份有限公司、重庆电子工程职业学院、深圳职业技术大学、深圳信息职业技术学院、湖南科技职业学院。 + +核心参与者:张生、陈汛、李奇龙、金伟、林滨、张宇豪、王江宇、刘武阳、何鸿坤、高野、向键雄、杜小敏、袁佳佳、彭添淞、罗嘉城、肖晶雄。 + +项目介绍: + +为了让更多开发者参与到智能合约库组件优化,社区启动了“Task挑战赛”活动。2023年第1、2季活动分别征集了“供应链金融应收款保理融资”、“历史块高查询”、“类型转换合约”、“时间锁操作”、“多方投票”、“区块链资金透明监管与投票解决方案”、“打怪升级高达游戏”、“共享单车案例”、“给合约添加代码注释”、“公共领域的创新解决方”“电子病历案例”“囚徒困境”等合约。 +https://github.com/WeBankBlockchain/SmartDev-Contract + +### 方案贡献 +在2023深圳国际金融科技大赛等众多区块链权威赛事中,涌现不少基于FISCO BCOS的优秀参赛方案。本着回馈社区的开源精神,参赛者将这些方案贡献出来,为社区用户提供区块链学习了有益参考。 + +**方案名称:AI4C——面向AIGC创作的文化数字产品运营平台** + +核心参与者:于祯奇、胡鑫、孙俨、杨国铭 + +目前,AIGC文化创作面临海量素材难存查、链下推理不可信、产品版权难保护、利益分配不透明等诸多难题。为解决以上问题,团队构建面向文化数字产品AIGC创作的版权运营平台。平台集成可信版权标识等6大关键功能,实现文化数字作品版权全流程服务。开展链上存储检索、链下可信扩展技术研究,设计文化数字产品运营方案。已完成平台与FISCO BCOS区块链的研发部署,并使用可信计算硬件支撑生成式模型的隐私计算与推理加速。 +https://github.com/FISCO-BCOS/hackathon/pull/81/files + +**方案名称:基于FISCO BCOS的联邦学习平台** + +核心参与者:马昊滨、苏柄权 + +该平台创新性地整合了联邦学习与区块链技术,实现了高效而安全的业务流程。创新提出串行+并行的联邦学习方式,巧妙提升了训练数据的多样性,减轻数据存储的压力,最大程度地保护了隐私安全。系统采用FISCO BCOS多群组部署和Ribbon负载均衡相结合,显著提升了区块链服务的处理效率与吞吐量。利用RocketMQ实现削峰确保了系统的稳定性;同时采用模型文件与文件索引分开存储的方式实现了大数据量文件上链存证的功能。通过公私钥文件实现节点可信认证,为整个系统提供了安全的基石。 +https://github.com/FISCO-BCOS/hackathon/pull/87/files + +**方案名称:基于区块链的供应链碳足迹一体化系统** + +核心参与者:邓淏天、梁浩天、王炜杰、轩浩均、任旭豪 + +传统供应链厂商通常将碳足迹数据存储在各自的本地数据库中,导致不同供应链厂商之间的数据库数据无法流通,造成了碳足迹数据难以同步的问题。本作品提出“基于区块链的供应链碳足迹一元化系统”。该系统由三个关键技术组成,包括面向区块链的细粒度访问控制技术、链上链下混合存储的体系架构以及高效的链上链下协同机制。该系统实现了各供应链厂商间数据的同步和一致,从而助力企业实现“双碳”目标。 +https://github.com/FISCO-BCOS/hackathon/pull/89/files + +**方案名称:基于区块链和情感寄托的二手潮玩交易平台** + +核心参与者:卢隆基、高韬、伍嘉恒、袁瑶、林佳儿 + +本项目旨在构建更加可信、高效、安全且富有温度的二手潮玩交易平台,通过情绪寄存和原创确权提升用户体验,利用区块链技术让情感故事永远留存、原创内容受到保护,同时减少交易过程的欺诈和恶意行为,推动二手交易市场的健康发展。本项目的创新点在于让情感产生价值,保护原创作者权益,项目初期在前景广阔的二手交易市场中,聚焦于二手潮玩这个特殊的品类,用故事和商品连结买家和卖家的情感进而产生共鸣:让卖家通过情感赋值将商品卖出更高的价格;同时为最有情感需求的买家,提供情绪消费的场所。 +https://github.com/FISCO-BCOS/hackathon/pull/80/files + +**方案名称:问链—基于区块链的ESG评级系统** + +核心参与者:郑惠文、钟南海、李志远 + +在可持续发展的背景下,ESG评估成为了企业可持续性的重要指标。然而,当前市场上缺乏统一、透明且高效的ESG评估平台。现有的评估工具往往面临着评分标准不一、数据不透明、易篡改、流程冗余等问题,这不仅影响了评估的公正性,也增加了企业的运营成本。因此,开发基于区块链的ESG评分系统,旨在为企业提供可靠、透明且易于操作的ESG评估解决方案,本系统在成本效率方面具有显著优势,适合各种规模的企业及评估机构、相关监管机构使用。 +https://github.com/FISCO-BCOS/hackathon/pull/83/files + +**方案名称:碳路—基于区块链的碳资产管理与可信交易方案** + +核心参与者:张帆、宋雨、肖轶涛、王青楠、申铜博 + +本方案针对碳数据采集、接入认证、碳资产交易、碳数据管理流程中存在的痛点,制定项目的解决方案,通过碳排放可信自动采集、多主体低成本接入认证、碳资产高效可信交易、碳数据动态授权管理等技术优势,提供打破碳市场资产交易壁垒、支持多元碳资产交易业务、多市场交易数据融合分析、碳资产交易与管理一体化方案。本项目使用FISCO BCOS v3.0区块链架构,前端使用VUE,后端使用SpringBoot等核心开发工具实现基于区块链的碳资产管理与可信交易一体化平台。 +https://github.com/FISCO-BCOS/hackathon/pull/92/files + +**方案名称:WeTender—适用于修建“四好农村路”的政府与企业之间的项目招标ESG治理模型** + +核心参与者:丁俞嘉、代钰堃、陈炜权、熊语嘉、盛媛 + +WeTender是一个基于FISCO BCOS底层开源平台搭建的适用于修建“四好农村路”的政府与企业之间的项目招标的区块链数据信息管理平台,充分发挥了区块链技术的不可篡改性、可追溯性以及对智能合约的支持,致力于解决在“四好农村路”建设过程中的信任问题。 +https://github.com/FISCO-BCOS/hackathon/pull/86/files + +**方案名称:基于FISCO BCOS的匿名投票系统** + +核心参与者:陈鸣远、林泽君、叶力涛、鲁宇豪、张诗洁 + +基于FISCO BCOS区块链平台搭建匿名权重投票系统,充分发挥了区块链技术的不可篡改性、可追溯性以及对智能合约的支持,致力于解决传统投票系统由中心化机构控制、不公开透明、不支持权重投票和隐私性等问题。 +https://github.com/FISCO-BCOS/hackathon/pull/91/files + +**方案名称:智慧兴农——从触网到触链,“红星苹果”特色农产品持“证”一键溯源** + +核心参与者:白琪利、李艺乐、高慧雯、陈国翠、常嘉璇 + +智慧农业特色农产品溯源系统是集物联网、云计算、数据分析、区块链技术为一体的对农业环境与运输进行感知、分析、预测、控制的物联网平台。区块链是融合了数字、密码学、互联网和计算机编程等技术,通过去中心化和可信的方式,集体维护一个可靠数据库的技术方案。首先依托部署在农业生产现场的各种传感节点实时在线采集监测生长条件等实时数据,通过websocket长连接方式采集数据传输至FISCO BCOS区块链网络云端区块链计算中心,并通过储存加密保证了运行联盟链的数据在硬盘上的安全性与可视性,形成实际农作物从种植到运输全流程追溯,通过AI分析向种植户提供科学的种植指导和赋予农作物“一物一码”,提高农作物质量的真实性,为农作物了提供精准化种植、可视化管理、智能化决策。 +https://github.com/FISCO-BCOS/hackathon/pull/90/files + +### 布道贡献 + +除了代码贡献与工具贡献,还有一类贡献者不吝于在各种渠道分享基于FISCO BCOS的开发经验与技术/产业观点,赋予了FISCO BCOS开源社区更强劲、长久的生命力和影响力,鼓励了更多人参与到生态共建中。 + +布道贡献包括但不限于在各类活动中分享FISCO BCOS相关技术、撰写文章或编制视频解析FISCO BCOS相关技术等。布道渠道不限,如贡献名单有遗漏,欢迎联系小助手告知我们。 + +![](../../images/community/sermon_contributors_2023.png) + +### 贡献数据来源说明 +本期贡献者名单主要从GitHub中 FISCO BCOS代码仓库,以及FISCO BCOS Toolbox、WeBankBlockchain等社区生态项目的代码仓库中收集,统计时间周期为2023年1月1日-2023年12月31日,如有遗漏、改进建议,可联系小助手【FISCOBCOS010】反馈。 + +![](../../images/community/img.png) + +扫码查看季度贡献者榜单 + diff --git a/3.x/zh_CN/docs/community/join_fiscobcos.md b/3.x/zh_CN/docs/community/join_fiscobcos.md new file mode 100644 index 000000000..986ebc307 --- /dev/null +++ b/3.x/zh_CN/docs/community/join_fiscobcos.md @@ -0,0 +1,20 @@ +# 5. 欢迎加入FISCO BCOS社区 + +--- + +## FISCO BCOS社区资源 + +- [Github主页](https://github.com/FISCO-BCOS/FISCO-BCOS) +- [技术文档](https://fisco-bcos-documentation.readthedocs.io) + +- [深度解析系列文章](http://mp.weixin.qq.com/mp/homepage?__biz=MzA3MTI5Njg4Mw==&hid=2&sn=4f6d7251fbc4a73ed600e1d6fd61efc1&scene=18#wechat_redirect) +- [贡献代码](https://mp.weixin.qq.com/s/_w_auH8X4SQQWO3lhfNrbQ) +- [反馈问题](https://github.com/FISCO-BCOS/FISCO-BCOS/issues) +- [应用案例集](https://mp.weixin.qq.com/s/cUjuWf1eGMbG3AFq60CBUA) + +## 加入我们 + +![](../../../../2.x/images/community/qr_code1.png) +![](../../../../2.x/images/community/qr_code2.1.png) +![](../../../../2.x/images/community/changeable_body.png) +![](../../../../2.x/images/community/tailer.png) \ No newline at end of file diff --git a/3.x/zh_CN/docs/community/partner_list_new.md b/3.x/zh_CN/docs/community/partner_list_new.md new file mode 100644 index 000000000..f48643f5a --- /dev/null +++ b/3.x/zh_CN/docs/community/partner_list_new.md @@ -0,0 +1,414 @@ +# 4. 合作伙伴 + +---- + +**FISCO BCOS 合作伙伴** + +作者:小助手 + +为了更好地推动区块链落地产业,为行业培育更多专业人才,助力区块链生态蓬勃发展,金链盟FISCO BCOS合作伙伴计划面向业界长期招募“产业应用合作伙伴”、“人才培育合作伙伴”与“生态发展合作伙伴”。 + +产业应用合作伙伴旨在助力区块链技术更好落地应用,推动区块链产业发展;人才培育合作伙伴将与FISCO BCOS开源社区共同携手,基于FISCO BCOS开源区块链技术,开展课程研发、人才培育与人才认证等工作,助力共建区块链人才培育体系,为产业发展提供专业技能人才;生态发展合作伙伴将与FISCO BCOS开源社区共建区块链开源生态,以坚实的基础科技支撑引领产业高质量发展。 + +自FISCO BCOS合作伙伴计划启动以来,有众多伙伴踊跃申请。截止2023年通过认证的金链盟FISCO BCOS合作伙伴共计50家(35家产业应用合作伙伴、13家人才培育合作伙伴、2家生态发展合作伙伴),为推动FISCO BCOS落地产业应用,助力区块链产业发展发挥重要作用。 +认证合作伙伴公示如下,欢迎大家添加小助手【FISCOBCOS010】了解并报名加入计划。 + +![](../../images/community/partner/industrial_application_partners_2023.jpeg) + +![](../../images/community/partner/talent_development_partner_2023.jpeg) + +![](../../images/community/partner/ecological_development_partner_2023.jpeg) + +### FISCO BCOS产业应用合作伙伴 + +(下列根据公司名称首字母排序) + +![](https://user-images.githubusercontent.com/93572056/155054506-033e768b-0b1d-4380-b9c4-98730158a628.png) + +**北京版权家科技发展有限公司** + +北京版权家科技发展有限公司携手FISCO BCOS提供数字版权服务,开发的版权区块链系统联合版权监管机构、司法机构、国家授时中心、CA等提供版权确权、盗版监测、版权维权以及版权交易等一站式版权综合服务,实现创作即确权、使用即授权、发现即维权! + +![](../../images/community/partner/img.png) + +**北京众享比特科技有限公司** + +北京众享比特科技有限公司成立于2014年7月,是国内首批从事区块链底层平台和应用案例开发的技术驱动型公司之一,基于FISCO BCOS为国内外众多客户提供区块链产品和综合解决方案服务。 +众享比特是国家高新技术企业、北京市“专精特新”中小企业、2021北京市知识产权示范单位,获得2022/2021北京民营企业中小百强、2021/2020/2019毕马威中国领先金融科技50企业、2020/2019中关村瞪羚企业等荣誉。 + +![](https://img-blog.csdnimg.cn/343fead6b7a643c1bf534149d224b3e5.png) + +**广电运通集团股份有限公司** + +广电运通创立于1999年,隶属于广州无线电集团,是国有控股的高科技上市企业(证券代码:002152),主营业务覆盖智能金融、公共安全、交通出行、政务、大文旅、新零售及教育等领域,携手FISCO BCOS为全球客户提供具有竞争力的智能终端、运营服务及大数据解决方案。 + +公司从国内金融自助设备起步,凭借多年来积累的场景落地能力、技术研发、供应链等优势,贯彻新发展理念,聚焦金融科技和城市智能两条主线,在智能金融、智能交通、智能安全、智能便民等领域,以科技赋能传统产业升级。在海外市场,公司已建立9大全球分支机构,产品及服务已进入全球100多个国家和地区。面对新一轮科技浪潮,广电运通将继续加快区块链、人工智能、大数据、物联网等前沿信息技术与实体经济的深度融合,为建设智慧大湾区和“数字中国”贡献力量。 + +![](https://img-blog.csdnimg.cn/bbf93b5ae6ea41e1976137f072cd8dcd.png) + +**广州市一链区块链科技有限公司** + +广州市一链区块链科技有限公司专注于区块链技术产品与行业应用解决方案,拥有软著专利10余项,成功应用FISCO BCOS于政企 “审计监管”场景,上线“区块链数据防篡改平台”。 +平台致力于“让天下的数据可信,没有造假”,已成功落地广汽本田、招商高速公路、安居宝等客户的审计监管场景。 + +![](../../images/community/partner/hucais.jpeg) + +**虎彩集团有限公司** + +虎彩集团有限公司成立于1989年,是一家集数字印刷、原浆啤酒、智慧婚拍三大业务板块于一体的集团企业,旗下拥有数十家成员企业,涵盖虎彩印艺、泰山原浆啤酒、鲜檬智慧婚拍三大品牌。总部位于东莞国家级高新技术开发区松山湖。 + +基于公司数字化和工业互联网战略,虎彩于2020年成立虎彩区块链创新应用中心,将区块链技术发展为公司工业互联网五大核心能力之一。基于FISCO BCOS,虎彩构建了包含从营销、物流、商城到内容的大量产业区块链应用,包括小虎智数营销、运力链、兑换商城、内容生态平台、统一交易结算平台和印刷链等平台,已广泛应用在虎彩实际业务中,服务超百万的合作伙伴和用户。 + +![](https://img-blog.csdnimg.cn/f3a426136533477b8561146dce75ae9f.png) + +**济南泉链海沃数字科技有限公司** + +济南泉链海沃数字科技有限公司是一家专注于RegTech(监管科技)细分领域的高新技术企业,由区块链领域知名学者、工信部认证的区块链技术专家以及金融科技领域人才组建,是国内首批进入政府试点目录的商用区块链公司之一,是航天信息、人民在线、山东数字出版等大型企业的区块链重点合作商。 + +公司携手FISCO BCOS,提供一站式区块链应用解决方案,已推出链联金服平台、防篡改对比审查系统、专项资金监管、区块链超融合一体机、共享单车治理、社区数字化防疫、分布式大数据共享等产品,获得国内多项区块链赛事大奖。 + +![](https://img-blog.csdnimg.cn/2df1a680702f4f30b7002066f8f0af44.png) + +**价值互联(广州)区块链科技有限责任公司** + +价值互联(广州)区块链科技有限责任公司(简称“价值互联”或“Value++”),成立于2017年,专注于区块链相关技术、产品的研发和销售,通过打造基于区块链技术的数据交换和流通平台,融合区块链、隐私安全计算、云计算、人工智能等先进技术,构建企业间数据交换、交易、流通和共享平台,解决企业数据互信和数据的自由流通和交换,激活企业沉睡数据,实现数据聚合升华,帮助企业迈入DT智能化时代。 + +![](https://img-blog.csdnimg.cn/d701715249f140e88c17b1b8b760f349.png) + +**江苏安凰领御科技有限公司** + +江苏安凰领御科技有限公司成立于2017年8月,公司聚焦于区块链各应用场景,携手FISCO BCOS提供物联网安全服务、区块链产品、可信安全服务能力输出等多项解决方案与服务。致力于成为行业领先的区块链解决方案与服务提供商,助力政府、企业数字化转型。 + +安凰领御于2020年11月获得了国家网信办区块链备案企业称号,2021年5月成功入选IDC区块链数字存证领域创新者。 + +![](../../images/community/partner/north_king.png) + +**京北方信息技术股份有限公司** + +京北方信息技术股份有限公司[股票代码:002987]作为领先的金融科技服务提供商,向以金融机构为主的客户提供软件与信息技术服务,为企业数字化建设聚势赋能。公司以大数据、云计算、人工智能、区块链、隐私计算及5G应用为引领,将前沿科技与金融业务场景深度耦合,成为行业发展的新引擎。 + +京北方基于FISCO BCOS打造了通用的区块链公共服务平台,平台拥有区块链分布式账本、加密算法、数据存储、网络协议、共识机制、智能合约、应用API接口等核心模块。该平台支持业务信息上链、金融交易、合同文件和金融数据存证服务,优化业务流程,提升系统运行效率。平台支持金融业应用,可用于供应链金融、票据管理、跨境结算、工资代发等场景。利用加密算法、公私钥体系、共识算法、时间戳等技术,平台可出具金融区块链证书,提升金融安全,相关发明专利已获得国家知识产权局专利授权。 + +![](../../images/community/partner/img_1.png) + +**科大讯飞股份有限公司** + +科大讯飞股份有限公司是一家专业从事智能语音及语言技术,人工智能技术研究,软件及芯片产品开发,语音信息服务及电子政务系统集成的国家级骨干软件企业。2008年,科大讯飞在深圳证券交易所挂牌上市。 + +科大讯飞致力于面向政府、行业和用户,构建一套基于区块链的数字身份、公共数据共享、智能感知的新型区块链基础设施,实现对数据要素的全面互联,解决数据跨地域、跨行业、跨系统的可信流通,推动数字经济变革。公司携手FISCO BCOS,提供区块链基础设施平台和区块链应用解决方案,已推出开放联盟链服务、存证溯源平台、版权保护系统、供应链金融融资平台等。 + +![](https://img-blog.csdnimg.cn/5d6e5a309d4343519f15ec191fe27c9b.png) + +**南京安链数据科技有限公司** + +南京安链数据科技有限公司是国内专业、领先的区块链公司,研发方向覆盖区块链、大数据分析等领域,已成功应用FISCO BCOS于物流、金融、溯源、存证等多业务场景,大幅降低区块链应用层开发成本。 + +![](../../images/community/partner/ctk.jpeg) + +**厦门哈希科技有限公司** + +厦门哈希科技有限公司成立于2018年4月,隶属于北京哈希数道集团,是中关村北京绿色碳汇研究院理事单位,是致力于碳汇全产业链及生态价值开发与服务的绿色生态科技公司。 + +公司坚持自主创新、掌握自主核心技术,以GEP为切入点,基于区块链底层平台FISCO BCOS,先后打造多个国家级、省级、市级生态价值开发及碳中和体系建设,通过林业碳汇、碳普惠等串联碳汇生态产业链,助力数字化转型,赋能碳市场交易,拓展“两山”转化通道,引领绿色低碳产业体系。将数字化的“绿水青山”变成真正价值的“金山银山”,为各地方政府职能机构及金融资源体提供全链条生态价值服务。 + +![](https://img-blog.csdnimg.cn/332ceb0c12fb403fb1a56226753c5327.png) + +**熵链科技(福建)有限公司** + +熵链科技(福建)有限公司是一家专注于产业数字化应用的综合服务商。公司于2017年率先布局区块链技术,搭建领先的区块链产业生态服务平台,为产业数字化发展提供先进的区块链解决方案。针对区块链供应链金融、农业溯源、分布式商业、数据存证与数据资产化等领域拥有自主的技术解决方案。熵链科技作为福建省区块链协会首任会长单位以及BSN福建省区块链主干网指定唯一运营商,汇聚全球领先区块链产业资源,具有专业的实践应用和市场拓展服务能力。 + +![](https://img-blog.csdnimg.cn/58e8010398fb4754b9324b72cd79face.png) + +**上海久誉软件系统有限公司** + +上海久誉软件系统有限公司成立于2013年,是由上海久事公司和上海公共交通卡股份有限公司共同投资组建的一家专业从事软件开发和系统集成的企业。 + +携手FISCO BCOS,上海久誉围绕支付清算、消费交换两大核心技术,在卡基业务、移动支付、城市公交“一卡通”、“一票换乘”资金清分清算、智能终端、数据服务等行业领域拥有一流技术;公司集行业知识、应用开发、系统集成、运营管理、项目实施和增值服务为一体,坚持“自主创新、自有品牌、立足上海、辐射周边”的发展战略,在金融电子化、社会信息化等行业领域,为客户提供行业解决方案、系统集成服务及机具销售。公司在成立近5年时间内已获得二十三项项软件著作权和十七项软件产品认证证书。 + +![](../../images/community/partner/img_2.png) + +**上海碳抵信息科技有限公司** + +上海碳抵信息科技有限公司是一家专注于碳中和数字化的金融科技公司。公司长期深耕金融数字化服务业,在软件及小程序开发,数字化及运营管理等方面具备较强能力。 + +目前,公司战略聚焦于“碳中和数字化”与“协同低碳”,致力于通过SaaS平台为政府及企业提供快速便捷的碳减排、碳中和服务,以及助力碳普惠体系建设运营、低碳数据增信等多元服务。 + +基于区块链底层平台FISCO BCOS,公司打造了碳低链服务平台,为科技赋能低碳减排提供了新的实践探索思路。碳抵科技的合作伙伴包括多家低碳领域专业机构,服务客户包括多家大型公司以及多个大中型会议。 + +![](../../images/community/partner/img_3.png) + +**上海旺链信息科技有限公司** + +上海旺链信息科技有限公司成立于2016年,是高速成长的国家高新技术企业、国家工信部区块链重点实验室成员单位,总部位于上海,在宁波、合肥、长沙、西安、雅加达、新加坡设有分公司。2018年,荣登工信部赛迪区块链“中国区块链企业百强榜”;2020年,荣膺“亚洲创新企业Top10”;2022年,入选“2022中国产业区块链100强”。 + +旺链科技以数据中心运营、云计算为依托,自研云管平台和云操作系统,为全球客户提供前沿的高新技术解决方案,包括智慧农业、区块链溯源、供应链金融、工业互联网、边缘计算、元宇宙模型渲染、高速分布式存储、自治组织管理等多个应用场景,已成功服务包含航空、政府、金融、能源、农业、医疗、教育、房地产、快消和汽车等在内的数十个行业数百家客户。 +旺链科技和FISCO BCOS一直保持良好的合作关系,基于FISCO BCOS研发了VoneBaaS区块链基础服务平台;公司也持续参与社区建设,多次荣登FISCO BCOS贡献榜单。 + +![](https://img-blog.csdnimg.cn/289b2382adc840369106d00dcc42ad08.png) + +**上海新致软件股份有限公司** + +上海新致软件股份有限公司成立于1994年,是国内领先的软件服务提供商。公司总部坐落于上海,在北京、深圳、大连、重庆、成都、贵安、武汉、东京等多地设立了分支机构。2020年12月,新致软件正式登陆A股科创板,使公司迎来新的发展篇章。 + +公司依托20多年服务金融行业的实践经验,基于云计算、大数据、人工智能、区块链四大基础实验室的研发能力,为金融客户提供包括渠道、核心、数据、管理等全面的信息化解决方案,满足金融客户实现智能化、安全合规、业务多样化等需求,连续多年在中国保险业、银行业IT解决方案市场份额中占据领先地位。同时,公司的相关产品及服务已广泛应用于电信、医疗、汽车等诸多领域,赢得包括中国太保、中国人寿、中国人保、交通银行、建设银行、中国银联、中国电信、上海汽车、复星集团等众多优质客户。 + +![](https://img5.tianyancha.com/logo/product/b75785ccf33885df0c815de4129a697c.png@!f_200x200) + +**上海信医科技有限公司** + +上海信医科技有限公司,是坐落在上海区块链生态谷的医疗区块链与大数据领军企业,是国家卫健委及上海、山东、湖北、浙江、四川、江西等多省市医疗区块链的核心成员与技术支撑单位;也是多家企业及多个健康医疗大数据中心等主流平台的合作伙伴。 + +信医科技为多家医疗平台的建设提供FISCO BCOS区块链技术支持,包括“信医链电子病历夹应用”、“基于区块链的商业保险结算与审核支撑服务”、“基于区块链的中药饮片流转质量服务与监管平台”等。公司参与广州国家实验室、上海申康、国家健康医疗大数据(北方)中心多个专病库与科创大数据平台建设,覆盖近百个专病库。 + +![](https://img-blog.csdnimg.cn/2c768788331843469936a1796277d2ff.png) + +**上海域乎信息技术有限公司** + +上海域乎信息技术有限公司是一家以区块链技术为核心的高新技术企业,专注于区块链技术与数字资产服务,2018年通过工信部区块链系统功能测试,曾参与工信部物联网区块链蓝皮书和区块链技术安全标准编写。域乎应用FISCO BCOS实现农业数字化,确保数字农业主体身份和数据可信,助力企业、政府、银行等机构实现可信数据共享。 + +![](https://img-blog.csdnimg.cn/fef9f8c1236f45389ea7f8ffee06ed04.png) + +**深圳市瀚兰区块链地产有限公司** + +深圳瀚兰区块链地产有限公司基于区块链帐本管理技术自主研发互联网平台兰房链,由成熟的区块链底层技术及海内外区块链专家团队提供技术支持,实现一种“非接触”式的可信赖的新型房地产商业模式,在房地产开发行业中建立信用及价值体系,立足数字经济,打造的房地产数字化运营管理SaaS工具,解决房地产开发中的痛点,为房地产行业上下游企业提质增效。 + +![](../../images/community/partner/green_credit_tech.png) + +**中碳绿信科技(深圳)有限公司** + +中碳绿信科技(深圳)有限公司成立于2018年5月17日,是中国碳中和发展集团旗下专注于以区块链赋能双碳经济的国家高新技术企业。 + +绿信科技为产业打造跨组织协同、驱动价值共识、提炼数字资产的金融级可信协同网络-绿信链。通过降低区块链技术的使用门槛与成本,促进全球更多企业和个体基于区块链建立数字信用,实现商业创新,连接绿色金融。 + +![](../../images/community/partner/XGD.png) + +**深圳市新国都数字科技有限公司** + +深圳市新国都数字科技有限公司成立于 2016 年,是上市公司新国都股份(300130) 旗下公司。新国都数科依托数字科技能力,形成了数字政企、数字征信、数字安全、数字用工四大核心业务板块,主要提供数据治理、数据产品、数据应用开发、数据资产运营、数据安全等服务。 + +新国都数科坚持以“数据资产运营商”为使命,以大数据、人工智能、区块链技术为核心,携手FISCO BCOS在区块链底层平台、隐私计算等领域开展合作,提供数据分析、平台技术、区块链产品和运营服务,为政府、金融机构、国有企业提供数字化服务综合解决方案,致力于为社会诚信体系建设做出贡献。 + +![](https://storage-public.zhaopin.cn/org/logo/1644992846111082045/7bf6f160950405e91717b28e1d89586b330aa8db533bb5d2452c2f62b5a38136fa86a38250e8e3ab.jpg) + +**数金公共服务(青岛)有限公司** + +数金公共服务(青岛)有限公司是一家数字金融科技企业,是数字人民币试点落地机构和标准组成员企业,业务涉及绿色低碳及数字金融等领域。公司深度参与数字人民币试点推广过程中的技术研发、产品创新、运营拓展、资源协同以及生态建设等服务,为政府、企业以及金融机构接入数字人民币系统、开展数字人民币活动提供“场景+技术+服务”支持,推动数字金融科技生态构建和产业升级。 + +公司携手FISCO BCOS 围绕个人碳普惠领域推出了场景化解决方案,包括利用区块链做数据的可信存证,解决数据的多方信任问题;链接碳普惠的各参与方,构建一个开放、共创、可信的碳普惠联盟链生态。 + +![](../../images/community/partner/digit_guangdong.jpeg) + +**数字广东网络建设有限公司** + +数字广东网络建设有限公司作为广东省数字政府建设运营中心和中国电子二级机构,坚持数字政府公益性、基础性、平台性、保障性定位,聚焦数字政府公共服务、基础设施、平台建设、安全防护等主责主业,有力支撑广东省经济社会高质量发展,有力推进治理体系和治理能力现代化,为积极探索中国式现代化的广东路径作出了重要贡献。公司目前拥有近3000名员工,其中技术类人员占比超过七成。 + +数字广东公司现已建成省市一体化的政务云平台、一网共享平台和公共支撑平台,持续夯实数字政府基础底座,并打造了粤省事、粤商通、粤政易、广东政务服务网、“一网统管”粤治慧平台、粤公平等一系列数字政府改革建设重要成果,全面支撑广东数字政府改革建设事业走在全国前列,在改善民生服务、优化营商环境、提升政府治理能力现代化等方面发挥了重要作用。数字广东将携手FISCO BCOS持续探索区块链在智慧政务领域的应用场景。 + +![](https://user-images.githubusercontent.com/93572056/155054328-57752ba6-e40d-42d5-bfba-888d83c5fd73.png) + +**四川虹信软件股份有限公司** + +四川虹信软件股份有限公司是四川长虹旗下旗舰企业之一,历经十余年高速发展,成为拥有四大核心能力的高新技术企业,专注于智慧企业、智慧城市、军民融合三大业务领域前沿IT技术研发、咨询与实施。借助在智能家居领域的优势,长虹携手FISCO BCOS建立可信互联物联网,虹信软件承担身份认证模块,利用FISCO BCOS证书认证体系,完善物联网中群组/节点准入验证机制,为跨品牌智能家居场景提供可信数据基础。 + +![](https://user-images.githubusercontent.com/93572056/155054716-90294c2f-831d-4385-b5d1-7917baabce09.png) + +**四川万物数创科技有限公司** + +四川万物数创科技有限公司是具备科技创新能力的新经济企业。企业核心产品CoT Network万物共算网络是自主可控的多元弹性网络计算系统,融合区块链分布式计算以及边缘计算技术,为各行业和场景提供区块链系统及应用、多元计算软硬件产品、区块链服务、以及行业整体解决方案的咨询和实施。目前,四川万物基于FISCO BCOS落地了社区智慧化治理和服务、智慧党建等方向应用案例案例。 + +公司核心团队由海外归国专家及世界500强企业管理者组成,拥有多项知识产权和优质合作伙伴。 + +![](../../images/community/partner/taikang_pension.jpeg) + +**泰康养老保险股份有限公司** + +泰康养老保险股份有限公司是由泰康人寿保险股份有限公司和泰康资产管理有限责任公司共同出资成立的全国性、股份制专业养老保险公司。业务范围涵盖团体保险、企业年金、个人养老保险三大领域。目前在全国已成立了23家分公司及9家企业年金中心。 + +泰康养老作为国内五家专业养老保险公司之一,始终奉行“专业化、规范化、国际化”的发展战略,携手泰康资产,依托泰康人寿十七年丰富的员工福利及补充养老保险管理经验,坚持“以客户为中心、以价值为导向,做强员福、做大年金”的经营策略,致力于为广大企业和企业员工提供团体寿险、意外伤害险、短期健康险、团体养老险、企业年金、个人养老险全方位的员工福利计划和一站式服务,用专业的服务做市场上最好的企业员工福利解决方案的好管家。泰康养老已基于FISCO BCOS落地多个应用,未来将继续携手FISCO BCOS针对保险健康管理场景探索更多解决方案。 + +![](https://img-blog.csdnimg.cn/2662383423db48dc8892d3b1c29f45ad.png) + +**万高信息科技有限公司** + +万高成立于2014年,于2015年组建珠海分公司,为澳门提供长期、稳定、充足的人力资源保障,万高团队按不同业务划分,专责专项管理。技术研发团队稳定且项目经验丰富,旨在为客户提供更好的技术建议和开发服务。 + +目前公司已接受FISCO BCOS专业培训的人员有8人,并计划让更多的人员接受FISCO BCOS的专业培训。万高专注移动及数据应用程式开发,2019年疫情期间,成功采用FISCO BCOS技术开发澳门健康码供澳门政府应对疫情,并助力粤澳两地健康码在2020年5月实现跨境互认。迄今,粤澳健康码跨境互认系统已服务上亿人次通关。 + + +![](https://img-blog.csdnimg.cn/b887aab7a31f4711aece65fd258201c0.png) + +**武汉链动时代科技有限公司** + +武汉链动时代科技有限公司携手FISCO BCOS解决区块链应用开发“最后一公里”问题,研发的“inBC区块链存证服务系统”对链上数据进行格式化协同,实现区块链存证一键触达;”Falcon零代码开发平台” 通过图形化拖拽、参数配置等即可高效完成系统搭建和部署。 + + +![](https://img-blog.csdnimg.cn/e70b73e27d6e43b8859ba1adb75c4010.png) + +**武汉领晟旺链科技有限公司** + +武汉领晟旺链科技有限公司成立于2018年11月,是武汉市区块链协会秘书长单位,其前身为菲旺科技区块链事业部。公司是国内领先的区块链+智慧城市数权服务提供商,围绕“智链城市”建设,在政务、物联网、数据安全等方面打造并落地了一系列产品及解决方案,其中基于FISCO BCOS开发的“链税通” 是全国税收治理领域第一个区块链项目;“明厨亮灶区块链物联网平台”被评选为工信部2020年新型信息消费示范项目。 + +同时,公司获批成为工业和信息化重点领域(区块链)人才能力评价机构,目前已获得区块链相关软著15项,已申报了8项专利。 + +![](../../images/community/partner/yeepay.png) + +**易宝支付有限公司** + +易宝支付成立于2003年,是首批获得中国人民银行《支付业务许可证》的第三方支付机构。2006年易宝创立B端行业支付模式,为企业客户提供集技术、产品、服务为一体的一站式数字化交易服务解决方案。目前,易宝已累计服务超过百万家商户,覆盖航空、旅游、零售、能源、汽车、互联网3.0、跨境、金融、政务、本地生活等众多行业头部客户,业务规模位居行业前列。 + +公司基于FISCO BCOS孵化了极速不卡顿的交易级联盟链——亿链,亿链首创支付节点合约规则,并引入公信力节点,可保障数字资产永久留存、可信流通。通过打造聚焦Web3.0经济系统的技术底座,持续为企业客户提供极速、安全、稳定的链上交易解决方案,构建生态共融的开放联盟链,引领Web3.0可信生态的升级跃迁。 + +![](https://img-blog.csdnimg.cn/be9d01ea303a4e3cb2a3d3b0787995c0.png) + +**易联众信息技术股份有限公司** + +易联众信息技术股份有限公司是国内民生信息服务领域上市公司。自2000年成立以来,易联众牢记“让天下没有难过的人生”的企业使命,以大数据为驱动,重点围绕“医疗保障、卫生健康、人力资源和社会保障”等民生领域,提供全方位的整体解决方案和产品与技术服务体系。公司充分利用大数据、区块链及人工智能等技术,持续研发并提升产品创新能力,推动主营业务数字创新。 + +![](https://img-blog.csdnimg.cn/a90c74530b7b4d39b237b220fe767499.png) + +**浙江天演维真网络科技股份有限公司** + +浙江天演维真网络科技股份有限公司是全国领先的乡村振兴数字化服务整体解决方案提供商,成功应用FISCO BCOS于农业全过程溯源,目前正在融合区块链与物联网技术研发智慧农业云平台、探索区块链+农业金融应用场景。 + +![](../../images/community/partner/chinatower.png) + +**中国铁塔股份有限公司** + +中国铁塔股份有限公司是由国务院推动成立的国有大型通信基础设施服务企业。主要从事通信铁塔等基站配套设施和高铁地铁公网覆盖、大型室内分布系统的建设、维护和运营,同时依托独特资源面向社会提供信息化应用和智能换电、备电、充电等能源应用服务,是我国移动通信基础设施建设的“国家队”和5G新基建的“主力军”,是全球最大通信基础设施服务商。 +中国铁塔入选2019年《财富》全球未来50强(排名第22位)和全球数字经济100强(排第71位),2018-2020连续三年被评为中国证券金紫荆奖“最具投资价值上市公司”,在第十一届中国证券金紫荆奖中荣获“十四五最具投资价值上市公司”特别大奖。 + +中国铁塔聚焦自主可控区块链技术研发,具备FISCO BCOS开发能力,正在基于FISCO BCOS开源技术建设区块链管理平台。中国铁塔也致力于区块链应用研究,开展的“区块链+税务”的研究成果获得国资委主办的首届“国企数字场景创新专业赛”大赛一等奖,业务模式受到社会各界关注与国内外权威媒体报道。 + +![](../../images/community/partner/img_5.png) + +**中金数据(武汉)超算技术有限公司** + +中金数据(武汉)超算技术有限公司成立于2016年,位于武汉市国家网络人才与创新产业基地,是一家主要以数据中心外包与运维服务为基础,对外开展云计算、区块链、网络与信息安全、超级计算、系统集成等信息技术服务业务的高新技术企业,同时,也是武汉市科技“小巨人”企业、武汉市“瞪羚”企业,并获得武汉市大数据企业20强、武汉市软件与信息技术百强企业等资质荣誉。 + +公司携手FISCO BCOS提供国内领先的安全数据底座和可信数据服务。公司基于云计算和区块链底层技术搭建的中金数据云链平台,面向用户提供纵贯数据中心、云计算、大数据、区块链的开发、部署、应用的一体化服务,被评为湖北省发展和改革委员会2022年数字经济试点示范项目、入选“2022年湖北省区块链十大优秀应用案例”。 + +### FISCO BCOS人才培育合作伙伴 + +(下列根据公司名称首字母排序) + +![](https://img-blog.csdnimg.cn/7b143cb03f484ac2b4864461bb928fec.png) + +**巴比特学院** + +巴比特是国内领先的区块链信息与技术服务商,已发展成集资讯内容、线下活动、培训、孵化器、投资和区块链技术落地应用于一体的生态体平台。巴比特学院是巴比特旗下教育培训品牌,携手FISCO BCOS打造区块链人才高地,向社会输送优质区块链人才。 + +![](https://img-blog.csdnimg.cn/a459dafa03f045b3a8be2b673f54e5b3.png) + +**北京柏链道捷教育科技有限公司** + +柏链教育是国内领先的区块链及数字化教育人才服务机构,入选工信部重点领域人才评价和能力提升任务承担单位,携手FISCO BCOS推出《区块链工程技术系列认证课程》,学员通过认证考试可获得国家级区块链技术证书。 + +![](https://img-blog.csdnimg.cn/251b477e43f242ada74c97ee83ea5718.png) + +**北京智谷星图教育科技有限公司** + +智谷星图是一家具有国际化视野的前沿科技产教融合机构,提供区块链技术解决方案的同时,围绕前沿科技(区块链、人工智能等技术)为高校提供实验室共建、专业共建和产业学院共建等服务。 + +智谷星图的团队成员多数来自美国硅谷,拥有成熟的新技术研发能力,包括区块链底层技术积累。同时,产品及教研团队则拥有丰富的教育行业从业经验,顾问团队来自斯坦福大学、卡耐基梅隆大学等知名高校。依托于强大的硅谷产学研资源及全球产业合作方,智谷星图紧扣产业发展趋势,用新技术推动高等教育的进步,力求培养具有国际化视野及实践能力的综合型人才。 + +![](../../images/community/partner/img_6.png) + +**广东中创智慧科技有限公司** + +广东中创智慧科技有限公司成立于2018年,从事数字经济产教融合的业务。公司是广东省发改委评定的产教融合型企业、广东省产教融合促进会副会长单位,以数字经济产教融合专家为定位。中创智科通过自身优势资源,以及强大的整合能力,发展数字经济产教融合的业务,为广东省各类院校的专业建设和人才培养提供最优产教融合解决方案。包括:区块链、大数据、人工智能、信创、网络安全、工业互联网六个领域,与广东省今年7月8日发布的《广东省数字经济发展指引》中重点发展的数字经济新兴产业高度契合。 + +中创携手FISCO BCOS支持了2022年度教育部区块链国家级培训计划项目,支持了深圳市人社局区块链应用操作员赛项,同时,也是广东省人社厅区块链应用操作员赛项唯一技术支持单位,广东省教育厅区块链技术应用赛项唯一技术支持单位。 + + +![](../../images/community/partner/img_7.png) + +**教链科技(深圳)科技有限公司** + +教链科技(深圳)有限公司是国际领先的区块链教培产品及应用解决方案供应商,致力于构建数字化时代的职业教育培训基础设施。教链科技专注于区块链人才发展的专业服务,提供创新课题申报、学科专业共建、区块链培训课程、国家区块链人才技能等级认证培训、实训游学营和师资培训等服务。 + +秉着“让每位区块链从业者都拥有中高级技能职称”的愿景,教链科技已经发布了《区块链应用操作员》职业培训教材,承办了国内多期区块链应用操作员职业培训,其区块链在线实训平台已通过国家工业和信息化部备案。教链科技拥有目前国内最大的区块链应用操作考试题库以及培训课程资源,基于FISCO BCOS开发的应用系统已对超过8000件的区块链课程进行版权上链保护,也是广东、海南、浙江、上海、安徽等全国多个省市的区块链职业认证合作伙伴。 + +![](https://img-blog.csdnimg.cn/00d7bbf0c5a24a13af8dc63bde12dbcc.png) + +**链人国际咨询(北京)有限责任公司** + +链人国际服务G端、B端、C端,是中国领先的区块链产业人才综合服务商,三部委区块链人才认证服务商,工信部人才交流中心区块链产业人才研究所运营方,拥有院士科学家人才库、从业者人才库和师资人才库。已在高校公开课、区块链开发工程师(周末班)、《企业级联盟链原理及应用》线上课中培训FISCO BCOS区块链。 + +![](../../images/community/partner/IBWEDU.png) + +**南京秉蔚信息科技有限公司** + +南京秉蔚信息科技有限公司聚焦区块链、人工智能、大数据新工科专业工程实践能力建设。与全球知名产业企业合作,以岗位技能需求为设计出发点,为高校提供泛IT领域的专业课程资源库,以真实商业案例实现过程为蓝本,为院校提供案例数据、实验实训手册以及实验实训环境,并和高校教师组成混编师资为学生提供专业技能实训教学服务,是“互联网+教育”领域的综合人才培养解决方案提供商,助力高校建设产学融合的新工科教育新生态。 + +公司坚持以赛促教、以赛促学,积极参与高校相关赛事。2023年联合微众区块链作为技术支持单位支持“中国大学生计算机设计大赛-区块链应用与开发”赛道,围绕FISCO BCOS及其周边组件进行赛道命题。目前公司已与全国100余所高校有过深度合作。 + +![](https://img-blog.csdnimg.cn/74bf4a085db14dd1b45ee95ab1bfd3b4.png) + +**前海丰创区块链(深圳)有限公司** + +丰创区块链成立于2016年12月,是国内较早成立并高速发展的区块链培训、咨询服务公司,目前公司具有完备、高效、成熟的运营团队,是国内最专业、最权威的区块链教育和运营团队之一,是国内首个官方(国家工信部人才交流中心)指定授权的区块链人才提升机构。 + +目前公司已培养了首期区块链行业产品经理、区块链金融行业工程师等行业领军人才,学员遍及山东、山西、河南、河北、安徽、江苏、浙江、广东、湖南、湖北、北京、上海等25个省份(直辖市),涵盖传统行业中高层管理者、区块链爱好者、应届大学生等 。 + +![](../../images/community/partner/digQuant.png) + +**深圳点宽网络科技有限公司** + +深圳点宽网络科技有限公司是一家致力于协助高校实现交叉学科建设的教育科技公司,主要在金融科技领域协助高校培养“金融+科技”的复合人才。公司为高校相关专业提供课程、实训系统、专业建设解决方案以及共建金融科技产业学院。点宽以自主研发的课程产品和实训系统产品为依托,目前已自研金融科技相关课程超400个小时,全自主研发行业实训系统6套,协助高校的经济管理、数学统计、金融工程和金融数学等专业实现金融科技人才培养服务。 + +公司携手FISCO BCOS,落地了面向高校区块链专业人才培养的BCW v1.0区块链编程实践平台,用于区块链专业知识学习和智能合约编程实践。创新项目CERX研学资源交换平台正在研发中,该平台是一个基于FISCO BCOS区块链技术的分布式研学资产交换网络,其目标是在高校之间创建一个数据、算法模型、论文和课程的数据资产流转平台,公司首席架构师曾凭对社区的贡献荣获FISCO BCOS年度MVP。 + +![](https://img-blog.csdnimg.cn/11a2ddd3eb014d0f8fbfb0015d6fb77c.png) + +**深圳市火链教育科技有限公司** + +深圳市火链教育科技有限公司,简称”火链科技“,是一家专注于区块链行业生态构建、输出区块链核心技术及教育的公司,拥有国内领先的行业科技与教学水平。 + +公司主要的产品与业务包括,为政府提供区块链技术支持与咨询服务,构建区块链生态结构,赋能地方经济;为企事业单位输出技术服务,主导或参与DApps开发;与全国各大高校合作建立区块链学院,开设区块链专业,并面向社会招生。 + +![](../../images/community/partner/img_8.png) + +**深圳职业技术学院** + +深圳职业技术学院2019年起开办区块链技术应用专业,并面向全国招生,以FISCO BCOS国产开源区块链为技术主线,成立区块链与数字经济研究所和FISCO BCOS区块链人才培育SIG,深化区块链部署运维、智能合约编程、工程项目开发等能力的培养,为区块链产业输送高素质技术技能人才。多名学生在国家及省市各类区块链比赛中获得10余项大奖,其中2名学生荣获FISCO BCOS年度MVP。 + +![](https://img-blog.csdnimg.cn/59e3af34a51a4117baf6a32b6d47bfdd.png) + +**腾讯教育腾实学院** + +腾实学院是腾讯教育旗下的学院,提供全面、最新的教育人才培养解决方案,学院切实推动教育部关于“世界一流大学和一流学科”、“特色高水平高职学校和专业”建设的宏伟目标,涵盖区块链、人工智能、大数据等十大领域课程内容。去年开始,腾实学院与FISCO BCOS展开培训领域广泛合作。 + +![](../../images/community/partner/img_9.png) + +**西南林业大学** + +西南林业大学建设有云南省供应链管理区块链工程研究中心和云南省高校供应链管理区块链创新团队,承担了多项区块链领域的国家级项目和省部级重大项目,其研发的安全可控区块链基础服务平台“西林链”已在跨境贸易、数字烟叶、供应链和绿色食品溯源等多个领域进行应用。中心和团队携手FISCO BCOS提供区块链产品、技术研发和人才培养等服务,助力政府和企业的数字化转型。 + +“西林链”于2022年3月通过了国家网信办第七批境内区块链信息服务备案,2022年5月通过了中国电子技术标准化研究院“区块链系统功能测试”和中国合格评定国家认可委员会(CNAS)认证 + +### FISCO BCOS生态发展合作伙伴 + +![](../../images/community/partner/beijing_blockchain_application_association.png) + +**北京区块链技术应用协会** + +北京区块链技术应用协会是中国首家区块链应用协会,于2016年正式发起成立,是依法在民政部门注册,在北京市投资促进服务中心指导成立的非营利性专业性社会组织。协会基于“政策引导、理论研究、场景应用、资本接入、技术实践“的全业务链整合原则,利用丰富的社会资源,与国内一流高校科研院所、国内外知名企业及核心会员单位共同构建政、产、学、研、用一体的区块链生态体系,旨在通过区块链集聚行业资源,跨界融合推进区块链发展,促进先进技术的创新与发展。 +协会携手FISCO BCOS在区块链行业赛事、生态交流、人才培养等多方面开展合作,推动技术成果落地应用,营造产业发展良好生态,加快推动区块链蓬勃发展。 + +![](../../images/community/partner/sichuang_blockchain_association.jpeg) + +**四川省区块链行业协会** + +四川省区块链行业协会是在四川省经济和信息化厅的指导下,在四川省民政厅登记注册成立的社会团体。协会成立旨在推动四川区块链与实体经济融合发展,加强行业企、事业单位和个人之间的合作与联系,加速区块链技术的应用,发展四川区块链产业、积极推动本土企业开拓国内外市场,并发挥协会的纽带作用,起到推进四川省区域内区块链产业的良好发展作用。 + +蜀信链是在四川省经济和信息化厅指导下,在四川省区块链行业协会组织下,由全省区块链相关从业与应用机构共同参与建设和运营的区域性区块链基础设施,目前已适配FISCO BCOS。协会将携手FISCO BCOS开源社区,通过多方协同共同打造合作共赢的区块链产业生态。 + +**推荐阅读:** + +[FISCO BCOS合作伙伴计划正式启动,火热招募中](https://mp.weixin.qq.com/s/BXiNVs-OBY3AD13NI8gF_Q) + +[首批FISCO BCOS合作伙伴公示](https://mp.weixin.qq.com/s/JAm14f7LzHO8gDRe_LXjbw) + +[公告 | FISCO BCOS新增9家合作伙伴](https://mp.weixin.qq.com/s/p7Mv3X18h6099sHpfoOVJg) + +[公告 | FISCO BCOS新增6家合作伙伴](https://mp.weixin.qq.com/s/TI_M5pbBhb0utu0jf6e3hA) diff --git a/3.x/zh_CN/docs/community/pr.md b/3.x/zh_CN/docs/community/pr.md new file mode 100644 index 000000000..0ab96e263 --- /dev/null +++ b/3.x/zh_CN/docs/community/pr.md @@ -0,0 +1,75 @@ +# 3. PR 代码规范 + +----- +### 文章贡献PR操作指引 + +如果你已经是社区贡献者,可直接按照如下操作完成文章PR提交;如果你初次尝试PR贡献,请参考[文档](https://mp.weixin.qq.com/s/_w_auH8X4SQQWO3lhfNrbQ)。 + + +#### 1、提PR的预置条件:Fork FISCO-BCOS-DOC到个人github仓库 + +1. step1:进入[注册GitHub账号](https://github.com/join) +2. step2: Fork [FISCO-BCOS-DOC](https://github.com/FISCO-BCOS/FISCO-BCOS-DOC) 到个人仓库 + +#### 2、分支说明 + +PR须提到FISCO-BCOS-DOC的release-3分支 + +#### 3、必备工具:git [点击参考](https://gitee.com/help/articles/4106) + +1. mac系统:brew install git +2. windows系统:点击[下载安装](https://git-scm.com/downloads) +3. ubuntu系统:sudo apt install git +4. centos系统:sudo yum install git + +#### 4、主要的git命令: + +(以下步骤只需要执行一次即可) + +- 将官方的[FISCO-BCOS-DOC](https://github.com/FISCO-BCOS/FISCO-BCOS-DOC)添加为upstream: git remote add upstream + + + +(以下步骤每次都要操作) + +**每次提交PR之前,均需要执行以下命令,同步最新的官方文档:** + +1. 拉取官方文档release-3分支的最新文档:git fetch upstream release-3 + +2. 同步官方文档release-3分支最新文档到本地:git rebase upstream/release-3 + + (注:本步骤可能会有冲突,如果有冲突,请解决冲突,点击参考[冲突解决方法](https://gitee.com/help/articles/4194)) + +3. 将同步后的文档推到个人的git仓库:git push origin -f + +**提交个人文档的主要命令** + +git add, git commit, git push等,[点击参考](https://gitee.com/help/articles/4114)。 + +#### 5、文档格式说明 + +1. 须采用markdown的格式编辑文章内容,[点击参考markdown语法](https://www.runoob.com/markdown/md-tutorial.html)。 +2. (本步骤不强制) 提交PR之前,建议先基于个人仓库的文档构建readthedocs,检查构建出来的文档显示是否符合预期,并在提交PR的时候,附带说明个人构建的readthedocs链接。 + +点击参考[readthedocs构建方法](https://www.jianshu.com/p/d1d59d0cd58c), FISCO-BCOS-DOC的readthedocs配置选项参考下表: + +| **设置字段** | **设置结果** | +| - | - | +| 默认分支 | release-3 | +| 文档类型 | Sphinx | +| 所需的文件 | repuirements.txt | +| Python解释器 | CPython | +| 使用系统包 | 是 | +| Python配置文件 | conf.py | + +#### 6、Reviewer反馈和合入 + +提交PR后,Reviewer会将修改意见直接在GitHub上进行反馈,你也可以添加小助手微信FISCOBCOS010进行直接沟通;最后当Reviewer合入PR时,你的文章就被录入啦! + +### 文章PR贡献写作规范 + +- 开头署名为撰稿人姓名,也可以展现个人所属公司或学校,例如,作者:张三 | FISCO BCOS核心开发者; +- 文章内容尽量包含引言介绍,段与段之间自然衔接和过度,文末总结; +- 文章应保证文句通顺、无语病,表述不会引起读者误解; +- 实操类文章需确保技术点准确无误,并能完成测试跑通; +- 如果文章中涉及到相关技术文档或代码仓库链接,为避免链接失效,请使用FISCO BCOS官方链接。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/contract_develop/Liquid_develop.md b/3.x/zh_CN/docs/contract_develop/Liquid_develop.md new file mode 100644 index 000000000..688a33473 --- /dev/null +++ b/3.x/zh_CN/docs/contract_develop/Liquid_develop.md @@ -0,0 +1,19 @@ +# 3. WBC-Liquid合约开发 + +标签:``开发第一个应用`` ``WBC-Liquid`` ``合约开发`` ``区块链应用`` ``WASM`` + +--- +FISCO BCOS 支持用以下几种方式实现智能合约 + +* [Solidity](https://solidity.readthedocs.io/en/latest/):以太坊生态中采用的合约编程语言,FISCO BCOS为其拓展了面向联盟链的一系列功能,是FISCO BCOS上智能合约开发最常用的方式。 +* [预编译合约](./c++_contract/add_precompiled_impl.md):在区块链节点内部直接内置定制化的智能合约,用c++语言实现,能直接调用节点内部各种接口,面向复杂场景,使用门槛较高。 +* [WBC-Liquid](./Liquid_develop.md):微众区块链开发的基于Rust的智能合约编程语言,借助Rust语言特性,能够实现比Solidity语言更强大的编程功能。 + + + +WBC-Liquid是微众区块链开发的基于Rust的智能合约编程语言,借助Rust语言特性,能够实现比Solidity语言更强大的编程功能,相关教程请见: + +- 相关文档:[Liquid 在线文档](https://liquid-doc.readthedocs.io/zh_CN/latest/) +- 相关文档:[Rust语言官方教程](https://doc.rust-lang.org/book/) +- 相关文档:[开发第一个WBC_Liquid区块链应用](../quick_start/wbc_liquid_application.md) + diff --git a/3.x/zh_CN/docs/develop/precompiled/add_precompiled_impl.md b/3.x/zh_CN/docs/contract_develop/c++_contract/add_precompiled_impl.md similarity index 100% rename from 3.x/zh_CN/docs/develop/precompiled/add_precompiled_impl.md rename to 3.x/zh_CN/docs/contract_develop/c++_contract/add_precompiled_impl.md diff --git a/3.x/zh_CN/docs/contract_develop/c++_contract/index.md b/3.x/zh_CN/docs/contract_develop/c++_contract/index.md new file mode 100644 index 000000000..87180adc5 --- /dev/null +++ b/3.x/zh_CN/docs/contract_develop/c++_contract/index.md @@ -0,0 +1,18 @@ +# 2. c++ 合约开发(预编译合约) + +标签:``预编译合约`` ``接口`` ``开发`` + +---------- + +```eval_rst +.. toctree:: + :maxdepth: 1 + + use_precompiled.md + precompiled_contract_api.md + precompiled_error_code.md + use_kv_precompiled.md + use_crud_precompiled.md + use_group_ring_sig.md + add_precompiled_impl.md +``` diff --git a/3.x/zh_CN/docs/develop/precompiled/precompiled_contract_api.md b/3.x/zh_CN/docs/contract_develop/c++_contract/precompiled_contract_api.md similarity index 100% rename from 3.x/zh_CN/docs/develop/precompiled/precompiled_contract_api.md rename to 3.x/zh_CN/docs/contract_develop/c++_contract/precompiled_contract_api.md diff --git a/3.x/zh_CN/docs/develop/precompiled/precompiled_error_code.md b/3.x/zh_CN/docs/contract_develop/c++_contract/precompiled_error_code.md similarity index 100% rename from 3.x/zh_CN/docs/develop/precompiled/precompiled_error_code.md rename to 3.x/zh_CN/docs/contract_develop/c++_contract/precompiled_error_code.md diff --git a/3.x/zh_CN/docs/develop/precompiled/use_crud_precompiled.md b/3.x/zh_CN/docs/contract_develop/c++_contract/use_crud_precompiled.md similarity index 100% rename from 3.x/zh_CN/docs/develop/precompiled/use_crud_precompiled.md rename to 3.x/zh_CN/docs/contract_develop/c++_contract/use_crud_precompiled.md diff --git a/3.x/zh_CN/docs/develop/precompiled/use_group_ring_sig.md b/3.x/zh_CN/docs/contract_develop/c++_contract/use_group_ring_sig.md similarity index 100% rename from 3.x/zh_CN/docs/develop/precompiled/use_group_ring_sig.md rename to 3.x/zh_CN/docs/contract_develop/c++_contract/use_group_ring_sig.md diff --git a/3.x/zh_CN/docs/develop/precompiled/use_kv_precompiled.md b/3.x/zh_CN/docs/contract_develop/c++_contract/use_kv_precompiled.md similarity index 100% rename from 3.x/zh_CN/docs/develop/precompiled/use_kv_precompiled.md rename to 3.x/zh_CN/docs/contract_develop/c++_contract/use_kv_precompiled.md diff --git a/3.x/zh_CN/docs/develop/precompiled/use_precompiled.md b/3.x/zh_CN/docs/contract_develop/c++_contract/use_precompiled.md similarity index 100% rename from 3.x/zh_CN/docs/develop/precompiled/use_precompiled.md rename to 3.x/zh_CN/docs/contract_develop/c++_contract/use_precompiled.md diff --git a/3.x/zh_CN/docs/contract_develop/contracts_IDE_develop.md b/3.x/zh_CN/docs/contract_develop/contracts_IDE_develop.md new file mode 100644 index 000000000..a796b8ee1 --- /dev/null +++ b/3.x/zh_CN/docs/contract_develop/contracts_IDE_develop.md @@ -0,0 +1,9 @@ +# 4. 使用IDE +标签: ``IDE合约`` ``智能合约`` ``合约开发`` + +---- + +FISCO BCOS支持通过区块链管理平台webaseIDE部署合约以及Remix在线IDE开发合约,具体操作与部署步骤可参考下述文档: +- [WeBASE合约IDE](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE/quick-start.html?highlight=%E5%90%88%E7%BA%A6IDE#id3) +- [Remix在线IDE](https://remix.ethereum.org/) +- [Solidity官方文档](https://solidity.readthedocs.io/en/latest/) diff --git a/3.x/zh_CN/docs/contract_develop/opcode_diff.md b/3.x/zh_CN/docs/contract_develop/opcode_diff.md new file mode 100644 index 000000000..296c96d27 --- /dev/null +++ b/3.x/zh_CN/docs/contract_develop/opcode_diff.md @@ -0,0 +1,70 @@ +# 5. EVM OPCODE 兼容性描述 + +该文档从OPCODE的角度描述FISCO BCOS与以太坊在执行行为上的差异: + +1. 基础操作指令与以太坊相同 +2. 国密版的密码计算OPCODE为国密算法 +3. 联盟链设计 + * Balance相关OPCODE需用开关打开 + * POW、POS相关OPCODE默认返回0 + +FISCO BCOS 属于[Type 3](https://vitalik.eth.limo/general/2022/08/04/zkevm.html)兼容(兼容Type描述见附录) + +## OPCODE 兼容性分类 + +* 无差异 + * 默认支持:计算类、指令跳转类、内存操作类 + * 新版本支持:代码类,调用类 +* 半差异(详细描述见下一节) + * 功能类似:TIMESTAMP、GASLIMIT、SELFDESTRUCT + * 国密版不同:KECCAK256、CREATE2 + * 通过开关开启:BALANCE、CALLVALUE、GASPRICE、SELFBALANCE +* 全差异 + * 默认返回0:COINBASE、PREVRANDAO、CHAINID、BASEFEE + +## OPCODE 兼容性描述列表 + +(*表格中未给出的OPCODE为默认支持,无差异 -,半差异 ○,全差异 ●) + +| Stack | Name | 差异 | 描述 | 支持版本 | +| :---: | :----------- | ---- | ------------------------------------------------------------ | ------------------ | +| 20 | KECCAK256 | ○ | 国密类型的为SM3,非国密的不变 | | +| 31 | BALANCE | ○ | 开启feature_balance后生效 | 3.6.0+ | +| 34 | CALLVALUE | ○ | 开启feature_balance后生效 | 3.6.0+ | +| 38 | CODESIZE | ○ | FISCO BCOS 的预编译合约返回 1
以太坊原有的预编译合约返回 0 | 3.1.0+ | +| 39 | CODECOPY | - | | 3.2.4+
3.6.0+ | +| 3A | GASPRICE | ○ | 开启feature_balance_policy1后生效,在tx_gas_price系统配置项中配置 | 3.6.0+ | +| 3B | EXTCODESIZE | - | | 3.1.0+ | +| 3C | EXTCODECOPY | - | | 3.2.4+
3.6.0+ | +| 3F | EXTCODEHASH | - | | 3.1.0+ | +| 40 | BLOCKHASH | - | | 3.1.0+ | +| 41 | COINBASE | ● | 返回0 | | +| 42 | TIMESTAMP | ○ | 返回区块时间戳,单位为“毫秒”
(以太坊中单位为“秒”) | | +| 44 | PREVRANDAO | ● | 返回0 | | +| 45 | GASLIMIT | ○ | 通过系统合约配置,返回“单笔交易”的gas上限
(以太坊中是区块的gas上限) | | +| 46 | CHAINID | ● | 返回0 | | +| 47 | SELFBALANCE | ○ | 开启feature_balance后生效 | 3.6.0+ | +| 48 | BASEFEE | ● | 返回0 | | +| F2 | CALLCODE | - | | 3.1.0+ | +| F4 | DELEGATECALL | - | | 3.1.0+ | +| F5 | CREATE2 | ○ | 国密的计算根据SM3算法计算地址 | 3.2.4+
3.6.0+ | +| FA | STATICCALL | - | 历史版本与CALL相同,3.2.4和3.6.0开始支持 | 3.2.4+
3.6.0+ | +| FF | SELFDESTRUCT | ○ | 3.1.0+支持合约销毁
3.6.0+开启featrue_balance后支持销毁合约并回收balance | 3.6.0+ | + +## 附录:兼容等级划分 + +文章[《The different types of ZK-EVMs》](https://vitalik.eth.limo/general/2022/08/04/zkevm.html)中对以太坊的兼容性进行了等级划分 + +* Type 1:fully Ethereum-equivalent + * 完全兼容以太坊,包括RPC接口、EVM和EVM外的执行环境 +* Type 2:fully EVM-equivalent) + * 兼容EVM,EVM外的执行环境相同 +* Type 2.5:EVM-equivalent, except for gas costs + * 兼容EVM,但gas不同 +* Type 3:almost EVM-equivalent + * 采用EVM,但EVM外的执行环境存在差异,有自定义功能 +* Type 4:high-level-language equivalent + * 采用其他智能合约执行引擎 + +![img](https://vitalik.eth.limo/images/zkevm/chart.png) + diff --git a/3.x/zh_CN/docs/contract_develop/solidity_develop.md b/3.x/zh_CN/docs/contract_develop/solidity_develop.md new file mode 100644 index 000000000..f1cc492a6 --- /dev/null +++ b/3.x/zh_CN/docs/contract_develop/solidity_develop.md @@ -0,0 +1,25 @@ +# 1. Solidity合约开发 +标签: ``Solidity`` ``合约开发`` + +---- +FISCO BCOS 支持用以下几种方式实现智能合约 + +* [Solidity](https://solidity.readthedocs.io/en/latest/):以太坊生态中采用的合约编程语言,FISCO BCOS为其拓展了面向联盟链的一系列功能,是FISCO BCOS上智能合约开发最常用的方式。 +* [预编译合约](./c++_contract/add_precompiled_impl.md):在区块链节点内部直接内置定制化的智能合约,用c++语言实现,能直接调用节点内部各种接口,面向复杂场景,使用门槛较高。 +* [WBC-Liquid](./Liquid_develop.md):微众区块链开发的基于Rust的智能合约编程语言,借助Rust语言特性,能够实现比Solidity语言更强大的编程功能。 + + + +FISCO BCOS上的Solidity语言的合约开发 + +- 基础的 + - 语法与以太坊相同,可参考[Solidity官方文档](https://solidity.readthedocs.io/en/latest/)进行学习。 + +- 面向联盟链拓展的 + - 编写Solidity代码,调用已[内置的合约接口](./c++_contract/use_precompiled.html#fisco-bcos-3-x):CRUD合约、KVTable合约、群环签名、系统管理等 + + +```eval_rst +.. important:: + Solidity中有一些内置的密码学算法(如:keccak256/sha3等),当部署的FISCO BCOS区块为国密类型时,内置使用的是相应的国密算法(如:sm3等) +``` diff --git a/3.x/zh_CN/docs/design/amop_protocol.md b/3.x/zh_CN/docs/design/amop_protocol.md new file mode 100644 index 000000000..09f9288dc --- /dev/null +++ b/3.x/zh_CN/docs/design/amop_protocol.md @@ -0,0 +1,91 @@ +# 20. 链上信息传输协议AMOP + +标签:``AMOP`` ``链上信使`` ``私有话题`` ``认证流程`` + +---- +## 链上信使协议介绍 + +链上信使协议AMOP(Advanced Messages Onchain Protocol)系统旨在为联盟链提供一个安全高效的消息信道,联盟链中的各个机构,只要部署了区块链节点,无论是共识节点还是观察节点,均可使用AMOP进行通讯,AMOP有如下优势:   +- 实时:AMOP消息不依赖区块链交易和共识,消息在节点间实时传输,延时在毫秒级。 +- 可靠:AMOP消息传输时,自动寻找区块链网络中所有可行的链路进行通讯,只要收发双方至少有一个链路可用,消息就保证可达。 +- 高效:AMOP消息结构简洁、处理逻辑高效,仅需少量cpu占用,能充分利用网络带宽。 +- 安全:AMOP的所有通讯链路使用SSL加密,加密算法可配置,支持身份认证机制。 +- 易用:使用AMOP时,无需在SDK做任何额外配置。 + +AMOP功能使用请参照[Java SDK AMOP](../sdk/java_sdk/amop.md). + +## 逻辑架构 + +![](../../images/sdk/AMOP.jpg) +以银行典型IDC架构为例,各区域概述: + +- 链外区域:机构内部的业务服务区,此区域内的业务子系统使用区块链SDK,连接到区块链节点。 +- 区块链P2P网络:此区域部署各机构的区块链节点,此区域为逻辑区域,区块链节点也可部署在机构内部。 + + + +## 普通话题 + +AMOP的消息收发基于话题(Topic)订阅机制,订阅者首先订阅一个话题,发送者往该话题发送消息,订阅者即可收到。 + +**发送方式和内容** + +总共支持两种传播方式: + +* **单播**:仅随机发送给一个指定话题的订阅者。 +* **多播**:发送给所有指定话题的订阅者。 + +发送内容: + +* **文本消息** +* **文件** + + + +## 私有话题 + +在普通的配置下,任何一个订阅了某topic的接收者都能接受到发送者推送的消息。但在某些场景下,发送者只希望特定的接收者能接收到消息,不希望无关的接收者能任意的监听此topic。在此场景下,需要使用私有话题功能。 + +**私有话题**:对于特定的话题,发送者配置好期望的接受者的公钥,仅该公钥所对应的订阅者才能接收该私有话题的消息。 + +私有话题功能是自FISCO BCOS 2.1.0 之后新增的。使用过程如下: + +- 1:接收者使用[生成公私钥脚本](./account.md)生成公私钥文件,私钥保留,公钥给生产者。 +- 2:参考配置案例将配置文件配好。启动接收端和发送端进行收发消息。 + +```eval_rst +.. important:: + 注意:AMOP私有话题目前只支持非国密算法,因此生成在生成公私钥文件时,注意使用非国密工具生成。 +``` + +**私有话题的认证流程** + +假定链外系统1是话题消息发送者(消息发送端),链外系统2是话题订阅者(消息接收端)。私有话题的认证流程如下: + +![](../../images/sdk/AMOP_AUTHOR.jpg) + +- 1:链外系统2连接Node2,宣称订阅T1,Node2将T1加入到话题列表,并将seq加1。同时每5秒同步seq到其他节点。 +- 2:Node1收到seq之后,对比本地seq和同步过来的seq,发现不一致,则从Node2获取最新的话题列表,并将话题列表更新到p2p的话题列表,对于还没认证的私有话题,状态置为待认证。Node1遍历列表。针对每一个待认证的私有话题,进行如下操作: + - 2.1:Node1往Node1推送消息(消息类型0x37),请求链外系统1发起私有话题认证流程。 + - 2.2:链外系统1接收到消息之后,生成随机数,并使用amop消息(消息类型0x30)将消息发送出去,并监听回包。 + - 2.3:消息经过 链外系统1-->Node1-->Node2-->链外系统2的路由,链外系统2接收到消息后解析出随机数并使用私钥签名随机数。 + - 2.4:签名包(消息类型0x31)经过 链外系统2-->Node2-->Node1->链外系统1的路由,链外系统1接收到签名包之后,解析出签名并使用公钥验证签名。 + - 2.5:链外系统1验证签名后,发送消息(消息类型0x38),请求节点更新topic状态(认证成功或者认证失败)。 +- 3:如果认证成功,链外系统的一条消息到达Node1之后,Node1会将这条消息转发给Node2,Node2会将消息推送给链外系统2。 + + + +**发送方式和内容** + +同样的私有话题支持单播和多播,发送文本和文件。 + + + +## 错误码 + +- 99:发送消息失败,AMOP经由所有链路的尝试后,消息未能发到服务端,建议使用发送时生成的`seq`,检查链路上各个节点的处理情况。 +- 100:区块链节点之间经由所有链路的尝试后,消息未能发送到可以接收该消息的节点,和错误码‘99’一样,建议使用发送时生成的‘seq’,检查链路上各个节点的处理情况。 +- 101:区块链节点往Sdk推送消息,经由所有链路的尝试后,未能到达Sdk端,和错误码‘99’一样,建议使用发送时生成的‘seq’,检查链路上各个节点以及Sdk的处理情况。 +- 102:消息超时,建议检查服务端是否正确处理了消息,带宽是否足够。 +- 103:因节点出带宽限制,SDK发到节点的AMOP请求被拒绝。 + diff --git a/3.x/zh_CN/docs/design/architecture.md b/3.x/zh_CN/docs/design/architecture.md index 2899f1b64..290fedea5 100644 --- a/3.x/zh_CN/docs/design/architecture.md +++ b/3.x/zh_CN/docs/design/architecture.md @@ -1,4 +1,4 @@ -# 系统架构 +# 1. 系统架构 标签:``设计`` ``架构`` @@ -22,7 +22,7 @@ FISCO BCOS 3.x版本采用**微服务模块化**设计架构,总体上系统 *** -- **管理层**:管理层是为整个区块链系统各模块实现**可视化管理**的平台,包括部署、配置、日志、网络路由等管理功能。FISCO BCOS 3.x系统架构基于开源微服务框架Tars构建,这层的能力复用成熟的Tars-Framwork管理组件。 +- **管理层**:管理层是为整个区块链系统各模块实现**可视化管理**的平台,包括部署、配置、日志、网络路由等管理功能。FISCO BCOS 3.x系统架构基于开源微服务框架Tars构建,这层的能力复用成熟的Tars-Framework管理组件。 ![](../../images/design/fisco_bcos_system_architecture.png) @@ -37,6 +37,6 @@ FISCO BCOS 3.x采用微服务架构,但同时也支持**灵活拆分组合** *** -- **大容量Max版**:由各个层的所有服务构成,每个服务都可独立扩展,存储采用分布式存储TiKV,管理采用Tars-Framwork服务。它适用于海量交易上链,需要支持大量数据落盘存储的场景。 +- **大容量Max版**:由各个层的所有服务构成,每个服务都可独立扩展,存储采用分布式存储TiKV,管理采用Tars-Framework服务。它适用于海量交易上链,需要支持大量数据落盘存储的场景。 -![](../../images/design/fisco_bcos_version.png) \ No newline at end of file +![](../../images/design/fisco_bcos_version.png) diff --git a/3.x/zh_CN/docs/design/boostssl.md b/3.x/zh_CN/docs/design/boostssl.md new file mode 100644 index 000000000..c099b1fa4 --- /dev/null +++ b/3.x/zh_CN/docs/design/boostssl.md @@ -0,0 +1,93 @@ +# 19. 公共网络组件BoostSSL + +标签: ``网络组件`` ``boostssl`` + +---- + +`boostssl`是`fisco-bcos`提供的一个公共网络组件,内置http、websocket两种协议,支持国密、非国密的SSL连接方式,在`FISCO-BCOS 3.0`多个模块中使用。 + +## 1. 目标 + +- 支持国密、非国密SSL连接 +- 支持HTTP协议 +- 支持WebSocket协议 +- 简单、易用的接口 + +## 2. 设计 + +![](../../images/design/boostssl.png) + +## 3. 接口 + +待添加 + +## 4. 使用 + +**源码路径:** + +- +- + +**支持系统:** + +- `CentOS 7.2+` +- `Ubuntu 18.04+` +- `Windows 10` +- `macOS 12` + +**依赖安装:** + +- `CentOS`: + `yum install -y epel-release centos-release-scl openssl-devel openssl cmake3 gcc-c++ git flex patch bison gmp-static devtoolset-7 wget` + +- `Ubuntu`: + `apt install -y g++ libssl-dev openssl cmake git build-essential autoconf texinfo flex patch bison libgmp-dev zlib1g-dev automake libtool wget` + +- `macOS`: + `brew install wget openssl@1.1 git flex bison gmp` + +- `Windows`: + - [Visual Studio 2017](https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2017-relnotes)或[Visual Studio 2019](https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes) + - [perl](https://www.activestate.com/products/perl/) + - [nasm](https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/) + +**编译:** + +- `Linux`编译 + +```shell +# source /opt/rh/devtoolset-7/enable # centos执行 + +cd bcos-boostssl +mkdir build && cd build +cmake ../ -DBUILD_SAMPLE=ON # centos使用cmake3, BUILD_SAMPLE表示编译sample目录的示例程序 +``` + +- `macOS`编译 + +```shell +cd bcos-boostssl +mkdir build && cd build +cmake ../ -DBUILD_SAMPLE=ON # BUILD_SAMPLE表示编译sample目录的示例程序 +``` + +- `Windows`编译 + +```shell +# cmake +cmake -G "Visual Studio 15 2017" -A x64 ../ -DHUNTER_CONFIGURATION_TYPES=Release -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON + +# 编译 +MSBuild bcos-boostssl.sln /p:Configuration=Release /p:Platform=x64 +``` + +## 5. 案例 + +`bcos-boostssl`在`FISCO-BCOS`中的使用: + +- `bcos-cpp-sdk`: 使用`boostssl`作为客户端,连接节点`rpc`,参考: + - [github]() + - [gitee]() +- `FISCO-BCOS rpc`模块: 使用`boostssl`作为服务端,提供`http`、`websocket`两种协议的`RPC`服务,参考: + - [github]() + - [gitee]() diff --git a/3.x/zh_CN/docs/design/cns_contract_name_service.md b/3.x/zh_CN/docs/design/cns_contract_name_service.md new file mode 100644 index 000000000..849ded2f7 --- /dev/null +++ b/3.x/zh_CN/docs/design/cns_contract_name_service.md @@ -0,0 +1,175 @@ +# 17. 合约命名服务CNS + +标签:``合约命名服务`` ``CNS表结构`` + +---- + +## 注意 + +CNS服务仅在`FISCO BCOS 2.+版本`中可以使用,在 `FISCO BCOS 3.+版本` 已经弃用,使用更友好的树状合约目录的形式进行管理,详情请查看:[合约文件系统BFS](./contract_directory.md) + +**迁移说明:** 由于CNS接口废弃,BFS包含了CNS的功能,也提供了对应的适配接口。用户可以将原来的CNS服务接口都改成BFS接口,接口对应如下表: + +| 方法名 | CNSService | BFSService | +|--------------------------------|-----------------------------------------------------------------|---------------------------------------------------------------| +| 创建合约名与合约地址的映射关系 | insert(string name, string version, string address,string abi); | link(string name, string version, string address,string abi); | +| 获取对应名称和版本的地址 | selectByNameAndVersion(string name,string version); | readlink(string path); | +| 遍历合约名称的所有版本 | selectByName(string name); | list(string path); | +| 合约地址 | 0x1004 | 0x100e | + +## 概述 + +调用以太坊智能合约的流程包括: + +1. 编写合约; +2. 编译合约得到合约接口abi描述; +3. 部署合约得到合约地址address; +4. 封装合约的abi和地址,通过SDK等工具实现对合约的调用。 + +从合约调用流程可知,调用之前必须准备合约abi以及合约地址address。这种使用方式存在以下的问题: + +1. 合约abi为较长的JSON字符串,调用方不需直接感知; +2. 合约地址为20字节的魔数,不方便记忆,若丢失后将导致合约不可访问; +3. 合约重新部署后,一个或多个调用方都需更新合约地址; +4. 不便于进行版本管理以及合约灰度升级。 + +为解决以上问题,给调用者提供良好的智能合约调用体验,FISCO BCOS提出**CNS合约命名服务**。 + +## 名词解释 + +- **CNS**(Contract Name Service)通过提供链上合约名称与合约地址映射关系的记录及相应的查询功能,方便调用者通过记忆简单的合约名来实现对链上合约的调用。 +- **CNS信息**为合约名称、合约版本、合约地址和合约abi +- **CNS表**用于存储CNS信息 + +## CNS对比以太坊原有调用方式的优势 + +- 简化调用合约方式; +- 合约升级对调用者透明,支持合约灰度升级。 + +## 对标ENS + +ENS (Ethereum Name Service) ,以太坊名称服务。 + +ENS的功能类似我们较熟悉的DNS(Domain Name Service)域名系统,但提供的不是Internet网址,而是将以太坊(Ethereum)合约地址和钱包地址以xxxxxx.eth网址的方式表示,用于存取合约或转账。两者相比: + +- ENS映射的地址类型包括合约地址及钱包地址,CNS可支持,当地址类型为钱包地址时合约abi为空。 +- ENS有竞拍功能,CNS不需支持。 +- ENS支持多级域名,CNS不需支持。 + +## 模块架构 + +![](../../images/design/contract_name_service/cns_architecture.png) + +
CNS架构
+ +## 核心流程 + +用户调用SDK部署合约及调用合约流程如下: + +![](../../images/design/contract_name_service/deploy_and_call.png) + +
SDK部署合约及调用合约流程
+ +- 部署合约时,SDK生成合约对应的Java类,调用类的deploy接口发布合约获得合约地址,然后调用CNS合约insert接口上链CNS信息。 +- 调用合约时,SDK引入合约的Java类,并加载实例化。load加载接口可传入合约地址(原有以太坊方式)或合约名称和合约版本的组合(CNS方式),SDK处理CNS方式时通过调用CNS模块查询链上信息来获取合约地址。 +- 对于缺少版本号的合约调用,由SDK实现默认调用合约的最新版本。 +- 上链的合约abi信息属于可选字段。 + +## 数据结构 + +### CNS表结构 + +CNS信息以系统表的方式进行存储,各账本独立。CNS表定义如下: + + + + + + + + + + + + + + +
Field
Type
Null
Key
Expain
namestringNoPRI合约名称,name和version为联合主键
versionstringNo合约版本,name和version为联合主键
addressstringNo合约地址
abistringYES合约abi
_status_stringNo分布式存储通用字段,“0”可用“1”删除
+ +### 合约接口 + +``` +pragma solidity ^0.4.2; +contract CNS +{ + function insert(string name, string version, string addr, string abi) public returns(uint256); + function selectByName(string name) public constant returns(string); + function selectByNameAndVersion(string name, string version) public constant returns(string); +} +``` + +- CNS合约不暴露给用户,为SDK与底层CNS表的交互接口。 +- insert接口提供CNS信息上链的功能,接口四个参数分别为合约名称name、合约版本version、合约地址addr和合约ABI信息abi。SDK调用接口需判断name和version的组合与数据库原有记录是否重复,在不重复的前提下才能发起上链交易。节点在执行交易时,precompiled逻辑会Double Check,发现数据重复就直接抛弃该交易。insert接口对CNS表的内容只增不改。 +- selectByName接口参数为合约名称name,返回表中所有基于该合约的不同version记录。 +- selectByNameAndVersion接口参数为合约名称name和合约版本version,返回表中该合约该版本的唯一地址。 + +#### 更新CNS表方式 + +**预编译合约**是FISCO BCOS底层通过C++实现的一种高效智能合约,用于FISCO BCOS底层的系统信息配置与管理。引入precompiled逻辑后,FISCO BCOS节点执行交易的流程如下: + +CNS合约属于预编译合约类型,节点将通过内置C++代码逻辑实现对CNS表的插入和查询操作,不经EVM执行,因此CNS合约只提供了函数接口描述而没有函数实现。**预置CNS合约的precompiled地址为0x1004。** + +#### 合约接口返回示例 + +selectByName和selectByNameAndVersion接口返回的string为Json格式,示例如下: +```json +[ + { + "name" : "Ok", + "version" : "1.0", + "address" : "0x420f853b49838bd3e9466c85a4cc3428c960dde2", + "abi" : "[{\"constant\":false,\"inputs\":[{\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"co +nstant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\ +"type\":\"constructor\"}]" + }, + { + "name" : "Ok", + "version" : "2.0", + "address" : "0x420f853b49838bd3e9466c85a4cc3428c960dde2", + "abi" : "[{\"constant\":false,\"inputs\":[{\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"co +nstant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\ +"type\":\"constructor\"}]" + } +] +``` + +## SDK_API + +SDK开发者可使用`org.fisco.bcos.web3j.precompile.cns`中以下两接口实现CNS的注册及查询功能。 + +### registerCns +- 描述:public TransactionReceipt registerCns(String name, String version, String addr, String abi) +- 功能:上链合约信息 +- 参数:name——合约名,version——合约版本,addr——合约地址,abi——合约abi +- 返回:上链交易回执,回执中含上链结果信息及错误信息(如有) + +### resolve +- 描述:public String resolve(String contractNameAndVersion) +- 功能:基于合约名和合约版本查询合约地址 +- 参数:contractNameAndVersion——合约名+合约版本信息 +- 返回:合约地址,如无参数指定版本的合约信息,接口抛出异常 +- 说明:contractNameAndVersion通过`:`来分割合约名和合约版本,当缺少合约版本时,SDK默认调用使用合约的最新版本进行查询 + +注意: +1. 在调用接口前,需将sol合约转换Java类,并将生成的Java类以及abi、bin文件置于正确的目录,详细使用方法请参考[Web3SDK](../sdk/java_sdk.md); +2. 两个接口的使用例子可参考[ConsoleImpl.java](https://github.com/FISCO-BCOS/console/blob/master-2.0/src/main/java/console/contract/ConsoleContractImpl.java)中的deployByCNS和callByCNS接口实现。 + +## 操作工具 + +控制台可提供部署合约、调用合约、基于合约名查询链上已有合约的功能,控制台使用手册请参考[这里](../operation_and_maintenance/console/console_commands.md)。 + +控制台提供的命令包括: + +- deployByCNS:通过CNS方式部署合约 +- callByCNS:通过CNS方式调用合约 +- queryCNS:根据合约名称和合约版本号(可选参数)查询CNS表信息 diff --git a/3.x/zh_CN/docs/design/committee_design.md b/3.x/zh_CN/docs/design/committee_design.md index 90495d539..fff7979d6 100644 --- a/3.x/zh_CN/docs/design/committee_design.md +++ b/3.x/zh_CN/docs/design/committee_design.md @@ -1,4 +1,4 @@ -# 权限治理体系设计 +# 9. 权限治理体系设计 标签:``合约权限`` ``部署权限`` ``权限控制`` ``权限设计`` diff --git a/3.x/zh_CN/docs/design/compatibility.md b/3.x/zh_CN/docs/design/compatibility.md index e3bcb9495..b720a602a 100644 --- a/3.x/zh_CN/docs/design/compatibility.md +++ b/3.x/zh_CN/docs/design/compatibility.md @@ -1,6 +1,7 @@ -# 兼容性方案 +# 16. 兼容性方案 标签:``兼容性`` ``版本升级`` +----- ## 1. 设计目标 FISCO BCOS 3.X版本迭代,为实现各版本之间的兼容,FISCO BCOS针对网络层面与数据层面的兼容性设计了相应的兼容性方案。 方案的目标主要包括两点,第一, 可保证各个版本之间的网络、数据、执行模块、公用的编解码协议(scale/abi)均可向后兼容,第二,支持可灰度升级,且灰度升级过程中,系统可正常共识、出块。 @@ -210,6 +211,7 @@ FISCOBCOS 设计主版本号与次版本号,例如针对FISCOBCOS 3.x,版本 3.1.0: 0x03010000 3.1.1: 0x03010100 3.2.0: 0x03020000 +3.3.0: 0x03030000 ... ``` diff --git a/3.x/zh_CN/docs/design/consensus/consensus.md b/3.x/zh_CN/docs/design/consensus/consensus.md index 90bee4df0..47d156417 100644 --- a/3.x/zh_CN/docs/design/consensus/consensus.md +++ b/3.x/zh_CN/docs/design/consensus/consensus.md @@ -1,4 +1,4 @@ -# 两阶段并行拜占庭共识 +# Two-Phase PBFT 标签:``共识`` ``BFT`` diff --git a/3.x/zh_CN/docs/design/consensus/index.rst b/3.x/zh_CN/docs/design/consensus/index.rst index 33736e641..d5381797f 100644 --- a/3.x/zh_CN/docs/design/consensus/index.rst +++ b/3.x/zh_CN/docs/design/consensus/index.rst @@ -1,5 +1,5 @@ ############################################################## -共识算法 +4. 共识算法 ############################################################## 标签:``共识算法`` ``设计方案`` ``可扩展的共识框架`` @@ -30,5 +30,6 @@ FISCO BCOS基于多群组架构实现了插件化的共识算法,不同群组 :maxdepth: 1 pbft.md - pbft_optimize.md + raft.md + rpbft.md consensus.md diff --git a/3.x/zh_CN/docs/design/consensus/pbft.md b/3.x/zh_CN/docs/design/consensus/pbft.md index c107a912e..70f749aa1 100644 --- a/3.x/zh_CN/docs/design/consensus/pbft.md +++ b/3.x/zh_CN/docs/design/consensus/pbft.md @@ -1,4 +1,4 @@ -# PBFT基础流程 +# PBFT 标签:``PBFT`` ``共识算法`` ``设计方案`` @@ -8,7 +8,6 @@ FISCO BCOS区块链系统实现了PBFT共识算法。 - ## 1. 重要概念 节点类型、节点ID、节点索引和视图是PBFT共识算法的关键概念。区块链系统基本概念请参考[关键概念](../../tutorial/key_concepts.md)。 @@ -23,31 +22,26 @@ FISCO BCOS区块链系统实现了PBFT共识算法。 其中Leader和Replica统称为共识节点。 - ### 1.2 节点ID && 节点索引 为了防止节点作恶,PBFT共识过程中每个共识节点均对其发送的消息进行签名,对收到的消息包进行验签名,因此每个节点均维护一份公私钥对,私钥用于对发送的消息进行签名,公钥作为节点ID,用于标识和验签。 > **节点ID** : 共识节点签名公钥和共识节点唯一标识, 一般是64字节二进制串,其他节点使用消息包发送者的节点ID对消息包进行验签 - 考虑到节点ID很长,在共识消息中包含该字段会耗费部分网络带宽,FISCO BCOS引入了节点索引,每个共识节点维护一份公共的共识节点列表,节点索引记录了每个共识节点ID在这个列表中的位置,发送网络消息包时,只需要带上节点索引,其他节点即可以从公共的共识节点列表中索引出节点的ID,进而对消息进行验签: > **节点索引** : 每个共识节点ID在这个公共节点ID列表中的位置 - ### 1.3 视图(view) PBFT共识算法使用视图view记录每个节点的共识状态,相同视图节点维护相同的Leader和Replicas节点列表。当Leader出现故障,会发生视图切换,若视图切换成功(至少2\*f+1个节点达到相同视图),则根据新的视图选出新leader,新leader开始出块,否则继续进行视图切换,直至全网大部分节点(大于等于2\*f+1)达到一致视图。 - FISCO BCOS系统中,leader索引的计算公式如下: ```bash leader_idx = (view + block_number) % node_num ``` - 下图简单展示了`4(3*f+1, f=1)`节点FISCO BCOS系统中,第三个节点(node3)为拜占庭节点情况下,视图切换过程: @@ -59,7 +53,6 @@ leader_idx = (view + block_number) % node_num - 为第五轮共识:node0为leader,继续打包出块。 - ### 1.4 共识消息 PBFT模块主要包括**PrepareReq、SignReq、CommitReq和ViewChangeReq**四种共识消息: @@ -94,17 +87,14 @@ PrepareReqPacket类型消息包包含了正在处理的区块信息: 系统框架如下图: - ![](../../../../../2.x/images/consensus/pbft_architecture.png) - PBFT共识主要包括两个线程: - PBFTSealer: PBFT打包线程,负责从交易池取交易,并将打包好的区块封装成PBFT Prepare包,交给PBFTEngine处理; - PBFTEngine: PBFT共识线程,从PBFTSealer或者P2P网络接收PBFT共识消息包,区块验证器(Blockverifier)负责开始执行区块,完成共识流程,将达成共识的区块写入区块链,区块上链后,从交易池中删除已经上链的交易。 - ## 3. 核心流程 PBFT共识主要包括Pre-prepare、Prepare和Commit三个阶段: @@ -115,24 +105,18 @@ PBFT共识主要包括Pre-prepare、Prepare和Commit三个阶段: ![](../../../../../2.x/images/consensus/pbft_process.png) - 下图详细介绍了PBFT各个阶段的具体流程: ![](../../../images/design/pbft_workflow.jpg) - - ### 3.1 leader打包区块 - PBFT共识算法中,共识节点轮流出块,每一轮共识仅有一个leader打包区块,leader索引通过公式`(block_number + current_view) % consensus_node_num`计算得出。 节点计算当前leader索引与自己索引相同后,就开始打包区块。区块打包主要由PBFTSealer线程完成,Sealer线程的主要工作如下图所示: - ![](../../../../../2.x/images/consensus/sealer.png) - - **产生新的空块**: 通过区块链(BlockChain)获取当前最高块,并基于最高块产生新空块(将新区块父哈希置为最高块哈希,时间戳置为当前时间,交易清空); - **从交易池打包交易**: 产生新空块后,从交易池中获取交易,并将获取的交易插入到产生的新区块中; @@ -141,7 +125,6 @@ PBFT共识算法中,共识节点轮流出块,每一轮共识仅有一个lead - **产生Prepare包**: 将组装的新区块编码到Prepare包内,通过PBFTEngine线程广播给组内所有共识节点,其他共识节点收到Prepare包后,开始进行三阶段共识。 - ### 3.2 pre-prepare阶段 共识节点收到Prepare包后,进入pre-prepare阶段,此阶段的主要工作流程包括: @@ -152,11 +135,10 @@ PBFT共识算法中,共识节点轮流出块,每一轮共识仅有一个lead - **空块判断**:若Prepare请求包含的区块中交易数目是0,则触发空块视图切换,将当前视图加一,并向所有其他节点广播视图切换请求; -- **执行区块并缓存区块执行结果**: 若Prepare请求包含的区块中交易数目大于0,则调用BlockVerifier区块执行器执行区块,并缓存执行后的区块; +- **执行区块并缓存区块执行结果**: 若Prepare请求包含的区块中交易数目大于0,则调用executor执行区块,并缓存执行后的区块; - **产生并广播签名包**:基于执行后的区块哈希,产生并广播签名包,表明本节点已经完成区块执行和验证。 - ### 3.3 Prepare阶段 共识节点收到签名包后,进入Prepare阶段,此阶段的主要工作流程包括: @@ -180,7 +162,6 @@ PBFT共识算法中,共识节点轮流出块,每一轮共识仅有一个lead - **判断pre-prepare阶段缓存的区块对应的Commit包缓存是否达到`2*f+1`,若收集满Commit包,则将新区块落盘**:若pre-prepare阶段缓存的区块哈希对应的Commit请求数目超过`2*f+1`,则说明大多数节点达到了可提交该区块状态,且执行结果一致,则调用BlockChain模块将pre-prepare阶段缓存的区块写入数据库; - ### 3.5 视图切换处理流程 当PBFT三阶段共识超时或节点收到空块时,PBFTEngine会试图切换到更高的视图(将要切换到的视图toView加一),并触发ViewChange处理流程;节点收到ViewChange包时,也会触发ViewChange处理流程: @@ -189,4 +170,4 @@ PBFT共识算法中,共识节点轮流出块,每一轮共识仅有一个lead - **缓存有效ViewChange包**: 防止相同的ViewChange请求被处理多次,也作为判断节点是否可以切换视图的统计依据; -- **收集ViewChange包**:若收到的ViewChange包中附带的view等于本节点的即将切换到的视图toView且本节点收集满`2*f+1`来自不同节点view等于toView的ViewChange包,则说明超过三分之二的节点要切换到toView视图,切换当前视图到toView。 \ No newline at end of file +- **收集ViewChange包**:若收到的ViewChange包中附带的view等于本节点的即将切换到的视图toView且本节点收集满`2*f+1`来自不同节点view等于toView的ViewChange包,则说明超过三分之二的节点要切换到toView视图,切换当前视图到toView。 diff --git a/3.x/zh_CN/docs/design/consensus/raft.md b/3.x/zh_CN/docs/design/consensus/raft.md new file mode 100644 index 000000000..4abee5a6d --- /dev/null +++ b/3.x/zh_CN/docs/design/consensus/raft.md @@ -0,0 +1,166 @@ +# Raft + +标签:``Raft`` ``共识算法`` ``设计方案`` + +---- +## 1 名词解释 + +### 1.1 Raft +Raft(Replication and Fault Tolerant)是一个允许网络分区(Partition Tolerant)的一致性协议,它保证了在一个由N个节点构成的系统中有(N+1)/2(向上取整)个节点正常工作的情况下的系统的一致性,比如在一个5个节点的系统中允许2个节点出现非拜占庭错误,如节点宕机、网络分区、消息延时。Raft相比于Paxos更容易理解,且被证明可以提供与Paxos相同的容错性以及性能,其详细介绍可见[官网](https://raft.github.io/)及[动态演示](http://thesecretlivesofdata.com/raft/)。 + +### 1.2 节点类型 + +在Raft算法中,每个网络节点只能如下三种身份之一:**Leader**、**Follower**以及**Candidate**,其中: +* **Leader**:主要负责与外界交互,由Follower节点选举而来,在每一次共识过程中有且仅有一个Leader节点,由Leader全权负责从交易池中取出交易、打包交易组成区块并将区块上链; +* **Follower**:以Leader节点为准进行同步,并在Leader节点失效时举行选举以选出新的Leader节点; +* **Candidate**:Follower节点在竞选Leader时拥有的临时身份。 + +### 1.3 节点ID & 节点索引 +在Raft算法中,每个网络节点都会有一个固定且全局的唯一的用于表明节点身份的ID(一般是一个64字节表示数字),这称为节点ID;同时每个共识节点还会维护一份公共的共识节点列表,这个列表记录了每个共识节点的ID,而自己在这个列表中的位置被称为节点索引。 + +### 1.4 任期 +Raft算法将时间划分为不定长度的任期Terms,Terms为连续的数字。每个Term以选举开始,如果选举成功,则由当前leader负责出块,如果选举失败,并没有选举出新的单一Leader,则会开启新的Term,重新开始选举。 + +![.](../../../images/consensus/raft_terms.png) + +## 1.5 消息 +在Raft算法中,每个网络节点间通过发送消息进行通讯,当前Raft模块包括四种消息:**VoteReq**、**VoteResp**、**Heartbeat**、**HeartbeatResp**,其中: +* **VoteReq**:投票请求,由Candidate节点主动发出,用于向网络中其他节点请求投票以竞选Leader; +* **VoteResp**:投票响应,在节点收到投票请求后,用于对投票请求进行响应,响应内容为同意或拒绝该投票请求; +* **Heartbeat**:心跳,由Leader节点主动周期发出,其作用有两个:(1) 用于维护Leader节点身份,只要Leader能够一直正常发送心跳且被其他节点响应,Leader身份就不会发生变化;(2) 区块数据复制,当Leader节点成功打包一个区块后,会将区块数据编码至心跳中以将区块进行广播,其他节点在收到该心跳后会解码出区块数据并将区块放入自己的缓冲区中; +* **HeartbeatResp**:心跳响应,在节点收到心跳后,用于对心跳进行响应,特别的,当收到一个包含区块数据的心跳时,该心跳的响应中会带上该区块的哈希; + +所有消息共有的字段如下表所示: + +| 字段名 | 字段含义 | +| --------- | ---------------------------- | +| idx | 自身节点索引 | +| term | 前节点所处在的任期 | +| height | 当前节点所持有的最高块的块高 | +| blockHash | 前节点所持有的最高块的哈希 | + +每种消息类型特有的字段如下表所示: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
消息类型字段名字段含义
VoteReqcandidateCandidate自身的节点索引
lastLeaderTermCandidate见到过的最后一个Leader的Term,其详细作用见3.1.2节
lastBlockNumberCandidate见到过的最新块的块高,其详细作用见3.1.2节
VoteRespvoteFlag对投票请求的响应标志位,用以标记对是否同意投票请求,若是拒绝还会具体标记拒绝原因,其详细作用见3.1.2节
lastLeaderTerm收到VoteReq的节点见到过的最新块的块高,其详细作用见3.1.2节
Heartbeatleader发出心跳的Leader节点的节点索引
uncommitedBlock当Leader节点预备提交一个新块时,会先将区块数据编码进此字段以并通过心跳进行广播,其详细作用见3.2节
uncommitedBlockNumberuncommitedBlock对应的块高,其详细作用见3.2节
HeartbeatRespuncommitedBlockHash当收到Leader发送过来的uncommitedBlock数据时,节点在心跳响应中写入uncommitedBlock对应的哈希(指纹),并发送回Leader,表明节点已经收到Leader预备提交的区块数据且已写入本地缓存,其详细作用见3.2节
+ +## 2 系统框架 +系统框架如下图所示: + +![](../../../images/consensus/raft_architecture.png) + +* Raft Sealer:负责从交易池取出交易并打包成区块,并发送至Raft Engine进行共识。区块上链后,Raft Sealer负责从交易池中删除已上链交易; +* Raft Engine:负责在共识节点进行共识,将达成共识的区块上链。 + +## 3 核心流程 + +### 3.1 节点状态转换 +节点类型之间转换关系如下图所示,每种状态转换形式将在接下来的各个小节进行阐述: + +![](../../../images/consensus/raft_nodes_transfer.jpg) + +#### 3.1.1 选举 +Raft共识模块中使用心跳机制来触发Leader选举。当节点启动时,节点自动成为Follower且将Term置0。只要Follower从Leader或者Candidate收到有效的Heartbeat或RequestVote消息,其就会保持在Follower状态,如果Follower在一段时间内(这段时间称为 ***Election Timeout***)没收到上述消息,则它会假设系统当前的Leader已经失活,然后增加自己的Term并转换为Candidiate,开启新一轮的Leader选举流程,流程如下: +1. Follower增加当前的Term,转换为Candidate; +2. Candidate将票投给自己,并广播RequestVote到其他节点请求投票; +3. Candidate节点保持在Candidate状态,直到下面三种情况中的一种发生:(1)该节点赢得选举;(2) 在等待选举期间,Candidate收到了其他节点的Heartbeat;(3) 经过*Election Timeout*后,没有Leader被选出。Raft算法采用随机定时器的方法来避免节点选票出现平均瓜分的情况以保证大多数时候只会有一个节点超时进入Candidate状态并获得大部分节点的投票成为Leader。 + +#### 3.1.2 投票 +节点在收到VoteReq消息后,会根据消息的内容选择不同的响应策略: +1. ***VoteReq的Term小于或等于自己的Term*** + + * 如果节点是Leader,则拒绝该投票请求,Candidate收到此响应后会放弃选举转变为Follower,并增加投票超时; + * 如果节点不是Leader: + * 如果VoteReq的Term小于自己的Term,则拒绝该投票请求,如果Candidate收到超过半数的该种响应则表明其已经过时,此时Candidate会放弃选举转变为Follower,并增加投票超时; + * 如果VoteReq的Term等于自己的Term,则拒绝该投票请求,对于该投票请求不作任何处理。对于每个节点而言,只能按照先到先得的原则投票给一个Candidate,从而保证每轮选举中至多只有一个Candidate被选为Leader。 + +2. ***VoteReq的lastLeaderTerm小于自己的lastLeaderTerm*** + + 每个节点中会有一个lastLeaderTerm字段表示该节点见过的最后一个Leader的Term,lastLeaderTerm仅能由Heartbeat进行更新。如果VoteReq中的lastLeaderTerm小于自己的lastLeaderTerm,表明Leader访问这个Candidate存在问题,如果此时Candidate处于网络孤岛的环境中,会不断向外提起投票请求,因此需要打断它的投票请求,所以此时节点会拒绝该投票请求。 + +3. ***VoteReq的lastBlockNumber小于自己的lastBlockNumber*** + + 每个节点中会有一个lastBlockNumber字段表示节点见到过的最新块的块高。在出块过程中,节点间会进行区块复制(详见3.2节),在区块复制的过程中,可能有部分节点收到了较新的区块数据而部分没有,从而导致不同节点的lastBlockNumber不一致。为了使系统能够达成一致,需要要求节点必须把票投给拥有较新数据的节点,因此在这种情况下节点会拒绝该投票请求。 + +4. ***节点是第一次投票*** + + 为了避免出现Follower因为网络抖动导致重新发起选举,规定如果节点是第一次投票,直接拒绝该投票请求,同时会将自己的firstVote字段置为该Candidate的节点索引。 + +5. ***1~4步骤中都没有拒绝投票请求*** + + 同意该投票请求。 + +#### 3.1.3 心跳超时 +在Leader成为网络孤岛时,Leader可以发出心跳、Follower可以收到心跳但是Leader收不到心跳回应,这种情况下Leader此时已经出现网络异常,但是由于一直可以向外发送心跳包会导致Follower无法切换状态进行选取,系统陷入停滞。为了避免第二种情况发生,模块中设置了心跳超时机制,Leader每次收到心跳回应时会进行相应记录,一旦一段时间后记录没有更新则Leader放弃Leader身份并转换为Follower节点。 + +### 3.2 区块复制 +Raft协议强依赖Leader节点的可用性来确保集群数据的一致性,因为数据只能从Leader节点向Follower节点转移。当Raft Sealer向集群Leader提交区块数据后,Leader将该数据置为未提交(uncommitted)状态,接着Leader 节点会通过在Heartbeat中附加数据的形式并发向所有Follower节点复制数据并等待接收响应,在确保网络中超过半数节点已接收到数据后,再将区块数据写入底层存储中,此时区块数据状态已经进入已提交(committed)状态。此后Leader节点再通过Sync模块向其他Follower节点广播该区块数据,区块复制及提交的流程图如下图所示: + +```eval_rst +.. mermaid:: + + sequenceDiagram + participant Sealer + participant Leader + participant Follower + + Sealer->>Leader: 将交易打包为区块,阻塞自身 + Leader->>Follower: 将区块编码为RLP编码随心跳包发送 + Note right of Follower: 对心跳包进行解码,
并将解码出来的区块
写入缓存中 + Follower->>Leader: 发送ACK + loop 收集ACK + Leader->>Leader: 检查大多数节点是否已经收到区块拷贝 + end + Leader->>Sealer: 解除阻塞 + Leader->>Leader: 执行区块 + Leader->>Leader: 丢弃已经上链的交易 + +``` + +其中RaftSealer验证是否当前是否能打包交易的验证条件包括:(1) 是否为Leader;(2) 是否存在尚未完成同步的peer; (3) uncommitBlock字段是否为空,只有三个条件均符合才允许打包。 diff --git a/3.x/zh_CN/docs/design/consensus/rpbft.md b/3.x/zh_CN/docs/design/consensus/rpbft.md new file mode 100644 index 000000000..7a31da453 --- /dev/null +++ b/3.x/zh_CN/docs/design/consensus/rpbft.md @@ -0,0 +1,200 @@ +# rPBFT + +标签:``rPBFT`` ``共识算法`` + +---- +## 区块链共识困境 + +### POW类算法 + +POW算法因如下特点,不适用于交易吞吐量大、交易时延要求低的联盟链场景: +- 性能低:10分钟出一个区块,交易确认时延一个小时,耗电多 +- 无最终一致性保证 +- 吞吐量低 + +### 基于分布式一致性原理的共识算法 + +基于分布式一致性原理的共识算法,如BFT类和CFT类共识算法具有秒级交易确认时延、最终一致性、吞吐量高、不耗电等优势,尤其是BFT类共识算法还可应对节点作恶的场景,在性能、安全性等方面均可达到联盟链需求。 + +但这类算法复杂度均与节点规模有关,可支撑的网络规模有限,极大限制了联盟链节点规模。 + +综上所述,FISCO BCOS v2.3.0提出了rPBFT共识算法,旨在保留BFT类共识算法高性能、高吞吐量、高一致性、安全性的同时,尽量减少节点规模对共识算法的影响。 + +## rPBFT共识算法 + +### 节点类型 + +- 共识委员:执行PBFT共识流程的节点,有轮流出块权限 +- 验证节点:不执行共识流程,验证共识节点是否合法、区块验证,经过若干轮共识后,会切换为共识节点 + +### 核心思想 + +![](../../../images/consensus/rpbft.png) + +rPBFT算法每轮共识流程仅选取若干个共识节点出块,并根据区块高度周期性地替换共识节点,保障系统安全,主要包括2个系统参数: + +- `epoch_sealer_num`:每轮共识过程中参与共识的节点数目,可通过控制台发交易方式动态配置该参数 +- `epoch_block_num`: 共识节点替换周期,为防止选取的共识节点联合作恶,rPBFT每出epoch_block_num个区块,会替换一个共识节点,可通过控制台发交易的方式动态配置该参数 + +这两个配置项记录在系统配置表中,配置表主要包括配置关键字、配置对应的值、生效块高三个字段,其中生效块高记录了配置最新值最新生效块高,例:在100块发交易将`epoch_sealer_num`和`epoch_block_num`分别设置为4和10000,此时系统配置表如下: + +key | value | _enable_num_ | +:-: | :-: | :-: | +epoch_sealer_num | 4 | 101 | +epoch_block_num | 10000| 101 | + + +### 算法流程 + +#### **确定各共识节点编号IDX** + +对所有共识节点的NodeID进行排序,如下图,节点排序后的NodeID索引即为该共识节点编号: + +![](../../../images/consensus/sealer_order.png) + +#### **链初始化** + +链初始化时,rPBFT需要选取`epoch_sealer_num`个共识节点到共识委员中参与共识,目前初步实现是选取索引为0到`epoch_sealer_num-1`的节点参与前`epoch_block_num`个区块共识。 + + +#### **共识委员节点运行PBFT共识算法** + +选取的`epoch_sealer_num`个共识委员节点运行PBFT共识算法,验证节点同步并验证这些共识委员节点共识产生的区块,验证节点的验证步骤包括: + +- 校验区块签名列表:每个区块必须至少包含三分之二共识委员的签名 +- 校验区块执行结果:本地区块执行结果须与共识委员在区块头记录的执行结果一致 + +#### **动态替换共识委员列表** + +为保障系统安全性,rPBFT算法每出`epoch_block_num`个区块后,会从共识委员列表中剔除一个节点作为验证节点,并加入一个验证节点到共识委员列表中,如下图所示: + +![](../../../images/consensus/epoch_rotating.png) + +rPBFT算法目前实现中,轮流将共识委员列表节点替换为验证节点,设当前有序的共识委员会节点列表为`CommitteeSealersList`,共识节点总数为`N`,则共识`epoch_block_num`个区块后,会将`CommitteeSealersList[0]`剔除共识委员列表,并加入索引为`(CommitteeSealersList[0].IDX + epoch_sealer_num) % N`的验证节点到共识委员列表中。第`i`轮替换周期,将`CommitteeSealersList[i % epoch_sealer_num]`剔除共识委员列表,加入索引为`(CommitteeSealersList[i%epoch_sealer_num].IDX + epoch_sealer_num) % N`的验证节点到共识委员列表中。 + + +#### **节点重启** + +节点重启后,rPBFT算法需要快速确定共识委员列表,由于`epoch_block_num`可通过控制台动态更新,需要结合`epoch_block_num`最新配置生效块高获取共识委员列表,主要步骤如下: + +**计算共识周期rotatingRound** + + 设当前块高为`blockNum`,`epoch_block_num`生效块高为`enableNum`,则共识周期为: + `rotatingRound = (blockNumber - enableNum) / epoch_block_num` + +**确定共识委员起始节点索引**: `N`为共识节点总数,索引从`(rotatingRound * epoch_block_num) % N`到`(rotatingRound * epoch_block_num + epoch_sealer_num) % N`之间的节点均属于共识委员节点 + +### rPBFT算法分析 + +- 网络复杂度:O(epoch_sealer_num * epoch_sealer_num),与节点规模无关,可扩展性强于PBFT共识算法 +- 性能:可秒级确认,且由于算法复杂度与节点数无关,性能衰减远小于PBFT +- 一致性、可用性要求:需要至少三分之二的共识委员节点正常工作,系统才可正常共识 +- 安全性:未来将引入VRF算法,随机、私密地替换共识委员,增强共识算法安全性 + + +## rPBFT网络优化 + +### Prepare包广播优化 + +为进一步提升Prepare包在带宽有限场景下广播效率,FISCO BCOS v2.3.0在rPBFT的基础上实现了Prepare包树状广播,如下图所示: + +![](../../../images/consensus/broadcast_prepare_by_tree.png) + + +- 根据共识节点索引,构成完全n叉树(默认是3) +- Leader产生Prepare包后,沿着树状拓扑将Prepare包转发给其所有下属子节点 + +**优势**: +- 传播速度比gossip快,无冗余消息包 +- 分而治之,每个节点出带宽为O(1),可扩展性强 + +**劣势**: 中间节点是单点,需要额外的容错策略 + + +### 基于状态包的容错方案 + +```eval_rst +.. note:: + + 基于状态包的容错策略仅在开启Prepare包树状广播时生效 +``` + +为保证节点断连情况下,开启树状广播时,Prepare包能到达每个节点,rPBFT引入了基于状态包的容错机制,如下图所示: + +![](../../../images/consensus/prepare_tree_broadcast_fault_tolerant.png) + +主要流程包括: + +(1) 节点A收到Prepare后,随机选取33%节点广播Prepare包状态,记为prepareStatus,包括{blockNumber, blockHash, view, idx} + +(2) 节点B收到节点A随机广播过来的prepareStatus后,判断节点A的Prepare包状态是否比节点B当前Prepare包localPrepare状态新,主要判断包括: + +- prepareStatus.blockNumber是否大于当前块高 +- prepareStatus.blockNumber是否大于localPrepare.blockNumber +- prepareStatus.blockNumber等于localPrepare.blockNumber情况下,prepareStatus.view是否大于localPrepare.view + +以上任意一个条件成立,都说明节点A的Prepare包状态比节点B的状态新 + +(3) 若节点B的状态落后于节点A,且节点B与其父节点断连,则节点B向节点A发出prepareRequest请求,请求相应的Prepare包 + +(4) 若节点B的状态落后于节点A,但节点B与其父节点相连,若节点B最多等待[100ms(可配)](../../manual/configuration.html#rpbft)后,状态仍然落后于节点A,则节点B向节点A发出prepareRequest请求,请求相应的Prepare包 + +(5) 节点B收到节点A的prepareRequest请求后,向其回复相应的Prepare消息包 + +(6) 节点A收到节点B的Prepare消息包后,执行handlePrepare流程处理收到的Prepare包。 + + +### 流量负载均衡策略 + +```eval_rst +.. note:: + 流量负载均衡策略仅在开启Prepare包树状广播时生效 +``` + +rPBFT开启Prepare包结构优化后,其他共识节点交易缺失后,向leader请求交易,导致leader出带宽成为瓶颈,FISCO BCOS v2.3.0结合Prepare包状态,设计并实现了负载均衡策略,该策略时序图如下: + +```eval_rst +.. mermaid:: + + sequenceDiagram + participant leader + participant sealerA(父节点) + participant sealerB(子节点) + + leader->>sealerA(父节点): 发送Prepare + leader->>sealerA(父节点): 发送PrepareStatus + sealerA(父节点)->>sealerA(父节点): 更新Prepare状态缓存{leader, PrepareStatus} + sealerA(父节点)->>sealerB(子节点): 转发Prepare + sealerA(父节点)->>sealerA(父节点): 向leader请求并获取缺失交易,Prepare包加入缓存 + sealerA(父节点)->>sealerB(子节点): 发送PrepareStatus + sealerB(子节点)->>sealerB(子节点): 更新Prepare状态缓存{sealerA, PrepareStatus} + sealerB(子节点)->>sealerB(子节点): 向sealerA请求缺失并获取 + sealerB(子节点)->>leader: 发送PrepareStatus + + ``` + +**Leader的子节点sealerA的主要处理流程如下:** + +(1) leader产生新区块后,将仅包含交易哈希列表的Prepare包发送给三个子节点 + +(2) 子节点sealerA收到Prepare包后,将其沿树状拓扑转发给三个子节点 + +(3) 子节点sealerA开始处理Prepare包: + + - 从交易池中获取命中的交易,填充到Prepare包内的区块中 + - 向父节点Leader请求缺失的交易 + +(4) sealerA收到Leader的回包后,将回包内的交易填充到Prepare包内,并随机选取33%的节点广播Prepare包的状态,主要包括{blockNumber, blockHash, view, idx},其他节点收到该状态包后,将sealerA最新状态包更新到缓存中 + +**sealerA的子节点sealerB的主要处理流程如下** + +(1) sealerB收到SealerA转发过来的Prepare包后,同样继续将该Prepare包转发给sealerB的子节点 + +(2) sealerB开始处理Prepare包,首先从交易池中获取命中的交易,填充到Prepare包的区块中,并选取节点获取缺失的交易: + - 若sealerB缓存来自节点sealerA的prepareStatus.blockHash等于Prepare.blockHash,则直接向父节点sealerA请求缺失交易 + - 若sealerB缓存的sealerA状态包哈希不等于Prepare.blockHash,但存在来自其他节点C的prepareStatus.blockHash等于prepare.blockHash,则向C请求缺失交易 + - 若sealerB缓存的任何节点prepareStatus的哈希均不但等于prepare.blockHash,最多等待[100ms(可配)](../../manual/configuration.html#rpbft)后,向Leader请求缺失的交易 + +(3) sealerB收到被请求节点回复的交易后,填充Prepare包内区块,并随机选取[33%(可配)](../../manual/configuration.html#rpbft)节点广播Prepare包状态 + +(4) 其他节点收到sealerB的状态包后,将其sealerB的最新状态包更新到缓存中 \ No newline at end of file diff --git a/3.x/zh_CN/docs/design/contract.md b/3.x/zh_CN/docs/design/contract.md index cb7548653..c12a928d1 100644 --- a/3.x/zh_CN/docs/design/contract.md +++ b/3.x/zh_CN/docs/design/contract.md @@ -8,17 +8,15 @@ 交易的执行是区块链节点上的一个重要的功能。交易的执行,是把交易中的智能合约二进制代码取出来,用执行器(Executor_)执行。共识模块(Consensus_)把交易从交易池(TxPool_)中取出,打包成区块,并调用执行器去执行区块中的交易。在交易的执行过程中,会对区块链的状态(State)进行修改,形成新区块的状态储存下来(Storage)。执行器在这个过程中,类似于一个黑盒,输入是智能合约代码,输出是状态的改变。 -随着技术的发展,人们开始关注执行器的性能和易用性。一方面,人们希望智能合约在区块链上能有更快的执行速度,满足大规模交易的需求。另一方面,人们希望能用更熟悉更好用的语言进行开发。进而出现了一些替代传统的执行器(EVM)的方案,如:JIT_、 WASM_甚至JVM。然而,传统的EVM是耦合在节点代码中的。首先要做的,是将执行器的接口抽象出来,兼容各种虚拟机的实现。因此,EVMC被设计出来。 +随着技术的发展,人们开始关注执行器的性能和易用性。一方面,人们希望智能合约在区块链上能有更快的执行速度,满足大规模交易的需求。另一方面,人们希望能用更熟悉更好用的语言进行开发。进而出现了一些替代传统的执行器(EVM)的方案,如:WASM。 +EVMC (Ethereum Client-VM Connector API),是以太坊抽象出来的执行器的接口,旨在能够对接各种类型的执行器。 -EVMC (Ethereum Client-VM Connector API),是以太坊抽象出来的执行器的接口,旨在能够对接各种类型的执行器。FISCO BCOS目前采用了以太坊的智能合约语言Solidity,因此也沿用了以太坊对执行器接口的抽象。 +![虚拟机](../../images/evm/evmc_frame.png) -![](../../images/evm/evmc_frame.png) - -在节点上,共识模块会调用EVMC,将打包好的交易交由执行器执行。执行器执行时,对状态进行的读写,会通过EVMC的回调反过来操作节点上的状态数据。 - -经过EVMC一层的抽象,FISCO BCOS能够对接今后出现的更高效、易用性更强的执行器。目前,FISCO BCOS采用的是传统的EVM根据EVMC抽象出来的执行器---Interpreter。因此能够支持基于Solidity语言的智能合约。目前其他类型的执行器发展尚未成熟,后续将持续跟进。 +在节点上,共识模块会将打包好的区块交由执行器执行。虚拟机执行时,对状态进行的读写,会通过EVMC的回调反过来操作节点上的状态数据。 +经过EVMC的抽象,FISCO BCOS能够对接今后出现的更高效、易用性更强的执行器。目前,FISCO BCOS支持evm和wasm两种合约引擎,其中evmone作为evm的解释器,支持以Solidity为主的能编译为evm字节码的智能合约语言。wasm引擎使用wasmtime实现,支持能够编译为wasm的语言编写的合约,例如[liquid](https://liquid-doc.readthedocs.io/zh_CN/latest/index.html),其他语言的工具链正在规划中。 .. toctree:: :maxdepth: 1 @@ -33,6 +31,4 @@ virtual_machine/gas.md .. _TxPool: ../architecture/transaction_stream.html -.. _JIT: https://github.com/ethereum/evmjit - -.. _WASM: https://webassembly.org/ \ No newline at end of file +.. _WASM: https://webassembly.org/ diff --git a/3.x/zh_CN/docs/design/contract_directory.md b/3.x/zh_CN/docs/design/contract_directory.md index b356df980..a857fe799 100644 --- a/3.x/zh_CN/docs/design/contract_directory.md +++ b/3.x/zh_CN/docs/design/contract_directory.md @@ -1,4 +1,4 @@ -# 区块链合约文件系统 +# 18. 合约文件系统BFS 标签:``合约目录``,``区块链文件系统``,``BFS`` @@ -85,11 +85,11 @@ FISCO BCOS 3.x版本引入区块链合约文件系统(Blockchain File System ### 1.2 详细使用文档 -BFS的使用体验主要集中体现在控制台,请参考控制台中BFS相关操作命令,以及使用控制台的BFS命令时的注意事项、错误出现情况请参考:[链接](../develop/console/console_commands.html#bfs)。 +BFS的使用体验主要集中体现在控制台,请参考控制台中BFS相关操作命令,以及使用控制台的BFS命令时的注意事项、错误出现情况请参考:[链接](../operation_and_maintenance/console/console_commands.html#bfs)。 -使用合约调用的BFS接口时的注意事项、错误出现情况请参考:[链接](../develop/precompiled/precompiled_contract_api.html#bfsprecompiled) 。 +使用合约调用的BFS接口时的注意事项、错误出现情况请参考:[链接](../contract_develop/c++_contract/precompiled_contract_api.html#bfsprecompiled) 。 -同时在部署合约和调用合约均支持BFS使用,请参考控制台中[deploy命令](../develop/console/console_commands.html#deploy)与[call命令](../develop/console/console_commands.html#call)。 +同时在部署合约和调用合约均支持BFS使用,请参考控制台中[deploy命令](../operation_and_maintenance/console/console_commands.html#deploy)与[call命令](../operation_and_maintenance/console/console_commands.html#call)。 ## 2. 设计文档 @@ -205,7 +205,7 @@ BFS存储表生命周期主要包括创建、修改、读取,暂时不支持 - **值得注意的是:** Solidity的地址由于其不可读的性质与BFS易读可见的原则相悖,因此Solidity部署后的合约地址只生成合约存储表,其BFS元数据不会写入 `/apps` 表内。例如:用户部署合约后地址为 0x123456,链上将会为合约创建合约存储表`/apps/123456`,但并不会将元数据写入到 `/apps` 内,即用户调用`list(/apps)`,不会显示子目录有`123456`这个资源。用户后续可以通过link操作,将solidity合约地址与BFS进行绑定。 - 在用户发起创建Table合约请求时,将会在 `/tables` 目录下创建对应的合约资源表,例如:创建Table合约 t_test合约时,将会创建 `/tables/t_test` 的存储表。 - 在执行合约时,将会读取合约资源对应的存储表中的状态数据。 -- 在部署普通合约是,将会创建合约的权限数据表,详情请参考:[权限底层节点设计](./committee_design.html#id15) +- 在部署普通合约时,将会创建合约的权限数据表,详情请参考:[权限底层节点设计](./committee_design.html#id15) #### 2.5.3 合约软链接资源生命周期 diff --git a/3.x/zh_CN/docs/design/guomi.md b/3.x/zh_CN/docs/design/guomi.md new file mode 100644 index 000000000..f78bfdc7a --- /dev/null +++ b/3.x/zh_CN/docs/design/guomi.md @@ -0,0 +1,49 @@ +# 12. 国密支持方案 + +标签:``国密算法`` ``SSL`` ``SM`` + +---- +## 设计目标 + + 为了充分支持国产密码学算法,金链盟基于[国产密码学标准](http://www.gmbz.org.cn/main/bzlb.html),实现了国密加解密、签名、验签、哈希算法、国密SSL通信协议,并将其集成到FISCO BCOS平台中,实现了对**国家密码局认定的商用密码**的完全支持。 + +**国密版FISCO BCOS将交易签名验签、p2p网络连接、节点连接、数据落盘加密等底层模块的密码学算法均替换为国密算法**,国密版FISCO BCOS与标准版主要特性对比如下: + + | | 标准版FISCO BCOS | 国密版FISCO BCOS | + |:------------:|:--------------------:|:------------------:| + | SSL链接 | Openssl TLSv1.2协议 | 国密TLSv1.1协议 | + | 签名验证 | ECDSA签名算法 | SM2签名算法 | + | 消息摘要算法 | SHA-256 SHA-3 | SM3消息摘要算法 | + | 落盘加密算法 | AES-256加密算法 | SM4加密算法 | + | 证书模式 | OpenSSL证书模式 | 国密双证书模式 | + | 合约编译器 | 以太坊solidity编译器 | 国密solidity编译器 | + +(注:国密算法SM2, SM3, SM4均基于[国产密码学标准](http://www.gmbz.org.cn/main/bzlb.html)开发) + +## 系统框架 + +系统整体框架如下图所示: + +![](../../images/guomi/guomishakehand.png) + +## 国密SSL 1.1 握手建立流程 + +国密版FISCO BCOS节点之间的认证选用国密SSL 1.1的ECDHE_SM4_SM3密码套件进行SSL链接的建立,差异如下表所示: + + | | OpenSSL | 国密SSL | + |:------------:|:----------------------------------------:|:----------------------------------------:| + | 加密套件 | 采用ECDH、RSA、SHA-256、AES256等密码算法 | 采用国密算法 | + | PRF算法 | SHA-256 | SM3 | + | 密钥交换方式 | 传输椭圆曲线参数以及当前报文的签名 | 当前报文的签名和加密证书 | + | 证书模式 | OpenSSL证书模式 | 国密双证书模式,分别为加密证书和签名证书 | + +## 数据结构差异 + +国密版与标准版FISCO BCOS在数据结构上的差异如下: + + | 算法类型 | 标准版FISCO BCOS | 国密版FISCO BCOS | + |:----------:|:----------------------------------------------:|:--------------------------------------------------:| + | 签名 | ECDSA (公钥长度: 512 bits, 私钥长度: 256 bits) | SM2 (公钥长度:512 bits, 私钥长度:256 bits) | + | 哈希 | SHA3 (哈希串长度: 256 bits) | SM3 (哈希串长度: 256 bits) | + | 对称加解密 | AES (加密秘钥长度: 256 bits) | SM4 (对称密钥长度: 128 bits) | + | 交易长度 | 520bits(其中标识符8bits,签名长度512bits) | 1024bits(128字节,其中公钥512bits,签名长度512bits) | diff --git a/3.x/zh_CN/docs/design/hsm.md b/3.x/zh_CN/docs/design/hsm.md new file mode 100644 index 000000000..89afc1a3a --- /dev/null +++ b/3.x/zh_CN/docs/design/hsm.md @@ -0,0 +1,29 @@ +# 15. 硬件密码机 + +标签:``硬件加密`` ``HSM`` ``密码机`` + +----- + +## 一、密码机与GMT0018简介 + +### 密码机HSM + +硬件安全模块(Hardware security module,HSM)是一种用于保障和管理强认证系统所使用的数字密钥,并同时提供相关密码学操作的计算机硬件设备。硬件安全模块一般通过扩展卡或外部设备的形式直接连接到电脑或网络服务器。 + +### GMT0018 + +《GMT0018-2012 密码设备应用接口规范》是由国家密码管理局发布的,符合中国密码行业标准的一个密码设备应用接口规范。它为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。 + +FISCO BCOS 2.8.0和FISCO BCOS 3.3.0版本引入了密码机功能。用户可以将密码放入密码机,通过密码机进行**共识签名**、**交易验签**。FISCO BCOS支持《GMT0018-2012 密码设备应用接口规范》的密码卡/密码机,支持SDF标准,这使得FISCO BCOS拥有更快的密码计算速度,更安全的密钥保护。 + +## 二、调用密码机的模块 + +FISCO BCOS的共识和交易模块调用了密码机。 +共识、交易模块在签名时,调用`bcos-crypto`模块,`bcos-crypto`再调用`hsm-crypto`模块,最终调用到密码机API接口完成签名。其中涉及到的参数还有通过配置文件传入的密码机内置密钥索引keyIndex,最终调用密码机签名接口`SDF_InternalSign_ECC`。 +交易模块在验签时,同理调用`bcos-crypto`模块,`bcos-crypto`再调用`hsm-crypto`模块,最终调用到密码机API接口完成签名。最终调用密码机验签接口`SDF_ExternalVerify_ECC`。 + +### hsm-crypto模块 + +hsm-crypto是个封装密码机API接口,使用C++实现的硬件加密模块(Hardware secure module),它能协助应用调用符合《GMT0018-2012密码设备通用接口规范》的PCI密码卡或者密码机进行国密算法SM2、SM3、SM4运算。FISCO BCOS节点,以及java-sdk都通过调用该模块,调用密码机API接口。[Github项目地址](https://github.com/WeBankBlockchain/hsm-crypto) + +至此,硬件密码机HSM的设计文档到此结束,关于FISCO BCOS和java-sdk如何使用密码机,请参考[构建使用硬件密码模块的国密链](../tutorial/air/use_hsm.md) diff --git a/3.x/zh_CN/docs/design/index.md b/3.x/zh_CN/docs/design/index.md index e36342219..13dff270d 100644 --- a/3.x/zh_CN/docs/design/index.md +++ b/3.x/zh_CN/docs/design/index.md @@ -38,11 +38,19 @@ ___ sync.md storage/storage.md DMC.md - contract_directory.md virtual_machine/index.rst committee_design.md storage/storage_security.md storage/archive.md + guomi.md + rip.md + network_compress.md + security_control/index.rst + hsm.md + cns_contract_name_service.md + contract_directory.md + boostssl.md + amop_protocol.md p2p.md compatibility.md ``` diff --git a/3.x/zh_CN/docs/design/network_compress.md b/3.x/zh_CN/docs/design/network_compress.md index 1bedeeeb6..74dafd975 100644 --- a/3.x/zh_CN/docs/design/network_compress.md +++ b/3.x/zh_CN/docs/design/network_compress.md @@ -1,11 +1,10 @@ -# 网络压缩 +# 13. 网络包压缩 标签:``p2p网络压缩`` ``数据压缩`` ---- -外网环境下,区块链系统性能受限于网络带宽,为了尽量减少网络带宽对系统性能的影响,FISCO BCOS 3.0在`relase-3.1`支持p2p网络压缩功能,该功能主要在发送端进行p2p网络数据包压缩,在接收端将解包数据,并将解包后的数据传递给上层模块。该p2p网络压缩功能默认开启,无需通过配置项控制。 - +外网环境下,区块链系统性能受限于网络带宽,为了尽量减少网络带宽对系统性能的影响,FISCO BCOS 3.0在`v3.1.0`支持p2p网络压缩功能,该功能主要在发送端进行p2p网络数据包压缩,在接收端将解包数据,并将解包后的数据传递给上层模块。该p2p网络压缩功能默认开启,无需通过配置项控制。 ## 系统框架 @@ -15,16 +14,14 @@ 网络压缩主要包括两个过程: -- **发送端压缩数据包**:群组层通过P2P层发送数据时,若数据包大小超过1KB,而且接收端节点是3.1及之后的版本,则压缩数据包后,更新标记位`ext`,编码后,将其发送到目标节点; +- **发送端压缩数据包**:群组层通过P2P层发送数据时,若数据包大小超过1KB,而且接收端节点是3.1.0及之后的版本,则压缩数据包后,更新标记位`ext`,编码后,将其发送到目标节点; - **接收端解压数据包**:节点收到数据包后,解码,根据标记位`ext`判断收到的数据包是否被压缩,若数据包是压缩后的数据包,则将其解压,重置ext标记位。 - ## 核心实现 综合考虑性能、压缩效率等,我们选取了[Zstd](https://github.com/facebook/zstd)来实现数据包压缩和解压功能。本节主要介绍网络压缩的实现。 - ### 数据压缩标记位 FISCO BCOS的网络数据包结构如下图: @@ -59,14 +56,13 @@ FISCO BCOS的网络数据包结构如下图: - 编码模块给packet加上包头,同时更新压缩标记位`ext`。即:若packet是压缩后的数据包,将`ext |= 0x0010`; - P2P将编码后的数据包传送到目的节点。 -**接收端处理流程:** +**接收端处理流程** - 目标机器收到数据包后,解码模块分离出包头,通过判断包头ext字段,即`m_ext & 0x0010 == 0x0010`判断网络数据是否被压缩; - 若网络数据包被压缩过,则调用解压接口,对payload数据进行解压; - reset重置ext标记位,即`m_ext &= ~0x0010`,防止同个数据包被多次解压。 - ## 兼容性说明 - **数据兼容**:不涉及存储数据的变更; -- **网络兼容rc1**:向前兼容,仅有relase-3.1及以上节点具有网络压缩功能。 \ No newline at end of file +- **网络兼容rc1**:向前兼容,仅有relase-3.1及以上节点具有网络压缩功能。 diff --git a/3.x/zh_CN/docs/design/DMC.md b/3.x/zh_CN/docs/design/parallel/DMC.md similarity index 96% rename from 3.x/zh_CN/docs/design/DMC.md rename to 3.x/zh_CN/docs/design/parallel/DMC.md index 7c0882904..8ee63f62c 100644 --- a/3.x/zh_CN/docs/design/DMC.md +++ b/3.x/zh_CN/docs/design/parallel/DMC.md @@ -1,11 +1,9 @@ -# 确定性多合约并行 +# DMC确定性多合约并行 标签:``执行`` ``并行调度`` ``DMC`` ``确定性并行合约`` ---------- -本文档用于描述**确定性多合约并行**。 - ## 1、背景 如今多核已经逐渐成为当今 CPU 的主流,未来 CPU 可能集成更多的核,进入众核时代。 @@ -43,22 +41,22 @@ DMC 方案中,调用同一个合约的多个交易在全局视角中总是串 - 如果目的合约字段成功放入哈希表,说明该消息调用的目的合约是首次执行,DMC 调度器将该消息异步发送至任意交易执行器来执行该消息; - 如果目的合约字段放入哈希表时发生冲突,说明该消息调用的目的合约已经有更早的消息调用过,DMC 调度器将该消息移动至下一阶段(阶段2); -![](../../images/design/dmc_stage1.png) +![](../../../images/design/dmc_stage1.png) **阶段2** - DMC 调度器遍历阶段1的消息,发现消息2与消息1调用了同一合约,消息3与消息5调用了同一合约,消息4与消息6调用了同一合约,DMC 调度器将首次调用合约的消息(消息1、消息3、消息4)异步发送给多个交易执行器来执行,其它(消息2、消息5、消息6)移动到下一阶段。 - 消息1、消息3和消息4,由于它们分别调用不同的合约,因此多个交易执行器可以并行执行这3个消息,DMC 调度器会等待消息1、3、4执行完成。 -![](../../images/design/dmc_stage2.png) +![](../../../images/design/dmc_stage2.png) **阶段3** - 交易执行器在执行消息的过程中,如果消息对应的智能合约内部发生跨合约调用,交易执行器会中止当前消息的执行,保存消息执行的上下文,生成新的跨合约调用消息,新消息内包含前述保存的上下文,交易执行器将跨合约调用的新消息发送给 DMC 调度器。 - DMC 调度器将来自交易执行器的跨合约调用消息移动到下一阶段。 - 假如DMC 调度器在阶段2执行过程中,交易执行器执行消息2时,消息调用的智能合约发起了跨合约调用,跨合约调用的目的合约是3,则该交易执行器暂停执行消息2的执行,保存消息2的上下文,生成一个新的跨合约调用消息2’,交易执行器将跨合约调用的消息2’发送给 DMC 调度器。DMC 调度器将消息2’放到阶段3,后续 DMC 调度器在阶段3将该消息下发给其它交易执行器。 -![](../../images/design/dmc_stage3.png) +![](../../../images/design/dmc_stage3.png) **阶段4** - 交易执行器将消息执行结束后,如果消息内包含上下文,相当于跨合约调用返回,交易执行器会根据消息内上下文,还原该上下文,生成新消息,并将当前消息执行的结果作为跨合约调用返回值放到新消息的参数中,将跨合约调用返回的新消息发送给 DMC 调度器。 -![](../../images/design/dmc_stage4.png) +![](../../../images/design/dmc_stage4.png) - DMC 调度器将来自交易执行器的跨合约调用消息移动到下一阶段。 - DMC 调度器如果发现下一阶段非空,会将当前阶段设置为下一阶段并重复初始步骤,依次类推,直到所有交易都执行完成为止。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/design/parallel/dag.md b/3.x/zh_CN/docs/design/parallel/dag.md new file mode 100644 index 000000000..b7d369cb5 --- /dev/null +++ b/3.x/zh_CN/docs/design/parallel/dag.md @@ -0,0 +1,73 @@ +# DAG交易并行 + +标签:``交易并行`` ``DAG`` + +---- + +## 1 名词解释 + +### 1.1 DAG + +一个无环的有向图称做有向无环图(**D**irected **A**cyclic **G**raph),简称DAG图。在一批交易中,可以通过一定方法识别出每笔交易需要占用的互斥资源,再根据交易在Block中的顺序及互斥资源的占用关系构造出一个交易依赖DAG图,如下图所示,凡是入度为0(无被依赖的前序任务)的交易均可以并行执行。如下图所示,基于左图的原始交易列表的顺序进行拓扑排序后,可以得到右图的交易DAG。 + +![](../../../images/parallel/DAG.png) + +## 2 模块架构 + +![](../../../images/parallel/architecture.png) +其中主要流程包括: + +- 用户直接或间接通过SDK发起交易。交易可以是能够并行执行的交易和不能并行执行的交易; +- 交易进入节点的交易池中,等待打包; +- 交易被Sealer打包为区块,经过共识后,发送至BlockVerifier进行验证; +- BlockVerifier根据区块中的交易列表生成交易DAG; +- BlockVerifier构造执行上下文,并行执行交易DAG; +- 区块验证通过后,区块上链。 + +## 3 重要流程 + +### 3.1 交易DAG构建 + +#### 3.1.1 DAG数据结构 + +方案中所用到的DAG数据结构如下: +![](../../../images/parallel/TxDAG.png) +其中: +- 顶点(Vertex) + - inDegree用于存储顶点当前的入度; + - outEdge用于保存该顶点的出边信息,具体为所有出边所连顶点的ID列表。 +- DAG: + - vtxs是用于存储DAG中所有节点的列表; + - topLevel是一个并发队列,用于存储当前入度为0的节点ID,执行时供多个线程并发访问; + - totalVtxs:顶点总数 + - totalConsume:已经执行过的顶点总数; + - void init(uint32_t \_maxSize):初始化一个最大顶点数为maxSize的DAG; + - void addEdge(ID from, ID to):在顶点from和to之间建立一条有向边; + - void generate():根据已有的边和顶点构造出一个DAG结构; + - ID waitPop(bool needWait):等待从topLevel中取出一个入度为0的节点; + - void clear():清除DAG中所有的节点与边信息。 +- TxDAG: + - dag:DAG实例 + - exeCnt:已经执行过的交易计数; + - totalParaTxs:并行交易总数; + - txs:并行交易列表 + - bool hasFinished():若整个DAG已经执行完毕,返回true,否则返回false; + - void executeUnit():取出一个没有上层依赖的交易并执行; +#### 3.1.2 交易DAG构造流程 + +流程如下: + +![](../../../images/parallel/dag_construction.png) + +1. 从打包好的区块从取出区块中的所有交易; +2. 将交易数量作为最大顶点数量初始化一个DAG实例; +3. 按序读出所有交易,如果一笔交易是可并行交易,则解析其冲突域,并检查是否有之前的交易与该交易冲突,如果有,则在相应交易间构造依赖边;若该交易不可并行,则认为其必须在前序的所有交易都执行完后才能执行,因此在该交易与其所有前序交易间建立一条依赖边。 + +### 3.2 DAG执行流程 + +流程如下: + +![](../../../images/parallel/execution.png) + +1. 主线程会首先根据硬件核数初始化一个相应大小的线程组,若获取硬件核数失败,则不创建其他线程; +2. 当DAG尚未执行完毕时,线程循环等待从DAG中pop出入度为0的交易。若成功取出待执行的交易,则执行该交易,执行完后将后续的依赖任务的入度减1,若有交易入度被减至0,则将该交易加入topLevel中;若失败,则表示DAG已经执行完毕,线程退出。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/design/parallel/group.md b/3.x/zh_CN/docs/design/parallel/group.md new file mode 100644 index 000000000..1221243a6 --- /dev/null +++ b/3.x/zh_CN/docs/design/parallel/group.md @@ -0,0 +1,58 @@ +# 群组架构 + +标签:``群组架构`` ``架构`` + +---- + +考虑到真实的业务场景需求,FISCO BCOS引入多群组架构,支持区块链节点启动多个群组,群组间交易处理、数据存储、区块共识相互隔离,保障区块链系统隐私性的同时,降低了系统的运维复杂度。不同群组间的交易可并行执行,提升了性能。 + + +```eval_rst +.. note:: + + 举个例子: + + 机构A、B、C所有节点构成一个区块链网络,运行业务1;一段时间后,机构A、B启动业务2,且不希望该业务相关数据、交易处理被机构C感知,有何解? + + - **1.3系列FISCO BCOS系统** :机构A和机构B重新搭一条链运行业务2;运维管理员需要运维两条链,维护两套端口 + + - **FISCO BCOS 2.0+** :机构A和机构B新建一个群组运行业务2;运维管理员仅需维护一条链 + + 显然在达到相同隐私保护需求基础上,FISCO BCOS 2.0+具有更好的扩展性、可运维性和灵活性。 +``` + +多群组架构中,群组间共享网络,通过[网络准入和账本白名单](../security_control/node_management.md)实现各账本间网络消息隔离。 + +![](../../../images/parallel/ledger.png) + + +群组间数据隔离,每个群组独立运行各自的共识算法,不同群组可使用不同的共识算法。每个账本模块自底向上主要包括核心层、接口层和调度层三层,这三层相互协作,FISCO BCOS可保证单个群组独立健壮地运行。 + +## 核心层 + +核心层负责将群组的[区块](../../tutorial/key_concepts.html#id3)数据、区块信息、系统表以及区块执行结果写入底层数据库。 + +存储分为世界状态(State)和分布式存储(AMDB)两部分,世界状态包括MPTState和StorageState,负责存储交易执行的状态信息,StorageState性能高于MPTState,但不存储区块历史信息;AMDB则向外暴露简单的查询(select)、提交(commit)和更新(update)接口,负责操作合约表、系统表和用户表,具有可插拔特性,后端可支持多种数据库类型,目前支持[RocksDB数据库](https://github.com/facebook/rocksdb)和MySQL[storage](../storage/storage.md)。 + +![](../../../images/parallel/storage.png) + + +## 接口层 + +接口层包括交易池(TxPool)、区块链(BlockChain)和区块执行器(BlockVerifier)三个模块。 + +- **交易池(TxPool)**: 与网络层以及调度层交互,负责缓存客户端或者其他节点广播的交易,调度层(主要是同步和共识模块)从交易池中取出交易进行广播或者区块打包; + +- **区块链(BlockChain)**: 与核心层和调度层交互,是调度层访问底层存储的唯一入口,调度层(同步、共识模块)可通过区块链接口查询块高、获取指定区块、提交区块; + +- **区块执行器(BlockVerifier)**: 与调度层交互,负责执行从调度层传入的区块,并将区块执行结果返回给调度层。 + + +## 调度层 + +调度层包括共识模块(Consensus)和同步模块(Sync)。 + +- **共识模块**:包括Sealer线程和Engine线程,分别负责打包交易、执行共识流程。Sealer线程从交易池(TxPool)取交易,并打包成新区块;Engine线程执行共识流程,共识过程会执行区块,共识成功后,将区块以及区块执行结果提交到区块链(BlockChain),区块链统一将这些信息写入底层存储,并触发交易池删除上链区块中包含的所有交易、将交易执行结果以回调的形式通知客户端,目前FISCO BCOS主要支持[PBFT](../consensus/pbft.md)和[Raft](../storage/storage.md)共识算法; + +- **同步模块**:负责广播交易和获取最新区块, +考虑到共识过程中,[leader](../consensus/pbft.html#id1)负责打包区块,而leader随时有可能切换,因此必须保证客户端的交易尽可能发送到每个区块链节点,节点收到新交易后,同步模块将这些新交易广播给所有其他节点;考虑到区块链网络中机器性能不一致或者新节点加入都会导致部分节点区块高度落后于其他节点,同步模块提供了区块同步功能,该模块向其他节点发送自己节点的最新块高,其他节点发现块高落后于其他节点后,会主动下载最新区块。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/design/parallel/index.md b/3.x/zh_CN/docs/design/parallel/index.md new file mode 100644 index 000000000..9e68ea4a9 --- /dev/null +++ b/3.x/zh_CN/docs/design/parallel/index.md @@ -0,0 +1,33 @@ +# 7. 全方位并行 + +标签:``执行`` ``并行调度`` ``DMC`` ``DAG`` + +---------- + +FISCO BCOS为提升交易处理性能,进行了全方位的并行处理设计。按照**并行粒度**从细到粗的划分,其并行机制可分为: + +* **交易**的并行:DAG交易并行、读写集并行 + +* **合约**的并行:DMC、块内分片 + +* **区块**的并行:区块DAG(设计中) + +* **链**的并行:群组架构 + +* **链服务**的并行:多链跨链 + +---------- + + + +```eval_rst +.. toctree:: + :maxdepth: 1 + + dag.md + rwset.md + DMC.md + sharding.md + group.md + multichain.md +``` \ No newline at end of file diff --git a/3.x/zh_CN/docs/design/parallel/multichain.md b/3.x/zh_CN/docs/design/parallel/multichain.md new file mode 100644 index 000000000..6cc3bec9d --- /dev/null +++ b/3.x/zh_CN/docs/design/parallel/multichain.md @@ -0,0 +1,5 @@ +# 多链跨链 +FISCO BCOS 通过多了跨链的方案与其他类型的区块链进行并行处理。方案包括: + +* [WeCross](https://github.com/WeBankFinTech/WeCross) +* [陆羽跨链协议](https://gitee.com/luyu-community/luyu-cross-chain-protocol) diff --git a/3.x/zh_CN/docs/design/parallel/rwset.md b/3.x/zh_CN/docs/design/parallel/rwset.md new file mode 100644 index 000000000..95f0970d0 --- /dev/null +++ b/3.x/zh_CN/docs/design/parallel/rwset.md @@ -0,0 +1,2 @@ +# 读写集并行 +(该方案在开发中,将于3.4.0版本发布,敬请期待) diff --git a/3.x/zh_CN/docs/design/parallel/sharding.md b/3.x/zh_CN/docs/design/parallel/sharding.md new file mode 100644 index 000000000..2312fba98 --- /dev/null +++ b/3.x/zh_CN/docs/design/parallel/sharding.md @@ -0,0 +1,145 @@ +# 块内分片 +标签: ``sharding`` ``分片`` ``交易执行`` + +------- + +## 概念 + +当一条区块链上承载了多个应用时,可采用“**块内分片**”技术实现应用间交易执行的并行化。 + +FISCO BCOS支持中对链上的合约进行分组。在执行一个区块内的交易时,一个区块内的交易会根据合约的分组情况拆分成多个“**块内分片**”下文简称:分片),相同分片的交易调度到同一个执行器中执行。 + +## 方案 + +**关键点** + +* 并行:一个区块内的不同分片调度至不同的执行器中并行执行。 +* 局部:分片内部合约的相互调用直接在同一个执行器中完成,分片间互不干扰。 +* 跨分片:跨分片调用直接在一个区块内完成,对用户透明无感,其调度基于DMC机制,避免繁重的SPV证明。 +* 配置:用户可用控制台管理合约所属的分片 +* 继承:分片内合约部署的合约属于相同的分片,消除繁琐的分片管理操作。 + +## 实现 + +实现方法如下: + +* 并行:基于[FISCO BCOS的架构](../architecture.md)实现多executor的调度。 +* 局部:一个executor内部,采用[DAG的方式并行执行](./dag.md)。 +* 跨分片:跨分片的交易采用[DMC机制进行调度](./dmc.md),在一个区块内完成的同时,保证一致性与存在性。 +* 配置:基于[BFS](../contract_directory.md)实现合约的分片管理,启动控制台,用linkShard命令可绑定合约至分片,用 ls 命令查看分片信息。 +* 继承:分片内合约部署的合约自动继承所属分片配置 + +## 举例 + +分片1:`/shard/hello_shard` + +``` +/shard/hello_shard/hello1 +/shard/hello_shard/hello2 +/shard/hello_shard/hello3 +``` + +分片2:`/shard/account_shard` + +``` +/shard/account_shard/alice +/shard/account_shard/bob +/shard/account_shard/charies +``` + + + +![](../../../images/parallel/sharding.png) + + + +## 操作举例 + +该操作需要使用控制台,请参考[此处](../../operation_and_maintenance/console/console_config.md)部署控制台。分片管理操作请参考此处。 + +**部署合约** + +> 部署两个合约:Asset、HelloWorld + +``` +[group0]: /apps> deploy Asset +transaction hash: 0x8dbee4602da3d3435ce73df3778ee975b650cfaf70ce6b53f14db6db478cec10 +contract address: 0xcceef68c9b4811b32c75df284a1396c7c5509561 +currentAccount: 0x988e6a553f434be3d37786c97abb1fe1f8b7341d + +[group0]: /apps> deploy HelloWorld +transaction hash: 0xcb860822f8d74ac447fc3d18870109a202ff788a6b1ef32970fa53497ba386d5 +contract address: 0xd24180cc0fef2f3e545de4f9aafc09345cd08903 +currentAccount: 0x988e6a553f434be3d37786c97abb1fe1f8b7341d +``` + +**创建分片** + +> 创建两个分片:account_shard 和 hello_shard + +``` +[group0]: /apps> makeShard account_shard +make shard account_shard Ok. You can use 'ls' to check + +[group0]: /apps> makeShard hello_shard +make shard hello_shard Ok. You can use 'ls' to check + +[group0]: /apps> ls /shards/ +account_shard hello_shard +``` + +**合约绑定分片** + +> 分别将上述的两个合约绑定到不同的shard + +``` +[group0]: /apps> linkShard 0xcceef68c9b4811b32c75df284a1396c7c5509561 account_shard +Add 0xcceef68c9b4811b32c75df284a1396c7c5509561 to account_shard Ok. You can use 'ls' to check + +[group0]: /apps> linkShard 0xd24180cc0fef2f3e545de4f9aafc09345cd08903 hello_shard +Add 0xd24180cc0fef2f3e545de4f9aafc09345cd08903 to hello_shard Ok. You can use 'ls' to check +``` + +**查询分片信息** + +> 用getContractShard命令查看合约已经绑定至特定的shard + +``` +[group0]: /apps> getContractShard 0xcceef68c9b4811b32c75df284a1396c7c5509561 +/shards/account_shard + +[group0]: /apps> getContractShard d24180cc0fef2f3e545de4f9aafc09345cd08903 +/shards/hello_shard +``` + +> BFS的ls命令也可以查询 + +``` +[group0]: /apps> ls /shards/account_shard/ +cceef68c9b4811b32c75df284a1396c7c5509561 + +[group0]: /apps> ls /shards/hello_shard/ +d24180cc0fef2f3e545de4f9aafc09345cd08903 +``` + +**调用shard内的合约** + +> 交易会自动调度至相应的shard中执行,不同的shard在不同的执行器中执行,该操作对用户透明,体验上与调用普通合约无区别 + +``` +[group0]: /apps> call HelloWorld 0xd24180cc0fef2f3e545de4f9aafc09345cd08903 set nice +transaction hash: 0x41637d8eb5907e84fd2bda6303d444bb7b3b9fe8cd85750dc547139710439b6e +--------------------------------------------------------------------------------------------- +transaction status: 0 +description: transaction executed successfully +--------------------------------------------------------------------------------------------- +Receipt message: Success +Return message: Success +Return value size:0 +Return types: () +Return values:() +--------------------------------------------------------------------------------------------- +Event logs +Event: {} +``` + diff --git a/3.x/zh_CN/docs/design/protocol_description.md b/3.x/zh_CN/docs/design/protocol_description.md index 4a5e869cb..ee2377f05 100644 --- a/3.x/zh_CN/docs/design/protocol_description.md +++ b/3.x/zh_CN/docs/design/protocol_description.md @@ -1,4 +1,4 @@ -# 数据结构的编码协议 +# 3. 核心数据结构 标签:``数据结构`` ``编码`` @@ -6,19 +6,20 @@ ```eval_rst .. note:: - FISCO BCOS 3.x数据和编码协议的实现位于仓库 `bcos-tars-protocol `_ + FISCO BCOS 3.x数据和编码协议的实现位于 `bcos-tars-protocol `_ ``` FISCO BCOS 3.x默认采用[tars](https://doc.tarsyun.com/#/markdown/TarsCloud/TarsDocs/base/tars-protocol.md)编码协议,本章主要介绍FISCO BCOS 3.x基础数据结构的编码协议。 + ## 1. 区块头数据结构 -区块头的tars定义可参考[这里](https://github.com/FISCO-BCOS/bcos-tars-protocol/blob/main/bcos-tars-protocol/tars/Block.tars)。 +区块头的tars定义可参考[这里](https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/bcos-tars-protocol/bcos-tars-protocol/tars/Block.tars)。 ### 1.1 BlockHeaderData 区块头中需要计算哈希的字段: -| 字段 | 类型 | 说明 | +| 字段 | 类型 | 说明 | | ---- | ---- | ---- | | version | int |区块头版本号 | | parentInfo | vector |父区块信息,包括父区块的块高和哈希| @@ -37,18 +38,17 @@ FISCO BCOS 3.x默认采用[tars](https://doc.tarsyun.com/#/markdown/TarsCloud/Ta 区块头所有字段的定义: -| 字段 | 类型 | 说明 | +| 字段 | 类型 | 说明 | | ---- | ---- | ---- | |data |BlockHeaderData |区块头用于计算哈希的所有字段编码后对应的数据| |dataHash ||区块内所有交易状态变化对应的根哈希| |signatureList |vector |区块头共识成功后,产生的签名列表| - ## 2. 区块数据结构 -区块的tars定义可参考[这里](https://github.com/FISCO-BCOS/bcos-tars-protocol/blob/main/bcos-tars-protocol/tars/Block.tars),区块中既可以包括完整的区块头、交易、回执信息,也可以作为共识模块的Proposal仅包括交易的元数据信息,具体如下: +区块的tars定义可参考[这里](https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/bcos-tars-protocol/bcos-tars-protocol/tars/Block.tars),区块中既可以包括完整的区块头、交易、回执信息,也可以作为共识模块的Proposal仅包括交易的元数据信息,具体如下: -| 字段 | 类型 | 说明 | +| 字段 | 类型 | 说明 | | ---- | ---- | ---- | |version |int|可选字段,区块版本号| |type |int|可选字段,区块类型| @@ -61,7 +61,7 @@ FISCO BCOS 3.x默认采用[tars](https://doc.tarsyun.com/#/markdown/TarsCloud/Ta ## 3. 交易数据结构 -交易的tars定义可参考[这里](https://github.com/FISCO-BCOS/bcos-tars-protocol/blob/main/bcos-tars-protocol/tars/Transaction.tars),类似于区块头,交易的数据协议字段也划分为用于计算哈希的字段和不参与哈希计算的字段两部分。 +交易的tars定义可参考[这里](https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/bcos-tars-protocol/bcos-tars-protocol/tars/Transaction.tars),类似于区块头,交易的数据协议字段也划分为用于计算哈希的字段和不参与哈希计算的字段两部分。 ### 3.1 TransactionData @@ -80,11 +80,12 @@ FISCO BCOS 3.x默认采用[tars](https://doc.tarsyun.com/#/markdown/TarsCloud/Ta hashWith字段(也称交易hash/交易唯一标识)的生成流程如下: ![](../../images/design/generate_hash_process.png) + ### 3.2 Transaction 交易所有字段的定义: -| 字段 | 类型 | 说明 | +| 字段 | 类型 | 说明 | | ---- | ---- | ---- | | data | TransactionData| optional,交易用于计算哈希的字段编码后的数据| | dataHash | vector |optional,交易哈希| @@ -98,7 +99,7 @@ hashWith字段(也称交易hash/交易唯一标识)的生成流程如下: 共识打包的proposal中仅包括交易元数据信息,交易元数据信息字段定义如下: -| 字段 | 类型 | 说明 | +| 字段 | 类型 | 说明 | | ---- | ---- | ---- | |hash |vector |optional,交易哈希| |to |string |optional,交易接收方地址| @@ -107,13 +108,13 @@ hashWith字段(也称交易hash/交易唯一标识)的生成流程如下: ## 4. 交易回执数据结构 -交易回执的tars定义可参考[这里](https://github.com/FISCO-BCOS/bcos-tars-protocol/blob/main/bcos-tars-protocol/tars/TransactionReceipt.tars),类似于区块头和交易,交易回执的数据协议字段也划分为用于计算哈希的字段和不参与哈希计算的字段两部分。 +交易回执的tars定义可参考[这里](https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/bcos-tars-protocol/bcos-tars-protocol/tars/TransactionReceipt.tars),类似于区块头和交易,交易回执的数据协议字段也划分为用于计算哈希的字段和不参与哈希计算的字段两部分。 ### 4.1 LogEntry -定义event log,具体如下: +定义event log,具体如下: -| 字段 | 类型 | 说明 | +| 字段 | 类型 | 说明 | | ---- | ---- | ---- | |address |string|事件对应的合约地址 | |topic|vector>|事件topic| @@ -123,7 +124,7 @@ hashWith字段(也称交易hash/交易唯一标识)的生成流程如下: 交易回执中用于计算哈希的字段: -| 字段 | 类型 | 说明 | +| 字段 | 类型 | 说明 | | ---- | ---- | ---- | |version|int|require,交易回执版本号| |gasUsed|string|require,回执对应的交易消耗的Gas| @@ -137,7 +138,7 @@ hashWith字段(也称交易hash/交易唯一标识)的生成流程如下: 交易回执的数据结构定义如下: -| 字段 | 类型 | 说明 | +| 字段 | 类型 | 说明 | | ---- | ---- | ---- | |data|TransactionReceiptData|交易回执中所有用于计算哈希的字段编码数据| |dataHash|vector|交易回执编码| @@ -146,6 +147,6 @@ hashWith字段(也称交易hash/交易唯一标识)的生成流程如下: 并且,用户可通过在控制台调用相关接口获取区块信息,校验数据一致性。 ### 4.4 原生交易 + FISCO BCOS实现了基于solidity合约与预编译版的smallBank合约。smallBank源于blockBench,被业界与学术界公认为区块链系统基础测试之一,FISCO BCOS将smallBank实现了账户间实现转账的交易定义为原生交易。 通过部署合约smallBank,最终与EVM中执行。smallBank也提供预编译合约方式,通过调用smallBank预编译合约地址即可实现。 - diff --git a/3.x/zh_CN/docs/design/rip.md b/3.x/zh_CN/docs/design/rip.md new file mode 100644 index 000000000..30e836512 --- /dev/null +++ b/3.x/zh_CN/docs/design/rip.md @@ -0,0 +1,6 @@ +# 13. 基于动态路由的网络转发策略 +标签: ``动态路由`` ``网络转发`` + +---- + +专利提交中,具体设计细节敬请期待。 diff --git a/3.x/zh_CN/docs/design/security_control/certificate_list.md b/3.x/zh_CN/docs/design/security_control/certificate_list.md new file mode 100644 index 000000000..ba928c193 --- /dev/null +++ b/3.x/zh_CN/docs/design/security_control/certificate_list.md @@ -0,0 +1,72 @@ +# CA黑白名单 + +标签:``安全控制`` ``网络安全`` ``黑白名单`` + +---- + +本文档对黑、白名单进行介绍性说明,实践方法参见[《CA黑白名单操作手册》](../../manual/certificate_list.md)。 + +## 名词解释 + +**CA黑名单** + +* 别称**证书拒绝列表**(certificate blacklist,简称CBL)。CA黑名单基于`config.ini`文件中`[certificate_blacklist]`配置的NodeID进行判断,拒绝此NodeID节点发起的连接。 + +**CA白名单** + +* 别称**证书接受列表**(certificate whitelist,简称CAL)。CA白名单基于`config.ini`文件中`[certificate_whitelist]`配置的NodeID进行判断,拒绝除白名单外所有节点发起的连接。 + +**CA黑、白名单所属的配置类型** + +- 基于**作用范围**(网络配置/账本配置)维度可划分为**网络配置**,影响整个网络的节点连接建立过程; +- 基于**是否可改**(可改配置/固定配置)维度可划分为**可改配置**,内容可改,重启后生效; +- 基于**存放位置**(本地存储/链上存储)维度可划分为**本地存储**,内容记录在本地,不存于链上。 + +## 模块架构 + +下图表示CA黑名单所涉及的模块及其关系。图例A->B表示B模块依赖A模块的数据,同时B模块晚于A模块初始化。白名单的架构与黑名单相同。 + +![](../../../images/node_management/architecture.png) + +
模块架构
+ +## 核心流程 + +底层实现SSL双向验证。节点在handshake过程中,通过对方提供的证书获取对方节点的nodeID,检查该nodeID与节点配置的黑、白名单是否有关系。如果根据黑、白名单的配置,拒绝该关闭的connection,继续后续流程。 + +**拒绝逻辑** + +* 黑名单:拒绝写在黑名单中的节点连接 +* 白名单:拒绝所有未配置在白名单中的节点连接。白名单为空表示不开启,接受任何连接。 + +**优先级** + +黑名单的优先级高于白名单。例如,白名单里配置了A,B,C,会拒绝掉D的连接,若黑名单里同时配了A,则A也会被拒绝连接。 + +## 影响范围 + +- CA黑、白名单对网络层的P2P节点连接及AMOP功能有显著影响,**使之失效**; +- 对账本层的共识和同步功能有潜在影响,**影响共识及同步消息/数据的转发**。 + +## 配置格式 + +**黑名单** + +节点`config.ini`配置中增加`[certificate_blacklist]`路径(`[certificate_blacklist]`在配置中可选)。CA黑名单内容为节点NodeID列表,crl.X为本节点拒绝连接的对方节点NodeID。CA黑名单的配置格式示例如下。 + +```ini +[certificate_blacklist] + crl.0=4d9752efbb1de1253d1d463a934d34230398e787b3112805728525ed5b9d2ba29e4ad92c6fcde5156ede8baa5aca372a209f94dc8f283c8a4fa63e3787c338a4 + crl.1=af57c506be9ae60df8a4a16823fa948a68550a9b6a5624df44afcd3f75ce3afc6bb1416bcb7018e1a22c5ecbd016a80ffa57b4a73adc1aeaff4508666c9b633a + +``` + +**白名单** + +节点`config.ini`配置中增加`[certificate_whitelist]`路径(`[certificate_whitelist]`在配置中可选)。CA白名单内容为节点NodeID列表,cal.X为本节点可接受连接的对方节点NodeID。CA白名单的配置格式示例如下。 + +``` ini +[certificate_whitelist] + cal.0=4d9752efbb1de1253d1d463a934d34230398e787b3112805728525ed5b9d2ba29e4ad92c6fcde5156ede8baa5aca372a209f94dc8f283c8a4fa63e3787c338a4 + cal.1=af57c506be9ae60df8a4a16823fa948a68550a9b6a5624df44afcd3f75ce3afc6bb1416bcb7018e1a22c5ecbd016a80ffa57b4a73adc1aeaff4508666c9b633a +``` diff --git a/3.x/zh_CN/docs/design/security_control/committee_design.md b/3.x/zh_CN/docs/design/security_control/committee_design.md new file mode 100644 index 000000000..90495d539 --- /dev/null +++ b/3.x/zh_CN/docs/design/security_control/committee_design.md @@ -0,0 +1,176 @@ +# 权限治理体系设计 + +标签:``合约权限`` ``部署权限`` ``权限控制`` ``权限设计`` + +---- + +FISCO BCOS 3.x 引入了合约粒度的权限治理体系。治理委员会可通过投票的方式管理合约的部署、合约的接口调用权限。 + +详细权限治理使用文档请参考链接:[权限治理使用指南](../develop/committee_usage.md) + +## 整体设计 + +在FISCO BCOS3.0框架中,治理体系由系统合约实现,系统合约提供了相对灵活且通用的功能模块,在满足几乎所有场景的诉求的同时,确保可插拔。 + +### 1. 角色划分 + +在FISCO BCOS3.0中,链上角色按照不同的权责可划分为三类:治理角色、合约管理员角色和用户角色,三种角色依次进行管理和被管理。 + +**治理角色**:对链上治理规则、治理委员会进行治理,属于链的顶层管理者。包括:治理规则设置、治理委员会选举、账户冻结、解冻等。同时治理角色可对下层合约管理员角色进行管控。 + +**合约管理员角色**:合约管理员角色对合约接口的访问权限进行管理。对于链上参与者,合约管理员未设置合约部署权限的时候,任何用户都可以部署合约。合约部署账户在部署合约时可指定合约管理员账户,如果未指定则合约管理员默认为合约部署者。需要指出的是一旦治理委员会发现合约管理员未履行合约管理员职责,那么则可以通过治理委员会投票的方式重置合约合约管理员。 + +**用户角色**:用户角色为参与业务的角色,任何账户(包括治理角色和合约管理员角色)都属于用户角色。用户角色能否能参与相关业务(发交易)依赖于合约管理员是否设置相关权限。如果合约管理员未对合约接口设置权限类型(黑名单或白名单模式),则任何人都可以调用合约接口。如果设置了白名单,只有在命中白名单时才能访问,如果为黑名单模式,如果命中,则无法访问对应接口。 + +### 2. 治理规则管理 + +- 治理角色通过治理模块完成治理委员会选举,并设置治理规则,如每个治理委员会成员的投票权重,治理决策过程中的投票率和参与率。同时设置合约部署权限; + +- 合约管理员角色部署业务合约,并对业务合约相关接口进行权限设置; + +- 用户角色通过调用合约接口完成业务操作。 + +## 详细设计 + +### 1. 治理模块 + +治理模块提供治理功能,由治理委员会根据决策规则通过多方投票方式完成。治理合约数据结构如下: + +```solidity +// governors 地址列表 +LibAddressSet.AddressSet private _governorSet; +// 权重映射表 +mapping(address => uint32) private _weightMapping; +// 参与阈值,单位为百分比 +uint8 public _participatesRate; +// 提案通过阈值,单位为百分比 +uint8 public _winRate; +``` + +#### 治理提案类型 + +治理委员的提案类型主要包括以下类型: + +- 元治理类:添加、删除成员、修改治理成员权重、修改投票的阈值、设置部署权限、提案投票和撤回。 + +- 权限类:重置合约代理人。 + +#### 治理委员决策规划 + +决策规则根据治理者投票权重、投票率和参与率三个维度的数据进行决策。当治理委员会只有一个治理者时,退化为管理员模式,所有提案都会通过。如果治理委员有多名是,就会以下面的规则进行判断。当治理者发生变化,所有未完成决策的提案均按照新的治理者参数进行决策。 + +首先,对于参与率阈值,取值范围为1-100。当参与率阈值设置为0是,即参与率阈值规则失效。当参与率阈值调整后,所有未完成决策的提案均按照新的参与率阈值决策。参与率阈值决策可按照如下公式计算,如果不满足则代表提案的状态为`noEnoughVotes`。 + +**总投票权重 / 总权重 >= 参与阈值** + +其次,对于权重通过率阈值,取值范围为0-100。当权重通过率阈值设置为0时,即权重通过率阈值规则失效。当权重通过率阈值调整后,所有未完成决策的提案均按照新的权重通过率阈值决策。权重通过率阈值决策可按照如下公式计算。如果成立则代表提案已经通过,如果不成立则代表提案失败。 + +**总同意权重票 / 总投票权重 >= 权重通过率阈值** + +#### 治理运作流程 + +- 初始阶段 + +为了简化初始化操作,提升用户体验,在搭建链的时候 ,只需要在配置中配置一个账户作为治理委员会的初始成员。如果未指定,系统会自动随机生成一个私钥,作为治理委员会成员,治理者权重为1,投票率阈值及参与率阈值均为0,即初始化后治理委员会为管理员模式。 + +- 运营阶段 + +在运营阶段,治理委员会针对元治理类、权限类进行操作。所有的操作可分为提案、投票、决策通过自动执行的阶段。 + +### 2. 权限模块 + +#### 权限管理 + +权限包括创建权限、合约访问管理权限和表访问管理权限三种。 + +- 创建合约权限:部署合约的权限,由治理委员会进行管理。 +- 合约访问管理权限:对合约接口的访问权限,由合约合约管理员进行管理。 + +所谓合约管理员模式,即在部署合约时候,指定一个账户作为该合约的管理员,对相关接口的访问权限进行管理。对于合约或者表的访问,之所以采用合约管理员这种管理员模式,而未采用治理委员会模式进行权限管理,主要原因是考虑用户体验和决策效率。同时合约管理员可以由治理委员会修改,确保了合约权限管理的安全性。 + +#### 权限策略 + + 考虑到权限管理操作的效率,权限模块提供两种权限管理策略:白名单模式和黑名单模式。 + +- 白名单模式:当账户处于接口白名单中时,该账户可以访问当前接口; +- 黑名单模式:当账户处于接口黑名单中时,该账户无法访问当前接口; + +#### 运作流程 + +合约权限运作流程如下。 + +1. 部署策略设置:治理委员会决策设置群组的部署策略,选择是黑名单还是白名单。 +2. 访问策略设置:合约管理员有权设置合约访问接口的权限ACL策略,选择黑名单或白名单模式。合约管理员直接调用权限合约的setMethodAuthType(address contractAddr, bytes4 func, uint8 acl)来设置ACL的类型。 +3. 添加访问规则。合约管理员可选择添加访问的规则。则所有的规则被保存在mapping\[methodId]\[account][bool]中 + +### 3. 合约设计 + +权限治理合约地址可参考: https://github.com/FISCO-BCOS/bcos-auth + +主要合约包括: + +- CommitteeManager:权限治理的唯一入口,管理提案和治理委员会,治理委员可调用合约对应的接口发起治理提案。在底层节点有唯一地址 0x10001 +- ProposalManager:提案管理合约,由CommitteeManager管理,用于存储提案 +- Committee:治理委员合约,由CommitteeManager管理,记录治理委员会信息 +- ContractAuthPrecompiled:底层节点提供的权限信息读写接口,写接口具有权限控制,在底层节点有唯一地址0x1005 + +权限治理执行步骤如下: + +1. 治理委员A发起修改系统配置的提案,调用CommitteeManager接口 +2. CommitteeManager从已有的Committee中获取治理委员的相关信息 +3. CommitteeManager调用ProposalManager,创建提案并push进提案列表 +4. 治理委员B调用CommitteeManager接口,对该提案进行投票 +5. CommitteeManager调用ProposalManager,对该提案进行投票,并写入投票列表 +6. ProposalManager,收集该提案的投票结果,并调用Committee接口,确认是否达到提案阈值 +7. Committee返回确认结果 +8. CommitteeManager确认提案的状态,达到可执行状态后,发起对`SystemConfigPrecompiled`或 `ConsensusPrecompiled`的调用 +9. 系统预编译合约会先确认调用的sender是否以/sys/开头,确认则执行。(CommitteeManager是内置在链上的合约,具有固定地址/sys/10001) + +![](../../images/design/committee_contract.png) + +### 4. 底层节点设计 + +![权限底层设计](../../images/design/committee_adapt_chain.png) + +在每一次部署合约时,都将会在同目录创建以合约名+“_accessAuth”的存储表,用于存储接口到用户的黑白名单数据。 + +底层可通过表名直接访问存储,得到权限信息。为了solidity、liquid可以访问目录合约所对应的权限表,开放/sys/contractAuth系统合约,可通过访问/sys/contractAuth的方法,访问合约对应的权限存储表,判断权限。 + +#### 具体实现 + +1. 创建合约时创建权限表:在executive执行创建时,额外创建权限表即可。 +2. 提供权限表的读写操作接口:提供/sys/contractAuth系统合约,专门作为访问权限表的系统合约。solidity使用0x1005地址。 +3. 系统合约ContractAuth接口 + +```solidity +function getAdmin(address contractAddr) public view returns (address) {} + +function resetAdmin(address contractAddr, address admin) + public returns (int256); + +function setMethodAuthType( + address contractAddr, bytes4 func, uint8 authType) + public returns (int256); + +function openMethodAuth( + address contractAddr, bytes4 func, address account) + public returns (int256); + +function closeMethodAuth( + address contractAddr, bytes4 func, address account) + public returns (int256); + +function checkMethodAuth( + address contractAddr, bytes4 func, address account) + public view returns (bool); + +function deployType() public view returns (uint256); + +function setDeployAuthType(uint8 _type) public returns (int256); + +function openDeployAuth(address account) public returns (int256); + +function closeDeployAuth(address account) public returns (int256); + +function hasDeployAuth(address account) public view returns (bool); +``` diff --git a/3.x/zh_CN/docs/design/security_control/index.rst b/3.x/zh_CN/docs/design/security_control/index.rst new file mode 100644 index 000000000..5f094520a --- /dev/null +++ b/3.x/zh_CN/docs/design/security_control/index.rst @@ -0,0 +1,36 @@ +############################################################## +14. 安全控制 +############################################################## + +标签:``安全控制`` ``网络安全`` ``存储安全`` ``黑白名单`` ``权限控制`` + +---- + +为了保障节点间通信安全性,以及对节点数据访问的安全性,FISCO BCOS引入了节点准入机制、CA黑名单和权限控制三种机制,在网络和存储层面上做了严格的安全控制。 + + +**网络层面安全控制** + +- 节点使用 **SSL连接** ,保障了通信数据的机密性 + +- 引入 **网络准入机制** ,可将指定群组的作恶节点从共识节点列表或群组中删除,保障了系统安全性 + +- 通过 **群组白名单机制** ,保证每个群组仅可接收相应群组的消息,保证群组间通信数据的隔离性 + +- 引入 **CA黑名单机制** ,可及时与作恶节点断开网络连接 + +- 提出 **权限治理体系** 机制,灵活、细粒度地控制外部账户部署合约和创建、插入、删除和更新用户表的权限。 + + +**存储层面安全控制** + +基于分布式存储,提出分布式存储权限控制的机制,以灵活、细粒度的方式进行有效的权限控制,设计并实现了权限控制机制限制外部账户(tx.origin)对存储的访问,权限控制范围包括合约部署、表的创建、表的写操作。 + + +.. toctree:: + :maxdepth: 1 + + node_management.md + certificate_list.md + permission_control.md + committee_design.md diff --git a/3.x/zh_CN/docs/design/security_control/node_management.md b/3.x/zh_CN/docs/design/security_control/node_management.md new file mode 100644 index 000000000..72d9dbb60 --- /dev/null +++ b/3.x/zh_CN/docs/design/security_control/node_management.md @@ -0,0 +1,240 @@ +# 节点准入管理 + +标签:``安全控制`` ``访问控制`` ``节点准入`` + +---- + +本文档对节点准入管理进行介绍性说明,实践方法参见[《节点准入管理操作文档》](../../manual/node_management.md)。 + +## 概述 + +### 单链多账本 + +区块链技术是一种去中心化、公开透明的分布式数据存储技术,能够降低信任成本,实现安全可靠的数据交互。然而区块链的交易数据面临着隐私泄露威胁: + +- 对于公有链,一节点可任意加入网络,从全局账本中获得所有数据; +- 对于联盟链,虽有网络准入机制,但节点加入区块链后即可获取全局账本的数据。 + +作为联盟链的FISCO BCOS,对链上隐私这一问题,提出了**单链多账本**的解决方案。FISCO BCOS通过引入**群组**概念,使联盟链从原有一链一账本的存储/执行机制扩展为一链多账本的存储/执行机制,基于群组维度实现同一条链上的数据隔离和保密。 + +![](../../../images/node_management/multi_ledger.png) +
多账本
+ +如上图所示,节点ABC加入蓝色群组,并共同维护蓝色账本; 节点B和C加入粉色群组并维护粉红色账本; 节点A和B加入黄色群组并维护黄色账本。三个群组间共享公共的网络服务,但各群组有各自独立的账本存储及交易执行环境。客户端将交易发到节点所属的某个群组上,该群组内部对交易及数据进行共识并存储,其他群组对该交易无感知不可见。 + +### 节点准入机制 + +基于群组概念的引入,节点准入管理可分为**网络准入机制**和**群组准入机制**。准入机制的规则记录在配置中,节点启动后将读取配置信息实现网络及群组的准入判断。 + +## 名词解释 + +### 节点类型 + +本文档所讨论的节点为已完成网络准入可进行P2P通信的节点。**网络准入过程涉及P2P节点连接列表添加和证书验证。** + +- **群组节点**:完成网络准入并加入群组的节点。群组节点只能是共识节点和观察节点两者之一。其中共识节点参与共识出块和交易/区块同步,观察节点只参与区块同步。**群组节点准入过程涉及动态增删节点的交易发送。** + +- **游离节点**:完成网络准入但没有加入群组的节点。**游离节点尚未通过群组准入,不参与共识和同步。** + +节点关系如下: + +![](../../../images/node_management/node_relationship.png) +
节点关系
+ +### 配置类型 + + + + + + + + + + + + + + + + + + + + + + + + + +
划分维度配置类型
说明
影响范围网络配置全局性质的配置,节点的配置影响该节点所在的整个网络,节点对整个网络使用同一份配置,
文件名为config.*
群组配置节点的配置影响该节点所在的单个群组,每个群组各有一份配置,
文件名为group.X.*,其中X为群组号
是否可改固定配置只使用首次配置内容,后续对配置的修改无效,
文件后缀为.genesis
可改配置配置后续可改动,节点重启生效,
文件后缀为.ini
存放位置本地存储配置存放在本地文件,用户可直接修改,
用户修改自身文件能重启生效的配置项
链上存储配置存放在区块链上,对其修改需群组共识,目前没有需全网共识的内容,
需新链重置或通过交易修改生效的配置项
+ +### 节点准入配置项 + +涉及节点转入管理相关的配置项有:**P2P节点连接列表**,**节点证书**,**CA黑名单**,**群组节点初始列表**和**群组节点系统表**。 + + + + + + + + + + + + + + + + + + + + + + + + +
配置项
作用
影响范围
是否可改
存放位置
P2P节点连接列表记录本节点期望与哪些节点建立网络通信网络配置可改配置本地存储
节点证书证明自己是由可信第三方许可的节点网络配置可改配置本地存储
CA黑名单记录本节点禁止与哪些节点建立网络通信网络配置可改配置本地存储
群组节点初始列表记录创世块阶段参与共识/同步的节点列表群组配置固定配置本地存储
群组节点系统表记录当前参与一群组共识/同步的节点列表群组配置可改配置链上存储
+ +## 模块架构 + +![](../../../images/node_management/architecture.png) +
模块架构
+ +**配置项及系统模块关系图**如上,箭头方向A->B表示B模块依赖A模块的数据,同时B模块晚于A模块初始化。 + +## 核心流程 + +### 一般初始化流程 + +![](../../../images/node_management/initialization.png) +
一般初始化流程
+ +### 首次初始化流程 + +节点在首次启动时,对其所属的各个群组,以群组为单位将固定配置文件的内容写入第0块并直接提交上链。初始化的具体逻辑为: + +![](../../../images/node_management/first_initialization.png) +
首次初始化流程
+ +这一阶段需写入的与节点准入管理相关的配置内容有:**群组节点初始列表->群组节点系统表**。 + +说明: + +- 同一账本的所有节点的第0块需一致,即**固定配置文件**均一致; +- 节点后续的每次启动均检查第0块信息是否与固定配置文件一致。如果固定配置文件被修改,节点再次启动将输出告警信息,但不会影响群组正常运作。 + +### 基于CA黑名单的节点建连流程 + +**SSL认证用于确定节点之间是否许可加入某条链**。一条链上的节点均信任可信的第三方(节点证书的颁发者)。 + +FISCO BCOS要求实现**SSL双向认证**。节点在handshake过程中,从对方节点提供的证书中获取对方节点的nodeID,检查该nodeID是否在自身的CA黑名单。如存在,关闭该connection,如不在,建立session。 + +CA黑名单机制也支持**SSL单向认证**的场景,作用时机是:节点在session建立后,可从session中获取对方节点的nodeID进行判断,如果nodeID在自身的CA黑名单中,将已建立的session断连。 + +### 节点相关类型及其转换操作 + +三种节点类型(共识节点+观察节点+游离节点)可通过相关接口进行如下转换: + +![](../../../images/node_management/type_and_conversion_of_nodes.png) +
共识节点相关类型及其转换操作
+ +## 接口及配置描述 + +### 节点配置文件层级 + +![](../../../images/node_management/config_file_organization.png) +
配置文件的层级关系
+ +配置文件的组织规则为:**各群组的配置独立**、**固定配置和可改配置相独立**。目前使用的文件有**网络可改配置文件**`config.ini`、**群组固定配置文件**`group.N.genesis`和**群组可改配置文件**`group.N.ini`,其中`N`为节点所在的群组号。对于**网络/群组可改配置文件**,如果文件中没有显式定义某配置项的值,程序将使用该配置项的默认值。 + +### 配置文件示例 + +对于**网络可改配置文件**`config.ini`,节点准入管理涉及**P2P节点连接列表`[p2p]`**、**节点证书`[network_security]`**、**CA黑名单`[certificate_blacklist]`**。`[certificate_blacklist]`可缺少。配置项举例如下: + +```eval_rst +.. note:: + 为便于开发和体验,p2p模块默认监听IP是 `0.0.0.0` ,出于安全考虑,请根据实际业务网络情况,修改为安全的监听地址,如:内网IP或特定的外网IP +``` + +``` +[p2p] + ;p2p listen ip + listen_ip=0.0.0.0 + ;p2p listen port + listen_port=30300 + ; ssl or sm ssl + sm_ssl=false + nodes_path=./ + nodes_file=nodes.json + +;certificate blacklist +[certificate_blacklist] + ;crl.0 should be nodeid, nodeid's length is 128 + ;crl.0= + +;certificate configuration +[network_security] + ;directory the certificates located in + data_path=conf/ + ;the node private key file + key=node.key + ;the node certificate file + cert=node.crt + ;the ca certificate file + ca_cert=ca.crt +``` +对于**群组固定配置文件**`group.N.genesis`,节点准入管理涉及**群组节点初始列表[consensus]**。配置项举例如下: +``` +;consensus configuration +[consensus] + ;consensus algorithm type, now support PBFT(consensus_type=pbft) and Raft(consensus_type=raft) + consensus_type=pbft + ;the max number of transactions of a block + block_tx_count_limit=1000 + ;the node id of consensusers + node.0=79d3d4d78a747b1b9e59a3eb248281ee286d49614e3ca5b2ce3697be2da72cfa82dcd314c0f04e1f590da8db0b97de466bd08e27eaa13f85df9b60e54d6a1ec8 + node.1=da527a4b2aeae1d354102c6c3ffdfb54922a092cc9acbdd555858ef89032d7be1be499b6cf9a703e546462529ed9ea26f5dd847110ff3887137541bc651f1c32 + node.2=160ba08898e1e25b31e24c2c4e3c75eed996ec56bda96043aa8f27723889ab774b60e969d9bd25d70ea8bb8779b7070521d9bd775dc7636f4b2b800d2fc8c7dd + node.3=a968f1e148e4b51926c5354e424acf932d61f67419cf7c5c00c7cb926057c323bee839d27fe9ad6c75386df52ae2b30b2e7ba152b0023979d25dee25b20c627f +``` + +### 群组节点系统表定义 + + + + + + + + + + + + + + +
Field
Type
Null
Key
Expain
namestringNoPRI各行同一值,分布式存储基于此key实现全表查询
typestringNo节点类型(sealer/observer)
node_idstringNo节点NodeID
enable_numstringNo该节点类型生效的区块高度
_status_stringNo分布式存储通用字段,“0”可用“1”删除
+ +### 群组系统表接口定义 + +**群组系统表实现群组层的白名单机制(对比CA黑名单实现网络的黑名单机制)**。群组系统表提供的接口有: + +```sol +contract ConsensusSystemTable +{ + // 修改一节点为共识节点 + function addSealer(string nodeID) public returns(int256); + // 修改一节点为观察节点 + function addObserver(string nodeID) public returns(int256); + // 把该节点从群组系统表中移除 + function remove(string nodeID) public returns(int256); +} +``` + +## 功能展望 + +- **可改配置**目前为修改后重启生效,后续可实现动态加载,修改实时生效; +- **CA黑名单**目前实现了基于节点的黑名单,后续可考虑基于机构的黑名单。 diff --git a/3.x/zh_CN/docs/design/security_control/permission_control.md b/3.x/zh_CN/docs/design/security_control/permission_control.md new file mode 100644 index 000000000..9e30a03f1 --- /dev/null +++ b/3.x/zh_CN/docs/design/security_control/permission_control.md @@ -0,0 +1,137 @@ +# 区块链权限控制 + +标签:``安全控制`` ``访问控制`` ``权限控制`` + +---- +## 权限控制介绍 + +与可自由加入退出、自由交易、自由检索的公有链相比,联盟链有准入许可、交易多样化、基于商业上隐私及安全考虑、高稳定性等要求。因此,联盟链在实践过程中需强调“权限”及“控制”的理念。 + +为体现“权限”及“控制”理念,FISCO BCOS平台基于分布式存储,提出分布式存储权限控制的机制,可以灵活,细粒度的方式进行有效的权限控制,为联盟链的治理提供重要的技术手段。分布式权限控制基于外部账户(tx.origin)的访问机制,对包括合约部署,表的创建,表的写操作(插入、更新和删除)进行权限控制,表的读操作不受权限控制。 在实际操作中,每个账户使用独立且唯一的公私钥对,发起交易时使用其私钥进行签名,接收方可通过公钥验签知道交易具体是由哪个账户发出,实现交易的可控及后续监管的追溯。 + +## 权限控制规则 +权限控制规则如下: +1. 权限控制的最小粒度为表,基于外部账户进行控制。 +2. 使用白名单机制,未配置权限的表,默认完全放开,即所有外部账户均有读写权限。 +3. 权限设置利用权限表(\_sys_table_access_)。权限表中设置表名和外部账户地址,则表明该账户对该表有读写权限,设置之外的账户对该表仅有读权限。 + +## 权限控制分类 + +分布式存储权限控制分为对用户表和系统表的权限控制。用户表指用户合约所创建的表,用户表均可以设置权限。系统表指FISCO BCOS区块链网络内置的表,系统表的设计详见[存储文档](../storage/storage.md)。系统表的权限控制如下所示: + +|表名 |表存储数据说明 |权限控制意义 | +|:---------------|:-------------|:-----------| +|`_sys_tables_` |存储所有表的结构 |控制部署合约和创建表 | +|`_sys_table_access_`|存储权限控制信息 |控制权限功能设置 | +|`_sys_consensus_` |存储共识节点和观察节点的列表 |控制节点类型设置 | +|`_sys_cns_` |存储cns列表 |控制使用CNS | +|`_sys_config_` |存储系统配置的列表 |控制系统配置设置 | + + +针对用户表和每个系统表,SDK分别实现三个接口进行权限相关操作: +- 用户表: + - **public String grantUserTableManager(String tableName, String address):** 根据用户表名和外部账户地址设置权限信息。 + - **public String revokeUserTableManager(String tableName, String address):** 根据用户表名和外部账户地址去除权限信息。 + - **public List\ listUserTableManager(String tableName):** 根据用户表名查询设置的权限记录列表(每条记录包含外部账户地址和生效块高)。 +- _sys_tables_表: + - **public String grantDeployAndCreateManager(String address):** 增加外部账户地址的部署合约和创建用户表权限。 + - **public String revokeDeployAndCreateManager(String address):** 移除外部账户地址的部署合约和创建用户表权限。 + - **public List\ listDeployAndCreateManager():** 查询拥有部署合约和创建用户表权限的权限记录列表。 +- _sys_table_access_表: + - **public String grantPermissionManager(String address):** 增加外部账户地址的管理权限的权限。 + - **public String revokePermissionManager(String address):** 移除外部账户地址的管理权限的权限。 + - **public List\ listPermissionManager():** 查询拥有管理权限的权限记录列表。 +- _sys_consensus_表: + - **public String grantNodeManager(String address):** 增加外部账户地址的节点管理权限。 + - **public String revokeNodeManager(String address):** 移除外部账户地址的节点管理权限。 + - **public List\ listNodeManager():** 查询拥有节点管理的权限记录列表。 +- _sys_cns_表: + - **public String grantCNSManager(String address):** 增加外部账户地址的使用CNS权限。 + - **public String revokeCNSManager(String address):** 移除外部账户地址的使用CNS权限。 + - **public List\ listCNSManager():** 查询拥有使用CNS的权限记录列表。 +- _sys_config_表: + - **public String grantSysConfigManager(String address):** 增加外部账户地址的系统参数管理权限。 + - **public String revokeSysConfigManager(String address):** 移除外部账户地址的系统参数管理权限。 + - **public List\ listSysConfigManager():** 查询拥有系统参数管理的权限记录列表。 + +设置和移除权限接口返回json字符串,包含code和msg字段,当无权限操作时,其code定义-50000,msg定义为“permission denied”。当成功设置权限时,其code为0,msg为“success”。 + +## 数据定义 +权限信息以系统表的方式进行存储,权限表表名为_sys_table_access_,其字段信息定义如下: + +```eval_rst + ++-----------+-------+--------+-----+---------------------------------------------+ +|字段 |类型 |是否为空|主键 |描述 | ++===========+=======+========+=====+=============================================+ +|table_name |string |No |PRI | 表名称 | ++-----------+-------+--------+-----+---------------------------------------------+ +|address |string |No | | 外部账户地址 | ++-----------+-------+--------+-----+---------------------------------------------+ +|enable_num |string |No | | 权限设置生效区块高度 | ++-----------+-------+--------+-----+---------------------------------------------+ +|_status_ |string |No | | 分布式存储通用字段,“0”表示可用,“1”表示移除| ++-----------+-------+--------+-----+---------------------------------------------+ + +``` +其中,对权限表的插入或更新,当前区块不生效,在当前区块的下一区块生效。状态字段为“0”时,表示权限记录处于正常生效状态,为“1”时表示已删除,即表示权限记录处于失效状态。 + +## 权限控制设计 + +#### 权限控制功能设计 +根据交易信息确定外部账户,待操作的表以及操作方式。待操作的表为用户表或系统表。系统表用于控制区块链的系统功能,用户表用于控制区块链的业务功能,如下图所示。外部账户通过查询权限表获取权限相关信息,确定权限后再操作相关的用户表和权限表,从而可以控制相关的系统功能和业务功能。 + +```eval_rst +.. mermaid:: + + sequenceDiagram + participant 外部账户 + participant 权限表 + participant 系统表 + participant 用户表 + + 外部账户->>权限表: 查询 + 权限表->>系统表: 控制 + 权限表->>用户表: 控制 + 系统表->>区块链的系统功能: 控制 + 用户表->>区块链的业务功能: 控制 + +``` + +#### 权限控制流程设计 +权限控制的流程如下:首先由客户端发起交易请求,节点获取交易数据,从而确定外部账户和待操作的表以及操作表的方式。如果判断操作方式为写操作,则检查该外部账户针对操作的表的权限信息(权限信息从权限表中查询获取)。若检查有权限,则执行写操作,交易正常执行;若检查无权限,则拒绝写操作,返回无权限信息。如果判断操作方式为读操作,则不检查权限信息,正常执行读操作,返回查询数据。流程图如下。 + +```eval_rst +.. mermaid:: + + graph TB + classDef blue fill:#4C84FF,stroke:#4C84FF,stroke-width:4px, font:#1D263F, text-align:center; + + classDef yellow fill:#FFEEB8,stroke:#FFEEB8,stroke-width:4px, font:#1D263F, text-align:center; + + classDef light fill:#EBF5FF,stroke:#1D263F,stroke-width:2px, font:#1D263F, text-align:center; + + subgraph 权限控制流程 + A((开始))-->B + B(客户端发起交易请求)-->C + C(确定待操作的表和操作方式)-->D + D(操作方式是否为写操作)-->|否|E + E(获取查询结果) + D-->|是|F + F(是否有权限记录缓存)-->|否|G + F-->H + G(查询权限表)-->H + H(是否有权限)-->|否|I + H(是否有权限)-->|是|J + I(拒绝写操作) + J(执行写操作) + + class A,B,C,D,E,F,G,H,I,J light + end +``` + +## 权限控制工具 + +FISCO BCOS的分布式存储权限控制有如下使用方式: +- 针对普通用户,通过控制台命令使用权限功能,具体参考[权限治理使用指南](../../develop/committee_usage.md)。 +- 针对开发者,SDK根据权限控制的用户表和每个系统表均实现了三个接口,分别是授权,撤销和查询权限接口。 diff --git a/3.x/zh_CN/docs/design/storage/archive.md b/3.x/zh_CN/docs/design/storage/archive.md index f30be761d..a62c7f7e5 100644 --- a/3.x/zh_CN/docs/design/storage/archive.md +++ b/3.x/zh_CN/docs/design/storage/archive.md @@ -1,4 +1,4 @@ -# 数据归档设计 +# 11. 数据归档设计 标签:``数据归档`` ``数据裁剪`` diff --git a/3.x/zh_CN/docs/design/storage/storage.md b/3.x/zh_CN/docs/design/storage/storage.md index 3fcfcb60f..9ca8f2154 100644 --- a/3.x/zh_CN/docs/design/storage/storage.md +++ b/3.x/zh_CN/docs/design/storage/storage.md @@ -1,4 +1,4 @@ -# 基于事务的存储模块 +# 6. 存储设计 标签:``存储`` ``storage`` ``事务`` @@ -8,7 +8,7 @@ 存储层需要能够满足Air、Pro和Max三个版本的不同设计目标,为此我们使用同一套接口来屏蔽不同版本存储的具体实现。对于Air和Pro版本,存储层使用RocksDB来满足其轻便和高性能的需求,对于Max版本通过接入能够支持水平扩展的分布式数据库支撑大规模数据存储的需求,我们选择了Tikv,通过Raft协议保证了多副本数据一致性以及高可用。整体存储服务设计如下图所示。 -![](../../images/design/storage_design.png) +![](../../../images/design/storage_design.png) Air、Pro和Max版本的区别在于其使用的`Storage SDK`内部的具体实现是不同的,对于Air和Pro版本,在初始化时会创建基于RocksDB封装的实现,而对于Max版本则提供基于TiKV封装的实现,同时保留定制存储的能力,用户可以基于具体的业务需求接入其他数据库。 @@ -75,7 +75,7 @@ class TransactionalStorageInterface : public virtual StorageInterface Air与Pro版本的提交与Max的区别在于一方面存储服务使用RocksDB作为后端数据库,另一方面执行服务与调度服务在同一进程中,不存在分布式事务的问题,相对于Max版本其提交逻辑较为简单,如下图所示。 -![air](../../images/design/storage_design_air.png) +![air](../../../images/design/storage_design_air.png) 对于调度服务和执行服务其处理逻辑与Max版本相同,只是在提交阶段,调度服务和执行服务提交数据时,其持有的存储对象为同一个,当调用`asyncPrepare`时,存储内部实现中会并不会真的将数据提交到RocksDB,而是将数据写入内存中,当调度服务调用`asyncCommit`方法时,将数据一次性提交写入RocksDB。 diff --git a/3.x/zh_CN/docs/design/storage/storage_security.md b/3.x/zh_CN/docs/design/storage/storage_security.md index 3f6513f7d..e78802bae 100644 --- a/3.x/zh_CN/docs/design/storage/storage_security.md +++ b/3.x/zh_CN/docs/design/storage/storage_security.md @@ -1,4 +1,4 @@ -# 数据落盘加密 +# 10. 数据落盘加密 标签:``落盘加密`` ``数据加密`` ``数据安全`` @@ -16,7 +16,7 @@ 对于链上通信数据的访问控制,FISCO BCOS是通过节点证书和SSL来完成。此处主要介绍的是节点存储数据的访问控制,即落盘加密。 -![](../../images/design/data_secure_background.png) +![](../../../images/design/data_secure_background.png) ## 主要思想 @@ -25,9 +25,7 @@ ## 方案架构 -![](../../images/design/diskencryption_framework.png) - - +![](../../../images/design/diskencryption_framework.png) 落盘加密是在机构内部进行的,每个机构独立管理自己硬盘数据的安全。内网中,每个节点的硬盘数据是被加密的。所有加密数据的访问权限,通过Key Manager来管理。Key Manager是部署在机构内网内,专门管理节点硬盘数据访问秘钥的服务,外网无法访问。当内网的节点启动时,从Key Manager处获取加密数据的访问秘钥,来对自身的加密数据进行访问。 @@ -55,8 +53,7 @@ - 当节点启动时,发来cipherDataKey,Key Manager用superKey对cipherDataKey进行解密,若解密成功,就将节点的dataK返回给节点。 - Key Manager只能在内网访问,机构内的外网无法访问Key Manager. - -![](../../images/design/diskencryption.png) +![](../../../images/design/diskencryption.png) ## 方案流程 @@ -97,8 +94,8 @@ 具体落盘加密的使用,可参考: -- [部署Air版落盘加密](../tutorial/air/storage_security.md) +- [部署Air版落盘加密](../../tutorial/air/storage_security.md) ## 存储安全性 -Air与Pro版本存储系统采用了后端数据库RocksDB,它是一个高性能的Key-Value数据库。设计了完善的持久化机制,同时保证性能和安全性,能够良好的支持范围查询。而针对Max版本采用了TiKv数据库。两者都有具备高可靠性,能应对节点断电、重启、网络波动等异常场景,在异常场景恢复后数据能正常读写。 +Air与Pro版本存储系统采用了后端数据库RocksDB,它是一个高性能的Key-Value数据库。设计了完善的持久化机制,同时保证性能和安全性,能够良好的支持范围查询。而针对Max版本采用了TiKV数据库。两者都有具备高可靠性,能应对节点断电、重启、网络波动等异常场景,在异常场景恢复后数据能正常读写。 diff --git a/3.x/zh_CN/docs/design/sync.md b/3.x/zh_CN/docs/design/sync.md index 22cadc9c6..ea09a9be5 100644 --- a/3.x/zh_CN/docs/design/sync.md +++ b/3.x/zh_CN/docs/design/sync.md @@ -1,4 +1,4 @@ -# 同步模块 +# 5. 同步模块 标签:``区块同步`` ``交易同步`` @@ -6,23 +6,17 @@ 同步,是区块链节点非常重要的功能。它是共识的辅助,给共识提供必需的运行条件。同步分为交易的同步和状态的同步。交易的同步,确保了每笔交易能正确的到达每个节点上。状态的同步,能确保区块落后的节点能正确的回到最新的状态。只有持有最新区块状态的节点,才能参与到共识中去。 -## 交易同步 +## 交易广播 交易同步,是让区块链的上的交易尽可能的到达所有的节点。为共识中将交易打包成区块提供基础。 -![](../../../../2.x/images/sync/tx.png) - -一笔交易(tx1),从客户端上发往某个节点,节点在接收到交易后,会将交易放入自身的交易池(TxPool)中供共识去打包。与此同时,节点会将交易广播给其它的节点,其它节点收到交易后,也会将交易放到自身的交易池中。交易在发送的过程中,会有丢失的情况,为了能让交易尽可能的到达所有的节点,收到广播过来交易的节点,会根据一定的策略,选择其它的节点,再进行一次广播。 - -**交易广播策略** - -如果每个节点都没有限制的转发/广播收到的交易,带宽将被占满,出现交易广播雪崩的问题。为了避免交易广播的雪崩,FISCO BCOS根据经验,选择了较为精巧的交易广播策略。在尽可能保证交易可达性的前提下,尽量的减少重复的交易广播。 +一笔交易(tx1),从客户端上发往某个节点,节点在接收到交易后,会将交易放入自身的交易池(TxPool)中供共识去打包。与此同时,节点会将交易广播给其它的节点,其它节点收到交易后,也会将交易放到自身的交易池中。 * 对于SDK来的交易,广播给所有的节点 -* 对于其它节点广播来的交易,随机选择25%的节点再次广播 +* 对于其它节点广播来的交易,直接放入交易池 * 一条交易在一个节点上,只广播一次,当收到了重复的交易,不会进行二次广播 -通过上述的策略,能够尽量的让交易到达所有的节点,但也会在极小的概率下出现某交易无法到达某节点的情况。此情况是允许的。交易尽可能到达更多的节点,是为了让此交易尽快的被打包、共识、确认,尽量的让交易能够更快的得到执行的结果。当交易未到达某个节点时,只会使得交易的执行时间变长,不会影响交易的正确性。 +会在极小的概率下出现某交易无法到达某节点的情况,此情况是允许的。交易尽可能到达更多的节点,是为了让此交易尽快的被打包、共识、确认,尽量的让交易能够更快的得到执行的结果。当交易未到达某个节点时,只会使得交易的执行时间变长,不会影响交易的正确性。在共识流程中会验证leader打包的区块交易列表,如果本地有出现交易缺少的情况,则会主动向leader请求缺的交易。 ## 状态同步 @@ -44,46 +38,59 @@ ## 同步场景举例 -### 交易同步 +### 交易广播场景 一笔交易被广播到所有节点的过程: -- 一笔交易通过RPC发送到某节点上 -- 收到交易的节点全量广播此交易给其它节点 -- 其它节点收到交易后,为了保险起见,选择25%的节点再广播一次 -- 节点收到广播过的交易,不会再次广播 +* 一笔交易通过RPC发送到某节点上 +* 收到交易的节点全量广播此交易给其它节点 +* 节点收到广播过的交易,不会再次广播 + +### 共识验证时缺交易同步场景 + +在共识缺交易场景的过程: + +* 节点收到proposal后发现proposal列表中有缺交易 +* 会主动向proposal发起的节点请求缺的交易(单播) +* 打包节点收到请求后返回缺少的交易(单播) + +### 交易池为空请求其他节点交易场景 + +当节点交易池为空时,将会触发节点主动请求交易的场景: + +* 主动向所有节点广播onEmptyTxs的消息包(广播) +* 其他节点收到消息包后,将会主动返回交易给请求节点(单播) ### 状态同步 节点出块时的广播逻辑 -- 某个节点出块 -- 此节点将自己最新的状态(最新块高,最高块哈希,创世块哈希)广播给所有的节点 -- 其它的节点收到peer的状态后,更新在本地管理的peer数据 +* 某个节点出块 +* 此节点将自己最新的状态(最新块高,最高块哈希,创世块哈希)广播给所有的节点 +* 其它的节点收到peer的状态后,更新在本地管理的peer数据 **组内成员的同步** 组内成员在某时刻意外关闭,但其它成员在出块,当此组员再次启动时,发现区块落后于其它组员: -- 组员再次启动 -- 收到其它组员发来的状态包 -- 比较发现自己的最高块高落后于其它组员,启动下载流程 -- 将相差的区块按区间划分成多个下载请求包,发送给多个组员,负载均衡 -- 等待其它节点回复区块包 -- 其它节点接受响应,从自己的区块链上查询出区块,回复给启动的节点 -- 节点收到区块,放入下载队列 -- 节点从下载队列中将区块拿出,写到区块链上 -- 若下载未结束,则继续请求,若下载结束,则切换自身状态,开启交易同步,开启共识 +* 组员再次启动 +* 收到其它组员发来的状态包 +* 比较发现自己的最高块高落后于其它组员,启动下载流程 +* 将相差的区块按区间划分成多个下载请求包,发送给多个组员,负载均衡 +* 等待其它节点回复区块包 +* 其它节点接受响应,从自己的区块链上查询出区块,回复给启动的节点 +* 节点收到区块,放入下载队列 +* 节点从下载队列中将区块拿出,写到区块链上 +* 若下载未结束,则继续请求,若下载结束,则切换自身状态,开启交易同步,开启共识 **新组员的同步** 非组员作为一个新组员加入到某个组中,且此节点第一次启动,从原来的组员中同步区块: -- 非组员未被注册到组中,但非组员先启动 -- 此时发现自己不在组中,不进行状态广播,也不进行交易广播,只等待其它组员发来状态消息 -- 此时组员中并没有此新组员,不会向新组员广播状态 -- 管理员将新组员加入到组中 -- 组员向新组员广播自身状态 -- 新组员收到组员状态,比较自身块高(为0),启动下载流程 -- 之后的下载流程,与组内成员区块同步流程相同 - +* 非组员未被注册到组中,但非组员先启动 +* 此时发现自己不在组中,不进行状态广播,也不进行交易广播,只等待其它组员发来状态消息 +* 此时组员中并没有此新组员,不会向新组员广播状态 +* 管理员将新组员加入到组中 +* 组员向新组员广播自身状态 +* 新组员收到组员状态,比较自身块高(为0),启动下载流程 +* 之后的下载流程,与组内成员区块同步流程相同 diff --git a/3.x/zh_CN/docs/design/transaction_deduplication.md b/3.x/zh_CN/docs/design/transaction_deduplication.md new file mode 100644 index 000000000..e65a753ca --- /dev/null +++ b/3.x/zh_CN/docs/design/transaction_deduplication.md @@ -0,0 +1,5 @@ +# 15. 交易去重 +标签: ``交易去重`` + +---- + diff --git a/3.x/zh_CN/docs/design/tx_procedure.md b/3.x/zh_CN/docs/design/tx_procedure.md index 6317edb22..46e791942 100644 --- a/3.x/zh_CN/docs/design/tx_procedure.md +++ b/3.x/zh_CN/docs/design/tx_procedure.md @@ -1,29 +1,27 @@ -# 区块链交易流程 +# 2. 交易流程 交易——区块链系统的核心,负责记录区块链上发生的一切。区块链引入智能合约后,交易便超脱『价值转移』的原始定义,其更加精准的定义应该是区块链中一次事务的数字记录。无论大小事务,都需要交易的参与。 交易的一生,贯穿下图所示的各个阶段。本文将梳理交易的整个流转过程,一窥FISCO BCOS交易完整生命周期。 - - +![](../../images/design/transaction_lifetime/IMG_5188.PNG) ## 交易生成 用户的请求给到客户端后,客户端会构建出一笔有效交易,交易中包括以下关键信息: -1. 发送地址:即用户自己的账户,用于表明交易来自何处。 -2. 接收地址:FISCO BCOS中的交易分为两类,一类是部署合约的交易,一类是调用合约的交易。前者,由于交易并没有特定的接收对象,因此规定这类交易的接收地址固定为0x0;后者,则需要将交易的接收地址置为链上合约的地址。 -3. 交易相关的数据:一笔交易往往需要一些用户提供的输入来执行用户期望的操作,这些输入会以二进制的形式被编码到交易中。 -4. 交易签名:为了表明交易确实是由自己发送,用户会向SDK提供私钥来让客户端对交易进行签名,其中私钥和用户账户是一一对应的关系。 +1. 接收地址:FISCO BCOS中的交易分为两类,一类是部署合约的交易,一类是调用合约的交易。前者,由于交易并没有特定的接收对象,因此规定这类交易的接收地址固定为空;后者,则需要将交易的接收地址置为链上合约的地址。 +1. 交易相关的数据:一笔交易往往需要一些用户提供的输入来执行用户期望的操作,这些输入会以二进制的形式被编码到交易中。 +1. 交易签名:为了表明交易确实是由自己发送,用户会向SDK提供私钥来让客户端对交易进行签名,其中私钥和用户账户是一一对应的关系。 之后,区块链客户端会再向交易填充一些必要的字段,如用于防交易重放的交易ID及blockLimit。交易的具体结构和字段含义可以参考[编码协议文档](./protocol_description.md),交易构造完成后,客户端随后便通过RPC信道将交易发送给节点。 - +![](../../images/design/transaction_lifetime/IMG_5189.PNG) ## 交易池 区块链交易被发送到节点后,节点会通过验证交易签名的方式来验证一笔交易是否合法。若一笔交易合法,则节点会进一步检查该交易是否重复出现过,若从未出现过,则将交易加入交易池缓存起来。若交易不合法或交易重复出现,则将直接丢弃交易。 - +![](../../images/design/transaction_lifetime/IMG_5190.PNG) ## 交易广播 @@ -35,15 +33,15 @@ 为了提高交易处理效率,同时也为了确定交易之后的执行顺序保证事务性,当交易池中有交易时,Sealer线程负责从交易池中按照先进先出的顺序取出一定数量的交易,组装成待共识区块,随后待共识区块会被发往各个节点进行处理。 - +![](../../images/design/transaction_lifetime/IMG_5191.JPG) ## 交易执行 -节点在收到区块后,会调用区块验证器把交易从区块中逐一拿出来执行。如果是预编译合约代码,验证器中的执行引擎会直接调用相应的C++功能,否则执行引擎就会把交易交给EVM(以太坊虚拟机)执行。 +节点在收到区块后,会调用区块验证器把交易从区块中逐一拿出来执行。如果是预编译合约代码,验证器中的执行引擎会直接调用相应的C++功能,否则执行引擎就会把交易交给EVM(以太坊虚拟机)或WASM执行。 交易可能会执行成功,也可能因为逻辑错误或Gas不足等原因执行失败。交易执行的结果和状态会封装在交易回执中返回。 - +![](../../images/design/transaction_lifetime/IMG_5192.JPG) ## 交易共识 diff --git a/3.x/zh_CN/docs/design/virtual_machine/evm.md b/3.x/zh_CN/docs/design/virtual_machine/evm.md index 22a9bad02..eaccc5ece 100644 --- a/3.x/zh_CN/docs/design/virtual_machine/evm.md +++ b/3.x/zh_CN/docs/design/virtual_machine/evm.md @@ -1,4 +1,4 @@ -# EVM 以太坊虚拟机 +# EVM 引擎 标签:``EVM`` ``智能合约`` ``虚拟机`` @@ -8,13 +8,11 @@ 当智能合约被编译成二进制文件后,被部署到区块链上。用户通过调用智能合约的接口,来触发智能合约的执行操作。EVM执行智能合约的代码,修改当前区块链上的数据(状态)。被修改的数据,会被共识,确保一致性。 - - ## EVMC – Ethereum Client-VM Connector API -新版本的以太坊将EVM从节点代码中剥离出来,形成一个独立的模块。EVM与节点的交互,抽象出EVMC接口标准。通过EVMC,节点可以对接多种虚拟机,而不仅限于传统的基于solidity的虚拟机。 +新版本的以太坊将EVM从节点代码中剥离出来,形成一个独立的模块。EVM与节点的交互,抽象出EVMC接口标准。通过EVMC,节点可以对接多种虚拟机。 -传统的solidity虚拟机,在以太坊中称为interpreter,下文主要解释interpreter的实现。 +最初的EVM虚拟机,在以太坊中称为interpreter,下文主要解释interpreter的实现。 ### EVMC 接口 @@ -27,7 +25,7 @@ EVM本身不保存状态数据,节点通过instance接口操作EVM,EVM反过 ![](../../../images/evm/evmc.png) -**Instance 接口** +**Instance接口** 定义了节点对虚拟机的操作,包括创建,销毁,设置等。 @@ -47,7 +45,6 @@ EVM本身不保存状态数据,节点通过instance接口操作EVM,EVM反过 接口定义在evmc_context_fn_table(evmc.h)中。 - * evmc_account_exists_fn account_exists * evmc_get_storage_fn get_storage * evmc_set_storage_fn set_storage @@ -61,7 +58,6 @@ EVM本身不保存状态数据,节点通过instance接口操作EVM,EVM反过 * evmc_get_block_hash_fn get_block_hash * evmc_emit_log_fn emit_log - ## EVM 执行 ### EVM 指令 @@ -198,9 +194,6 @@ void VM::caseCall() } ``` - - ## 总结 -EVM是一个状态执行的机器,输入是solidity编译后的二进制指令和节点的状态数据,输出是节点状态的改变。以太坊通过EVMC实现了多种虚拟机的兼容。但截至目前,并未出现除开interpreter之外的,真正生产可用的虚拟机。也许要做到同一份代码在不同的虚拟机上跑出相同的结果,是一件很难的事情。BCOS将持续跟进此部分的发展。 - +EVM是一个状态执行的机器,输入是solidity编译后的二进制指令和节点的状态数据,输出是节点状态的改变。以太坊通过EVMC实现了多种虚拟机的兼容。 diff --git a/3.x/zh_CN/docs/design/virtual_machine/gas.md b/3.x/zh_CN/docs/design/virtual_machine/gas.md index 98c5dada5..d168054b0 100644 --- a/3.x/zh_CN/docs/design/virtual_machine/gas.md +++ b/3.x/zh_CN/docs/design/virtual_machine/gas.md @@ -1,20 +1,12 @@ -# Gas +# Gas 计费 标签:``Gas`` ``智能合约`` ``虚拟机`` ---- -EVM虚拟机有一整套Gas机制来衡量每笔交易上链消耗的CPU、内存和存储资源。FISCO BCOS 2.0引入了Precompiled合约,支持内置的C++合约,为了提升Precompiled合约的安全性,FISCO BCOS v2.4.0在Precompiled合约中引入了Gas机制。 - -此外,EVM原始的Gas机制中,交易的主要Gas消耗来源于存储,考虑到联盟链场景更关注CPU和内存消耗,FISCO BCOS v2.4.0调整了存储Gas,引入`Free Storage` Gas衡量模式,提升CPU和内存在交易Gas消耗中的占比。 - +EVM虚拟机有一整套Gas机制来衡量每笔交易上链消耗的CPU、内存和存储资源。FISCO BCOS 引入了Precompiled合约,支持内置的C++合约,为了提升Precompiled合约的安全性,FISCO BCOS v2.4.0在Precompiled合约中引入了Gas机制。 ## Precompiled合约支持Gas计算 -```eval_rst -.. note:: - Precompiled合约支持Gas计算的特性从v2.4.0开始支持,当 ``supported_version`` 小于v2.4.0,或者旧链直接替换二进制升级时,不支持该特性 -``` - ### 模块架构 FISCO BCOS v2.4.0新增了`PrecompiledGas`模块进行Gas计算,Gas开销主要包括CPU、内存和存储三个维度,模块图如下: @@ -29,7 +21,6 @@ FISCO BCOS v2.4.0新增了`PrecompiledGas`模块进行Gas计算,Gas开销主 - `Precompiled`合约执行完毕后,可调用接口,根据运行`Precompiled`合约过程中执行的指令集合、消耗的内存,计算出该`Precompiled`合约Gas消耗。 - ### Precompiled合约Gas衡量标准 FISCO BCOS Precompiled合约Gas衡量标准参考了EVM,主要包括CPU、内存和存储三个维度。下面详细介绍Precompiled合约具体的Gas计算方法。 @@ -75,7 +66,6 @@ PaillierAdd | 同态加接口 | 0x13 | GroupSigVerify | 群签名验证接口 | 0x14 | RingSigVerify | 环签名验证接口 | 0x15 | - ##### Precompiled合约基础操作衡量标准 `PrecompiledGas`定义了Precompiled合约每个基础操作对应的Gas消耗,具体如下: @@ -105,52 +95,30 @@ PaillierAdd | 20000 | GroupSigVerify | 20000 | RingSigVerify | 20000 | - -## EVM Gas衡量标准插件化 - -如前面所述,针对部分场景衡量交易资源耗用时,更加关注CPU和Gas,FISCO BCOS v2.4.0引入了`Free Storage`的Gas衡量模式,提升CPU和内存在交易Gas消耗中的占比。 - - -```eval_rst -.. note:: - EVM Gas衡量标准支持插件化配置的特性从v2.4.0开始支持,当 ``supported_version`` 小于v2.4.0,或者旧链直接替换二进制升级时,不支持该特性 -``` - -### 模块架构 - -为了支持Gas衡量标准插件化配置和FreeStorage的Gas衡量模式,FISCO BCOS v2.4.0在以太坊EVMSchedule引入`FreeStorageEVMSchedule`,在PrecopmiledGas的GasMetrics基础上引入了`FreeStorageGasMetrics`,并根据`genesis`文件的`enable_free_storage`配置项决定启用哪种Gas衡量模式,如下图所示: - -![](../../../images/evm/free_storage.png) - -为了提升CPU和内存在交易Gas消耗中的占比,`FreeStorageEVMSchedule`调整了创建合约、`SSTORE`、`SLOAD`等操作的Gas消耗;`FreeStorageGasMetrics`主要调整了`CreateTable`、`Insert`、`Remove`、`Update`等操作的Gas消耗。 - ### Gas衡量标准 -下面分别介绍非`FreeStorage`模式和`FreeStorage`模式下,EVM虚拟机和Precompiled合约Gas衡量标准: +下面分别介绍EVM虚拟机和Precompiled合约Gas衡量标准: **EVM虚拟机Gas衡量标准** - -Gas | 说明 | EVMSchedule模式下Gas消耗 | FreeStorageEVMSchedule模式下Gas消耗 -|-------|--------|-------|--------| -CreateGas | 创建合约的Gas消耗 | 32000 | 16000 | -sloadGas| 从存储读取32字节数据消耗的Gas | 200 | 1200| -sstoreSetGas| 添加32字节数据到存储的Gas消耗 | 20000 | 1200 | -sstoreResetGas| 更新32字节存储数据的Gas消耗 |5000 | 1200 | +Gas | 说明 | Gas消耗 | +|-------|--------|-------| +CreateGas | 创建合约的Gas消耗 | 32000 | +sloadGas| 从存储读取32字节数据消耗的Gas | 200 | +sstoreSetGas| 添加32字节数据到存储的Gas消耗 | 20000 | +sstoreResetGas| 更新32字节存储数据的Gas消耗 |5000 | **Precompiled合约Gas衡量标准** - -Gas | 说明| GasMetrics模式下Gas消耗 | FreeStorageGasMetrics模式下Gas消耗 --------|--------|-------|--------| -CreateTableGas| 创建表的Gas消耗 | 16000 | 500 | -StoreGas| 向表中插入数据或更新表中数据的Gas消耗 | 10000 | 200 | -RemoveGas| 删除表中数据的Gas消耗 | 2500 | 200 | - +Gas | 说明| Gas消耗 | +-------|--------|-------| +CreateTableGas| 创建表的Gas消耗 | 16000 | +StoreGas| 向表中插入数据或更新表中数据的Gas消耗 | 10000 | +RemoveGas| 删除表中数据的Gas消耗 | 2500 | ### 配置项 ```eval_rst .. note:: EVM Gas衡量标准支持插件化配置项位于 ``genesis`文件中 -``` \ No newline at end of file +``` diff --git a/3.x/zh_CN/docs/design/virtual_machine/index.rst b/3.x/zh_CN/docs/design/virtual_machine/index.rst index 6908d8ba0..9d97b96d7 100644 --- a/3.x/zh_CN/docs/design/virtual_machine/index.rst +++ b/3.x/zh_CN/docs/design/virtual_machine/index.rst @@ -1,29 +1,29 @@ ############################################################## -智能合约 +8. 智能合约引擎 ############################################################## -标签: ``智能合约`` ``虚拟机`` +标签: ``智能合约`` ``虚拟机`` ---- -交易的执行是区块链节点上的一个重要的功能。交易的执行,是把交易中的智能合约二进制代码取出来,用执行器(Executor_)执行。共识模块(Consensus_)把交易从交易池中取出,打包成区块,并调用执行器去执行区块中的交易。在交易的执行过程中,会对区块链的状态(State)进行修改,形成新区块的状态储存下来(Storage)。执行器在这个过程中,类似于一个黑盒,输入是智能合约代码,输出是状态的改变。 - -随着技术的发展,人们开始关注执行器的性能和易用性。一方面,人们希望智能合约在区块链上能有更快的执行速度,满足大规模交易的需求。另一方面,人们希望能用更熟悉更好用的语言进行开发。进而出现了一些替代传统的执行器(EVM)的方案,如:JIT_、 WASM_甚至JVM。然而,传统的EVM是耦合在节点代码中的。首先要做的,是将执行器的接口抽象出来,兼容各种虚拟机的实现。因此,EVMC被设计出来。 +交易的执行是区块链节点上的一个重要的功能。交易的执行,是把交易中的智能合约二进制代码取出来,用执行器(Executor)执行。共识模块(Consensus)把交易从交易池中取出,打包成区块,并调用执行器去执行区块中的交易。在交易的执行过程中,会对区块链的状态(State)进行修改,形成新区块的状态储存下来(Storage)。执行器在这个过程中,类似于一个黑盒,输入是智能合约代码,输出是状态的改变。 +随着技术的发展,人们开始关注执行器的性能和易用性。一方面,人们希望智能合约在区块链上能有更快的执行速度,满足大规模交易的需求。另一方面,人们希望能用更熟悉更好用的语言进行开发。进而出现了一些替代传统的执行器(EVM)的方案,如:WASM,传统的EVM是耦合在节点代码中的。首先要做的,是将执行器的接口抽象出来,兼容各种虚拟机的实现。因此,EVMC被设计出来。 EVMC (Ethereum Client-VM Connector API),是以太坊抽象出来的执行器的接口,旨在能够对接各种类型的执行器。FISCO BCOS目前采用了以太坊的智能合约语言Solidity,因此也沿用了以太坊对执行器接口的抽象。 .. image:: ../../../images/evm/evmc_frame.png -在节点上,共识模块会调用EVMC,将打包好的交易交由执行器执行。执行器执行时,对状态进行的读写,会通过EVMC的回调反过来操作节点上的状态数据。 +在节点上,共识模块会将打包好的区块交由执行器执行。虚拟机执行时,对状态进行的读写,会通过EVMC的回调反过来操作节点上的状态数据。 经过EVMC一层的抽象,FISCO BCOS能够对接今后出现的更高效、易用性更强的执行器。目前,FISCO BCOS采用的evmone执行solidity合约,采用wasmtime执行wasm合约。 .. toctree:: :maxdepth: 1 - + evm.md precompiled.md + wasm.md gas.md .. _Executor: ./evm.html diff --git a/3.x/zh_CN/docs/design/virtual_machine/precompiled.md b/3.x/zh_CN/docs/design/virtual_machine/precompiled.md index f1907d425..6c6f8bfe0 100644 --- a/3.x/zh_CN/docs/design/virtual_machine/precompiled.md +++ b/3.x/zh_CN/docs/design/virtual_machine/precompiled.md @@ -1,4 +1,4 @@ -## 预编译合约 +## C++ 引擎 标签:``预编译合约`` ``智能合约`` ``Precompiled`` @@ -8,11 +8,11 @@ ### 预编译合约与Solidity合约对比 -|表名 | 预编译合约 | Solidity合约| -|:--------|:-----|:-----| -|地址 | 固定地址,代码中定义 | 部署时确定| -|合约代码 | 数据存储在表中,与合约分离,可升级合约逻辑| 合约变量和数据存储在MPT树中| -|执行 | C++底层执行,性能更高,可实现并行 | EVM虚拟机,串行执行| +| 表名 | 预编译合约 | Solidity合约 | +|:---------|:-------------------------------------------|:----------------------------| +| 地址 | 固定地址,代码中定义 | 部署时确定 | +| 合约代码 | 数据存储在表中,与合约分离,可升级合约逻辑 | 合约变量和数据存储在MPT树中 | +| 执行 | C++底层执行,性能更高,可实现并行 | EVM虚拟机,串行执行 | ### 模块架构 @@ -26,10 +26,8 @@ Precompiled的架构如下图所示: - 每个预编译合约对象都会实现`call`接口,预编译合约的具体逻辑在该接口中实现。 - `call`根据交易的abi编码,获取到`Function Selector`和参数,然后执行对应的逻辑。 -```eval_rst -.. mermaid:: - - graph TB +```mermaid + graph LR Start(开始) --> branch1{预编译合约} branch1 --> |是|op1[根据地址获取合约对象] branch1 --> |否|op2[EVM] @@ -40,11 +38,11 @@ Precompiled的架构如下图所示: ### 接口定义 -每个预编译合约都必须实现自己的`call`接口,接口接受三个参数,分别是`ExecutiveContext`执行上下文、`bytesConstRef`参数的abi编码和外部账户地址,其中外部账户地址用于判断是否具有写权限。[`Precompiled`源码](https://github.com/FISCO-BCOS/FISCO-BCOS/blob/04db9d5e9d7a9d321d90cef8dc5e2010a53ed8d3/libprecompiled/Precompiled.h#L37)。 +每个预编译合约都必须实现自己的`call`接口,接口接受两个参数,分别是`TransactionExecutive::Ptr`执行上下文、`PrecompiledExecResult::Ptr`执行参数,其中包括执行输入、外部账户地址、gas使用。[`Precompiled`源码](https://github.com/FISCO-BCOS/FISCO-BCOS/blob/76da8909d5/bcos-executor/src/vm/Precompiled.h)。 -|接口名|参数说明|接口说明| -|:----|:------|:------| -|`virtual bytes call(std::shared_ptr context, bytesConstRef param, Address const& origin = Address())`|`context`为区块执行上下文,`param`为abi编码的参数,`origin`为调用的外部账户地址|具体合约接口的实现| -|`virtual uint32_t getParamFunc(bytesConstRef param)`|`param`为abi编码的参数|获取调用的函数的`Function Select`(函数名的sha3的前四个大端字节)| -|`virtual uint32_t getFuncSelector(std::string const& _functionName)`|`_functionName`为函数名|根据函数名计算`Function Select`| -|`virtual bytesConstRef getParamData(bytesConstRef param)`|`param`为abi编码的参数|获取调用函数的具体参数的abi编码| +| 接口名 | 参数说明 | 接口说明 | +|:--------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------|:------------------------------------------------------------------| +| `PrecompiledExecResult::Ptr call(executor::TransactionExecutive::Ptr context,PrecompiledExecResult::Ptr param) override;` | `context`为区块执行上下文,`param`为执行参数,其中包括执行输入、外部账户地址、gas使用 | 具体合约接口的实现 | +| `uint32_t getFuncSelector(std::string const& functionName)` | `functionName`为函数名 | 根据函数名计算`Function Select` | +| `bytesConstRef getParamData(bytesConstRef param)` | `param`为abi编码的参数 | 获取调用函数的具体参数的abi编码 | +| `uint32_t getParamFunc(bytesConstRef param)` | `param`为abi编码的参数 | 获取调用的函数的`Function Select`(函数名的sha3的前四个大端字节) | diff --git a/3.x/zh_CN/docs/design/virtual_machine/wasm.md b/3.x/zh_CN/docs/design/virtual_machine/wasm.md new file mode 100644 index 000000000..da5095c8d --- /dev/null +++ b/3.x/zh_CN/docs/design/virtual_machine/wasm.md @@ -0,0 +1,539 @@ +# Wasm 引擎 + +## FISCO BCOS 环境接口规范 + +FISCO BCOS 环境接口(FISCO BCOS Environment Interface,FBEI)规范中包含区块链底层平台[FISCO BCOS](https://gitee.com/FISCO-BCOS/FISCO-BCOS)向 Wasm 虚拟机公开的应用程序接口(Application Programming Interface,API)。FBEI 规范中所有的 API 均由 FISCO BCOS 负责实现,运行于 Wasm 虚拟机中的程序能够直接访问这些 API 以获取区块链的环境及状态。 + +### 数据类型 + +在 FBEI 规范中, API 参数及返回值的数据类型会使用`i32`、`i32ptr`及`i64`三种类型标记,其定义如下: + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 类型标记 + - 定义 + * - i32 + - 32位整数,与 Wasm 中i32类型的定义一致 + * - i32ptr + - 32位整数,其存储方式与 Wasm 中i32类型一致,但是用于表示虚拟机中的内存偏移量 + * - i64 + - 64位整数,与 Wasm 中i64类型的定义一致 +``` + +### API 列表 + +#### setStorage + +**_描述_** + +将键值对数据写入至区块链底层存储中以实现持久化存储。使用时需要先将表示键及值的字节序列存储在虚拟机内存中。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - keyOffset + - i32ptr + - 键在虚拟机内存中的存储位置的起始地址 + * - keyLength + - i32 + - 键的长度 + * - valueOffset + - i32ptr + - 值在虚拟机内存中的存储位置的起始地址 + * - valueLength + - i32 + - 值的长度 +``` + +**_返回值_** + +无。 + +```eval_rst +.. note:: + + 调用setStorage时,若提供的valueLength参数为0,则表示从区块链底层存储中删除键所对应的数据。在这种情况下,API的实现将直接跳过值的读取,因此valueOffset参数不用赋予有效值,一般直接置为0即可。 +``` + +#### getStorage + +**_描述_** + +根据所提供的键,将区块链底层存储中对应的值读取至虚拟机内存中。使用时需要先将表示键的字节序列存储在虚拟机内存中,并提前分配好存储值的内存区域。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - keyOffset + - i32ptr + - 键在虚拟机内存中的存储位置的起始地址 + * - keyLength + - i32 + - 键的长度 + * - valueOffset + - i32ptr + - 用于存放值的虚拟机内存起始地址 +``` + +**_返回值_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 类型 + - 描述 + * - i32 + - 值的长度 +``` + +#### getCallData + +**_描述_** + +将当前交易的输入数据拷贝至虚拟机内存中,使用时需要提前分配好存储交易输入数据的内存区域。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - resultOffset + - i32ptr + - 用于存放当前交易输入数据的虚拟机内存起始地址 +``` + +**_返回值_** + +无。 + +#### getCallDataSize + +**_描述_** + +获取当前交易输入数据的长度。 + +**_参数_** + +无。 + +**_返回值_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 类型 + - 描述 + * - i32 + - 当前交易输入数据的长度 +``` + +#### getCaller + +**_描述_** + +获取发起合约调用的调用方地址,使用时需要提前分配好存储调用方地址的内存区域。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - resultOffset + - i32ptr + - 用于存放调用方地址的虚拟机内存起始地址 +``` + +**_返回值_** + +无。 + +#### finish + +**_描述_** + +将表示返回值的字节序列传递至宿主环境并结束执行流程,宿主环境会将该其作为交易回执的一部分返回至调用方。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - dataOffset + - i32ptr + - 用于存放返回值的虚拟机内存起始地址 + * - dataLength + - i32 + - 返回值的长度 +``` + +**_返回值_** + +无。 + +#### revert + +**_描述_** + +将表示异常信息的字节序列抛出至宿主环境,宿主环境会将其作为交易回执的一部分返回至调用者。调用此接口后,交易回执中的状态将会被标记为“已回滚”。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - dataOffset + - i32ptr + - 异常信息在虚拟机内存中的存储位置的起始地址 + * - dataLength + - i32 + - 异常信息的长度 +``` + +**_返回值_** + +无。 + +```eval_rst +.. note:: + + 异常信息需要为人类可读的字符串,以方便快速定位异常原因。 +``` + +#### log + +**_描述_** + +创建一条交易日志。可以至多为该日志创建 4 个日志索引。使用时需要先将表示日志数据及其索引的字节序列存储在虚拟机内存中。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - dataOffset + - i32ptr + - 日志数据在虚拟机内存中的存储位置的起始地址 + * - dataLength + - i32 + - 日志数据的长度 + * - topic1 + - i32ptr + - 第 1 个日志索引的虚拟机内存起始地址,没有时置0 + * - topic2 + - i32ptr + - 第 2 个日志索引的虚拟机内存起始地址,没有时置0 + * - topic3 + - i32ptr + - 第 3 个日志索引的虚拟机内存起始地址,没有时置0 + * - topic4 + - i32ptr + - 第 4 个日志索引的虚拟机内存起始地址,没有时置0 +``` + +**_返回值_** + +无。 + +```eval_rst +.. note:: + + 日志索引的长度需要为恰好为32字节。 +``` + +#### getTxOrigin + +**_描述_** + +获取调用链中最开始发起合约调用的调用方地址,使用时需要提前分配好存储调用方地址的内存区域。与`getCaller`接口不同,本接口获取到的调用方地址一定为外部账户地址。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - resultOffset + - i32ptr + - 用于存放调用方地址的虚拟机内存起始地址 +``` + +**_返回值_** + +无。 + +#### getBlockNumber + +**_描述_** + +获取当前块高。 + +**_参数_** + +无。 + +**_返回值_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 类型 + - 描述 + * - i64 + - 当前块高 +``` + +#### getBlockTimestamp + +**_描述_** + +获取当前块的时间戳。 + +**_参数_** + +无。 + +**_返回值_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 类型 + - 描述 + * - i64 + - 当前块的时间戳 +``` + +#### call + +**_描述_** + +发起外部合约调用,使用时需要先将表示调用参数的字节序列存储在虚拟机内存中。调用此接口后执行流程会陷入阻塞,直至外部合约调用结束或发生异常。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - addressOffset + - i32ptr + - 被调用合约地址在虚拟机内存中的存储位置的起始地址 + * - dataOffset + - i32ptr + - 调用参数在虚拟机内存中的存储位置的起始地址 + * - dataLength + - i32 + - 调用参数的长度 +``` + +**_返回值_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 类型 + - 描述 + * - i32 + - 调用状态,0表示成功,否则表示失败 +``` + +#### getReturnDataSize + +**_描述_** + +获取外部合约调用的返回值长度,此接口仅能在外部合约调用成功后调用。 + +**_参数_** + +无。 + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 类型 + - 描述 + * - i32 + - 外部合约调用的返回值长度 +``` + +#### getReturnData + +获取外部合约调用的返回值,使用时需要根据`getReturnDataSize`的返回结果提前分配好存储返回值内存区域。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - resultOffset + - i32ptr + - 用于存放返回值的虚拟机内存起始地址 +``` + +**_返回值_** + +无。 + +## FISCO BCOS Wasm约束 + +FISCO BCOS Wasm 合约接口(FISCO BCOS Wasm Contract Interface,FBWCI)规范中包含关于合约文件格式及内容的约定。符合 FBWCI 规范要求合约文件能够在FISCO BCOS内置的 Wasm 虚拟机中运行。 + +### 传输格式 + +所有的合约件必须以[WebAssembly 二进制编码](https://webassembly.github.io/spec/core/binary/index.html)格式保存及传输。 + +### 符号导入 + +合约文件仅能导入在FBEI中规定的接口,所有的接口都需要从名为`bcos`的命名空间中导入,且签名必须与 BCOS 环境接口规范中所声明的接口签名保持一致。除`bcos`命令空间外,还有一个名为`debug`的特殊命名空间。`debug`命名空间中所声明的函数的主要用于虚拟机的调试模式,在正式的生产环境中该命名空间不会被启用,详情请参考调试模式。 + +### 符号导出 + +合约文件必须恰好导出下列 3 个符号: + +| 符号名 | 描述 | +| ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| memory | 共享线性内存,用于与宿主环境交换数据 | +| deploy | 初始化入口,无参数且无返回值,用于完成状态初始化的工作。当合约被初次部署至链上时,宿主环境会主动调用该函数 | +| main | 执行入口,无参数且无返回值,用于执行具体的合约逻辑。当有发往该合约的交易时,宿主环境会主动调用该函数。当交易成功执行时,该函数正常退出;否则向宿主环境抛出异常原因并回滚交易 | + +### 调试模式 + +调试模式是一种用于调试虚拟机的特殊模式,通过`debug`命名空间为合约提供了一组额外调试接口。但是在正式的生产环境中,若合约字节码尝试从`debug`命名空间中导入符号,则会被拒绝部署。`debug`命名空间中可用的接口如下所示,所有接口均没有返回值: + +#### print32 + +**_描述_** + +在区块链底层的日志中输出一个 32 位整数值。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - value + - i32 + - 32位整数值 +``` + +#### print64 + +**_描述_** + +在区块链底层的日志中输出一个 64 位整数值。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - value + - i64 + - 64位整数值 +``` + +#### printMem + +**_描述_** + +以可打印字符的形式在区块链底层的日志中输出一段虚拟机内存中的内容。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - offset + - i32 + - 内存区域的起始地址 + * - len + - i32 + - 内存区域的长度 +``` + +#### printMemHex + +以 16 进制字符串的形式在区块链底层的日志中输出一段虚拟机内存中的内容。 + +**_参数_** + +```eval_rst +.. list-table:: + :header-rows: 1 + + * - 参数名 + - 类型 + - 描述 + * - offset + - i32 + - 内存区域的起始地址 + * - len + - i32 + - 内存区域的长度 +``` + +### Start function + +[Start function](https://webassembly.github.io/spec/core/syntax/modules.html#start-function) 会在虚拟机载入合约字节码时自动执行,而此时宿主环境尚无法获得虚拟机提供的共享内存的访问权限,因而可能会导致引发运行时异常,因此 FBWCI 规范规定合约文件中不允许存在 start function。 diff --git a/3.x/zh_CN/docs/develop/account.md b/3.x/zh_CN/docs/develop/account.md index c8564169e..bb66faa45 100644 --- a/3.x/zh_CN/docs/develop/account.md +++ b/3.x/zh_CN/docs/develop/account.md @@ -1,4 +1,4 @@ -# 账户使用与账户管理 +# 3. 账户使用与账户管理 标签:``创建账户`` ``国密账户`` ``密钥文件`` @@ -67,9 +67,11 @@ bash get_account.sh 执行上面的命令,可以得到类似下面的输出,包括账户地址和以账户地址为文件名的私钥PEM文件与公钥PUB文件。 ```shell -[INFO] Account Address : 0xa04beef19c812628a2aa1f0fc73e0963f84ec75e -[INFO] Private Key (pem) : accounts/0xa04beef19c812628a2aa1f0fc73e0963f84ec75e.pem -[INFO] Public Key (pem) : accounts/0xa04beef19c812628a2aa1f0fc73e0963f84ec75e.pem.pub +[INFO] Account privateHex: 0x3c73c7ee2d549c7a39fddd3e0449677f3c201f0f4c6c540c93ab38f8aab03388 +[INFO] Account publicHex : 0x5309fa17ae97f81f80a1da3d6b116377ace351dffdcbfd0e91fbb3bcf0312d363c78b8aaf929b3661c1f02e8b2c318358843de6a2dcc66cc0d5260a0d6874a6e +[INFO] Account Address : 0x3d1771fb60963fbaf5906c6b2a574c77dae7c136 +[INFO] Private Key (pem) : accounts/0x3d1771fb60963fbaf5906c6b2a574c77dae7c136.pem +[INFO] Public Key (pem) : accounts/0x3d1771fb60963fbaf5906c6b2a574c77dae7c136.pem.pub ``` - 指定PEM私钥文件计算账户地址 @@ -81,7 +83,9 @@ bash get_account.sh -k accounts/0xa04beef19c812628a2aa1f0fc73e0963f84ec75e.pem 执行上面的命令,结果如下 ```shell -[INFO] Account Address : 0xa04beef19c812628a2aa1f0fc73e0963f84ec75e +[INFO] Account Address : 0x3d1771fb60963fbaf5906c6b2a574c77dae7c136 +[INFO] Account privateHex: 0x3c73c7ee2d549c7a39fddd3e0449677f3c201f0f4c6c540c93ab38f8aab03388 +[INFO] Account publicHex : 0x5309fa17ae97f81f80a1da3d6b116377ace351dffdcbfd0e91fbb3bcf0312d363c78b8aaf929b3661c1f02e8b2c318358843de6a2dcc66cc0d5260a0d6874a6e ``` #### 3. 使用脚本生成PKCS12格式私钥 @@ -95,26 +99,30 @@ bash get_account.sh -p 执行上面的命令,可以得到类似下面的输出,按照提示输入密码,生成对应的p12文件和pub文件。 ```shell +[INFO] Account privateHex: 0x7fe388c7617b7b2241f0a67a789f38f29dd731ae6ce3510302ab26fd429d65ce +[INFO] Account publicHex : 0x8d90d7e3e5b88b62941b23db10f35d13d1a06265e14993d43dff8562d23fded7466c006b74fa04b71c86c20a27ca20915e2f5e01dc466af9e080ff71229957e8 [INFO] Note: the entered password cannot contain Chinese characters! +Warning: -chain option ignored with -nocerts Enter Export Password: Verifying - Enter Export Password: -[INFO] Account Address : 0xd97a6a101d15c228a38c09d157843d2697535f7f -[INFO] Private Key (p12) : accounts/0xd97a6a101d15c228a38c09d157843d2697535f7f.p12 -[INFO] Public Key (pem) : accounts/0xd97a6a101d15c228a38c09d157843d2697535f7f.pem.pub +[INFO] Account Address : 0x6a707388d949ca429c1473e6c5ce334ad9c455be +[INFO] Private Key (p12) : accounts/0x6a707388d949ca429c1473e6c5ce334ad9c455be.p12 +[INFO] Public Key (pem) : accounts/0x6a707388d949ca429c1473e6c5ce334ad9c455be.pem.pub ``` - 指定p12私钥文件计算账户地址,**按提示输入p12文件密码** ```shell -bash get_account.sh -P accounts/0xd97a6a101d15c228a38c09d157843d2697535f7f.p12 +bash get_account.sh -P accounts/0x6a707388d949ca429c1473e6c5ce334ad9c455be.p12 ``` 执行上面的命令,结果如下 ```shell Enter Import Password: -MAC verified OK -[INFO] Account Address : 0xd97a6a101d15c228a38c09d157843d2697535f7f +[INFO] Account Address : 0x6a707388d949ca429c1473e6c5ce334ad9c455be +[INFO] Account privateHex: 0x7fe388c7617b7b2241f0a67a789f38f29dd731ae6ce3510302ab26fd429d65ce +[INFO] Account publicHex : 0x8d90d7e3e5b88b62941b23db10f35d13d1a06265e14993d43dff8562d23fded7466c006b74fa04b71c86c20a27ca20915e2f5e01dc466af9e080ff71229957e8 ``` ## 账户的存储 @@ -267,7 +275,7 @@ dcc703c0e500b653ca82273b7bfad8045d85a470 ```eval_rst .. important:: - 账户的管理冻结、解冻、废止操作以,均需要将开启区块链权限模式,详情请参考`【权限治理使用指南】 `_ + 账户的管理冻结、解冻、废止操作,均需要将开启区块链权限模式,详情请参考`权限治理使用指南 `_ ``` 在开启区块链权限模式之后,每次发起合约调用均会检查账户状态是否正常(tx.origin),账户的状态以存储表的形式记录在BFS `/usr/` 目录下,存储表名为 `/usr/` + 账户地址,如果查不到账户状态默认该账户为正常。BFS `/usr/` 目录底下的账户状态只有在主动设置账户状态时才会创建。**账户状态管理的接口只有治理委员才能操作。** @@ -291,6 +299,6 @@ abstract contract AccountManager { ### 账户的冻结、解冻、废止 -治理委员可以对固定地址0x10003的预编译合约发起交易、对账户的状态进行读写。在执行操作是,将会确定交易发起人msg.sender是否为治理委员会记录中的治理委员,若不是则会拒绝。值得注意的是,治理委员的账户地址不允许修改状态。 +治理委员可以对固定地址0x10003的预编译合约发起交易、对账户的状态进行读写。在执行操作时,将会确定交易发起人msg.sender是否为治理委员会记录中的治理委员,若不是则会拒绝。值得注意的是,治理委员的账户地址不允许修改状态。 -治理委员也可以通过控制台对账户进行冻结、解冻、废止等操作,详情请看:[冻结/解冻账户命令](./console/console_commands.html#freezeaccount-unfreezeaccount)、[废止账户命令](./console/console_commands.html#abolishaccount) +治理委员也可以通过控制台对账户进行冻结、解冻、废止等操作,详情请看:[冻结/解冻账户命令](../operation_and_maintenance/console/console_commands.html#freezeaccount-unfreezeaccount)、[废止账户命令](../operation_and_maintenance/console/console_commands.html#abolishaccount) diff --git a/3.x/zh_CN/docs/develop/amop.md b/3.x/zh_CN/docs/develop/amop.md new file mode 100644 index 000000000..f2f108745 --- /dev/null +++ b/3.x/zh_CN/docs/develop/amop.md @@ -0,0 +1,322 @@ +# 7. 使用AMOP功能 + +标签:``java-sdk`` ``AMOP`` ``链上信使协议`` + +---- +Java SDK支持链上信使协议AMOP(Advanced Messages Onchain Protocol),用户可以通过AMOP协议与其它机构互传消息。 + +## 1. 接口说明 + +AMOP支持任何一个订阅了某话题的订阅者都能收到该话题相关的推送消息 + +AMOP模块的接口类可参考文件java-sdk中的``src/main/java/org/fisco/bcos/sdk/v3/amop/Amop.java``文件,其中主要包含以下几个接口: + +### 1.1 subscribeTopic + +订阅一个话题 + +**参数:** + +* topic: 订阅话题名称。类型:``String``。 +* callback: 处理该话题消息的函数,当收到该话题相关消息时,会被调用。类型:``AmopRequestCallback``。 + +**例子:** + +```java +// 初始化java SDK, 获得Amop对象 +BcosSDK sdk = BcosSDK.build("config-example.toml"); +Amop amop = sdk.getAmop(); +// 启动amop +amop.start(); + +// 定义一个Callback,重写receiveAmopMsg方法,定义收到消息后的处理流程。 +AmopRequestCallback cb = new AmopRequestCallback() { + @Override + public void onRequest(String endpoint, String seq, byte[] data) { + // 你可以在这里写收到消息后的处理逻辑。 + System.out.println("Received msg, content:" + new String(data)); + } +}; + +// 订阅话题 +amop.subscribeTopic("MyTopic", cb); +``` + +### 1.2 sendAmopMsg + +以单播的方式发送AMOP消息 + +**参数:** + +* topic: 发送消息的topic。类型: ``String`` +* content: 消息内容。类型:``byte[]`` +* timeout: 超时时间。类型:``int`` +* callback: 回调函数。类型:``AmopResponseCallback`` + +**注意:** + +对于发送的单播AMOP消息,存在多个订阅topic的客户端时,其中随机的一个可以接收到单播消息。 + +**例子:** + +```java +// 初始化java SDK, 获得Amop对象 +BcosSDK bcosSDK = BcosSDK.build("config-example.toml"); +Amop amop = bcosSDK.getAmop(); +amop.start(); + +AmopResponseCallback cb = new AmopResponseCallback() { + @Override + public void onResponse(Response response) { + // 你可以在这里写收到回复的处理逻辑。 + System.out.println( + "Get response, { errorCode:" + + response.getErrorCode() + + " error:" + + response.getErrorMessage() + + " content:" + + new String(response.getData()) + + " }"); + } +}; + +String msg = "Send Message"; +// 发送消息 +amop.sendAmopMsg("MyTopic", msg.getBytes(), 0, cb); +``` + +### 1.3 broadcastAmopMsg + +以广播的方式发送AMOP消息 + +**参数:** + +* topic: 广播topic。类型:``String`` +* content: 消息内容。类型:``byte[]`` + +**例子:** + +```java +// 初始化java SDK, 获得Amop对象 +BcosSDK bcosSDK = BcosSDK.build("config-example.toml"); +Amop amop = bcosSDK.getAmop(); +amop.start(); + +// 发送消息 +String content = "Send Message"; + +// 发送消息 +amop.broadcastAmopMsg("MyTopic", content.getBytes()); +``` + +### 1.4 unsubscribeTopic + +取消订阅话题。 + +**参数:** + +* topic: 取消订阅的话题。类型:``String`` + +**例子:** + +```java +// 发送消息 +amop.unsubscribeTopic("MyTopic"); +``` + +### 1.5 sendResponse + +回复消息。 + +**参数:** + +* endpoint: 接收消息的对端endpoint,`AmopRequestCallback`回调中返回。类型:``String`` +* seq: 消息seq,`AmopRequestCallback`回调中返回。类型:``String`` +* content: 回复消息内容。类型:``byte[]`` + +**例子:** + +```java +// 初始化java SDK, 获得Amop对象 +BcosSDK sdk = BcosSDK.build("config-example.toml"); +Amop amop = sdk.getAmop(); +// 启动amop +amop.start(); + +// 定义一个Callback,重写receiveAmopMsg方法,定义收到消息后的处理流程。 +AmopRequestCallback cb = new AmopRequestCallback() { + @Override + public void onRequest(String endpoint, String seq, byte[] data) { + // 这里将消息返回给发送端 + amop.sendResponse(endpoint, seq, data); + } +}; + +// 订阅话题 +amop.subscribeTopic("MyTopic", cb); +``` + +### 1.6 setCallback + +设置默认回调,`subscribeTopic`订阅topic指定的回调为空时,接收到消息时会调用设置的默认回调接口 + +**参数:** + +* cb: 回调。类型: ``AmopRequestCallback`` + +## 2. 示例 + +更多的示例请看[java-sdk-demo](https://github.com/FISCO-BCOS/java-sdk-demo)项目源码``java-sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/``下的代码示范,链接:[java-sdk-demo GitHub链接](https://github.com/FISCO-BCOS/java-sdk-demo),[java-sdk-demo Gitee链接](https://gitee.com/FISCO-BCOS/java-sdk-demo)。 + +* 示例: + + * Subscribe + * 功能: 订阅topic,并且将接收的消息直接返回给对端 + * 使用: + + ```shell + Usage: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Subscribe topic + Example: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Subscribe topic + ``` + + * Publish + * 功能: 发送AMOP单播消息 + * 使用: + + ```shell + Usage: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Publish topic msg + Example: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Publish topic HelloWorld + ``` + + * Broadcast + * 功能: 广播AMOP消息 + * 使用: + + ```shell + Usage: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Broadcast topic msg + Example: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Broadcast topic HelloWorld + ``` +## 2. 快速试用AMOP + +### 第一步:搭建FISCO BCOS区块链网络 + +参考[搭建第一个区块链网络](../quick_start/air_installation.md)搭建FISCO BCOS区块链网络。 + +### 第二步:下载项目 + +```shell +mkdir -p ~/fisco && cd ~/fisco +# 获取java-sdk代码 +git clone https://github.com/FISCO-BCOS/java-sdk-demo + +# 若因为网络问题导致长时间拉取失败,请尝试以下命令: +git clone https://gitee.com/FISCO-BCOS/java-sdk-demo + +cd java-sdk-demo +# 构建项目 +bash gradlew build +``` + +### 第三步:配置 + +* 复制证书:将你搭建FISCO BCOS网络节点``nodes/${ip}/sdk/`` 目录下的证书复制到``java-sdk-demo/dist/conf``目录下。 +```shell +# 进入dist目录 +cd dist +cp ~/fisco/nodes/127.0.0.1/sdk/* conf/ +``` + +* 修改配置 +```shell +cp conf/config-example.toml conf/config.toml +``` + +### 第四步:运行Demo + +**运行订阅者:** + +```shell +# 在java-sdk-demo/dist目录 +# 我们订阅名为”testTopic“的话题 +java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Subscribe testTopic +``` + +订阅方的终端输出 + +```shell +====== AMOP subscribe, topic: testTopic +``` + +然后,运行发送者Demo + +**单播消息**: + +```shell +# 调用Publish发送AMOP消息 +# 话题名:testTopic,内容:Tell you something +java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Publish testTopic "Tell you something" +``` + +终端输出: + +```shell +$ java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Publish testTopic "Tell you something" + + ====== AMOP publish, topic: testTopic ,msg: Tell you something + ====== AMOP publish send message + ==> receive response message from server + responseData: Tell you something + ====== AMOP publish send message + ==> receive response message from server + responseData: Tell you something +``` + +同时,返回到话题订阅者的终端,发现终端输出: + +```shell + ==> receive message from client + ==> endpoint: 127.0.0.1:20201 + ==> seq: 64f3f40832d6499f8a154c6205001081 + ==> data: Tell you something + ==> receive message from client + ==> endpoint: 127.0.0.1:20200 + ==> seq: c121fa99204346c0a87478117607a50b + ==> data: Tell you something +``` + +**广播消息**: + +```shell +# 调用Broadcast发送AMOP消息 +# 话题名:testTopic,内容:Tell you something= +java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Broadcast testTopic "Tell you something" +``` + +终端的输出 + +```shell +java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Broadcast testTopic "Tell you something" + ====== AMOP broadcast, topic: testTopic ,msg: Tell you something +``` + +同时,返回到话题订阅者的终端,发现终端输出: + +```java + ==> receive message from client + ==> endpoint: 127.0.0.1:20200 + ==> seq: 3d5e5bec03cf4693939912ed0236b611 + ==> receive message from client + ==> data: Tell you something +``` + +注意: + +1. 广播消息没有回包。 + +2. 接收方可能收到多条重复的广播信息。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/develop/api.md b/3.x/zh_CN/docs/develop/api.md index 968ddf3e0..24b01f618 100644 --- a/3.x/zh_CN/docs/develop/api.md +++ b/3.x/zh_CN/docs/develop/api.md @@ -1,4 +1,4 @@ -# RPC接口 +# 2. 区块链RPC接口 标签:``RPC`` @@ -14,13 +14,14 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - Client接口声明位于 `Client.java` 文件中 ``` -**特别注意:Client接口均有两种,一种是带有node的接口,另一种是不带node的接口。带有node的接口可以让节点RPC发送请求到指定已连接的节点。如果不指定,节点RPC则会随机发送请求到节点。** - +**特别注意:** +**1. Client接口均有两种,一种是带有node的接口,另一种是不带node的接口。带有node的接口可以让节点RPC发送请求到指定已连接的节点。如果不指定,节点RPC则会随机发送请求到节点。** +**2. 以下接口示例,都是关闭了节点ssl通信的前提下。若要关闭节点的ssl通信配置项,请将节点配置文件`config.ini`的 `[rpc]` 项设置为 `disable_ssl=true`。** ## 1. 合约操作接口 ### sendTransaction -发送交易到区块链RPC。 +发送交易到区块链。 **参数** @@ -32,6 +33,19 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BcosTransactionReceipt: 节点收到交易后,回复给SDK的回包,包括交易哈希信息。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"sendTransaction","params":["group0","","0x1a1c2606636861696e30360667726f7570304101fb564d36323332373833373230383636323235323233313231343039373038383134363030353536383536313037383031313639373432363032343636323131353337373138313837323836303337397d0001046b608060405234801561001057600080fd5b5060408051808201909152600d8082526c48656c6c6f2c20576f726c642160981b60209092019182526100459160009161004b565b5061011f565b828054610057906100e4565b90600052602060002090601f01602090048101928261007957600085556100bf565b82601f1061009257805160ff19168380011785556100bf565b828001600101855582156100bf579182015b828111156100bf5782518255916020019190600101906100a4565b506100cb9291506100cf565b5090565b5b808211156100cb57600081556001016100d0565b600181811c908216806100f857607f821691505b602082108114156101195763b95aa35560e01b600052602260045260246000fd5b50919050565b61033d8061012e6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063299f7f9d1461003b5780633590b49f14610059575b600080fd5b61004361006e565b60405161005091906101b0565b60405180910390f35b61006c61006736600461021b565b610100565b005b60606000805461007d906102cc565b80601f01602080910402602001604051908101604052809291908181526020018280546100a9906102cc565b80156100f65780601f106100cb576101008083540402835291602001916100f6565b820191906000526020600020905b8154815290600101906020018083116100d957829003601f168201915b5050505050905090565b8051610113906000906020840190610117565b5050565b828054610123906102cc565b90600052602060002090601f016020900481019282610145576000855561018b565b82601f1061015e57805160ff191683800117855561018b565b8280016001018555821561018b579182015b8281111561018b578251825591602001919060010190610170565b5061019792915061019b565b5090565b5b80821115610197576000815560010161019c565b600060208083528351808285015260005b818110156101dd578581018301518582016040015282016101c1565b818111156101ef576000604083870101525b50601f01601f1916929092016040019392505050565b63b95aa35560e01b600052604160045260246000fd5b60006020828403121561022d57600080fd5b813567ffffffffffffffff8082111561024557600080fd5b818401915084601f83011261025957600080fd5b81358181111561026b5761026b610205565b604051601f8201601f19908116603f0116810190838211818310171561029357610293610205565b816040528281528760208487010111156102ac57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600181811c908216806102e057607f821691505b602082108114156103015763b95aa35560e01b600052602260045260246000fd5b5091905056fea2646970667358221220ad3331f4f52a10ab9c50f2e63a46fd49fab3847ff4e17912290db8f009f89c9464736f6c634300080b003387000001565b7b22696e70757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a22636f6e7374727563746f72227d2c7b22696e70757473223a5b5d2c226e616d65223a22676574222c226f757470757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a22222c2274797065223a22737472696e67227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a226e222c2274797065223a22737472696e67227d5d2c226e616d65223a22736574222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d5d0b2d000020867fc7059f04e9f172202b777673a8413c9e47990dcd09b11311a2f1f5b55a4f3d0001008015e0c4a3a51b5b5b157502aae04f3905bae8daf1389bddf12b0eb7069ead63b76d42383dcd38520df339d571d37ea85334dba126edcc323a98b91e51d32ec074b5f7430ea78c64ccc8d364bf4563dbffb33be503344b72f3384f987c38af98db3f0f00169f2a6545d0920a1a6cb7f338b8b717f03d05fded80ddbbb171a099c1",true],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0x1" +} +``` + ### sendTransactionAsync 交易发布异步接口, 收到节点的响应之后,调用指定的callback。 @@ -60,6 +74,23 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - Call: 合约常量接口的返回结果,包括当前块高、接口执行状态信息以及接口执行结果 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"call","params":["group0","","0xc0523dbdd94ba27e14b0336d799489340ca24cdf","aaaa"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "blockNumber": 8, + "output": "0x", + "status": 16 + } +} +``` + ### callAsync 合约常量接口异步调用,接收到节点返回的合约接口执行结果后,执行指定的回调函数 @@ -87,6 +118,18 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - Code: 合约地址对应的合约代码。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getCode","params":["group0","node0","0x17826374dbb2025b30ddec39ba662349d76d8fc6"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063299f7f9d1461003b5780633590b49f14610059575b600080fd5b61004361006e565b60405161005091906101b0565b60405180910390f35b61006c61006736600461021b565b610100565b005b60606000805461007d906102cc565b80601f01602080910402602001604051908101604052809291908181526020018280546100a9906102cc565b80156100f65780601f106100cb576101008083540402835291602001916100f6565b820191906000526020600020905b8154815290600101906020018083116100d957829003601f168201915b5050505050905090565b8051610113906000906020840190610117565b5050565b828054610123906102cc565b90600052602060002090601f016020900481019282610145576000855561018b565b82601f1061015e57805160ff191683800117855561018b565b8280016001018555821561018b579182015b8281111561018b578251825591602001919060010190610170565b5061019792915061019b565b5090565b5b80821115610197576000815560010161019c565b600060208083528351808285015260005b818110156101dd578581018301518582016040015282016101c1565b818111156101ef576000604083870101525b50601f01601f1916929092016040019392505050565b63b95aa35560e01b600052604160045260246000fd5b60006020828403121561022d57600080fd5b813567ffffffffffffffff8082111561024557600080fd5b818401915084601f83011261025957600080fd5b81358181111561026b5761026b610205565b604051601f8201601f19908116603f0116810190838211818310171561029357610293610205565b816040528281528760208487010111156102ac57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600181811c908216806102e057607f821691505b602082108114156103015763b95aa35560e01b600052602260045260246000fd5b5091905056fea2646970667358221220ad3331f4f52a10ab9c50f2e63a46fd49fab3847ff4e17912290db8f009f89c9464736f6c634300080b0033" +} +``` ## 2. 区块链查询接口 ### getBlockNumber @@ -101,6 +144,19 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BlockNumber: Client对象对应的群组最新区块高度。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getBlockNumber","params":[],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": 8 +} +``` + ### getBlockNumberAsync 异步获取Client对象对应的群组最新块高。 @@ -129,6 +185,23 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - blockNumber: 群组的当前区块高度 - failedTxSum: 上链执行异常的交易总量 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getTotalTransactionCount","params":[],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "blockNumber": 8, + "failedTransactionCount": 0, + "transactionCount": 8 + } +} +``` + ### getTotalTransactionCountAsync 异步获取Client对应群组的交易统计信息,包括上链的交易数、上链失败的交易数目。 @@ -159,6 +232,34 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BcosBlock: 查询获取的区块信息 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getBlockByNumber","params":["group0","node0",4,false,false],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "consensusWeights": [], + "extraData": "0x5b636861696e5d0a736d5f63727970746f3a310a636861696e49443a20636861696e300a67726f7549443a2067726f7570300a5b636f6e73656e7379735d0a636f6e73656e7375735f747970653a20706266740a626c6f636b5f74785f636f756e745f6c696d69743a313030300a6c65616465725f706572696f643a310a5b76657273696f6e5d0a636f6d7061746962696c6974795f76657273696f6e3a332e332e300a5b74785d0a6761736c696d69743a333030303030303030300a5b6578656375746f725d0a69737761736d3a20300a697341757468436865636b3a310a6175746841646d696e4163636f756e743a3078623161656264613131326232306131303665653937666334353430343738613166636162343963630a697353657269616c457865637574653a310a6e6f64652e303a30303535646361663037336133333261613161643930666635336566303238363830643234663962663266636263303765633462626434383739343133663735313138613537306263663830303163343532366664623863313331396535316165363334343434333165633861623833393436356330356531373865376334392c310a6e6f64652e313a32613761656366346163663031306230633133363937653834666664346631383534343833353636323834353632316639333631363664383863663037336631366231646161363838336465343537653631323933373764323134313262346337373039396538613530653865613532313735326164636464656238623333312c310a6e6f64652e323a35333534333939303839373962383931373132383364636137383532303736336530613332633634363331643766333465653164336637346334303861333161616138353635633530393234626136383137636433336331336665396463393238653336623861316466303232666338323564333638376332623237333235382c310a6e6f64652e333a64643939616238383336373761386165663263326133383437623936373165353031626436393330373932373030333938363237656230613162613034666538313031353734356236323837626535663336373836633063633866663132653964643332313564633561343231306230313264373733333061373339613263332c310a", + "gasUsed": "0", + "hash": "0x47c6d9493171f62bf7201faa2e4766bbf058d95c0d76d605f965ff4b212e01f5", + "number": 0, + "parentInfo": [], + "receiptsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sealer": 0, + "sealerList": [], + "signatureList": [], + "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 0, + "transactions": [], + "txsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "version": 50528256 + } +} +``` ### getBlockByNumberAsync 根据区块高度异步获取区块信息。 @@ -194,6 +295,62 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BcosBlock: 查询获取的区块信息。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getBlockByHash","params":["group0","node0","0x2fbafbf71395bb07d1d6e142a06fa3cd9436aee3e91b5b9e6ffc5c47133c3738",true,true],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "consensusWeights": [ + 1, + 1, + 1, + 1 + ], + "extraData": "0x", + "gasUsed": "24363", + "hash": "0x2fbafbf71395bb07d1d6e142a06fa3cd9436aee3e91b5b9e6ffc5c47133c3738", + "number": 2, + "parentInfo": [ + { + "blockHash": "0x1498f2ff420fb9c240c7081b99bd76819c7348fb1a899095476afa29146c8874", + "blockNumber": 1 + } + ], + "receiptsRoot": "0xf18d1984c7745a826e4b8d608b823534f1e44b273f75972e16cf2ac3ff313e14", + "sealer": 1, + "sealerList": [ + "0x0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49", + "0x2a7aecf4acf010b0c13697e84ffd4f18544835662845621f936166d88cf073f16b1daa6883de457e6129377d21412b4c77099e8a50e8ea521752adcddeb8b331", + "0x535439908979b89171283dca78520763e0a32c64631d7f34ee1d3f74c408a31aaa8565c50924ba6817cd33c13fe9dc928e36b8a1df022fc825d3687c2b273258", + "0xdd99ab883677a8aef2c2a3847b9671e501bd6930792700398627eb0a1ba04fe81015745b6287be5f36786c0cc8ff12e9dd3215dc5a4210b012d77330a739a2c3" + ], + "signatureList": [ + { + "sealerIndex": 0, + "signature": "0xbc1c559adb2723b31b6f75d4f7bd06b204563d238ebc53774b0a621d586482573ae320a6dcca9bd03a2a6af0d8c368cdd660c56b27c8af0c154947f3e6252074" + }, + { + "sealerIndex": 1, + "signature": "0x3490744fc8370eb65649b8bb89a0a53623838e37e37bbb66e3f26f67e81dabe8b34a7e10d85520c475bf92cc89da705aa3d76a0b8316784733301e7af57004a6" + }, + { + "sealerIndex": 2, + "signature": "0x9b7f9b3d18b619ea66f2a028f9980c09b3a83c0a6595da0fed4441a175a165154973a5b21eabf817311d0305b6b194818fab7308335760d10b584c954cf052eb" + } + ], + "stateRoot": "0xc81a18b17f22851cd19f48d2fcf875bebea711d7b5823b99a983c2ecbfc48f1a", + "timestamp": 1680598474810, + "txsRoot": "0xdce357d4a81bfe2c9b9cc83fde7576a8ae8dede910b70cdf9abed71a32ed10bf", + "version": 50528256 + } +} +``` + ### getBlockByHashAsync 根据区块哈希异步获取区块信息。 @@ -225,6 +382,19 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BlockHash: 指定区块高度对应的区块哈希 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getBlockHashByNumber","params":["group0","",0],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0x47c6d9493171f62bf7201faa2e4766bbf058d95c0d76d605f965ff4b212e01f5" +} +``` + ### getBlockHashByNumberAsync 根据区块高度异步获取区块哈希 @@ -239,7 +409,7 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - 无 -### getTransactionByHash +### getTransaction 根据交易哈希获取交易信息。 @@ -253,9 +423,9 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BcosTransaction: 指定哈希对应的交易信息。 -### getTransactionByHashAsync +### getTransactionAsync -根据交易哈异步希获取交易信息。 +根据交易哈希异步获取交易信息。 **参数** @@ -282,9 +452,42 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BcosTransactionReceipt: 交易哈希对应的回执信息。 -### getTransactionReceiptAync +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getTransactionReceipt","params":["group0","node0","0xdce357d4a81bfe2c9b9cc83fde7576a8ae8dede910b70cdf9abed71a32ed10bf",true],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "blockNumber": 2, + "checksumContractAddress": "0x82A3c3289a9F234A38AcEED3016D1fF0E0F922B3", + "contractAddress": "0x82a3c3289a9f234a38aceed3016d1ff0e0f922b3", + "extraData": "", + "from": "0xf3293c3452b3b0479e64a4c612e8c1b0da5fe1af", + "gasUsed": "24363", + "hash": "0xf18d1984c7745a826e4b8d608b823534f1e44b273f75972e16cf2ac3ff313e14", + "input": "0x608060405234801561001057600080fd5b5060408051808201909152600d8082526c48656c6c6f2c20576f726c642160981b60209092019182526100459160009161004b565b5061011f565b828054610057906100e4565b90600052602060002090601f01602090048101928261007957600085556100bf565b82601f1061009257805160ff19168380011785556100bf565b828001600101855582156100bf579182015b828111156100bf5782518255916020019190600101906100a4565b506100cb9291506100cf565b5090565b5b808211156100cb57600081556001016100d0565b600181811c908216806100f857607f821691505b602082108114156101195763b95aa35560e01b600052602260045260246000fd5b50919050565b61033d8061012e6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063299f7f9d1461003b5780633590b49f14610059575b600080fd5b61004361006e565b60405161005091906101b0565b60405180910390f35b61006c61006736600461021b565b610100565b005b60606000805461007d906102cc565b80601f01602080910402602001604051908101604052809291908181526020018280546100a9906102cc565b80156100f65780601f106100cb576101008083540402835291602001916100f6565b820191906000526020600020905b8154815290600101906020018083116100d957829003601f168201915b5050505050905090565b8051610113906000906020840190610117565b5050565b828054610123906102cc565b90600052602060002090601f016020900481019282610145576000855561018b565b82601f1061015e57805160ff191683800117855561018b565b8280016001018555821561018b579182015b8281111561018b578251825591602001919060010190610170565b5061019792915061019b565b5090565b5b80821115610197576000815560010161019c565b600060208083528351808285015260005b818110156101dd578581018301518582016040015282016101c1565b818111156101ef576000604083870101525b50601f01601f1916929092016040019392505050565b63b95aa35560e01b600052604160045260246000fd5b60006020828403121561022d57600080fd5b813567ffffffffffffffff8082111561024557600080fd5b818401915084601f83011261025957600080fd5b81358181111561026b5761026b610205565b604051601f8201601f19908116603f0116810190838211818310171561029357610293610205565b816040528281528760208487010111156102ac57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600181811c908216806102e057607f821691505b602082108114156103015763b95aa35560e01b600052602260045260246000fd5b5091905056fea2646970667358221220ad3331f4f52a10ab9c50f2e63a46fd49fab3847ff4e17912290db8f009f89c9464736f6c634300080b0033", + "logEntries": [], + "message": "", + "output": "0x", + "receiptProof": [], + "status": 0, + "to": "", + "transactionHash": "0xdce357d4a81bfe2c9b9cc83fde7576a8ae8dede910b70cdf9abed71a32ed10bf", + "transactionProof": [], + "txReceiptProof": [ + "f18d1984c7745a826e4b8d608b823534f1e44b273f75972e16cf2ac3ff313e14" + ], + "version": 0 + } +} +``` +### getTransactionReceiptAsync -根据交易哈希获取交易回执信息。 +根据交易哈希异步获取交易回执信息。 **参数** @@ -309,6 +512,18 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - PendingTxSize: 交易池内未处理的交易数目。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getPendingTxSize","params":["group0","node0"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": 0 +} +``` ### getPendingTxSizeAsync 获取交易池内未处理的交易数目。 @@ -339,19 +554,80 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java **参数** -- endpoint: 被查询的节点的`IP:Port`。 +- 无 **返回值** - Peers: 指定节点的网络连接信息。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getPeers","params":["group0"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "endPoint": "0.0.0.0:30300", + "groupNodeIDInfo": [ + { + "group": "group0", + "nodeIDList": [ + "0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49" + ] + } + ], + "p2pNodeID": "0463f180720373a05c4e0dd5244a88b278eae3f28f162d3b7c51d53a150f7dca570ef9d0f438170d6108a7a32a856b193486bc69624c2893669dcc32790222c6f9", + "peers": [ + { + "endPoint": "127.0.0.1:30301", + "groupNodeIDInfo": [ + { + "group": "group0", + "nodeIDList": [ + "535439908979b89171283dca78520763e0a32c64631d7f34ee1d3f74c408a31aaa8565c50924ba6817cd33c13fe9dc928e36b8a1df022fc825d3687c2b273258" + ] + } + ], + "p2pNodeID": "046a4ed7691832667c6cb49fadd367f761f6118138256f040e3afdbea3852416d2796907fd0d968b951e08ab5efd8071e408a25288b0bf19b38aee00a0b2700a0b" + }, + { + "endPoint": "127.0.0.1:50168", + "groupNodeIDInfo": [ + { + "group": "group0", + "nodeIDList": [ + "dd99ab883677a8aef2c2a3847b9671e501bd6930792700398627eb0a1ba04fe81015745b6287be5f36786c0cc8ff12e9dd3215dc5a4210b012d77330a739a2c3" + ] + } + ], + "p2pNodeID": "04b59db5c18b0ebdf20f8dbd5bfa2e00d5ee68d98abe8029785f7cb387910c4f6f6512a07363711e9cdb96c9e5595827f8cd3075e70629899891169d8b512cc140" + }, + { + "endPoint": "127.0.0.1:30302", + "groupNodeIDInfo": [ + { + "group": "group0", + "nodeIDList": [ + "2a7aecf4acf010b0c13697e84ffd4f18544835662845621f936166d88cf073f16b1daa6883de457e6129377d21412b4c77099e8a50e8ea521752adcddeb8b331" + ] + } + ], + "p2pNodeID": "045b7fa3b9a7e9d37b2be0d4d5eeb1bc01e2d01567ed2b638c5e5e1a26a9e14a9735decac90a3aba6b4dac09a23250e8c665bd67f75a1e1d5f4027ea724968ff45" + } + ] + } +} +``` + ### getPeersAsync 异步获取指定节点的网络连接信息。 **参数** -- endpoint:被查询的节点的`IP:Port`。 - callback:获取之后的回调 **返回值** @@ -370,6 +646,18 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - SyncStatus: 区块链节点同步状态。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getSyncStatus","params":["group0"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": "{\"archivedBlockNumber\":0,\"blockNumber\":7,\"genesisHash\":\"47c6d9493171f62bf7201faa2e4766bbf058d95c0d76d605f965ff4b212e01f5\",\"isSyncing\":false,\"knownHighestNumber\":7,\"knownLatestHash\":\"ef49fef70085ec4ae736c1e82ba74e98a860a53763f2484b8254b0d08a2c6865\",\"latestHash\":\"ef49fef70085ec4ae736c1e82ba74e98a860a53763f2484b8254b0d08a2c6865\",\"nodeID\":\"0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49\",\"peers\":[{\"archivedBlockNumber\":0,\"blockNumber\":7,\"genesisHash\":\"47c6d9493171f62bf7201faa2e4766bbf058d95c0d76d605f965ff4b212e01f5\",\"latestHash\":\"ef49fef70085ec4ae736c1e82ba74e98a860a53763f2484b8254b0d08a2c6865\",\"nodeID\":\"2a7aecf4acf010b0c13697e84ffd4f18544835662845621f936166d88cf073f16b1daa6883de457e6129377d21412b4c77099e8a50e8ea521752adcddeb8b331\"},{\"archivedBlockNumber\":0,\"blockNumber\":7,\"genesisHash\":\"47c6d9493171f62bf7201faa2e4766bbf058d95c0d76d605f965ff4b212e01f5\",\"latestHash\":\"ef49fef70085ec4ae736c1e82ba74e98a860a53763f2484b8254b0d08a2c6865\",\"nodeID\":\"535439908979b89171283dca78520763e0a32c64631d7f34ee1d3f74c408a31aaa8565c50924ba6817cd33c13fe9dc928e36b8a1df022fc825d3687c2b273258\"},{\"archivedBlockNumber\":0,\"blockNumber\":7,\"genesisHash\":\"47c6d9493171f62bf7201faa2e4766bbf058d95c0d76d605f965ff4b212e01f5\",\"latestHash\":\"ef49fef70085ec4ae736c1e82ba74e98a860a53763f2484b8254b0d08a2c6865\",\"nodeID\":\"dd99ab883677a8aef2c2a3847b9671e501bd6930792700398627eb0a1ba04fe81015745b6287be5f36786c0cc8ff12e9dd3215dc5a4210b012d77330a739a2c3\"}]}\n" +} +``` ### getSyncStatusAsync 异步获取节点同步状态。 @@ -396,6 +684,20 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - SystemConfig: 系统配置项的值。 +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getSystemConfigByKey","params":["group0","node0","tx_count_limit"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "blockNumber": 0, + "value": "1000" + } +} +``` ### getSystemConfigByKeyAsync 根据指定配置关键字异步获取系统配置项的值。 @@ -424,6 +726,20 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - ObserverList: 观察节点列表。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getObserverList","params":[],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": [ + "dd99ab883677a8aef2c2a3847b9671e501bd6930792700398627eb0a1ba04fe81015745b6287be5f36786c0cc8ff12e9dd3215dc5a4210b012d77330a739a2c3" + ] +} +``` ### getObserverListAsync 异步获取Client对应群组的观察节点列表。 @@ -449,7 +765,33 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - SealerList: 共识节点列表。 -### getSealerListAsycn +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getSealerList","params":[],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": [ + { + "nodeID": "0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49", + "weight": 1 + }, + { + "nodeID": "2a7aecf4acf010b0c13697e84ffd4f18544835662845621f936166d88cf073f16b1daa6883de457e6129377d21412b4c77099e8a50e8ea521752adcddeb8b331", + "weight": 1 + }, + { + "nodeID": "535439908979b89171283dca78520763e0a32c64631d7f34ee1d3f74c408a31aaa8565c50924ba6817cd33c13fe9dc928e36b8a1df022fc825d3687c2b273258", + "weight": 1 + } + ] +} +``` + +### getSealerListAsync 异步获取Client对应群组的共识节点列表。 @@ -473,6 +815,19 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java **返回值** - PbftView: PBFT视图信息。 + +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getPbftView","params":["group0","node0"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": 3 +} +``` ### getPbftViewAsync @@ -481,10 +836,11 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java **参数** - node:可让RPC发送请求到指定节点 +- callback:获取PBFT视图信息之后的回调 **返回值** -- PbftView: PBFT视图信息。 +- 无 ### getConsensusStatus @@ -498,6 +854,19 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - ConsensusStatus: 节点共识状态。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getConsensusStatus","params":["group0","node0"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": "{\"blockNumber\":7,\"changeCycle\":0,\"connectedNodeList\":4,\"consensusNodeList\":[{\"index\":0,\"nodeID\":\"0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49\",\"weight\":1},{\"index\":1,\"nodeID\":\"2a7aecf4acf010b0c13697e84ffd4f18544835662845621f936166d88cf073f16b1daa6883de457e6129377d21412b4c77099e8a50e8ea521752adcddeb8b331\",\"weight\":1},{\"index\":2,\"nodeID\":\"535439908979b89171283dca78520763e0a32c64631d7f34ee1d3f74c408a31aaa8565c50924ba6817cd33c13fe9dc928e36b8a1df022fc825d3687c2b273258\",\"weight\":1},{\"index\":3,\"nodeID\":\"dd99ab883677a8aef2c2a3847b9671e501bd6930792700398627eb0a1ba04fe81015745b6287be5f36786c0cc8ff12e9dd3215dc5a4210b012d77330a739a2c3\",\"weight\":1}],\"consensusNodesNum\":4,\"hash\":\"ef49fef70085ec4ae736c1e82ba74e98a860a53763f2484b8254b0d08a2c6865\",\"index\":0,\"isConsensusNode\":true,\"leaderIndex\":3,\"maxFaultyQuorum\":1,\"minRequiredQuorum\":3,\"nodeID\":\"0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49\",\"timeout\":false,\"view\":3}\n" +} +``` + ### getConsensusStatusAsync 异步获取节点共识状态。 @@ -525,6 +894,63 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BcosGroupInfo: 被查询的群组状态信息。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getGroupInfo","params":["group0","node1"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "chainID": "chain0", + "genesisConfig": "{\"blockTxCountLimit\":1000,\"consensusLeaderPeriod\":1,\"consensusType\":\"pbft\",\"sealerList\":[{\"nodeID\":\"0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49\",\"weight\":1},{\"nodeID\":\"2a7aecf4acf010b0c13697e84ffd4f18544835662845621f936166d88cf073f16b1daa6883de457e6129377d21412b4c77099e8a50e8ea521752adcddeb8b331\",\"weight\":1},{\"nodeID\":\"535439908979b89171283dca78520763e0a32c64631d7f34ee1d3f74c408a31aaa8565c50924ba6817cd33c13fe9dc928e36b8a1df022fc825d3687c2b273258\",\"weight\":1},{\"nodeID\":\"dd99ab883677a8aef2c2a3847b9671e501bd6930792700398627eb0a1ba04fe81015745b6287be5f36786c0cc8ff12e9dd3215dc5a4210b012d77330a739a2c3\",\"weight\":1}],\"txGasLimit\":3000000000}\n", + "groupID": "group0", + "iniConfig": "", + "nodeList": [ + { + "iniConfig": "{\"binaryInfo\":{\"buildTime\":\"20230403 11:55:56\",\"gitCommitHash\":\"114364de7db1ba3c0461b3813621ce7caedc4f2f\",\"platform\":\"Darwin/appleclang\",\"version\":\"3.3.0\"},\"chainID\":\"chain0\",\"gatewayServiceName\":\"\",\"groupID\":\"group0\",\"isAuthCheck\":true,\"isSerialExecute\":true,\"isWasm\":false,\"nodeID\":\"0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49\",\"nodeName\":\"0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49\",\"rpcServiceName\":\"\",\"smCryptoType\":true}\n", + "microService": false, + "name": "0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49", + "nodeID": "0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49", + "protocol": { + "compatibilityVersion": 50528256, + "maxSupportedVersion": 1, + "minSupportedVersion": 0 + }, + "serviceInfo": [ + { + "serviceName": "LedgerServiceObj", + "type": 2 + }, + { + "serviceName": "SchedulerServiceObj", + "type": 3 + }, + { + "serviceName": "FrontServiceObj", + "type": 4 + }, + { + "serviceName": "", + "type": 6 + }, + { + "serviceName": "", + "type": 7 + }, + { + "serviceName": "TxPoolServiceObj", + "type": 8 + } + ], + "type": 1 + } + ] + } +} +``` ### getGroupInfoAsync 异步查询当前群组的状态信息。 @@ -549,6 +975,25 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BcosGroupList: 当前节点的群组列表。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getGroupList","params":["group0","node1"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "code": 0, + "groupList": [ + "group0" + ], + "msg": "success" + } +} +``` + ### getGroupListAsync 异步获取当前节点的群组列表。 @@ -573,6 +1018,23 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - GroupPeers: 指定群组连接的节点列表。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getGroupPeers","params":["group0","node1"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": [ + "0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49", + "2a7aecf4acf010b0c13697e84ffd4f18544835662845621f936166d88cf073f16b1daa6883de457e6129377d21412b4c77099e8a50e8ea521752adcddeb8b331", + "535439908979b89171283dca78520763e0a32c64631d7f34ee1d3f74c408a31aaa8565c50924ba6817cd33c13fe9dc928e36b8a1df022fc825d3687c2b273258", + "dd99ab883677a8aef2c2a3847b9671e501bd6930792700398627eb0a1ba04fe81015745b6287be5f36786c0cc8ff12e9dd3215dc5a4210b012d77330a739a2c3" + ] +} +``` ### getGroupPeersAsync 异步获取当前节点指定群组连接的节点列表。 @@ -597,6 +1059,65 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BcosGroupInfoList: 当前节点群组信息列表。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getGroupInfoList","params":["group0","node1"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": [ + { + "chainID": "chain0", + "genesisConfig": "{\"blockTxCountLimit\":1000,\"consensusLeaderPeriod\":1,\"consensusType\":\"pbft\",\"sealerList\":[{\"nodeID\":\"0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49\",\"weight\":1},{\"nodeID\":\"2a7aecf4acf010b0c13697e84ffd4f18544835662845621f936166d88cf073f16b1daa6883de457e6129377d21412b4c77099e8a50e8ea521752adcddeb8b331\",\"weight\":1},{\"nodeID\":\"535439908979b89171283dca78520763e0a32c64631d7f34ee1d3f74c408a31aaa8565c50924ba6817cd33c13fe9dc928e36b8a1df022fc825d3687c2b273258\",\"weight\":1},{\"nodeID\":\"dd99ab883677a8aef2c2a3847b9671e501bd6930792700398627eb0a1ba04fe81015745b6287be5f36786c0cc8ff12e9dd3215dc5a4210b012d77330a739a2c3\",\"weight\":1}],\"txGasLimit\":3000000000}\n", + "groupID": "group0", + "iniConfig": "", + "nodeList": [ + { + "iniConfig": "{\"binaryInfo\":{\"buildTime\":\"20230403 11:55:56\",\"gitCommitHash\":\"114364de7db1ba3c0461b3813621ce7caedc4f2f\",\"platform\":\"Darwin/appleclang\",\"version\":\"3.3.0\"},\"chainID\":\"chain0\",\"gatewayServiceName\":\"\",\"groupID\":\"group0\",\"isAuthCheck\":true,\"isSerialExecute\":true,\"isWasm\":false,\"nodeID\":\"0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49\",\"nodeName\":\"0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49\",\"rpcServiceName\":\"\",\"smCryptoType\":true}\n", + "microService": false, + "name": "0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49", + "nodeID": "0055dcaf073a332aa1ad90ff53ef028680d24f9bf2fcbc07ec4bbd4879413f75118a570bcf8001c4526fdb8c1319e51ae63444431ec8ab839465c05e178e7c49", + "protocol": { + "compatibilityVersion": 50528256, + "maxSupportedVersion": 1, + "minSupportedVersion": 0 + }, + "serviceInfo": [ + { + "serviceName": "LedgerServiceObj", + "type": 2 + }, + { + "serviceName": "SchedulerServiceObj", + "type": 3 + }, + { + "serviceName": "FrontServiceObj", + "type": 4 + }, + { + "serviceName": "", + "type": 6 + }, + { + "serviceName": "", + "type": 7 + }, + { + "serviceName": "TxPoolServiceObj", + "type": 8 + } + ], + "type": 1 + } + ] + } + ] +} +``` ### getGroupInfoListAsync 异步获取当前节点群组信息列表。 @@ -621,6 +1142,18 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - BcosGroupNodeInfo: 查询获取的节点信息。 +**示例:** +``` +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"getGroupNodeInfo","params":["group0","node1"],"id":1}' http://127.0.0.1:20200 + +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": null +} +``` ### getGroupNodeInfoAsync 异步获取群组内指定节点的信息。 @@ -670,7 +1203,7 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java - name:合约名 - version:版本名 -- address:合约地址 +- contractAddress:合约地址 - abi:合约ABI **返回值** @@ -770,7 +1303,7 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java **参数** -- tableName: 需要插入记录的表名; +- kvTablePrecompiled: 需要插入记录的表名; - key: 主key被设置的值; - fieldNameToValue: 每个field到其对应值的映射。 @@ -789,7 +1322,7 @@ Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java **返回值** -- Map: 查询结果。 +- String: 查询结果。 #### desc diff --git a/3.x/zh_CN/docs/develop/committee_usage.md b/3.x/zh_CN/docs/develop/committee_usage.md index f9337a6ed..904877537 100644 --- a/3.x/zh_CN/docs/develop/committee_usage.md +++ b/3.x/zh_CN/docs/develop/committee_usage.md @@ -149,9 +149,9 @@ init_auth_address="0x976fe0c250181c7ef68a17d3bc34916978da103a" ## 控制台使用 -控制台有提供权限治理专属的命令,以及切换控制台账户的命令。用户可以通过控制台操作权限的治理,详情请参考:[权限操作命令](./console/console_commands.html#id14)。权限治理的命令只有控制台连入了开启权限治理的节点才会出现。 +控制台有提供权限治理专属的命令,以及切换控制台账户的命令。用户可以通过控制台操作权限的治理,详情请参考:[权限操作命令](../operation_and_maintenance/console/console_commands.html#id14)。权限治理的命令只有控制台连入了开启权限治理的节点才会出现。 -控制台操作命令包含以下三种类型,详情请参考[权限操作命令](./console/console_commands.html#id14): +控制台操作命令包含以下三种类型,详情请参考[权限操作命令](../operation_and_maintenance/console/console_commands.html#id14): - 查询状态命令,该命令没有权限控制,所有账户均可访问。 - 治理委员专用命令,这些命令只能持有治理委员的账户才可以使用。 diff --git a/3.x/zh_CN/docs/develop/console/index.md b/3.x/zh_CN/docs/develop/console/index.md deleted file mode 100644 index 88e9b4a25..000000000 --- a/3.x/zh_CN/docs/develop/console/index.md +++ /dev/null @@ -1,38 +0,0 @@ -# 控制台 - -标签:``console`` ``控制台`` ``命令行交互工具`` - ---------- - -```eval_rst -.. important:: - - ``控制台`` 只支持FISCO BCOS 3.0+版本,基于 `Java SDK <../sdk/java_sdk/index.html>`_ 实现。 - - 可通过命令 ``./start.sh --version`` 查看当前控制台版本 -``` - -[控制台](https://github.com/FISCO-BCOS/console)是FISCO BCOS 3.0重要的交互式客户端工具,它通过[Java SDK](../sdk/java_sdk/index.md)与区块链节点建立连接,实现对区块链节点数据的读写访问请求。控制台拥有丰富的命令,包括查询区块链状态、管理区块链节点、部署并调用合约等。此外,控制台提供一个合约编译工具,用户可以方便快捷的将Solidity和webankblockchain-liquid合约文件编译后的WASM文件转换为Java合约文件。 - -```eval_rst -.. important:: - 相关软件和环境版本说明!`请查看 `_ -``` - -命令行交互控制台是提供给开发者使用的节点查询与管理的工具。 - -控制台拥有丰富的命令,包括查询区块链状态、管理区块链节点、部署并调用合约等。 - -```eval_rst -.. important:: - 访问FISCO BCOS 3.x区块链须使用 ``>= v3.x`` 版本的控制台,不能使用 ``2.x`` 或 ``1.x`` 版本的控制台。 -``` - -使用手册: - -```eval_rst -.. toctree:: - :maxdepth: 2 - - console_config.md - console_commands.md - console_error.md -``` diff --git a/3.x/zh_CN/docs/develop/console_deploy_contract.md b/3.x/zh_CN/docs/develop/console_deploy_contract.md new file mode 100644 index 000000000..1a29300e0 --- /dev/null +++ b/3.x/zh_CN/docs/develop/console_deploy_contract.md @@ -0,0 +1,171 @@ +# 5. 控制台部署调用合约 + +----- + +本文档描述如何配置控制台,介绍控制台如何部署合约与调用合约 + +## 1. 下载配置控制台 +### 第一步. 安装控制台依赖 + +控制台运行依赖java环境(推荐使用java 14),安装命令如下: + +```shell +# ubuntu系统安装java +sudo apt install -y default-jdk + +# centos系统安装java +sudo yum install -y java java-devel +``` + +### 第二步. 下载控制台 + +```shell +cd ~/fisco && curl -LO https://github.com/FISCO-BCOS/console/releases/download/v3.5.0/download_console.sh && bash download_console.sh +``` + +```eval_rst +.. note:: + - 如果因为网络问题导致长时间无法下载,请尝试 cd ~/fisco && curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master/tools/download_console.sh +``` + +### 第三步. 配置控制台 + +- 拷贝控制台配置文件 + +```shell +cp -n console/conf/config-example.toml console/conf/config.toml +``` + +```eval_rst +.. note:: + 若节点未采用默认端口,请将文件中的20200替换成节点对应的rpc端口,可通过节点config.ini的 ``[rpc].listen_port``配置项获取节点的rpc端口。 +``` + +- 配置控制台证书 + +控制台与节点之间默认开启SSL连接,控制台需要配置证书才可连接节点。开发建链脚本在生成节点的同时,生成了SDK证书,可直接拷贝生成的证书供控制台使用: + +```shell +cp -r nodes/127.0.0.1/sdk/* console/conf +``` + +### 第四步. 启动并使用控制台 + +```eval_rst +.. note:: + - 请确保机器的30300~30303,20200~20203端口没有被占用。 + - 控制台的配置方法和命令请参考 `这里 <../operation_and_maintenance/console/index.html>`_ 实现。 +``` + +- 启动 + +```shell +cd ~/fisco/console && bash start.sh +``` + +输出下述信息表明启动成功 否则请检查conf/config.toml中节点端口配置是否正确 + +```shell +============================================================================================= +Welcome to FISCO BCOS console(3.4.0)! +Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console. + ________ ______ ______ ______ ______ _______ ______ ______ ______ +| | \/ \ / \ / \ | \ / \ / \ / \ +| $$$$$$$$\$$$$$| $$$$$$| $$$$$$| $$$$$$\ | $$$$$$$| $$$$$$| $$$$$$| $$$$$$\ +| $$__ | $$ | $$___\$| $$ \$| $$ | $$ | $$__/ $| $$ \$| $$ | $| $$___\$$ +| $$ \ | $$ \$$ \| $$ | $$ | $$ | $$ $| $$ | $$ | $$\$$ \ +| $$$$$ | $$ _\$$$$$$| $$ __| $$ | $$ | $$$$$$$| $$ __| $$ | $$_\$$$$$$\ +| $$ _| $$_| \__| $| $$__/ | $$__/ $$ | $$__/ $| $$__/ | $$__/ $| \__| $$ +| $$ | $$ \\$$ $$\$$ $$\$$ $$ | $$ $$\$$ $$\$$ $$\$$ $$ + \$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ + +============================================================================================= +``` + + +## 2. 部署和调用合约 + +### 第一步. 编写HelloWorld合约 + +HelloWorld合约提供了两个接口`get()`和`set()`,用于获取/设置合约变量`name`,合约内容如下: + +```shell +pragma solidity >=0.6.10 <0.8.20; +contract HelloWorld { + string name; + + constructor() public { + name = "Hello, World!"; + } + + function get() public view returns (string memory) { + return name; + } + + function set(string memory n) public { + name = n; + } +} +``` + +### 第二步. 部署HelloWorld合约 + +为了方便用户快速体验,HelloWorld合约已经内置于控制台中,位于控制台目录`contracts/solidity/HelloWorld.sol`,参考下面命令部署: + +```shell +# 在控制台输入以下指令 部署成功则返回合约地址 +[group0]: /> deploy HelloWorld +transaction hash: 0x796b573aece250bba891b9251b8fb464d22f41cb36e7cae407b2bd0a870f5b72 +contract address: 0x6849F21D1E455e9f0712b1e99Fa4FCD23758E8F1 +currentAccount: 0x7b047472a4516e9697446576f8c7fcc064f967fa + +# 查看当前块高 +[group0]: /> getBlockNumber +1 +``` + +### 第三步. 调用HelloWorld合约 + +```shell +# 调用get接口获取name变量,此处的合约地址是deploy指令返回的地址 +[group0]: /> call HelloWorld 0x6849F21D1E455e9f0712b1e99Fa4FCD23758E8F1 get +--------------------------------------------------------------------------------------------- +Return code: 0 +description: transaction executed successfully +Return message: Success +--------------------------------------------------------------------------------------------- +Return value size:1 +Return types: (string) +Return values:(Hello, World!) +--------------------------------------------------------------------------------------------- + +# 查看当前块高,块高不变,因为get接口不更改账本状态 +[group0]: /> getBlockNumber +1 + +# 调用set方法设置name +[group0]: /> call HelloWorld 0x6849F21D1E455e9f0712b1e99Fa4FCD23758E8F1 set "Hello, FISCO BCOS" +transaction hash: 0x2f7c85c2c59a76ccaad85d95b09497ad05ca7983c5ec79c8f9d102d1c8dddc30 +--------------------------------------------------------------------------------------------- +transaction status: 0 +description: transaction executed successfully +--------------------------------------------------------------------------------------------- +Receipt message: Success +Return message: Success +Return value size:0 +Return types: () +Return values:() +--------------------------------------------------------------------------------------------- +Event logs +Event: {} + +# 查看当前块高,因为set接口修改了账本状态,块高增加到2 +[group0]: /> getBlockNumber +2 + +# 退出控制台 +[group0]: /> exit +``` + +至此,我们完成了控制台的配置和使用,并介绍了如何通过控制台部署和调用合约,关于更多的控制台使用教程可参考[这里](../operation_and_maintenance/console/index.md)。 + diff --git a/3.x/zh_CN/docs/develop/contract_life_cycle.md b/3.x/zh_CN/docs/develop/contract_life_cycle.md index 634ac4670..994d3d421 100644 --- a/3.x/zh_CN/docs/develop/contract_life_cycle.md +++ b/3.x/zh_CN/docs/develop/contract_life_cycle.md @@ -1,4 +1,4 @@ -# 合约生命周期与权限管理 +# 4. 合约生命周期与权限管理 标签:``合约管理`` ``合约生命周期`` ``部署合约`` ``调用合约`` ``冻结合约`` ``废止合约`` @@ -29,14 +29,14 @@ FISCO BCOS平台支持Solidity、Liquid、Precompiled三种智能合约使用形 [Liquid官方文档](https://liquid-doc.readthedocs.io/zh_CN/latest/) -[预编译合约使用文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/precompiled/index.html) +[预编译合约使用文档](../contract_develop/c++_contract/index.md) ## 2. 智能合约部署与调用 用户完成智能合约的开发之后,将智能合约部署上链并发起调用交易。用户可通过[SDK](./sdk/index.md)将编译好的合约打包成交易发送到FISCO BCOS区块链节点上链。社区已提供高度包装的工具,用户可快速开箱使用: -- 使用控制台: [控制台](./console/index.md),控制台包装了Java SDK,提供命令行交互功能,供给开发者使用的节点查询与管理的工具。 -- 使用Java合约生成工具:[Java合约生成工具](./console/console_config.html#java)支持Solidity的自动编译并生成Java文件、支持指定wbc-liquid编译后的WASM文件以及ABI文件生成Java文件。 +- 使用控制台: [控制台](../operation_and_maintenance/console/index.md),控制台包装了Java SDK,提供命令行交互功能,供给开发者使用的节点查询与管理的工具。 +- 使用Java合约生成工具:[Java合约生成工具](../operation_and_maintenance/console/console_config.html#java)支持Solidity的自动编译并生成Java文件、支持指定wbc-liquid编译后的WASM文件以及ABI文件生成Java文件。 **延伸阅读** @@ -44,9 +44,9 @@ FISCO BCOS平台支持Solidity、Liquid、Precompiled三种智能合约使用形 [开发第一个Liquid区块链应用](../quick_start/wbc_liquid_application.md) -[Gradle SpringBoot 应用示例](./sdk/java_sdk/spring_boot_starter.md) +[Gradle SpringBoot 应用示例](../sdk/java_sdk/spring_boot_starter.md) -[Maven SpringBoot 应用示例](./sdk/java_sdk/spring_boot_crud.md) +[Maven SpringBoot 应用示例](../sdk/java_sdk/spring_boot_crud.md) ## 3. 智能合约数据存储 @@ -70,7 +70,7 @@ FISCO BCOS平台支持Solidity、Liquid、Precompiled三种智能合约使用形 - 保留旧合约数据升级的情况较为复杂,具体解决方案有以下几种: - (推荐)用户在开发智能合约时就需要主动将合约分为 **逻辑合约** 和 **数据合约**,数据合约用于存储需要在链上存储的数据,开放数据读写接口供逻辑合约使用,逻辑合约在计算时调用数据合约的读写接口。当需要升级时,只需要升级逻辑合约,新的逻辑合约调用旧的数据合约接口,旧的逻辑合约不再使用。 - - (推荐)相当于第一种方案的扩展,需要存储的数据都使用CRUD数据接口进行存储,CRUD的数据是通过节点共识并持久存储在链上的。详情请参考[使用CRUD预编译合约开发应用](./precompiled/use_crud_precompiled.md),[使用KV存储预编译合约开发应用](./precompiled/use_kv_precompiled.md) + - (推荐)相当于第一种方案的扩展,需要存储的数据都使用CRUD数据接口进行存储,CRUD的数据是通过节点共识并持久存储在链上的。详情请参考[使用CRUD预编译合约开发应用](../contract_develop/c++_contract/use_crud_precompiled.md),[使用KV存储预编译合约开发应用](../contract_develop/c++_contract/use_kv_precompiled.md) - 通过使用delegate call的代理合约主动调用逻辑合约,产生的状态数据均保存在代理合约中,逻辑合约保持接口不变的情况下可以升级。 - 不保留数据升级的情况更加简单,用户将升级的合约重新部署,将会有新的地址。应用基于新地址的合约进行操作即可,也将使用新合约的数据,旧合约记录的数据将存在链上,需要应用主动避免新业务逻辑调用旧合约数据。 @@ -78,7 +78,7 @@ FISCO BCOS平台支持Solidity、Liquid、Precompiled三种智能合约使用形 ```eval_rst .. important:: - 合约生命周期管理冻结、解冻、废止操作以及合约部署调用权限控制,均需要将开启区块链权限模式,详情请参考`【权限治理使用指南】 `_ + 合约生命周期管理冻结、解冻、废止操作以及合约部署调用权限控制,均需要将开启区块链权限模式,详情请参考`权限治理使用指南 `_ ``` 在开启区块链权限模式之后,每次合约部署将在存储层创建合约存储数据表之外,会额外创建一张合约权限数据表,用于记录合约管理员地址、合约状态、合约接口ACL。默认情况下,合约的管理员地址就是发起部署合约操作的账户地址(如果存在合约创建合约,合约管理员地址为交易发起账户tx.origin)。 @@ -127,7 +127,7 @@ abstract contract AuthManagerPrecompiled { 兼容性说明:合约生命周期管理废止操作只能在节点版本3.2以上进行。 ``` -合约管理员也可以通过控制台对合约进行冻结等操作,详情请看:[冻结合约命令](./console/console_commands.html#freezecontract)、[解冻合约命令](./console/console_commands.html#unfreezecontract) +合约管理员也可以通过控制台对合约进行冻结等操作,详情请看:[冻结合约命令](../operation_and_maintenance/console/console_commands.html#freezecontract)、[解冻合约命令](../operation_and_maintenance/console/console_commands.html#unfreezecontract) ### 5.2 智能合约部署权限控制 @@ -135,7 +135,7 @@ abstract contract AuthManagerPrecompiled { 部署权限记录在BFS目录/apps下,这代表着允许在/apps目录下的写权限。 -治理委员可以通过控制台进行部署合约权限控制等操作,详情请看 [设置部署权限类型提案](./console/console_commands.html#setdeployauthtypeproposal) 、[开启部署权限提案](./console/console_commands.html#opendeployauthproposal) 、[关闭部署权限提案](./console/console_commands.html#closedeployauthproposal) +治理委员可以通过控制台进行部署合约权限控制等操作,详情请看 [设置部署权限类型提案](../operation_and_maintenance/console/console_commands.html#setdeployauthtypeproposal) 、[开启部署权限提案](../operation_and_maintenance/console/console_commands.html#opendeployauthproposal) 、[关闭部署权限提案](../operation_and_maintenance/console/console_commands.html#closedeployauthproposal) 在检查部署权限时将会对交易发起地址tx.origin进行校验,若没有权限则会返回错误码 -5000。即,会对用户部署合约、用户通过合约部署合约都进行校验。 @@ -145,6 +145,6 @@ abstract contract AuthManagerPrecompiled { 在执行合约接口的访问ACL的写操作时,将会确定交易发起人msg.sender是否为合约权限表记录的合约管理员,若不是则会拒绝。 -合约管理员可以通过控制台对合约接口访问ACL的写操作等操作,详情请看:[合约管理员专用命令](./console/console_commands.html#setmethodauth) +合约管理员可以通过控制台对合约接口访问ACL的写操作等操作,详情请看:[合约管理员专用命令](../operation_and_maintenance/console/console_commands.html#setmethodauth) 在检查合约调用权限时将会对交易发起地址tx.origin和消息发送者msg.sender进行校验,若没有权限则会返回错误码 -5000。即,会对用户调用合约、用户通过合约调用合约、合约调用合约都进行校验。 diff --git a/3.x/zh_CN/docs/develop/contract_safty_practice.md b/3.x/zh_CN/docs/develop/contract_safty_practice.md new file mode 100644 index 000000000..7c77ee2ba --- /dev/null +++ b/3.x/zh_CN/docs/develop/contract_safty_practice.md @@ -0,0 +1,815 @@ +# 9. 智能合约安全实践 + +智能合约安全是指在设计、编码、部署、运行和维护智能合约的全生命周期中,采取措施确保合约的安全性和可靠性,防止恶意攻击、漏洞利用或错误操作导致的资产损失或系统崩溃。 + +本文从设计模式出发详细讲述智能合约在各个阶段应该使用的策略、推荐实践方式以及安全保障措施。 + +## 1. 智能合约设计模式 + +[智能合约编写之 Solidity的设计模式](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/articles/3_features/35_contract/solidity_design_patterns.html) + +作者:储雨知|FISCO BCOS 核心开发者 + +随着区块链技术发展,越来越多的企业与个人开始将区块链与自身业务相结合。区块链所具有的独特优势,例如,数据公开透明、不可篡改,可以为业务带来便利。但与此同时,也存在一些隐患。数据的公开透明,意味着任何人都可以读取;不可篡改,意味着信息一旦上链就无法删除,甚至合约代码都无法被更改。除此之外,合约的公开性、回调机制,每一个特点都可被利用,作为攻击手法,稍有不慎,轻则合约形同虚设,重则要面临企业机密泄露的风险。所以,在业务合约上链前,需要预先对合约的安全性、可维护性等方面作充分考虑。幸运的是,通过近些年Solidity语言的大量实践,开发者们不断提炼和总结,已经形成了一些"设计模式",来指导应对日常开发常见的问题。 + +2019年,IEEE收录了维也纳大学一篇题为《Design Patterns For Smart Contracts In the Ethereum Ecosystem》的论文。这篇论文分析了那些火热的Solidity开源项目,结合以往的研究成果,整理出了18种设计模式。这些设计模式涵盖了安全性、可维护性、生命周期管理、鉴权等多个方面。 + +| 类型 | 模式 | +|--------------------|---------------------------------------------------------------------------------------------------------------------------| +| Security | 1. Checks-Effects-Interaction
2. Emergency Stop
3. Speed Bump
4. Rate Limit
5. Mutex
6. Balance Limit | +| Maintenance | 7. Data Segregation
8. Satellite
9. Contract Register
10. Contract Relay | +| Lifecycle | 11. Mortal
12. Automatic Deprecation | +| Authorization | 13. Ownership
14. Access Restriction | +| Action And Control | 15. Pull Payment
16. Commit And Reveal
17. State Machine
18. Oracle | + +接下来,本文将从这18种设计模式中选择最为通用常见的进行介绍,这些设计模式在实际开发经历中得到了大量检验。 + +### 1.1 Checks-Effects-Interaction - 保证状态完整,再做外部调用 + +该模式是编码风格约束,可有效避免重放攻击。通常情况下,一个函数可能包含三个部分: + +- Checks:参数验证 +- Effects:修改合约状态 +- Interaction:外部交互 + +这个模式要求合约按照Checks-Effects-Interaction的顺序来组织代码。它的好处在于进行外部调用之前,Checks-Effects已完成合约自身状态所有相关工作,使得状态完整、逻辑自洽,这样外部调用就无法利用不完整的状态进行攻击了。回顾前文的AddService合约,并没有遵循这个规则,在自身状态没有更新完的情况下去调用了外部代码,外部代码自然可以横插一刀,让_adders[msg.sender]=true永久不被调用,从而使require语句失效。我们以checks-effects-interaction的角度审阅原来的代码: + +```solidity + //Checks + require(_adders[msg.sender] == false, "You have added already"); + //Effects + _count++; + //Interaction + AdderInterface adder = AdderInterface(msg.sender); + adder.notify(); + //Effects + _adders[msg.sender] = true; +``` + +只要稍微调整顺序,满足Checks-Effects-Interaction模式,悲剧就得以避免: + +```solidity + //Checks + require(_adders[msg.sender] == false, "You have added already"); + //Effects + _count++; + _adders[msg.sender] = true; + //Interaction + AdderInterface adder = AdderInterface(msg.sender); + adder.notify(); +``` + +由于_adders映射已经修改完毕,当恶意攻击者想递归地调用addByOne,require这道防线就会起到作用,将恶意调用拦截在外。虽然该模式并非解决重入攻击的唯一方式,但依然推荐开发者遵循。 + +### 1.2 Mutex - 禁止递归 + +Mutex模式也是解决重入攻击的有效方式。它通过提供一个简单的修饰符来防止函数被递归调用: + +```solidity +contract Mutex { + bool locked; + modifier noReentrancy() { + //防止递归 + require(!locked, "Reentrancy detected"); + locked = true; + _; + locked = false; + } + + //调用该函数将会抛出Reentrancy detected错误 + function some() public noReentrancy{ + some(); + } +} +``` + +在这个例子中,调用some函数前会先运行noReentrancy修饰符,将locked变量赋值为true。如果此时又递归地调用了some,修饰符的逻辑会再次激活,由于此时的locked属性已为true,修饰符的第一行代码会抛出错误。 + +### 1.3 Data segregation - 数据与逻辑相分离 + +了解该设计模式之前,先看看下面这个合约代码: + +```solidity +contract Computer{ + + uint private _data; + + function setData(uint data) public { + _data = data; + } + + function compute() public view returns(uint){ + return _data * 10; + } +} +``` + +此合约包含两个能力,一个是存储数据(setData函数),另一个是运用数据进行计算(compute函数)。如果合约部署一段时间后,发现compute写错了,比如不应是乘以10,而要乘以20,就会引出前文如何升级合约的问题。这时,可以部署一个新合约,并尝试将已有数据迁移到新的合约上,但这是一个很重的操作,一方面要编写迁移工具的代码,另一方面原先的数据完全作废,空占着宝贵的节点存储资源。 + +所以,预先在编程时进行模块化十分必要。如果我们将"数据"看成不变的事物,将"逻辑"看成可能改变的事物,就可以完美避开上述问题。Data Segregation(意为数据分离)模式很好地实现了这一想法。该模式要求一个业务合约和一个数据合约:数据合约只管数据存取,这部分是稳定的;而业务合约则通过数据合约来完成逻辑操作。 + +结合前面的例子,我们将数据读写操作专门转移到一个合约DataRepository中: + +```solidity +contract DataRepository{ + + uint private _data; + + function setData(uint data) public { + _data = data; + } + + function getData() public view returns(uint){ + return _data; + } +} +``` + +计算功能被单独放入一个业务合约中: + +```solidity +contract Computer{ + DataRepository private _dataRepository; + constructor(address addr){ + _dataRepository =DataRepository(addr); + } + + //业务代码 + function compute() public view returns(uint){ + return _dataRepository.getData() * 10; + } +} +``` + +这样,只要数据合约是稳定的,业务合约的升级就很轻量化了。比如,当我要把Computer换成ComputerV2时,原先的数据依然可以被复用。 + +### 1.4 Satellite - 分解合约功能 + +一个复杂的合约通常由许多功能构成,如果这些功能全部耦合在一个合约中,当某一个功能需要更新时,就不得不去部署整个合约,正常的功能都会受到波及。Satellite模式运用单一职责原则解决上述问题,提倡将合约子功能放到子合约里,每个子合约(也称为卫星合约)只对应一个功能。当某个子功能需要修改,只要创建新的子合约,并将其地址更新到主合约里即可,其余功能不受影响。 + +举个简单的例子,下面这个合约的setVariable功能是将输入数据进行计算(compute函数),并将计算结果存入合约状态_variable: + +```solidity +contract Base { + uint public _variable; + + function setVariable(uint data) public { + _variable = compute(data); + } + + //计算 + function compute(uint a) internal returns(uint){ + return a * 10; + } +} +``` + +如果部署后,发现compute函数写错,希望乘以的系数是20,就要重新部署整个合约。但如果一开始按照Satellite模式操作,则只需部署相应的子合约。 + +首先,我们先将compute函数剥离到一个单独的卫星合约中去: + +```solidity +contract Satellite { + function compute(uint a) public returns(uint){ + return a * 10; + } +} +``` + +然后,主合约依赖该子合约完成setVariable: + +```solidity +contract Base { + uint public _variable; + + function setVariable(uint data) public { + _variable = _satellite.compute(data); + } + + Satellite _satellite; + //更新子合约(卫星合约) + function updateSatellite(address addr) public { + _satellite = Satellite(addr); + } +} +``` + +这样,当我们需要修改compute函数时,只需部署这样一个新合约,并将它的地址传入到Base.updateSatellite即可: + +```solidity +contract Satellite2{ + function compute(uint a) public returns(uint){ + return a * 20; + } +} +``` + +### 1.5 Contract Registry - 跟踪最新合约 + +在Satellite模式中,如果一个主合约依赖子合约,在子合约升级时,主合约需要更新对子合约的地址引用,这通过updateXXX来完成,例如前文的updateSatellite函数。这类接口属于维护性接口,与实际业务无关,过多暴露此类接口会影响主合约美观,让调用者的体验大打折扣。Contract Registry设计模式优雅地解决了这个问题。在该设计模式下,会有一个专门的合约Registry跟踪子合约的每次升级情况,主合约可通过查询此Registyr合约取得最新的子合约地址。卫星合约重新部署后,新地址通过Registry.update函数来更新。 + +```solidity +contract Registry{ + + address _current; + address[] _previous; + + //子合约升级了,就通过update函数更新地址 + function update(address newAddress) public{ + if(newAddress != _current){ + _previous.push(_current); + _current = newAddress; + } + } + + function getCurrent() public view returns(address){ + return _current; + } +} +``` + +主合约依赖于Registry获取最新的卫星合约地址。 + +```solidity +contract Base { + uint public _variable; + + function setVariable(uint data) public { + Satellite satellite = Satellite(_registry.getCurrent()); + _variable = satellite.compute(data); + } + + Registry private _registry = //...; +} +``` + +### 1.6 Contract Relay - 代理调用最新合约 + +该设计模式所解决问题与Contract Registry一样,即主合约无需暴露维护性接口就可调用最新子合约。该模式下,存在一个代理合约,和子合约享有相同接口,负责将主合约的调用请求传递给真正的子合约。卫星合约重新部署后,新地址通过SatelliteProxy.update函数来更新。 + +```solidity +contract SatelliteProxy{ + address _current; + function compute(uint a) public returns(uint){ + Satellite satellite = Satellite(_current); + return satellite.compute(a); + } + + //子合约升级了,就通过update函数更新地址 + function update(address newAddress) public{ + if(newAddress != _current){ + _current = newAddress; + } + } +} + + +contract Satellite { + function compute(uint a) public returns(uint){ + return a * 10; + } +} +``` + +主合约依赖于SatelliteProxy: + +```solidity +contract Base { + uint public _variable; + + function setVariable(uint data) public { + _variable = _proxy.compute(data); + } + SatelliteProxy private _proxy = //...; +} +``` + +### 1.7 Mortal - 允许合约自毁 + +字节码中有一个selfdestruct指令,用于销毁合约。所以只需要暴露出自毁接口即可: + +```solidity +contract Mortal{ + + //自毁 + function destroy() public{ + selfdestruct(msg.sender); + } +} +``` + +### 1.8 Automatic Deprecation - 允许合约自动停止服务 + +如果你希望一个合约在指定期限后停止服务,而不需要人工介入,可以使用Automatic Deprecation模式。 + +``` solidity +contract AutoDeprecated{ + + uint private _deadline; + + function setDeadline(uint time) public { + _deadline = time; + } + + modifier notExpired(){ + require(now <= _deadline); + _; + } + + function service() public notExpired { + //some code + } +} +``` + +当用户调用service,notExpired修饰符会先进行日期检测,这样,一旦过了特定时间,调用就会因过期而被拦截在notExpired层。 + +### 1.9 Ownership检查 + +前文中有许多管理性接口,这些接口如果任何人都可调用,会造成严重后果,例如上文中的自毁函数,假设任何人都能访问,其严重性不言而喻。所以,一套保证只有特定账户能够访问的权限控制设计模式显得尤为重要。 + +对于权限的管控,可以采用Ownership模式。该模式保证了只有合约的拥有者才能调用某些函数。首先需要有一个Owned合约: + +```solidity +contract Owned{ + + address public _owner; + + constructor() { + _owner = msg.sender; + } + + modifier onlyOwner(){ + require(_owner == msg.sender); + _; + } +} +``` + +如果一个业务合约,希望某个函数只由拥有者调用,该怎么办呢?如下: + +```solidity +contract Biz is Owned{ + function manage() public onlyOwner{ + } +} +``` + +这样,当调用manage函数时,onlyOwner修饰符就会先运行并检测调用者是否与合约拥有者一致,从而将无授权的调用拦截在外。 + +### 1.10 延迟秘密泄露 + +这类模式一般针对具体场景使用,这节将主要介绍基于隐私的编码模式和与链外数据交互的设计模式。 + +链上数据都是公开透明的,一旦某些隐私数据上链,任何人都可看到,并且再也无法撤回。Commit And Reveal模式允许用户将要保护的数据转换为不可识别数据,比如一串哈希值,直到某个时刻再揭示哈希值的含义,展露真正的原值。以投票场景举例,假设需要在所有参与者都完成投票后再揭示投票内容,以防这期间参与者受票数影响。我们可以看看,在这个场景下所用到的具体代码: + +```solidity +contract CommitReveal { + + struct Commit { + string choice; + string secret; + uint status; + } + + mapping(address => mapping(bytes32 => Commit)) public userCommits; + event LogCommit(bytes32, address); + event LogReveal(bytes32, address, string, string); + + function commit(bytes32 commit) public { + Commit storage userCommit = userCommits[msg.sender][commit]; + require(userCommit.status == 0); + userCommit.status = 1; // committed + emit LogCommit(commit, msg.sender); + } + + function reveal(string choice, string secret, bytes32 commit) public { + Commit storage userCommit = userCommits[msg.sender][commit]; + require(userCommit.status == 1); + require(commit == keccak256(choice, secret)); + userCommit.choice = choice; + userCommit.secret = secret; + userCommit.status = 2; + emit LogReveal(commit, msg.sender, choice, secret); + } +} +``` + +## 2. 智能合约编程攻略 + +[智能合约编写之Solidity的编程攻略](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/articles/3_features/35_contract/solidity_design_programming_strategy.html) + +作者:毛嘉宇|FISCO BCOS 核心开发者 + +**“如无必要,勿增实体”。** + +- 需要分布式协作的重要数据才上链,非必需数据不上链; +- 敏感数据脱敏或加密后上链(视数据保密程度选择符合隐私保护安全等级要求的加密算法); +- 链上验证,链下授权。 + +在使用区块链时,开发者不需要将所有业务和数据都放到链上。相反,“好钢用在刀刃上”,智能合约更适合被用在分布式协作的业务场景中。 + +### 2.1 精简函数变量 + +如果在智能合约中定义了复杂的逻辑,特别是合约内定义了复杂的函数入参、变量和返回值,就会在编译的时候碰到以下错误: + +```shell +Compiler error: Stack too deep, try removing local variables. +``` + +这也是社区中的高频技术问题之一。造成这个问题的原因就是EVM所设计用于最大的栈深度为16。所有的计算都在一个栈内执行,对栈的访问只限于其顶端,限制方式为:允许拷贝最顶端16个元素中的一个到栈顶,或者将栈顶元素和下面16个元素中的一个交换。所有其他操作都只能取最顶的几个元素,运算后,把结果压入栈顶。当然可以把栈上的元素放到存储或内存中。但无法只访问栈上指定深度的那个元素,除非先从栈顶移除其他元素。如果一个合约中,入参、返回值、内部变量的大小超过了16个,显然就超出了栈的最大深度。因此,我们可以使用结构体或数组来封装入参或返回值,达到减少栈顶元素使用的目的,从而避免此错误。例如以下代码,通过使用bytes数组来封装了原本16个bytes变量。 + +```solidity +function doBiz(bytes[] paras) public { + require(paras.length >= 16); + // do something +} +``` + +### 2.2 保证参数和行为符合预期 + +在编写智能合约时,一定要注意对合约参数和行为的检查,尤其是那些对外部开放的合约函数。Solidity提供了require、revert、assert等关键字来进行异常的检测和处理。一旦检测并发现错误,整个函数调用会被回滚,所有状态修改都会被回退,就像从未调用过函数一样。以下分别使用了三个关键字,实现了相同的语义。 + +```solidity +require(_data == data, "require data is valid"); + +if(_data != data) { revert("require data is valid"); } + +assert(_data == data); +``` + +不过,这三个关键字一般适用于不同的使用场景: + +- require:最常用的检测关键字,用来验证输入参数和调用函数结果是否合法。 +- revert:适用在某个分支判断的场景下。 +- assert: 检查结果是否正确、合法,一般用于函数结尾。 + +在一个合约的函数中,可以使用函数修饰器来抽象部分参数和条件的检查。在函数体内,可以对运行状态使用if-else等判断语句进行检查,对异常的分支使用revert回退。在函数运行结束前,可以使用assert对执行结果或中间状态进行断言检查。在实践中,推荐使用require关键字,并将条件检查移到函数修饰器中去;这样可以让函数的职责更为单一,更专注到业务逻辑中。同时,函数修饰器等条件代码也更容易被复用,合约也会更加安全、层次化。 + +以一个水果店库存管理系统为例,设计一个水果超市的合约。这个合约只包含了对店内所有水果品类和库存数量的管理,setFruitStock函数提供了对应水果库存设置的函数。在这个合约中,我们需要检查传入的参数,即水果名称不能为空。 + +```solidity +pragma solidity ^0.4.25; + +contract FruitStore { + mapping(bytes => uint) _fruitStock; + modifier validFruitName(bytes fruitName) { + require(fruitName.length > 0, "fruite name is invalid!"); + _; + } + function setFruitStock(bytes fruitName, uint stock) validFruitName(fruitName) external { + _fruitStock[fruitName] = stock; + } +} +``` + +如上所述,我们添加了函数执行前的参数检查的函数修饰器。同理,通过使用函数执行前和函数执行后检查的函数修饰器,可以保证智能合约更加安全、清晰。智能合约的编写需要设置严格的前置和后置函数检查,来保证其安全性。 + +### 2.3 严控函数的执行权限 + +如果说智能合约的参数和行为检测提供了静态的合约安全措施,那么合约权限控制的模式则提供了动态访问行为的控制。由于智能合约是发布到区块链上,所有数据和函数对所有参与者都是公开透明的,任一节点参与者都可发起交易,无法保证合约的隐私。因此,合约发布者必须对函数设计严格的访问限制机制。Solidity提供了函数可见性修饰符、修饰器等语法,灵活地使用这些语法,可帮助构建起合法授权、受控调用的智能合约系统。还是以刚才的水果合约为例。现在getStock提供了查询具体水果库存数量的函数。 + +```solidity +pragma solidity ^0.4.25; + +contract FruitStore { + mapping(bytes => uint) _fruitStock; + modifier validFruitName(bytes fruitName) { + require(fruitName.length > 0, "fruite name is invalid!"); + _; + } + function getStock(bytes fruit) external view returns(uint) { + return _fruitStock[fruit]; + } + function setFruitStock(bytes fruitName, uint stock) validFruitName(fruitName) external { + _fruitStock[fruitName] = stock; + } +} +``` + +水果店老板将这个合约发布到了链上。但是,发布之后,setFruitStock函数可被任何其他联盟链的参与者调用。虽然联盟链的参与者是实名认证且可事后追责;但一旦有恶意攻击者对水果店发起攻击,调用setFruitStock函数就能任意修改水果库存,甚至将所有水果库存清零,这将对水果店正常经营管理产生严重后果。因此,设置某些预防和授权的措施很必要:对于修改库存的函数setFruitStock,可在函数执行前对调用者进行鉴权。类似的,这些检查可能会被多个修改数据的函数复用,使用一个onlyOwner的修饰器就可以抽象此检查。owner字段代表了合约的所有者,会在合约构造函数中被初始化。使用public修饰getter查询函数,就可以通过_owner()函数查询合约的所有者。 + +```solidity +contract FruitStore { + address public _owner; + mapping(bytes => uint) _fruitStock; + + constructor() public { + _owner = msg.sender; + } + + modifier validFruitName(bytes fruitName) { + require(fruitName.length > 0, "fruite name is invalid!"); + _; + } + // 鉴权函数修饰器 + modifier onlyOwner() { + require(msg.sender == _owner, "Auth: only owner is authorized."); + _; + } + function getStock(bytes fruit) external view returns(uint) { + return _fruitStock[fruit]; + } + // 添加了onlyOwner修饰器 + function setFruitStock(bytes fruitName, uint stock) + onlyOwner validFruitName(fruitName) external { + _fruitStock[fruitName] = stock; + } +} +``` + +这样一来,我们可以将相应的函数调用权限检查封装到修饰器中,智能合约会自动发起对调用者身份验证检查,并且只允许合约部署者来调用setFruitStock函数,以此保证合约函数向指定调用者开放。 + +### 2.4 抽象通用的业务逻辑 + +分析上述FruitStore合约,我们发现合约里似乎混入了奇怪的东西。参考单一职责的编程原则,水果店库存管理合约多了上述函数功能检查的逻辑,使合约无法将所有代码专注在自身业务逻辑中。对此,我们可以抽象出可复用的功能,利用Solidity的继承机制继承最终抽象的合约。基于上述FruitStore合约,可抽象出一个BasicAuth合约,此合约包含之前onlyOwner的修饰器和相关功能接口。 + +```solidity +contract BasicAuth { + address public _owner; + + constructor() public { + _owner = msg.sender; + } + + function setOwner(address owner) + public + onlyOwner +{ + _owner = owner; + } + + modifier onlyOwner() { + require(msg.sender == _owner, "BasicAuth: only owner is authorized."); + _; + } +} +``` + +FruitStore可以复用这个修饰器,并将合约代码收敛到自身业务逻辑中。 + +```solidity +import "./BasicAuth.sol"; + +contract FruitStore is BasicAuth { + mapping(bytes => uint) _fruitStock; + + function setFruitStock(bytes fruitName, uint stock) + onlyOwner validFruitName(fruitName) external { + _fruitStock[fruitName] = stock; + } +} +``` + +这样一来,FruitStore的逻辑被大大简化,合约代码更精简、聚焦和清晰。 + +### 2.5 预防私钥的丢失 + +在区块链中调用合约函数的方式有两种:内部调用和外部调用。出于隐私保护和权限控制,业务合约会定义一个合约所有者。假设用户A部署了FruitStore合约,那上述合约owner就是部署者A的外部账户地址。这个地址由外部账户的私钥计算生成。但是,在现实世界中,私钥泄露、丢失的现象比比皆是。一个商用区块链DAPP需要严肃考虑私钥的替换和重置等问题。这个问题最为简单直观的解决方法是添加一个备用私钥。这个备用私钥可支持权限合约修改owner的操作,代码如下: + +```solidity +ontract BasicAuth { + address public _owner; + address public _bakOwner; + + constructor(address bakOwner) public { + _owner = msg.sender; + _bakOwner = bakOwner; + } + + function setOwner(address owner) + public + canSetOwner +{ + _owner = owner; + } + + function setBakOwner(address owner) + public + canSetOwner +{ + _bakOwner = owner; + } + + // ... + + modifier isAuthorized() { + require(msg.sender == _owner || msg.sender == _bakOwner, "BasicAuth: only owner or back owner is authorized."); + _; + } +} +``` + +这样,当发现私钥丢失或泄露时,我们可以使用备用外部账户调用setOwner重置账号,恢复、保障业务正常运行。 + +### 2.6 合理预留事件 + +迄今为止,我们已实现强大灵活的权限管理机制,只有预先授权的外部账户才能修改合约owner属性。不过,仅通过上述合约代码,我们无法记录和查询修改、调用函数的历史记录和明细信息。而这样的需求在实际业务场景中比比皆是。比如,FruitStore水果店需要通过查询历史库存修改记录,计算出不同季节的畅销与滞销水果。 + +一种方法是依托链下维护独立的台账机制。不过,这种方法存在很多问题:保持链下台账和链上记录一致的成本开销非常高;同时,智能合约面向链上所有参与者开放,一旦其他参与者调用了合约函数,相关交易信息就存在不能同步的风险。针对此类场景,Solidity提供了event语法。event不仅具备可供SDK监听回调的机制,还能用较低的gas成本将事件参数等信息完整记录、保存到区块中。FISCO BCOS社区中,也有WEBASE-Collect-Bee这样的工具,在事后实现区块历史事件信息的完整导出。 + +[WEBASE-Collect-Bee工具参考](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Collect-Bee/index.html) + +基于上述权限管理合约,我们可以定义相应的修改权限事件,其他事件以此类推。 + +```solidity +event LogSetAuthority (Authority indexed authority, address indexed from); +} +``` + +接下来,可以调用相应的事件: + +```solidity +function setAuthority(Authority authority) + public + auth +{ + _authority = authority; + emit LogSetAuthority(authority, msg.sender); + } +``` + +当setAuthority函数被调用时,会同时触发LogSetAuthority,将事件中定义的Authority合约地址以及调用者地址记录到区块链交易回执中。当通过控制台调用setAuthority方法时,对应事件LogSetAuthority也会被打印出来。基于WEBASE-Collect-Bee,我们可以导出所有该函数的历史信息到数据库中。也可基于WEBASE-Collect-Bee进行二次开发,实现复杂的数据查询、大数据分析和数据可视化等功能。 + +### 2.7 遵循安全编程规范 + +每一门语言都有其相应的编码规范,我们需要尽可能严格地遵循Solidity官方编程风格指南,使代码更利于阅读、理解和维护,有效地减少合约的bug数量。[Solidity官方编程风格指南参考](https://solidity.readthedocs.io/en/latest/style-guide.html)。除了编程规范,业界也总结了很多安全编程指南,例如重入漏洞、数据结构溢出、随机数误区、构造函数失控、为初始化的存储指针等等。重视和防范此类风险,采用业界推荐的安全编程规范至关重要,例如[Solidity官方安全编程指南](https://solidity.readthedocs.io/en/latest/security-considerations.html)。同时,在合约发布上线后,还需要注意关注、订阅Solidity社区内安全组织或机构发布的各类安全漏洞、攻击手法,一旦出现问题,及时做到亡羊补牢。 + +对于重要的智能合约,有必要引入审计。现有的审计包括了人工审计、机器审计等方法,通过代码分析、规则验证、语义验证和形式化验证等方法保证合约安全性。虽然本文通篇都在强调,模块化和重用被严格审查并广泛验证的智能合约是最佳的实践策略。但在实际开发过程,这种假设过于理想化,每个项目或多或少都会引入新的代码,甚至从零开始。不过,我们仍然可以视代码的复用程度进行审计分级,显式地标注出引用的代码,将审计和检查的重点放在新代码上,以节省审计成本。 + +### 2.8 使用SmartDev应用插件 + +SmartDev包含了一套开放、轻量的开发组件集,覆盖智能合约的开发、调试、应用开发等环节,包括智能合约库(SmartDev-Contract)、智能合约编译插件(SmartDev-SCGP)和应用开发脚手架(SmartDev-Scaffold)。开发者可根据自己的情况自由选择相应的开发工具,提升开发效率。 + +详情可以看:[SmartDev应用开发组件](./smartdev_index.md) + +## 3. 智能合约部署权限控制 + +部署合约的权限控制将由治理委员会统一控制,治理委员会将以投票表决的形式控制部署权限。治理委员会对某个部署权限的提案通过后,将会主动调用固定地址0x1005预编译合约的部署权限写接口,这些写接口也限定只能治理委员会合约调用。 + +部署权限记录在BFS目录/apps下,这代表着允许在/apps目录下的写权限。 + +治理委员可以通过控制台进行部署合约权限控制等操作,详情请看 [设置部署权限类型提案](../operation_and_maintenance/console/console_commands.html#setdeployauthtypeproposal) 、[开启部署权限提案](../operation_and_maintenance/console/console_commands.html#opendeployauthproposal) 、[关闭部署权限提案](../operation_and_maintenance/console/console_commands.html#closedeployauthproposal) + +在检查部署权限时将会对交易发起地址tx.origin进行校验,若没有权限则会返回错误码 -5000。即,会对用户部署合约、用户通过合约部署合约都进行校验。 + +## 4. 智能合约执行权限控制 + +合约管理员可以对固定地址0x1005的预编译合约发起交易,对合约接口的访问ACL进行读写。 + +在执行合约接口的访问ACL的写操作时,将会确定交易发起人msg.sender是否为合约权限表记录的合约管理员,若不是则会拒绝。 + +合约管理员可以通过控制台对合约接口访问ACL的写操作等操作,详情请看:[合约管理员专用命令](../operation_and_maintenance/console/console_commands.html#setmethodauth) + +在检查合约调用权限时将会对交易发起地址tx.origin和消息发送者msg.sender进行校验,若没有权限则会返回错误码 -5000。即,会对用户调用合约、用户通过合约调用合约、合约调用合约都进行校验。 + +## 5. 智能合约运维 + +智能合约在运维时主要关注智能合约的数据状态、智能合约升级、智能合约冻结、智能合约销毁。 + +### 5.1 智能合约升级 + +在Solidity中,一旦合约部署发布后,其代码就无法被修改,只能通过发布新合约去改动代码。假如数据存储在老合约,就会出现所谓的“孤儿数据”问题,新合约将丢失之前运行的历史业务数据。这种情况,开发者可以考虑将老合约数据迁移到新合约中,但此操作至少存在两个问题: + +1. 迁移数据会加重区块链的负担,产生资源浪费和消耗,甚至引入安全问题; +2. 牵一发而动全身,会引入额外的迁移数据逻辑,增加合约复杂度。 + +一种更合理的方式是抽象一层独立的合约存储层。这个存储层只提供合约读写的最基本方法,而不包含任何业务逻辑。在这种模式中,存在三种合约角色: + +- 数据合约:在合约中保存数据,并提供数据的操作接口。 +- 管理合约:设置控制权限,保证只有控制合约才有权限修改数据合约。 +- 控制合约:真正需要对数据发起操作的合约。 + +具体的代码示例如下: + +**数据合约** + +```solidity +contract FruitStore is BasicAuth { + address _latestVersion; + mapping(bytes => uint) _fruitStock; + + modifier onlyLatestVersion() { + require(msg.sender == _latestVersion); + _; + } + + function upgradeVersion(address newVersion) public { + require(msg.sender == _owner); + _latestVersion = newVersion; + } + + function setFruitStock(bytes fruit, uint stock) onlyLatestVersion external { + _fruitStock[fruit] = stock; + } +} +``` + +**管理合约** + +```solidity +contract Admin is BasicAuth { + function upgradeContract(FruitStore fruitStore, address newController) isAuthorized external { + fruitStore.upgradeVersion(newController); + } +} +``` + +**控制合约** + +```solidity +contract FruitStoreController is BasicAuth { + function upgradeStock(bytes fruit, uint stock) isAuthorized external { + fruitStore.setFruitStock(fruit, stock); + } +} +``` + +一旦函数的控制逻辑需要变更,开发者只需修改FruitStoreController控制合约逻辑,部署一个新合约,然后使用管理合约Admin修改新的合约地址参数就可轻松完成合约升级。这种方法可消除合约升级中因业务控制逻辑改变而导致的数据迁移隐患。但天下没有免费的午餐,这种操作需要在可扩展性和复杂性之间需要做基本的权衡。首先,数据和逻辑的分离降低了运行性能。其次,进一步封装增加了程序复杂度。最后,越是复杂的合约越会增加潜在攻击面,简单的合约比复杂的合约更安全。 + +**通用数据结构——数据升级** + +到目前为止,还存在一个问题,假如数据合约中的数据结构本身需要升级怎么办? + +例如,在FruitStore中,原本只保存了库存信息,现在由于水果销售店生意发展壮大,一共开了十家分店,需要记录每家分店、每种水果的库存和售出信息。在这种情况下,一种解决方案是采用外部关联管理方式:创建一个新的ChainStore合约,在这个合约中创建一个mapping,建立分店名和FruitStore的关系。 + +此外,不同分店需要创建一个FruitStore的合约。为了记录新增的售出信息等数据,我们还需要新建一个合约来管理。假如在FruitStore中可预设一些不同类型的reserved字段,可帮助规避新建售出信息合约的开销,仍然复用FruitStore合约。但这种方式在最开始会增加存储开销。一种更好的思路是抽象一层更为底层和通用的存储结构。代码如下: + +```solidity +contract commonDB is BasicAuth { + mapping(bytes => uint) _uintMapping; + + function getUint(bytes key) external view returns(uint) { + return _uintMapping[key]; + } + + function setUint(bytes key, uint value) isAuthorized onlyLatestVersion external { + _uintMapping[key] = value; + } + +} +``` + +类似的,我们可加入所有数据类型变量,帮助commonDB应对和满足不同的数据类型存储需求。相应的控制合约可修改如下: + +```solidity +contract FruitStoreControllerV2 is BasicAuth { + function upgradeStock(bytes32 storeName, bytes32 fruit, uint stock) + isAuthorized external { + commonDB.setUint(sha256(storeName, fruit), stock); + uint result = commonDB.getUint(sha256(storeName, fruit)); + } +} +``` + +使用以上存储的设计模式,可显著提升合约数据存储灵活性,保证合约可升级。众所周知,Solidity既不支持数据库,使用代码作为存储entity,也无法提供更改schema的灵活性。但是,通过这种KV设计,可以使存储本身获得强大的可扩展性。总之,**没有一个策略是完美的,优秀的架构师善于权衡**。智能合约设计者需要充分了解各种方案的利弊,并基于实际情况选择合适的设计方案。 + +**使用CRUD或者KV存储合约数据** + +需要存储的数据都使用CRUD数据接口进行存储,CRUD的数据是通过节点共识并持久存储在链上的。详情请参考[使用CRUD预编译合约开发应用](../contract_develop/c++_contract/use_crud_precompiled.md),[使用KV存储预编译合约开发应用](../contract_develop/c++_contract/use_kv_precompiled.md) + +### 5.2 智能合约冻结、解冻 + +在合约出现数据异常或者出现大量访问异常时,合约管理员可以对该智能合约进行冻结操作,防止其他用户继续访问该合约。 + +合约管理员可以对固定地址0x1005的预编译合约发起交易,对合约的状态进行读写。 + +在执行合约状态的写操作时,将会确定交易发起人msg.sender是否为合约权限表记录的合约管理员,若不是则会拒绝。 + +```eval_rst +.. important:: + 兼容性说明:合约生命周期管理废止操作只能在节点版本3.2以上进行。 +``` + +合约管理员也可以通过控制台对合约进行冻结等操作,详情请看:[冻结合约命令](../operation_and_maintenance/console/console_commands.html#freezecontract)、[解冻合约命令](../operation_and_maintenance/console/console_commands.html#unfreezecontract) + +### 5.3 智能合约废止 + +当合约不再使用,且数据不再供访问,用户可以使用预留的selfdestruct进行合约销毁,合约管理员也可以使用合约废止功能主动将合约状态设定为废止。 + +**selfdestruct** + +字节码中有一个selfdestruct指令,用于销毁合约。所以只需要暴露出自毁接口即可。**注意:** 该过程不可逆,请酌情考虑后果。 + +```solidity +contract Mortal{ + + //自毁 + function destroy() public{ + selfdestruct(msg.sender); + } +} +``` + +**合约废止** + +```eval_rst +.. important:: + 兼容性说明:合约生命周期管理废止操作只能在节点版本3.2以上进行。 +``` + +**注意:** 该过程不可逆,请酌情考虑后果。 + +在执行合约状态的写操作时,将会确定交易发起人msg.sender是否为合约权限表记录的合约管理员,若不是则会拒绝。 + +合约管理员也可以通过控制台对合约进行冻结等操作,详情请看:[冻结合约命令](../operation_and_maintenance/console/console_commands.html#freezecontract) \ No newline at end of file diff --git a/3.x/zh_CN/docs/develop/index.md b/3.x/zh_CN/docs/develop/index.md new file mode 100644 index 000000000..7c8296a4e --- /dev/null +++ b/3.x/zh_CN/docs/develop/index.md @@ -0,0 +1,14 @@ +# 1. 应用开发指南 +标签: `应用开发` + +---- +应用开发部分旨在指导用户基于FISCO BCOS提供的丰富功能与组件,更快深入了解FISCO BCOS区块链以及使用相应组件进行开发。此部分主要包括以下部分: + +1. 区块链RPC接口:此部分为区块链应用开发者提供了Java API接口介绍,用户可通过此部分熟悉如何部署及调用合约。 +2. 账户使用与账户管理:此部分为区块链应用开发者具体介绍账户的创建、存储和使用方式,指导开发者可按需创建与操作账户。 +3. 合约生命周期与权限管理:此部分为应用开发者详细介绍合约从开发、部署、调用、升级、冻结再到废止的整个生命周期,以及在整个智能合约生命周期的参与角色与管理方法。 +4. 控制台部署调用合约:此部分介绍应用开发者如何下载配置控制台,并指导开发者如何通过控制台部署与调用合约。 +5. SmartDev应用开发组件:SmartDev开发组件为区块链应用开发者提供了全面的智能合约库,对于常用的功能,不必再重复造轮子,只需按需引用,就可以引入相应功能,为合约开发的效率和安全保驾护航。此部分旨在指导区块链应用开发者熟悉掌握SmartDev组件。 +6. 使用AMOP功能:FISCO BCSO提供AMOP功能(Advanced Messages Onchain Protocol),通过此部分介绍,指导用户利用AMOP协议与其它机构互传消息,通过指定接口接受系统推送消息。 +7. 使用群环签名与同态加密:FISCO BCOS以预编译合约的形式集成了同态加密、群/环签名验证功能,提供了多种隐私保护手段,开发者通可过此部分文档熟悉同态加密与群环签名算法,并了解如何使用此部分功能。 +8. 智能合约安全实践:介绍智能合约在编码、部署、运行、维护各个阶段的最佳实践以及应该使用的安全措施。 diff --git a/3.x/zh_CN/docs/develop/light_monitor.md b/3.x/zh_CN/docs/develop/light_monitor.md deleted file mode 100644 index b30db621f..000000000 --- a/3.x/zh_CN/docs/develop/light_monitor.md +++ /dev/null @@ -1,126 +0,0 @@ -# 监控工具 - -标签:``监控`` ``monitor`` - ----- - -## light_monitor.sh - -`FISCO-BCOS 3.0`区块链轻量级监控工具,可以监控区块链是否正常工作,也提供简单的接入用户告警系统的方式. - -- 监控共识是否正常. -- 监控区块同步是否正常. -- 监控磁盘空间. -- 对接告警系统,发送告警信息. - -### 使用 - -帮助: -`bash light_monitor.sh -h` - -```shell -$ bash light_monitor.sh -h -Usage: -Optional: - -g [Require] group id - -i [Require] rpc server ip - -p [Require] rpc server port - -t [Optional] block number far behind warning threshold, default: 30 - -d [Optional] disk directory to be monitor - -T [Optional] disk capacity alarm threshold, default: 5% - -h Help. -Example: - bash light_monitor.sh -i 127.0.0.1 -p 20200 -g group0 - bash light_monitor.sh -i 127.0.0.1 -p 20200 -g group0 -d /data -T 10 -``` - -**参数:** - -- `-g`: 监控的群组id,`rpc`接入多个群组时,可以部署多个light_monitor.sh,分别监控不同群组 -- `-i`: rpc ip -- `-p`: rpc port -- `-t`: 区块同步告警的阈值,共识节点之间的区块高度差值超过该阈值,说明共识或者区块同步异常,默认值`30` -- `-d`: 磁盘容量需要监控的目录 -- `-T`: 磁盘告警阈值,监控的磁盘剩余空间百分比小于该值时,触发告警,默认值`5%` -- `-h`: 帮助信息 - -#### 状态描述 - -**参数:** - -- $config_ip: rpc ip -- $config_port:rpc port -- $group: 群组id -- $height: 区块高度 - -**```OK! $config_ip:$config_port $node:$group is working properly: height $height```** - -群组`${group}`正常工作, 共识模块/区块同步正常工作 - -**```ERROR! Cannot connect to $config_ip:$config_port ${group}, method: xxxx```** - -调用`rpc`接口`xxxx`失败,`rpc`服务宕机, 严重错误,此时需要重启`rpc`服务 - -**```ERROR! Consensus timeout $config_ip:$config_port ${group}:${node}```** - -**群组共识超时,连续出现时为严重错误**。 -排查网络连接是否正常。 - -**```ERROR! insufficient disk capacity, monitor disk directory: ${dir}, left disk space percent: ${disk_space_left_percent}%```** - -磁盘空间不足,剩余`${disk_space_left_percent}%`的空间 - -为了能够持续监控区块链节点的状态, 将`light_monitor.sh`配置到`crontab`定期执行. - -```shell -# 每分钟执行一次,查看节点是否正常启动, 正常共识, 有无关键错误打印 -*/1 * * * * /data/app/127.0.0.1/light_monitor.sh >> /data/app/127.0.0.1/light_monitor.log 2>&1 -``` - -`light_monitor.log`保存`light_monitor.sh`的输出 - -**用户需要根据实际部署修改示例中的路径.** - -### 对接告警系统 - -- 接口 -`light_monitor.sh`对接告警系统的接口`alarm`, 默认实现如下: - -```shell -alarm() { - echo "$1" - alert_msg="$1" - alert_ip=$(/sbin/ifconfig eth0 | grep inet | grep -v inet6 | awk '{print $2}') - alert_time=$(date "+%Y-%m-%d %H:%M:%S") - - # TODO: alarm the message, mail or phone - - # echo "[${alert_time}]:[${alert_ip}]:${alert_msg}"| mail -s "fisco-bcos alarm message" xxxxxx@qq.com -} -``` - - `light_monitor.sh`执行触发的关键错误处都会调用该函数, 并将错误信息作为入参, 用户可以调用监控平台的API将错误信息发送至告警平台. - -- 示例 - - 假设用户的告警系统 - -- API: - `http://127.0.0.1:1111/alarm/request` - POST参数: - ```{'title':'告警主题','alert_ip':'告警服务器IP', 'alert_info':'告警内容'}``` - - 修改`alarm`函数: - -```shell -alarm() { - echo "$1" - alert_msg="$1" - alert_ip=$(/sbin/ifconfig eth0 | grep inet | grep -v inet6 | awk '{print $2}') - alert_time=$(date "+%Y-%m-%d %H:%M:%S") - - # TODO: alarm the message, mail or phone - - curl -H "Content-Type: application/json" -X POST --data "{'title':'alarm','alert_ip':'${alert_ip}','alert_info':'${alert_msg}'}" http://127.0.0.1:1111/alarm/request -} -``` diff --git a/3.x/zh_CN/docs/develop/precompiled/index.md b/3.x/zh_CN/docs/develop/precompiled/index.md deleted file mode 100644 index 91b2b1056..000000000 --- a/3.x/zh_CN/docs/develop/precompiled/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# 预编译合约 - -标签:``预编译合约`` ``接口`` ``开发`` - ----------- - -```eval_rst -.. toctree:: - :maxdepth: 1 - - use_precompiled.md - precompiled_contract_api.md - precompiled_error_code.md - use_kv_precompiled.md - use_crud_precompiled.md - use_group_ring_sig.md - add_precompiled_impl.md -``` diff --git a/3.x/zh_CN/docs/develop/privacy.md b/3.x/zh_CN/docs/develop/privacy.md new file mode 100644 index 000000000..a0082c76c --- /dev/null +++ b/3.x/zh_CN/docs/develop/privacy.md @@ -0,0 +1,121 @@ +# 8. 使用同态加密与群环签名 + +标签:``隐私合约`` ``隐私保护`` ``合约开发`` ``同态加密`` ``环签名`` ``群签名`` + +---- +隐私保护是联盟链的一大技术挑战。为了保护链上数据、保障联盟成员隐私,并且保证监管的有效性,FISCO BCOS以预编译合约的形式集成了同态加密、群/环签名验证功能,提供了多种隐私保护手段。 + +文档一、二节分别对同态加密和群/环签名算法以及相关应用场景进行了简单介绍,第三、四节则详细介绍了FISCO BCOS隐私保护模块启用方法以及调用方式。 + + +```eval_rst +.. note:: + 1. FISCO BCOS 2.3.0+ 支持同态加密、群签名和环签名 + 2. FISCO BCOS 2.3.0, 2.4.0以及2.4.1,需手动编译二进制启用隐私保护模块 + 3. FISCO BCOS 2.5.0+ 默认启用隐私保护模块 +``` + +## 同态加密 + +### 算法简介 + +同态加密(Homomorphic Encryption)是公钥密码系统领域的明珠之一,已有四十余年的研究历史。其绝妙的密码特性,吸引密码学家前赴后继,在业界也受到了广泛的关注。 + +- 同态加密本质是一种公钥加密算法,即加密使用公钥pk,解密使用私钥sk; +- 同态加密支持密文计算,即由相同公钥加密生成的密文可以计算​f( )操作,生成的新密文解密后恰好等于两个原始明文计算f( )的结果; +- 同态加密公式描述如下: + +![](../../images/privacy/formula.jpg) + +FISCO BCOS采用的是paillier加密算法,支持加法同态。paillier的公私钥兼容主流的RSA加密算法,接入门槛低。同时paillier作为一种轻量级的同态加密算法,计算开销小易被业务系统接受。因此经过功能性和可用性的权衡,最终选定了paillier算法。 + + +### 功能组件 + +FISCO BCOS同态加密模块提供的功能组件包括: + +- paillier同态库[GitHub源码](https://github.com/FISCO-BCOS/paillier-lib)/[Gitee源码](https://gitee.com/FISCO-BCOS/paillier-lib),包括java库和c++同态接口。 + +- paillier预编译合约,供智能合约调用,提供密文同态运算接口。 + +### 使用方式 + +对于有隐私保护需求的业务,如果涉及简单密文计算,可借助本模块实现相关功能。凡是上链的数据可通过调用paillier库完成加密,链上的密文数据可通过调用paillier预编译合约实现密文的同态加运算,密文返还回业务层后,可通过调用paillier库完成解密,得到执行结果。具体流程如下图所示: + +![](../../images/privacy/paillier.jpg) + +### 应用场景 + +在联盟链中,不同的业务场景需要配套不同的隐私保护策略。对于强隐私的业务,比如金融机构之间的对账,对资产数据进行加密是很有必要的。在FISCO BCOS中,用户可以调用同态加密库对数据进行加密,共识节点执行交易的时候调用同态加密预编译合约,得到密文计算的结果。 + + +## 群/环签名 + +### 算法简介 + +**群签名** + +群签名(Group Signature)是一种能保护签名者身份的具有相对匿名性的数字签名方案,用户可以代替自己所在的群对消息进行签名,而验证者可以验证该签名是否有效,但是并不知道签名属于哪一个群成员。同时,用户无法滥用这种匿名行为,因为群管理员可以通过群主私钥打开签名,暴露签名的归属信息。群签名的特性包括: + +- 匿名性:群成员用群参数产生签名,其他人仅可验证签名的有效性,并通过签名知道签名者所属群组,却无法获取签名者身份信息; +- 不可伪造性:只有群成员才能生成有效可被验证的群签名; +- 不可链接性:给定两个签名,无法判断它们是否来自同一个签名者; +- 可追踪性:在监管介入的场景中,群主可通过签名获取签名者身份。 + +**环签名** + +环签名(Ring Signature)是一种特殊的群签名方案,但具备完全匿名性,即不存在管理员这个角色,所有成员可主动加入环,且签名无法被打开。环签名的特性包括: + +- 不可伪造性:环中其他成员不能伪造真实签名者签名; +- 完全匿名性:没有群主,只有环成员,其他人仅可验证环签名的有效性,但没有人可以获取签名者身份信息。 + +### 功能组件 + +FISCO BCOS群/环签名模块提供的功能组件包括: + +- 群/环[签名库](https://github.com/FISCO-BCOS/group-signature-lib),提供完整的群/环签名算法c++接口 + +- 群/环签名预编译合约,供智能合约调用,提供群/环签名验证接口。 + +### 使用方式 + +有签名者身份隐匿需求的业务可借助本模块实现相关功能。签名者通过调用群/环签名库完成对数据的签名,然后将签名上链,业务合约通过调用群/环签名预编译合约完成签名的验证,并将验证结果返还回业务层。如果是群签名,那么监管方还能打开指定签名数据,获得签名者身份。具体流程如下图所示: + +![](../../images/privacy/group_sig.jpg) + +### 应用场景 + +群/环签名由于其天然的匿名性,在需要对参与者身份进行隐匿的场景中有广泛的应用前景,例如匿名投票、匿名竞拍、匿名拍卖等等,甚至在区块链UTXO模型中可用于实现匿名转账。同时,由于群签名具备可追踪性,可以用于需要监管介入的场景,监管方作为群主或者委托群主揭露签名者身份。 + +### 开发示例 + +FISCO BCOS专门为用户提供了群/环签名开发示例,包括: + +- 群/环签名服务端: 提供完整的群/环签名RPC服务。[GitHub源码](https://github.com/FISCO-BCOS/group-signature-server)、[Gitee源码](https://gitee.com/FISCO-BCOS/group-signature-server) + +- 群/环签名客户端: 调用RPC服务对数据进行签名,并提供签名上链以及链上验证等功能。[GitHub源码](https://github.com/FISCO-BCOS/group-signature-client/tree/master-2.0)、[Gitee源码](https://gitee.com/FISCO-BCOS/group-signature-client/tree/master-2.0) + +示例框架如下图所示,具体操作方法请参阅[客户端指南 Github链接](https://github.com/FISCO-BCOS/group-signature-client/tree/master-2.0)或[客户端指南 Gitee链接](https://gitee.com/FISCO-BCOS/group-signature-client/tree/master-2.0)。 + +![](../../images/privacy/demo.jpg) + +## 启用方法 + +FISCO BCOS隐私保护模块是通过预编译合约实现的,默认被启用。 + +### 搭建联盟链 + +搭建本机4节点的[参考文档](../quick_start/air_installation.md)。 + +## 预编译合约接口 + +隐私模块的代码和用户开发的预编译合约都位于`FISCO-BCOS/bcos-executor/src/precompiled/extension`目录,因此隐私模块的调用方式和用户开发的预编译合约[调用流程](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html#id12)相同,不过需要注意: + +已为隐私模块的预编译合约分配了地址,无需另行注册。隐私模块实现的预编译合约列表以及地址分配如下: + +源码可参考链接:[GitHub链接](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master/bcos-executor/src/precompiled/extension)、[Gitee链接](https://gitee.com/FISCO-BCOS/FISCO-BCOS/tree/master/bcos-executor/src/precompiled/extension) + + | 地址 | 功能 | 源码 | + | ------ | ---------- | ------------------------------------------------------------ | + | 0x5004 | 群签名 | GroupSigPrecompiled.cpp | + | 0x5005 | 环签名 | RingSigPrecompiled.cpp | diff --git a/3.x/zh_CN/docs/develop/sdk/c_sdk/api.md b/3.x/zh_CN/docs/develop/sdk/c_sdk/api.md deleted file mode 100644 index 505fdd315..000000000 --- a/3.x/zh_CN/docs/develop/sdk/c_sdk/api.md +++ /dev/null @@ -1,1139 +0,0 @@ -# 接口列表 - -标签:``c-sdk`` ``API`` - ----------- - -本章节介绍`c-sdk`的`API`列表,模块列表: - -- [基础操作](../c_sdk/api.html#id2) -- [错误处理](../c_sdk/api.html#id3) -- [RPC](../c_sdk/api.html#rpc) -- [AMOP](../c_sdk/api.html#amop) -- [EventSub](../c_sdk/api.html#eventsub) -- [工具类](../c_sdk/api.html#id4) - - [KeyPair](../c_sdk/api.html#keypair) - - [ABI编解码](../c_sdk/api.html#abi) - - [交易构造](../c_sdk/api.html#id5) - -## 1. 基础操作 - -本小节介绍`c-sdk`的基础操作,包括`sdk`对象的创建、启动、停止、释放。 - -### `bcos_sdk_version` - -- 原型: - - `const char* bcos_sdk_version()` -- 功能: - - 获取c-sdk的版本以及构建信息 -- 参数: - - 无 -- 返回: - - 字符串类型,包括c-sdk的版本以及构建信息,示例: - - ```shell - FISCO BCOS C SDK Version : 3.1.0 - Build Time : 20220915 11:11:11 - Build Type : Darwin/appleclang/Release - Git Branch : main - Git Commit : dbc82415510a0e59339faebcd72e540fe408d2d0 - ``` - -- 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 - -### `bcos_sdk_create` - -- 原型: - - `void* bcos_sdk_create(struct bcos_sdk_c_config* config)` -- 功能: - - 创建`sdk`对象指针 -- 参数: - - config: 配置对象, 参考[配置对象](./config.html#id2) -- 返回: - - 返回`sdk`指针 - - 失败返回`NULL`,可以调用`bcos_sdk_get_last_error`获取错误信息, 参考`bcos_sdk_get_last_error`接口介绍 -- 注意: - - 创建的`sdk`对象,需要由`bcos_sdk_destroy`接口释放,以免内存泄露 - -### `bcos_sdk_create_by_config_file` - -- 原型: - - `void* bcos_sdk_create_by_config_file(const char *config_file)` -- 功能: - - 创建`sdk`对象指针 -- 参数: - - config_file: 配置文件, 参考[配置文件](./config.html#id3) -- 返回: - - 返回`sdk`指针 - - 失败返回`NULL`,可以调用`bcos_sdk_get_last_error`获取错误信息, 参考`bcos_sdk_get_last_error`接口介绍 -- 注意: - - 创建的`sdk`对象,需要由`bcos_sdk_destroy`接口释放,以免内存泄露 - -### `bcos_sdk_start` - -- 原型: - - `void bcos_sdk_start(void* sdk)` -- 功能: - - 启动`sdk` -- 参数: - - sdk: `sdk`指针 -- 返回: - - 无, 可以使用`bcos_sdk_get_last_error`确认是否启动成功, 参考`bcos_sdk_get_last_error`介绍 - -### `bcos_sdk_stop` - -- 原型: - - `void bcos_sdk_stop(void* sdk)` -- 功能: - - 停止`sdk` -- 参数: - - sdk: `sdk`指针 -- 返回: - - 无 - -### `bcos_sdk_destroy` - -- 原型: - - `void bcos_sdk_destroy(void* sdk)` -- 功能: - - 停止并且释放`sdk` -- 参数: - - sdk: `sdk`指针 -- 返回: 无 - -### `bcos_sdk_c_free` - -- 原型: - - `void bcos_sdk_c_free(void* p)` -- 功能: - - 释放内存 -- 参数: - - p: 指针 -- 返回: 无 - -## 2. 错误处理 - -本小节介绍`c-sdk`的错误处理接口。 - -**注意: 这些接口仅仅对同步调用接口有效,异步接口的错误信息在回调中返回**。 - -### `bcos_sdk_is_last_opr_success` - -- 原型: - - `int bcos_sdk_is_last_opr_success()` -- 功能: - - 最近一次操作是否成功,等价于`bcos_sdk_get_last_error`返回结果不为0。 -- 参数: - - 无 -- 返回: - - 0: 操作失败 - - 1: 操作成功 - -### `bcos_sdk_get_last_error` - -- 原型: - - `int bcos_sdk_get_last_error()` -- 功能: - - 获取上一次操作的返回状态, 失败时可以调用`bcos_sdk_get_last_error_msg`获取错误描述信息 -- 参数: - - 无 -- 返回: - - 0: 成功, 其他表示错误码, 可以使用`bcos_sdk_get_last_error_msg`获取错误描述信息 - -### `bcos_sdk_get_last_error_msg` - -- 原型: - - `const char* bcos_sdk_get_last_error_msg()` -- 功能: - - 获取上一次操作的错误信息描述, 与`bcos_sdk_get_last_error`配合使用 -- 参数: - - 无 -- 返回: 错误描述信息 - -## 3. RPC接口 - -本小节介绍如何在`c-sdk`中调用`FISCO-BCOS 3.0`的`rpc`接口,与节点交互。 - -### `bcos_rpc_call` - -- 原型: - - `void bcos_rpc_call(void* sdk, const char* group, const char* node, const char* to, const char* data, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 调用合约,查询操作,无需共识 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 请求发往的节点名称(节点名称可以通过`getGroupInfo`获取), 值为`NULL`或者空字符串时, 在群组中按最高块高的原则, 随机选择一个节点 - - `to`: 合约地址 - - `data`: 编码后的参数 - - 调用`solidity`合约时为`ABI`编码 - - 调用`liquid`合约时为`liquid`编码 - - `callback`: 回调函数, 函数原型: - - ```shell - typedef void (*bcos_sdk_c_struct_response_cb)(struct bcos_sdk_c_struct_response* resp) - ``` - - `bcos_sdk_c_struct_response`定义及字段含义: - - ```c - struct bcos_sdk_c_struct_response - { - int error; // 返回状态, 0成功, 其他失败 - char* desc; // 失败时描述错误信息 - - void* data; // 返回数据, error=0 时有效 - size_t size; // 返回数据大小, error=0 时有效 - - void* context; // 回调上下文,调用接口时传入的`context`参数 - }; - ``` - - **!!!注意: 回调的数据`data`仅在回调线程有效,多线程场景下,用户需自行拷贝保证数据的线程安全** - - `context`: 回调上下文, 在回调`bcos_sdk_c_struct_response`中`context`字段返回 -- 返回: - - 无 - -### `bcos_rpc_send_transaction` - -- 原型: - - `void bcos_rpc_send_transaction(void* sdk, const char* group, const char* node, const char* data, int proof, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 发送交易,需要区块链共识 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `data`: 签名的交易,十六进制c风格字符串 - - `proof`: 是否返回交易回执证明, 0:不返回,1:返回 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_transaction` - -- 函数原型: `void bcos_rpc_get_transaction(void* sdk, const char* group, const char* node, const char* tx_hash,int proof, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 根据交易哈希获取交易 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `tx_hash`: 交易哈希 - - `proof`: 是否返回交易证明, 0:不返回, 1:返回 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_transaction_receipt` - -- 原型: - - ```shell - void bcos_rpc_get_transaction_receipt(void* sdk, const char* group, const char* node, const char* tx_hash, int proof, bcos_sdk_c_struct_response_cb callback, void* context) - ``` - -- 功能: - - 根据交易哈希获取交易回执 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `tx_hash`: 交易哈希 - - `proof`: 是否返回交易回执证明, 0: 不返回,1: 返回 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_block_by_hash` - -- 原型: - - ```shell - void bcos_rpc_get_block_by_hash(void* sdk, const char* group, const char* node,const char* block_hash, int only_header, int only_tx_hash, bcos_sdk_c_struct_response_cb callback, void* context) - ``` - -- 功能: - - 根据区块哈希获取区块 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `block_hash`: 区块哈希 - - `only_header`: 是否只获取区块头, 1: 是, 0: 否 - - `only_tx_hash`: 是否只获取区块的交易哈希, 1: 是, 0: 否 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_block_by_number` - -- 原型: - - ```shell - void bcos_rpc_get_block_by_number(void* sdk, const char* group, const char* node, int64_t block_number, int only_header, int only_tx_hash, bcos_sdk_c_struct_response_cb callback, void* context) - ``` - -- 功能: - - 根据块高获取区块 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `block_number`: 区块高度 - - `only_header`: 是否只获取区块头, 1: 是, 0: 否 - - `only_tx_hash`: 是否只获取区块的交易哈希, 1: 是, 0: 否 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_block_hash_by_number` - -- 原型: - - `void bcos_rpc_get_block_hash_by_number(void* sdk, const char* group, const char* node, int64_t block_number, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 根据块高获取区块哈希 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `block_number`: 区块高度 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: 无 - -### `bcos_rpc_get_block_limit` - -- 原型: - - `int64_t bcos_rpc_get_block_limit(void* sdk, const char* group)` -- 功能: - - 获取块高限制,创建签名交易时需要使用 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID -- 返回: - - `>0`时返回`block limit`值 - - `<=0`表示获取失败,此时表示查询不到该群组 - -### `bcos_rpc_get_block_number` - -- 原型: - - `void bcos_rpc_get_block_number(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取群组块高 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_code` - -- 原型: - - `void bcos_rpc_get_code(void* sdk, const char* group, const char* node, const char* address,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 根据合约地址,查询合约代码 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `address`: 合约地址 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: 无 - -### `bcos_rpc_get_sealer_list` - -- 原型: - - `void bcos_rpc_get_sealer_list(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取群组共识节点列表 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_observer_list` - -- 原型: - - `void bcos_rpc_get_observer_list(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取群组观察节点列表 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_pending_tx_size` - -- 原型: - - `void bcos_rpc_get_pending_tx_size(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取交易池待打包的交易数量 -- 参数; - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 空 - -### `bcos_rpc_get_sync_status` - -- 原型: - - `void bcos_rpc_get_sync_status(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取群组的区块同步状态 -- 参数; - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_consensus_status` - -- 原型: - - `void bcos_rpc_get_consensus_status(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取节点的共识状态 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_system_config_by_key` - -- 原型: - - `void bcos_rpc_get_system_config_by_key(void* sdk, const char* group, const char* node,const char* key,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取系统配置 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `key`: 配置`key` - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 空 - -### `bcos_rpc_get_total_transaction_count` - -- 原型: - - `void bcos_rpc_get_total_transaction_count(void* sdk, const char* group, const char* node, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取当前区块高度下的交易总量 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_group_peers` - -- 原型: - - `void bcos_rpc_get_group_peers(void* sdk, const char* group, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取群组的网络连接信息 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_peers` - -- 原型: - - `void bcos_rpc_get_peers(void* sdk, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取网关的`p2p`网络连接信息 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_group_list` - -- 原型: - - `void bcos_rpc_get_group_list(void* sdk, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取群组列表 -- 参数: - - `sdk`: `sdk`指针 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_group_info` - -- 原型: - - `void bcos_rpc_get_group_info(void* sdk, const char* group, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取群组信息 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 群组ID - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_group_info_list` - -- 原型: - - `void bcos_rpc_get_group_info_list(void* sdk, bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取群组列表详情 -- 参数: - - sdk: `sdk`指针 - - `callback`: 参考`bcos_rpc_call`接口对`context`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -### `bcos_rpc_get_group_node_info` - -- 原型: - - `void bcos_rpc_get_group_node_info(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 获取群组的节点信息 -- 参数: - - sdk: `sdk`指针 - - group: 群组ID - - node: 节点名称 - - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 - - `context`: 参考`bcos_rpc_call`接口对`context`的说明 -- 返回: - - 无 - -## 4. AMOP接口 - -本小节介绍在`c-sdk`使用FISCO-BCOS 3.0`AMOP`功能的接口。 - -### `bcos_amop_subscribe_topic` - -- 原型: - - `void bcos_amop_subscribe_topic(void* sdk, char** topics, size_t count)` -- 功能: - - 订阅topic -- 参数: - - `sdk`: `sdk`指针 - - `topics`: topics内容 - - `count`: topics长度 -- 返回: - - 无 - -### `bcos_amop_subscribe_topic_with_cb` - -- 原型: - - `void bcos_amop_subscribe_topic_with_cb(void* sdk, const char* topic, bcos_sdk_c_amop_subscribe_cb cb, void* context)` -- 功能: - - 订阅`topic`,并设置接收`topic`消息的回调函数 -- 参数: - - `sdk`: `sdk`指针 - - `topic`: topic - - `cb`: 回调函数, 函数原型如下: - - ```shell - typedef void (*bcos_sdk_c_amop_subscribe_cb)( - const char* endpoint, const char* seq, struct bcos_sdk_c_struct_response* resp); - ``` - - 字段含义: - - endpoint: 接收消息的网络连接标记, 回复消息调用`bcos_amop_send_response`时需要使用 - - seq: 消息标记, 回复消息调用`bcos_amop_send_response`时需要使用 - - resp: 参考`bcos_rpc_call`接口`callback`对`bcos_sdk_c_struct_response`的说明 - - - `context`: 回调上下文, 参考`bcos_rpc_call`接口对`context`的说明 - -### `bcos_amop_set_subscribe_topic_cb` - -- 原型: - - `void bcos_amop_set_subscribe_topic_cb(void* sdk, bcos_sdk_c_amop_subscribe_cb cb, void* context)` -- 功能: - - 为`topic`设置回调函数,接收到的`topic`消息没有单独设置回调函数时,默认回调函数会被调用 -- 参数: - - `sdk`: `sdk`指针 - - `cb`: `topic`回调函数, 参考`bcos_amop_subscribe_topic_with_cb`接口对`cb`的说明 - - `context`: 回调上下文 - -### `bcos_amop_unsubscribe_topic` - -- 原型: - - `void bcos_amop_unsubscribe_topic(void* sdk, char** topics, size_t count)` -- 功能: - - 取消订阅 -- 参数: - - `sdk`: `sdk`指针 - - `topics`: topics内容 - - `count`: topics长度 - -### `bcos_amop_publish` - -- 原型: - - `void bcos_amop_publish(void* sdk, const char* topic, void* data, size_t size, uint32_t timeout,bcos_sdk_c_amop_publish_cb cb, void* context)` -- 功能: - - 发送`topic`消息 -- 参数: - - `sdk`: `sdk`指针 - - `topic`: topic - - `data`: 消息内容 - - `size`: 消息长度 - - `timeout`: 超时时间,单位ms - - `cb`: 回调函数, 函数原型如下: - - ```shell - typedef void (*bcos_sdk_c_amop_publish_cb)(struct bcos_sdk_c_struct_response* resp) - ``` - - - `context`: 回调上下文 - -### `bcos_amop_broadcast` - -- 原型: - - `void bcos_amop_broadcast(void* sdk, const char* topic, void* data, size_t size)` -- 功能: - - 发送`topic`广播消息 -- 参数: - - `sdk`: `sdk`指针 - - `topic`: topic - - `data`: 消息内容 - - `size`: 消息长度 - -### `bcos_amop_send_response` - -- 原型: - - `void bcos_amop_send_response(void* sdk, const char* peer, const char* seq, void* data, size_t size)` -- 功能: - - 发送回复消息 -- 参数: - - `sdk`: `sdk`指针 - - `peer`: 接收消息的网络连接标记, 参考`bcos_amop_subscribe_topic_with_cb`接口回调函数`cb`的字段`endpoint`说明 - - `seq`: 消息标记, 参考`bcos_amop_subscribe_topic_with_cb`接口回调函数`cb`的字段`seq`说明 - - `data`: 消息内容 - - `size`: 消息长度 - -## 5. EventSub接口 - -本小节介绍在`c-sdk`使用FISCO-BCOS 3.0`EventSub`事件订阅功能的接口。 - -### `bcos_event_sub_subscribe_event` - -- 原型: - - `const char* bcos_event_sub_subscribe_event(void* sdk, const char* group, const char* params,bcos_sdk_c_struct_response_cb callback, void* context)` -- 功能: - - 合约事件订阅 -- 参数: - - `sdk`: `sdk`指针 - - `group`: 请求群组ID - - `params`: 请求参数,c风格JSON字符串 - - addresses: 字符串数组,订阅Event的合约地址列表,为空时表示所有的合约 - - fromBlock: 整形,初始区块,-1表示从当前最高块开始 - - toBlock: 整形,结束区块,-1表示不限制区块高度,已经是最高块时也继续等待新的区块 - - topics: 字符串数组,订阅的topic列表,为空时表示所有的topic - - 示例: - - ```shell - { - "addresses": ["6849F21D1E455e9f0712b1e99Fa4FCD23758E8F1"], - "fromBlock": -1, - "toBlock": -1, - "topics": [] - } - ``` - - - `context`: 回调上下文 -- 返回: - - 合约事件订阅的任务id,c风格字符串 - -### `bcos_event_sub_unsubscribe_event` - -- 原型: - - `void bcos_event_sub_unsubscribe_event(void* sdk, const char* id)` -- 功能: - - 取消合约事件订阅 -- 参数: - - `sdk`: `sdk`指针 - - `id`: 合约事件订阅的任务id,`bcos_event_sub_subscribe_event`的返回值 - -## 6. 工具类 - -本小结介绍`c-sdk`的基础工具类的使用,包括`KeyPair`签名对象、`ABI`编解码、构造签名交易。 - -### 6.1 `KeyPair`签名对象 - -- `bcos_sdk_create_keypair` - - 原型: - - `void* bcos_sdk_create_keypair(int crypto_type)` - - 功能: - - 创建`KeyPair`对象 - - 参数: - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - `KeyPair`对象指针 - - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 - - 注意: - - `KeyPair`对象不再使用时需要调用`bcos_sdk_destroy_keypair`接口释放,以免造成内存泄露 -- `bcos_sdk_create_keypair_by_private_key` - - 原型: - - `void* bcos_sdk_create_keypair_by_private_key(int crypto_type, void* private_key, unsigned length)` - - 功能: - - 加载私钥创建`KeyPair`对象 - - 参数: - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - private_key: 私钥,字节数组格式 - - length: 数组长度 - - 返回: - - `KeyPair`对象指针 - - 失败返回`NULL`使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 - - 注意: - - `KeyPair`对象不再使用时需要调用`bcos_sdk_destroy_keypair`接口释放,以免造成内存泄露 -- `bcos_sdk_create_keypair_by_hex_private_key` - - 原型: - - `void* bcos_sdk_create_keypair_by_hex_private_key(int crypto_type, const char* private_key)` - - 功能: - - 加载私钥创建`KeyPair`对象 - - 参数: - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - private_key: 私钥,十六进制c风格字符串格式 - - 返回: - - `KeyPair`对象指针 - - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 - - 注意: - - `KeyPair`对象不再使用时需要调用`bcos_sdk_destroy_keypair`接口释放,以免造成内存泄露 -- `bcos_sdk_get_keypair_type` - - 原型: - - `int bcos_sdk_get_keypair_type(void* key_pair)` - - 功能: - - 获取`KeyPair`对象类型 - - 参数: - - key_pair: `KeyPair`对象指针 - - 返回: - - 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) -- `bcos_sdk_get_keypair_address` - - 原型: - - `const char* bcos_sdk_get_keypair_address(void* key_pair)` - - 功能: - - 获取`KeyPair`对象对应的账户地址 - - 参数: - - key_pair: `KeyPair`对象指针 - - 返回: - - 账户地址,十六进制c风格字符串 - - 注意: - - 返回的字符串不使用时使用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_get_keypair_public_key` - - 原型: - - `const char* bcos_sdk_get_keypair_public_key(void* key_pair)` - - 功能: - - 获取`KeyPair`对象的公钥字符串 - - 参数: - - key_pair: `KeyPair`对象指针 - - 返回: - - 公钥,十六进制c风格字符串 - - 注意: - - 返回的字符串不使用时使用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_get_keypair_private_key` - - 原型: - - `const char* bcos_sdk_get_keypair_private_key(void* key_pair)` - - 功能: - - 获取`KeyPair`对象的私钥字符串 - - 参数: - - key_pair: `KeyPair`对象指针 - - 返回: - - 私钥,十六进制c风格字符串 - - 注意: - - 返回的字符串不使用时使用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_destroy_keypair` - - 原型: - - `void bcos_sdk_destroy_keypair(void* key_pair)` - - 功能: - - 释放`KeyPair`对象 - - 参数: - - key_pair: `KeyPair`对象指针 - - 返回: - - 无 - -### 6.2 `ABI`编解码 - -- `bcos_sdk_abi_encode_constructor` - - 原型: - - `const char* bcos_sdk_abi_encode_constructor(const char* abi, const char* bin, const char* params, int crypto_type)` - - 功能: - - 编码构造函数参数 - - 参数: - - abi: 合约ABI,JSON字符串 - - bin: 合约BIN,十六进制c风格字符串 - - params: 构造函数参数,JSON字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 编码后的参数,十六进制c风格字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 - -- `bcos_sdk_abi_encode_method` - - 原型: - - `const char* bcos_sdk_abi_encode_method(const char* abi, const char* method_name, const char* params, int crypto_type)` - - 功能: - - 编码接口参数 - - 参数: - - abi: 合约ABI,JSON字符串 - - method_name: 接口名 - - params: 构造函数的参数,JSON字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 编码后的参数,十六进制c风格字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_abi_encode_method_by_method_id` - - 原型: - - `const char* bcos_sdk_abi_encode_method_by_method_id(const char* abi, const char* method_id, const char* params, int crypto_type)` - - 功能: - - 根据methodID编码参数 - - 参数: - - abi: 合约ABI,JSON字符串 - - method_id: methodID - - params: 构造函数的参数,JSON字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 编码后的参数,十六进制c风格字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_abi_encode_method_by_method_sig` - - 原型: - - `const char* bcos_sdk_abi_encode_method_by_method_sig(const char* method_sig, const char* params, int crypto_type)` - - 功能: - - 根据接口signature编码参数 - - 参数: - - method_sig: 接口signature - - params: 构造函数的参数,JSON字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 编码后的参数,十六进制c风格字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_abi_decode_method_input` - - 原型: - - `const char* bcos_sdk_abi_decode_method_input(const char* abi, const char* method_name, const char* data, int crypto_type)` - - 功能: - - 根据接口名解析输入参数 - - 参数: - - abi: 合约ABI,JSON字符串 - - method_name: 接口名 - - data: 编码的参数,十六进制c风格字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 解析后的参数,十六进制c风格JSON字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_abi_decode_method_input_by_method_id` - - 原型: - - `const char* bcos_sdk_abi_decode_method_input_by_method_id(const char* abi, const char* method_id, const char* data, int crypto_type)` - - 功能: - - 根据methodID解析输入参数 - - 参数: - - abi: 合约ABI - - method_id: methodID - - data: ABI编码的参数,十六进制c风格字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 解析后的参数,十六进制c风格JSON字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_abi_decode_method_input_by_method_sig` - - 原型: - - `const char* bcos_sdk_abi_decode_method_input_by_method_sig(const char* method_sig, const char* data, int crypto_type)` - - 功能: - - 根据接口signature解析输入参数 - - 参数: - - method_sig: 接口signature - - data: 编码的参数,十六进制c风格字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 解析后的参数,十六进制c风格JSON字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_abi_decode_method_output` - - 原型: - - `const char* bcos_sdk_abi_decode_method_output(const char* abi, const char* method_name, const char* data, int crypto_type)` - - 功能: - - 根据接口名解析返回参数 - - 参数: - - abi: 合约ABI - - method_name: 接口名 - - data: 编码的返回,十六进制c风格字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 解析后的返回,十六进制c风格JSON字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_abi_decode_method_output_by_method_id` - - 原型: - - `const char* bcos_sdk_abi_decode_method_output_by_method_id(const char* abi, const char* method_id, const char* data, int crypto_type)` - - 功能: - - 根据methodID解析返回参数 - - 参数: - - abi: 合约ABI - - method_id: methodID - - data: 编码的返回,十六进制c风格字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 解析后的返回,十六进制c风格JSON字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_abi_decode_event` - - 原型: - - `const char* bcos_sdk_abi_decode_event(const char* abi, const char* event_name, const char* data, int crypto_type)` - - 功能: - - 根据event名解析event参数 - - 参数: - - abi: 合约ABI - - event_name: event名 - - data: 编码的返回,十六进制c风格字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 解析后的event参数,十六进制c风格JSON字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_abi_decode_event_by_topic` - - 原型: - - `const char* bcos_sdk_abi_decode_event_by_topic(const char* abi, const char* topic, const char* data, int crypto_type)` - - 功能: - - 根据topic解析event参数 - - 参数: - - abi: 合约ABI - - topic: event topic - - data: 编码的返回,十六进制c风格字符串 - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - 返回: - - 解析后的event参数,十六进制c风格JSON字符串 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 - -### 6.3 构造签名交易 - -- `bcos_sdk_get_group_wasm_and_crypto` - - 原型: - - `void bcos_sdk_get_group_wasm_and_crypto(void* sdk, const char* group_id, int* wasm, int* crypto_type)` - - 功能: - - 获取群组的部分基础信息 1. 群组运行`wasm`合约,还是`solidity`合约 2. 群组为国密还是非国密环境 - - 参数: - - `sdk`: sdk对象,`bcos_sdk_create`或者`bcos_sdk_create_by_config_file`创建 - - `group_id`: 群组ID - - `wasm`: 返回值,该群组是否运行`wasm`合约 - - 0: 否,群组运行`solidity`合约, - - 1: 是,群组运行`wasm`合约 - - `crypto_type`: 返回值,该群组是否为国密类型,0: 否,1: 是 - - 返回: - - 无 - -- `bcos_sdk_get_group_chain_id` - - 原型: - - `const char* bcos_sdk_get_group_chain_id(void* sdk, const char* group_id)` - - 功能: - - 获取群组的链ID,构造交易时需使用该参数 - - 参数: - - `sdk`: sdk对象,`bcos_sdk_create`或者`bcos_sdk_create_by_config_file`创建 - - `group_id`: 群组ID - - 返回: - - 群组的链ID - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 - -- `bcos_sdk_create_transaction_data` - - 原型: - - `void* bcos_sdk_create_transaction_data(const char* group_id, const char* chain_id, const char* to, const char* data, const char* abi, int64_t block_limit)` - - 功能: - - 创建`TransactionData`对象,该对象是未签名的交易对象 - - 参数: - - `group_id`: 群组ID - - `chain_id`: 链ID,可以调用`bcos_sdk_get_group_chain_id`接口获取群组的链ID - - `to`: 调用的合约地址,部署合约时设置为空字符串"" - - `data`: ABI编码后的参数,十六进制c风格字符串,参考[ABI编解码](../c_sdk/api.html#abi) - - `abi`: 合约的ABI,JSON字符串,可选参数,部署合约时可以将合约的ABI传入,默认传入空字符串"" - - `block_limit`: 区块限制,可以调用`bcos_rpc_get_block_limit`接口获取 - - 返回: - - `TransactionData`对象指针 - - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 - - 注意: - - `TransactionData`对象需要调用`bcos_sdk_destroy_transaction_data`接口释放,以免造成内存泄露 - -- `bcos_sdk_destroy_transaction_data` - - 原型: - - `void bcos_sdk_destroy_transaction_data(void* transaction_data)` - - 功能: - - 释放`TransactionData`对象 - - 参数: - - `transaction_data`: `TransactionData`对象指针 - - 返回: - - 无 -- `bcos_sdk_calc_transaction_data_hash` - - 原型: - - `const char* bcos_sdk_calc_transaction_data_hash(int crypto_type, void* transaction_data)` - - 功能: - - 计算`TransactionData`对象哈希 - - 参数: - - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) - - `transaction_data`: `TransactionData`对象指针 - - 返回: - - `TransactionData`对象哈希 - - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 - - 注意: - - **`TransactionData`对象的哈希,也是交易的哈希** - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 -- `bcos_sdk_sign_transaction_data_hash` - - 原型: - - `const char* bcos_sdk_sign_transaction_data_hash(void* keypair, const char* transcation_hash)` - - 功能: - - 交易哈希签名 - - 参数: - - keypair:`KeyPair`对象,参考[`KeyPair`签名对象](../c_sdk/api.html#keypair) - - transcation_hash: 交易哈希,由`bcos_sdk_calc_transaction_data_hash`接口生成 - - 返回: - - 交易签名,字符串类型 - - 失败返回`NULL`,调用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 - -- `bcos_sdk_create_signed_transaction_with_signed_data` - - 原型: - - ```shell - const char* bcos_sdk_create_signed_transaction_with_signed_data(void* transaction_data, const char* signed_transaction_data, const char* transaction_data_hash, int32_t attribute) - ``` - - - 功能: - - 创建签名的交易 - - 参数: - - transaction_data: `TransactionData`对象 - - signed_transaction_data: 交易哈希的签名,十六进制c风格字符串,`bcos_sdk_sign_transaction_data_hash`接口生成 - - transaction_data_hash: 交易哈希,十六进制c风格字符串,`bcos_sdk_calc_transaction_data_hash`接口生成 - - attribute: 交易额外属性,待拓展,默认填0即可 - - 返回: - - 签名的交易,十六进制c风格字符串 - - 失败返回`NULL`,调用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 - - 注意: - - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 - -- `bcos_sdk_create_signed_transaction` - - 原型: - - ```shell - void bcos_sdk_create_signed_transaction(void* key_pair, const char* group_id, const char* chain_id, const char* to, const char* data, const char* abi, int64_t block_limit, int32_t attribute, char** tx_hash, char** signed_tx) - ``` - - - 功能: - - 创建签名的交易 - - 参数: - - key_pair: `KeyPair`对象,参考[`KeyPair`签名对象](../c_sdk/api.html#keypair) - - group_id: 群组ID - - chain_id: 链ID,可以调用`bcos_sdk_get_group_chain_id`接口获取群组的链ID - - to: 调用的合约地址,部署合约时设置为空字符串"" - - data: ABI编码后的参数,参考[ABI编解码](../c_sdk/api.html#abi) - - abi: 合约的ABI,可选参数,部署合约时可以将合约的ABI传入,默认空字符串"" - - block_limit: 区块限制,可以调用`bcos_rpc_get_block_limit`接口获取 - - attribute: 交易额外属性,待拓展,默认填0即可 - - tx_hash: 返回值,交易哈希,十六进制c风格字符串 - - signed_tx: 返回值,签名的交易,十六进制c风格字符串 - - 返回: - - 调用`bcos_sdk_get_last_error`接口判断是否成功,0表示成功,其他值表示错误码 - - 注意: - - 返回的`tx_hash`、`signed_tx`需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 - - **说明**: - - `bcos_sdk_create_signed_transaction`相当于下面几个接口功能的组合,创建交易、交易哈希、交易签名流程需要分开处理时,使用下面几个接口: - - `bcos_sdk_create_transaction_data`: 创建`TransactionData` - - `bcos_sdk_calc_transaction_data_hash`: 计算交易哈希 - - `bcos_sdk_sign_transaction_data_hash`: 交易哈希签名 - - `bcos_sdk_create_signed_transaction_with_signed_data`: 创建签名的交易 - -- `bcos_sdk_create_transaction_builder_service` - - 原型: - - `void* bcos_sdk_create_transaction_builder_service(void* sdk, const char* group_id)` - - 功能: - - 创建`TransactionBuilderService`对象,简化构造签名交易的姿势,可以对比`bcos_sdk_create_transaction_data_with_tx_builder_service`与`bcos_sdk_create_transaction_data`接口的差异 - - 参数: - - sdk: sdk对象指针 - - group_id: 群组ID - - 返回: - - `TransactionBuilderService`对象指针 - - 失败返回`NULL`,调用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 - - 注意: - - `TransactionBuilderService`对象需要使用`bcos_sdk_destroy_transaction_builder_service`销毁,以免造成内存泄露 -- `bcos_sdk_destroy_transaction_builder_service` - - 原型: - - `bcos_sdk_destroy_transaction_builder_service(void* service)` - - 功能: - - 销毁`TransactionBuilderService`对象 - - 参数: - - `TransactionBuilderService`对象指针 - - 返回: - - 无 -- `bcos_sdk_create_transaction_data_with_tx_builder_service` - - 原型: - - `void* bcos_sdk_create_transaction_data_with_tx_builder_service(void* tx_builder_service, const char* to, const char* data, const char* abi)` - - 功能: - - 创建`TransactionData`对象 - - 参数: - - tx_builder_service: `TransactionBuilderService`对象指针 - - to: 调用的合约地址,部署合约时设置为空字符串"" - - data: ABI编码后的参数,参考[ABI编解码](../c_sdk/api.html#abi) - - abi: 合约的ABI,可选参数,部署合约时可以将合约的ABI传入,默认空字符串"" - - 返回: - - `TransactionData`对象指针 - - 失败返回`NULL`使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 - - 注意: - - 创建的`TransactionData`对象需要由`bcos_sdk_destroy_transaction_data`接口释放,以免造成内存泄露 -- `bcos_sdk_create_signed_transaction_with_tx_builder_service` - - 原型: - - ```shell - void bcos_sdk_create_signed_transaction_with_tx_builder_service(void*tx_builder_service, void* key_pair, const char*to, const char* data, const char* abi, int32_t attribute, char** tx_hash, char** signed_tx) - ``` - - - 功能: - - 创建签名的交易 - - 参数: - - tx_builder_service: `TransactionBuilderService`对象指针 - - key_pair: `KeyPair`对象,参考[`KeyPair`签名对象](../c_sdk/api.html#keypair) - - to: 调用的合约地址,部署合约时设置为空字符串"" - - data: ABI编码后的参数,参考[ABI编解码](../c_sdk/api.html#abi) - - abi: 合约的ABI,可选参数,部署合约时可以将合约的ABI传入,默认空字符串"" - - attribute: 交易额外属性,待拓展,默认填0即可 - - tx_hash: 返回值,交易哈希,十六进制c风格字符串 - - signed_tx: 返回值,签名的交易,十六进制c风格字符串 - - 注意: - - 返回的`tx_hash`、`signed_tx`需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 diff --git a/3.x/zh_CN/docs/develop/sdk/c_sdk/dylibs.md b/3.x/zh_CN/docs/develop/sdk/c_sdk/dylibs.md deleted file mode 100644 index 3740fb7e7..000000000 --- a/3.x/zh_CN/docs/develop/sdk/c_sdk/dylibs.md +++ /dev/null @@ -1,28 +0,0 @@ -# 动态库 - -标签:``c-sdk`` ``dynamic library`` - ----------- - -## 动态库 - - `bcos-c-sdk`已经提供了各个平台的动态库, 用户可以直接下载使用: - -- bcos-c-sdk.dll # windows dll - - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/bcos-c-sdk.dll) - - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/bcos-c-sdk.dll) -- bcos-c-sdk.lib # windows dll symbol - - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/bcos-c-sdk.lib) - - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/bcos-c-sdk.lib) -- libbcos-c-sdk-aarch64.so # linux arm64 - - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/libbcos-c-sdk-aarch64.so) - - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/libbcos-c-sdk-aarch64.so) -- libbcos-c-sdk.so # linux x64 - - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/libbcos-c-sdk.so) - - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/libbcos-c-sdk.so) -- libbcos-c-sdk-aarch64.dylib # mac m1 - - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/libbcos-c-sdk-aarch64.dylib) - - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/libbcos-c-sdk-aarch64.dylib) -- libbcos-c-sdk.dylib # mac x64 - - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/libbcos-c-sdk.dylib) - - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/libbcos-c-sdk.dylib) diff --git a/3.x/zh_CN/docs/develop/sdk/c_sdk/index.md b/3.x/zh_CN/docs/develop/sdk/c_sdk/index.md deleted file mode 100644 index 78ed42ba1..000000000 --- a/3.x/zh_CN/docs/develop/sdk/c_sdk/index.md +++ /dev/null @@ -1,21 +0,0 @@ -# C SDK - -标签:``c-sdk`` ``区块链应用`` - ----------- - -`c-sdk`是FISCO-BCOS 3.0实现的c版本的sdk, 提供c风格的访问区块链的接口,支持rpc、amop和合约事件订阅等基础功能。用户可以用于开发c语言的区块链应用,也可以方便其他开发人员在c sdk基础上进行封装,快速开发其他语言版本的sdk。 - -```eval_rst -.. toctree:: - :maxdepth: 1 - - env.md - compile.md - dylibs.md - config.md - api.md - dev.md - appendix.md - faq.md -``` diff --git a/3.x/zh_CN/docs/develop/sdk/cpp_sdk/index.md b/3.x/zh_CN/docs/develop/sdk/cpp_sdk/index.md deleted file mode 100644 index 56aaa0780..000000000 --- a/3.x/zh_CN/docs/develop/sdk/cpp_sdk/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# CPP SDK - -标签:``cpp-sdk`` ``区块链应用`` - ----- \ No newline at end of file diff --git a/3.x/zh_CN/docs/develop/sdk/index.md b/3.x/zh_CN/docs/develop/sdk/index.md deleted file mode 100644 index c9587f2f1..000000000 --- a/3.x/zh_CN/docs/develop/sdk/index.md +++ /dev/null @@ -1,33 +0,0 @@ -# 多语言SDK - -标签: ``SDK`` - ----- - -```eval_rst -.. important:: - 相关软件和环境版本说明!`请查看 `_ -``` - -FISCO BCOS 3.x版本的多语言SDK设计采用**分层架构**实现,从下到上依次分为通用基础组件层、CPP- SDK层、C-SDK层、多语言、多终端接入层。核心功能由底层CPP-SDK实现,上层多语言简单适配接入,这种方式可快速适配接入多语言SDK。 - -- **通用基础组件**:封装加密算法、通信协议、网络协议、加密机协议; -- **CPP-SDK层**:基于通用基础组件,实现区块链连接相关的网络管理、群组管理、AMOP通信、事件机制、账本与RPC接口,采用C++方式封装实现CPP-SDK; -- **C-SDK层**:基于CPP-SDK再包装一层C接口调用方式的C-SDK; -- **多语言、多终端接入层**:通过C- SDK的接口可以快速适配到Java、golang、nodejs、python、rust以及 iOS、Android等多语言SDK,并且兼容适配Windows、Linux、macOS、KyLin多中操作系统以及X86、ARM(包括M1)等不同平台。 -![](../../../images/develop/sdk_layered_architecture.png) - -各种语言的SDK使用说明文档如下: - -```eval_rst -.. toctree:: - :maxdepth: 1 - - java_sdk/index.md - c_sdk/index.md - python_sdk/index.md - rust_sdk/index.md - cert_config.md -``` - -其他语言待新增。 diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/amop.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/amop.md deleted file mode 100644 index e8555b299..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/amop.md +++ /dev/null @@ -1,333 +0,0 @@ -# AMOP 功能 - -标签:``java-sdk`` ``AMOP`` ``链上信使协议`` - ----- -Java SDK支持链上信使协议AMOP(Advanced Messages Onchain Protocol),用户可以通过AMOP协议与其它机构互传消息。 - -## 1. 接口说明 - -AMOP支持任何一个订阅了某话题的订阅者都能收到该话题相关的推送消息 - -AMOP模块的接口类可参考文件java-sdk中的``sdk-amop/src/main/org/fisco/bcos/sdk/amop/Amop.java``文件,其中主要包含以下几个接口: - -### 1.1 subscribeTopic - -订阅一个话题 - -**参数:** - -* topic: 订阅话题名称。类型:``String``。 -* callback: 处理该话题消息的函数,当收到该话题相关消息时,会被调用。类型:``AmopRequestCallback``。 - -**例子:** - -```java -// 初始化java SDK, 获得Amop对象 -BcosSDK sdk = BcosSDK.build("config-example.toml"); -Amop amop = sdk.getAmop(); -// 启动amop -amop.start(); - -// 定义一个Callback,重写receiveAmopMsg方法,定义收到消息后的处理流程。 -AmopRequestCallback cb = new AmopRequestCallback() { - @Override - public void onRequest(String endpoint, String seq, byte[] data) { - // 你可以在这里写收到消息后的处理逻辑。 - System.out.println("Received msg, content:" + new String(data)); - } -}; - -// 订阅话题 -amop.subscribeTopic("MyTopic", cb); -``` - -### 1.2 sendAmopMsg - -以单播的方式发送AMOP消息 - -**参数:** - -* topic: 发送消息的topic。类型: ``String`` -* content: 消息内容。类型:``byte[]`` -* timeout: 超时时间。类型:``int`` -* callback: 回调函数。类型:``AmopResponseCallback`` - -**注意:** - -对于发送的单播AMOP消息,存在多个订阅topic的客户端时,其中随机的一个可以接收到单播消息。 - -**例子:** - -```java -// 初始化java SDK, 获得Amop对象 -BcosSDK bcosSDK = BcosSDK.build("config-example.toml"); -Amop amop = bcosSDK.getAmop(); -amop.start(); - -AmopResponseCallback cb = new AmopResponseCallback() { - @Override - public void onResponse(Response response) { - // 你可以在这里写收到回复的处理逻辑。 - System.out.println( - "Get response, { errorCode:" - + response.getErrorCode() - + " error:" - + response.getErrorMessage() - + " content:" - + new String(response.getData()) - + " }"); - } -}; - -String msg = "Send Message"; -// 发送消息 -amop.sendAmopMsg("MyTopic", msg.getBytes(), 0, cb); -``` - -### 1.3 broadcastAmopMsg - -以广播的方式发送AMOP消息 - -**参数:** - -* topic: 广播topic。类型:``String`` -* content: 消息内容。类型:``byte[]`` - -**例子:** - -```java -// 初始化java SDK, 获得Amop对象 -BcosSDK bcosSDK = BcosSDK.build("config-example.toml"); -Amop amop = bcosSDK.getAmop(); -amop.start(); - -// 发送消息 -String content = "Send Message"; - -// 发送消息 -amop.broadcastAmopMsg("MyTopic", content.getBytes()); -``` - -### 1.4 unsubscribeTopic - -取消订阅话题。 - -**参数:** - -* topic: 取消订阅的话题。类型:``String`` - -**例子:** - -```java -// 发送消息 -amop.unsubscribeTopic("MyTopic"); -``` - -### 1.5 sendResponse - -回复消息。 - -**参数:** - -* endpoint: 接收消息的对端endpoint,`AmopRequestCallback`回调中返回。类型:``String`` -* seq: 消息seq,`AmopRequestCallback`回调中返回。类型:``String`` -* content: 回复消息内容。类型:``byte[]`` - -**例子:** - -```java -// 初始化java SDK, 获得Amop对象 -BcosSDK sdk = BcosSDK.build("config-example.toml"); -Amop amop = sdk.getAmop(); -// 启动amop -amop.start(); - -// 定义一个Callback,重写receiveAmopMsg方法,定义收到消息后的处理流程。 -AmopRequestCallback cb = new AmopRequestCallback() { - @Override - public void onRequest(String endpoint, String seq, byte[] data) { - // 这里将消息返回给发送端 - amop.sendResponse(endpoint, seq, data); - } -}; - -// 订阅话题 -amop.subscribeTopic("MyTopic", cb); -``` - -### 1.6 setCallback - -设置默认回调,`subscribeTopic`订阅topic指定的回调为空时,接收到消息时会调用设置的默认回调接口 - -**参数:** - -* cb: 回调。类型: ``AmopRequestCallback`` - -## 2. 示例 - -更多的示例请看[java-sdk-demo](https://github.com/FISCO-BCOS/java-sdk-demo)项目源码``java-sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/``下的代码示范,链接:[java-sdk-demo GitHub链接](https://github.com/FISCO-BCOS/java-sdk-demo),[java-sdk-demo Gitee链接](https://gitee.com/FISCO-BCOS/java-sdk-demo)。 - -* 示例: - - * Subscribe - * 功能: 订阅topic,并且将接收的消息直接返回给对端 - * 使用: - - ```shell - Usage: - java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Subscribe topic - Example: - java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Subscribe topic - ``` - - * Publish - * 功能: 发送AMOP单播消息 - * 使用: - - ```shell - Usage: - java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Publish topic msg - Example: - java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Publish topic HelloWorld - ``` - - * Broadcast - * 功能: 广播AMOP消息 - * 使用: - - ```shell - Usage: - java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Broadcast topic msg - Example: - java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Broadcast topic HelloWorld - ``` -## 2. 快速试用AMOP - -### 第一步:下载项目 - -```shell -mkdir -p ~/fisco && cd ~/fisco -# 获取java-sdk代码 -git clone https://github.com/FISCO-BCOS/java-sdk-demo - -# 若因为网络问题导致长时间拉取失败,请尝试以下命令: -git clone https://gitee.com/FISCO-BCOS/java-sdk-demo - -cd java-sdk-demo -# 构建项目 -bash gradlew build -``` - -### 第二步:搭建FISCO BCOS区块链网络 - -根据[指引](../../../quick_start/air_installation.md)搭建FISCO BCOS区块链网络。 - -### 第三步:配置 - -* 复制证书:将你搭建FISCO BCOS网络节点``nodes/${ip}/sdk/`` 目录下的证书复制到``java-sdk-demo/dist/conf``目录下。 - -* 修改配置:`cp config-example.toml config.toml` - -### 第四步:运行Demo - -#### 公有话题Demo - -新打开一个终端,下载java-sdk-demo的代码,并build。 - -```shell -cd ~/fisco -# 获取java-sdk-demo代码 -git clone https://github.com/FISCO-BCOS/java-sdk-demo - -# 若因为网络问题导致长时间拉取失败,请尝试以下命令: -git clone https://gitee.com/FISCO-BCOS/java-sdk-demo - -cd java-sdk-demo - -# build项目 -bash gradlew build -``` - -**运行订阅者:** - -```shell -# 进入java-sdk-demo/dist目录 -cd dist -# 我们订阅名为”testTopic“的话题 -java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Subscribe testTopic -``` - -订阅方的终端输出 - -```shell -====== AMOP subscribe, topic: testTopic -``` - -然后,运行发送者Demo - -**单播消息**: - -```shell -# 调用Publish发送AMOP消息 -# 话题名:testTopic,内容:Tell you something -java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Publish testTopic "Tell you something" -``` - -终端输出: - -```shell -$ java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Publish testTopic "Tell you something" - - ====== AMOP publish, topic: testTopic ,msg: Tell you something - ====== AMOP publish send message - ==> receive response message from server - responseData: Tell you something - ====== AMOP publish send message - ==> receive response message from server - responseData: Tell you something -``` - -同时,返回到话题订阅者的终端,发现终端输出: - -```shell - ==> receive message from client - ==> endpoint: 127.0.0.1:20201 - ==> seq: 64f3f40832d6499f8a154c6205001081 - ==> data: Tell you something - ==> receive message from client - ==> endpoint: 127.0.0.1:20200 - ==> seq: c121fa99204346c0a87478117607a50b - ==> data: Tell you something -``` - -**广播消息**: - -```shell -# 调用Broadcast发送AMOP消息 -# 话题名:testTopic,内容:Tell you something= -java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Broadcast testTopic "Tell you something" -``` - -终端的输出 - -```shell -java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Broadcast testTopic "Tell you something" - ====== AMOP broadcast, topic: testTopic ,msg: Tell you something -``` - -同时,返回到话题订阅者的终端,发现终端输出: - -```java - ==> receive message from client - ==> endpoint: 127.0.0.1:20200 - ==> seq: 3d5e5bec03cf4693939912ed0236b611 - ==> receive message from client - ==> data: Tell you something -``` - -注意: - -1. 广播消息没有回包。 - -2. 接收方可能收到多条重复的广播信息。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/assemble_transaction.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/assemble_transaction.md deleted file mode 100644 index 467edaa86..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/assemble_transaction.md +++ /dev/null @@ -1,388 +0,0 @@ -# 基于ABI和BIN调用合约 - -标签:``java-sdk`` ``发送交易`` ``使用接口签名发送交易`` ``组装交易`` ``合约调用`` - ----- - -```eval_rst -.. note:: - Java SDK同时支持将 `solidity` 转换为 `java` 文件后,调用相应的 `java` 方法部署和调用合约,也支持构造交易的方式部署和调用合约,这里主要展示交易构造与发送,前者的使用方法请参考 `这里 <./quick_start.html#solidityjava>`_ -``` - -## 1. 概念解析:部署和调用 - -合约的操作可分为合约部署和合约调用两大类。其中合约调用又可以被区分为『交易』和『查询』。 - -**合约部署**是指新创建和发布一个合约。交易创建传入的数据会被转换为 EVM 字节码并执行,执行的输出将作为合约代码被永久存储。 - -**合约调用**是指调用已部署的合约的函数。合约调用又可以被区分为『交易』和『查询』。 - -**“查询”**:被view修饰符修饰的方法一般称为“查询”,“查询”无需被同步和发送给到其他节点全网共识。 - -**“交易”**:未被修饰的才会称为“交易”。,而“交易”需发送全网进行上链的共识。 - -以下是“交易”和“查询”更详细的区别。 - -| 内容 | 查询 | 交易 | -|------------------|-----------------|------------------| -| 合约表现 | view修饰 | 无view修饰符 | -| ABI表现 | "constant":true | "constant":false | -| 是否需要签名 | 否 | 是 | -| rpc类型 | call | sendTransaction | -| 执行节点 | 所有共识节点 | 执行层面 | -| 是否消耗gas | 否 | 是 | -| 是否变更存储状态 | 否 | 是 | - -## 2. 快速上手 - -在快速上手环节,使用同步方式来发送。 - -### 2.1 准备abi和binary文件 - -控制台提供一个专门的编译合约工具,方便开发者将Solidity/webankblockchain-liquid(以下简称WBC-Liquid)合约文件编译生成Java文件和abi、binary文件,具体使用方式[参考这里](../../console/console_config.html#java)。 - -通过运行contract2java 脚本,生成的abi和binary文件分别位于contracts/sdk/abi、contracts/sdk/bin目录下(其中,国密版本编译产生的文件位于contracts/sdk/abi/sm和contracts/sdk/bin/sm文件夹下)。可将文件复制到项目的目录下,例如src/main/resources/abi和src/main/resources/bin。 - -为了便于演示,我们使用了以下HelloWorld的Solidity合约。 - -```solidity -pragma solidity ^0.6.0; - -contract HelloWorld{ - string public name; - constructor() public{ - name = "Hello, World!"; - } - - function set(string memory n) public{ - name = n; - } -} -``` - -**编译合约,生成abi和binary:** - -```shell -# 切换到控制台所在目录 -$ cd ~/fisco/console - -# 调用sol2java.sh脚本,编译contracts/solidity目录下的HelloWorld合约: -$ bash contract2java.sh solidity -p org -s contracts/solidity/HelloWorld.sol - -# 生成的abi位于contracts/sdk/abi/HelloWorld.abi路径 -$ ls contracts/sdk/abi/HelloWorld.abi - -# 生成的非国密版本的bin位于contracts/sdk/bin/HelloWorld.bin路径 -$ ls contracts/sdk/bin/HelloWorld.bin - -# 生成的国密版本bin位于contracts/sdk/bin/sm/HelloWorld.bin路径 -$ ls contracts/sdk/bin/sm/HelloWorld.bin -``` - -至此`HelloWorld`合约的abi和binary文件均已生成 - -### 2.2 初始化SDK - -基于配置文件,初始化SDK,如: - -```java - // 初始化BcosSDK对象 - BcosSDK sdk = new BcosSDK(configFile); - // 获取Client对象,此处传入的群组名 group - Client client = sdk.getClient("group0"); - // 构造AssembleTransactionProcessor对象,需要传入client对象,CryptoKeyPair对象和abi、binary文件存放的路径。abi和binary文件需要在上一步复制到定义的文件夹中。 - CryptoKeyPair keyPair = client.getCryptoSuite().getCryptoKeyPair(); -``` - -### 2.3 初始化配置对象 - -#### 2.3.1 部署、交易和查询 - -Java SDK提供了基于abi和binary文件来直接部署和调用合约的方式。本场景下适用于默认的情况,通过创建和使用`AssembleTransactionProcessor`对象来完成合约相关的部署、调用和查询等操作。 - -```java -AssembleTransactionProcessor transactionProcessor = TransactionProcessorFactory.createAssembleTransactionProcessor(client, keyPair, "src/main/resources/abi/", "src/main/resources/bin/"); -``` - -#### 2.3.2 仅交易和查询 - -假如只交易和查询,而不部署合约,那么就不需要复制binary文件,且在构造时无需传入binary文件的路径,例如构造方法的最后一个参数可传入空字符串。 - -```java - AssembleTransactionProcessor transactionProcessor = TransactionProcessorFactory.createAssembleTransactionProcessor(client, keyPair, "src/main/resources/abi/", ""); -``` - -### 2.4 发送操作指令 - -完成初始化SDK和配置对象后,可以发起合约操作指令。 - -#### 2.4.1 同步方式部署合约 - -部署合约调用了deployByContractLoader方法,传入合约名和构造函数的参数,上链部署合约,并获得`TransactionResponse`的结果。 - -```java - // 部署HelloWorld合约。第一个参数为合约名称,第二个参数为合约构造函数的列表,是List类型。 -TransactionResponse response = transactionProcessor.deployByContractLoader("HelloWorld", new ArrayList<>()); -``` - -`TransactionResponse`的数据结构如下: - -- returnCode: 返回的响应码。其中0为成功。 -- returnMessages: 返回的错误信息。 -- TransactionReceipt:上链返回的交易回执。 -- ContractAddress: 部署或调用的合约地址。 -- values: 如果调用的函数存在返回值,则返回解析后的交易返回值,返回Json格式的字符串。 -- events: 如果有触发日志记录,则返回解析后的日志返回值,返回Json格式的字符串。 -- receiptMessages: 返回解析后的交易回执信息。 - -`returnCode`与`returnMessages`对应表汇总[参考这里](./retcode_retmsg.md) - -例如,部署`HelloWorld`合约的返回结果: - -```json -{ - "returnCode": 0, - "returnMessage": "Success", - "transactionReceipt": { - "transactionHash": "0xcfdfb78be52b232afdee717826f9516af98fb2d67ee743da4b78e8c22172112b", - "transactionIndex": "0x0", - "root": "0xf6503b5f1a319dbd2c938d7e371b89441c238271bbaabf3d650112017158a658", - "blockNumber": "0x14b", - "blockHash": "0x817e0aaaba5448a6ac62fc2531be793cf6de9fed70c73ed8837082b7fcf74881", - "from": "0xcaa405b5dd47e7f28e6b862c198c15e923000c0b", - "to": "0x0000000000000000000000000000000000000000", - "gasUsed": "0x44683", - "contractAddress": "0x9dbaf42da05a0148d2ca9905870a91085c23ce71", - "logs": [], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "status": "0x0", - "input": "0x608060405234801561001057600080fd5b506040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061005c929190610062565b50610107565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b61010491905b808211156101005760008160009055506001016100e8565b5090565b90565b6102d3806101166000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633590b49f14610051578063b11b6883146100ba575b600080fd5b34801561005d57600080fd5b506100b8600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061014a565b005b3480156100c657600080fd5b506100cf610164565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010f5780820151818401526020810190506100f4565b50505050905090810190601f16801561013c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b8060009080519060200190610160929190610202565b5050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101fa5780601f106101cf576101008083540402835291602001916101fa565b820191906000526020600020905b8154815290600101906020018083116101dd57829003601f168201915b505050505081565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024357805160ff1916838001178555610271565b82800160010185558215610271579182015b82811115610270578251825591602001919060010190610255565b5b50905061027e9190610282565b5090565b6102a491905b808211156102a0576000816000905550600101610288565b5090565b905600a165627a7a723058209072782fc019ac745aa91b6fede6c358df1b03584b1bf5193a8c66d68a6880f30029", - "output": "0x", - "txProof": null, - "receiptProof": null, - "message": null, - "statusOK": true - }, - "contractAddress": "0x9dbaf42da05a0148d2ca9905870a91085c23ce71", - "values": null, - "events": "{}", - "receiptMessages": "Success" -} -``` - -#### 2.4.2 同步方式发送交易 - -调用合约交易使用了`sendTransactionAndGetResponseByContractLoader`来调用合约交易,此处展示了如何调用`HelloWorld`中的`set`函数。 - -```java - // 创建调用交易函数的参数,此处为传入一个参数 - List params = new ArrayList<>(); - params.add("test"); - // 调用HelloWorld合约,合约地址为helloWorldAddress, 调用函数名为『set』,函数参数类型为params - TransactionResponse transactionResponse = transactionProcessor.sendTransactionAndGetResponseByContractLoader("HelloWorld", helloWorldAddrss, "set", params); -``` - -例如,调用`HelloWorld`合约的返回如下: - -```json -{ - "returnCode": 0, - "returnMessage": "Success", - "transactionReceipt": { - "transactionHash": "0x46b510dfff02c327432362db76555c75211aab17b3b75221137132123773fe8f", - "transactionIndex": "0x0", - "root": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x156", - "blockHash": "0x2d1ef0246bc0484e0fecd2a0b6671c19b69c86ac9e464b162ff4a932908151a0", - "from": "0x77a5933b5af032a313fde655d8290c134aeeb0d5", - "to": "0x975810f096e8d8b2daa9ee399f5ce809c0a12f1b", - "gasUsed": "0x6032", - "contractAddress": "0x0000000000000000000000000000000000000000", - "logs": [], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "status": "0x0", - "input": "0x4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000", - "output": "0x", - "txProof": null, - "receiptProof": null, - "message": null, - "statusOK": true - }, - "contractAddress": "0x0000000000000000000000000000000000000000", - "values": "[]", - "events": "{}", - "receiptMessages": "Success" -} -``` - -#### 2.4.3 调用合约查询接口 - -查询合约直接通过调用链上的节点查询函数即可返回结果,无需共识;因此所有的查询交易都是同步方式通讯的。查询合约使用了`sendCallByContractLoader`函数来查询合约,此处展示了如何调用`HelloWorld`中的`name`函数来进行查询。 - -```java -// 查询HelloWorld合约的『name』函数,合约地址为helloWorldAddress,参数为空 -CallResponse callResponse = transactionProcessor.sendCallByContractLoader("HelloWorld", helloWorldAddrss, "name", new ArrayList<>()); -``` - -查询函数返回如下: - -```json -{ - "returnCode": 0, - "returnMessage": "Success", - "values": "[\"test\"]" -} -``` - -## 3. 更多操作 - -### 3.1 拼接签名的方式发送交易 - -此外,对于特殊的场景,可以通过接口签名的方式DIY拼装交易和发送交易。 - -例如上述`HelloWorld`智能合约定义的set方法的签名为 `set(string)` - -#### 3.1.1 构造接口签名 - -```java -// 使用WBC-Liquid合约时_isWasm 为true,Solidity合约则为false -ABICodec abiCodec = new ABICodec(client.getCryptoSuite(), _isWasm); -String setMethodSignature = "set(string)"; -String abiEncoded = abiCodec.encodeMethodByInterface(setMethodSignature, new Object[]{new String("Hello World")}); -``` - -#### 3.1.2 构造TransactionProcessor - -由于通过构造接口签名的方式无需提供abi,故可以构造一个`TransactionProcessor`来操作。同样可使用`TransactionProcessorFactory`来构造。 - -```java -TransactionProcessor transactionProcessor = TransactionProcessorFactory.createTransactionProcessor(client, keyPair); -``` - -#### 3.1.3 发送交易 - -发送交易到FISCO BCOS节点并接收回执。 - -```java -TransactionReceipt transactionReceipt = transactionProcessor.sendTransactionAndGetReceipt(contractAddress, abiEncoded, keyPair); -``` - -### 3.2 采用callback的方式异步操作合约 - -#### 3.2.1 定义回调类 - -异步发送交易的时候,可以自定义回调类,实现和重写回调处理函数。 - -自定义的回调类需要继承抽象类`TransactionCallback`, 实现`onResponse`方法。同时,可按需决定是否需要重写`onError`、`onTimeout`等方法。 - -例如,我们定义一个简单的回调类。该回调类实现了一个基于可重入锁的异步调用效果,可减少线程的同步等待时间。 - -```java -public class TransactionCallbackMock extends TransactionCallback { - private TransactionReceipt transactionReceipt; - private ReentrantLock reentrantLock = new ReentrantLock(); - private Condition condition; - - public TransactionCallbackMock() { - condition = reentrantLock.newCondition(); - } - - public TransactionReceipt getResult() { - try { - reentrantLock.lock(); - while (transactionReceipt == null) { - condition.awaitUninterruptibly(); - } - return transactionReceipt; - } finally { - reentrantLock.unlock(); - } - } - - @Override - public void onResponse(TransactionReceipt transactionReceipt) { - try { - reentrantLock.lock(); - this.transactionReceipt = transactionReceipt; - condition.signal(); - } finally { - reentrantLock.unlock(); - } - } -} -``` - -#### 3.2.2 采用callback的方式异步部署合约 - -首先,创建一个回调类的实例。然后使用`deployByContractLoaderAsync`方法,异步部署合约。 - -```java -// 创建回调类的实例 -TransactionCallbackMock callbackMock = new TransactionCallbackMock(); -// 异步部署合约 -transactionProcessor.deployByContractLoaderAsync("HelloWorld", new ArrayList<>(), callbackMock); -// 异步等待获取回执 -TransactionReceipt transactionReceipt = callbackMock.getResult(); -``` - -#### 3.2.3 采用callback的方式发送交易 - -参考部署合约交易,可采用异步的方式发送交易。 - -```java -// 创建回调类的实例 -TransactionCallbackMock callbackMock = new TransactionCallbackMock(); -// 定义构造参数 -List params = Lists.newArrayList("test"); -// 异步调用合约交易 -transactionProcessor.sendTransactionAsync(to, abi, "set", params, callbackMock ); -// 异步等待获取回执 -TransactionReceipt transactionReceipt = callbackMock.getResult(); -``` - -### 3.3 采用CompletableFuture的方式异步操作合约 - -#### 3.3.1 采用CompletableFuture的方式部署合约 - -SDK还支持使用`CompletableFuture`封装的方式异步部署合约。 - -```java - // 异步部署交易,并获得CompletableFuture 对象 - CompletableFuture future = - transactionProcessor.deployAsync(abi, bin, new ArrayList<>()); - // 定义正常返回的业务逻辑 - future.thenAccept( - tr -> { - doSomething(tr); - }); - // 定义异常返回的业务逻辑 - future.exceptionally( - e -> { - doSomething(e); - return null; - }); -``` - -## 4. 详细API功能介绍 - -`AssembleTransactionProcessor`支持自定义参数发送交易,支持异步的方式来发送交易,也支持返回多种封装方式的结果。 - -详细的API功能如下。 - -- **public void deployOnly(String abi, String bin, List\ params):** 传入合约abi、bin和构造函数参数来部署合约,不接收回执结果。 -- **public TransactionResponse deployAndGetResponse(String abi, String bin, List\ params) :** 传入合约abi、bin和构造函数参数来部署合约,接收回执结果 -- **TransactionResponse deployAndGetResponseWithStringParams(String abi, String bin, List\ params):** 传入合约abi和String类型的List作为构造函数参数来部署合约,接收TransactionResponse结果。 -- **void deployAsync(String abi, String bin, List\ params, TransactionCallback callback):** 传入合约abi、构造好的合约构造函数和callback来异步部署合约 -- **CompletableFuture\ deployAsync(String abi, String bin, List\ params):** 传入合约abi、bin和构造函数参数来部署合约,接收CompletableFuture封装的回执结果 -- **TransactionResponse deployByContractLoader(String contractName, List\ params):** 传入合约名和构造好的合约构造函数,接收TransactionResponse结果。 -- **void deployByContractLoaderAsync(String contractName, List\ args, TransactionCallback callback):** 传入合约名和合约构造函数参数以及callback,来异步部署合约 -- **TransactionReceipt sendTransactionAndGetReceiptByContractLoader(String contractName, String contractAddress, String functionName, List\ params):** 传入调用合约名称、合约地址、函数名和函数参数,接收交易回执 -- **TransactionResponse sendTransactionAndGetResponse(String to, String abi, String functionName, List\ params):** 传入调用合约地址、合约abi、函数名和函数参数,接收TransactionResponse结果 -- **TransactionResponse sendTransactionWithStringParamsAndGetResponse(String to, String abi, String functionName, List\ params):** 传入调用合约地址、合约abi、函数名和String类型List的函数参数,接收TransactionResponse结果 -- **void sendTransactionAsync(String to, String abi, String functionName, List\ params, TransactionCallback callback):** 传入调用合约地址、合约abi、函数名、函数参数、callback,异步发送交易。 -- **void sendTransactionAndGetReceiptByContractLoaderAsync(String contractName,String contractAddress, String functionName, List\ args, TransactionCallback callback):** 传入调用合约名、合约地址、函数名、函数参数、callback,异步发送交易。 -- **TransactionResponse sendTransactionAndGetResponseByContractLoader(String contractName, String contractAddress, String functionName, List\ funcParams):** 传入调用合约名、合约地址、函数名、函数参数,并接收TransactionResponse结果。 -- **CallResponse sendCallByContractLoader(String contractName, String contractAddress, String functionName, List\ params):** 传入调用合约名、合约地址、函数名、函数参数,并接收CallResponse结果。 -- **CallResponse sendCall(String from, String to, String abi, String functionName, List\ args):** 传入调用者地址、合约地址、合约abi、函数名、函数参数,并接收CallResponse结果。 -- **CallResponse sendCall(CallRequest callRequest):** 传入CallRequest,并接收CallResponse结果。 -- **CallResponse sendCallWithStringParams(String from, String to, String abi, String functionName, List\ paramsList):** 传入调用者地址、合约地址、合约abi、函数名、String类型List的函数参数,并接收CallResponse结果。 diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/contract_parser.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/contract_parser.md deleted file mode 100644 index cdf6bc85b..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/contract_parser.md +++ /dev/null @@ -1,179 +0,0 @@ -# 合约解析 - -标签:``java-sdk`` ``abi`` `scale` ``codec`` - ----- -在Java SDK 3.x版本使用`ABI`和`Scale`两种编解码格式,分别对**Solidity合约**和**WebankBlockchain-Liquid合约(简称WBC-Liquid)**的函数签名、参数编码、返回结果进行编解码。 - -**注**:为了更加区别ABI和Scale的区分,3.0.0-rc3以后org.fisco.bcos.sdk.ABICodec改名为org.fisco.bcos.sdk.v3.ContractCodec - -在Java SDK中,`org.fisco.bcos.sdk.v3.ContractCodec`类提供了编码交易的输出(`data`的字段)、解析交易返回值及解析合约事件推送内容的功能。 - -这里以`Add.sol`合约为例,给出`ContractCodec`的使用参考。 - -```solidity -pragma solidity^0.6.0; - -contract Add { - - uint256 private _n; - event LogAdd(uint256 base, uint256 e); - - constructor() public { - _n = 100; - } - - function get() public view returns (uint256 n) { - return _n; - } - - function add(uint256 e) public returns (uint256 n) { - emit LogAdd(_n, e); - _n = _n + e; - return _n; - } -} -``` - -调用`add(uint256)`接口的交易回执内容如下,重点关注`input`、`output`和`logs`字段: - -```Java -{ - // 省略 ... - "input":"0x1003e2d2000000000000000000000000000000000000000000000000000000000000003c", - "output":"0x00000000000000000000000000000000000000000000000000000000000000a0", - "logs":[ - { - // 省略 ... - "data":"0x0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000003c", - // 省略 ... - } - ], - // 省略 ... -} -``` - -## 1. 初始化ContractCodec - -在使用`ContractCodec`的方法之前,需要先对密码学环境、编解码格式进行初始设定。ABICodec构造函数如下: - -```java -public ContractCodec(CryptoSuite cryptoSuite, boolean isWasm) { - // 省略 -} -``` - -CryptoSuite可以从初始化的Client类中进行获取,可参考链接:[初始化SDK](./assemble_transaction.html#sdk) - -isWasm是决定ContractCodec编码格式使用的重要参数: - -- 如果isWasm为true,那么将使用Scale编码格式对交易输入输出进行编解码,在节点中对应的是使用WBC-Liquid合约; -- 如果isWasm为false,那么将使用ABI编码格式对交易输入输出进行编解码,在节点中对应的是使用Solidity合约。 - -## 2. 构造交易input - -交易的input由两部分组成,函数选择器及调用该函数所需参数的编码。其中input的前四个字节数据(如"0x1003e2d2")指定了要调用的函数选择器,函数选择器的计算方式为函数声明(去除空格,即`add(uint256)`)的哈希,取前4个字节。input的剩余部分为输入参数根据ABI编码之后的结果(如"000000000000000000000000000000000000000000000000000000000000003c"为参数"60"编码之后的结果)。 - -根据函数指定方式及参数输入格式的不同,`ContractCodec`分别提供了以下接口计算交易的`data`。 - -```Java - // 函数名 + Object格式的参数列表 - byte[] encodeMethod(String ABI, String methodName, List params); - // 函数声明 + Object格式的参数列表 - byte[] encodeMethodByInterface(String methodInterface, List params) - // 函数签名 + Object格式的参数列表 - byte[] encodeMethodById(String ABI, byte[] methodId, List params); - // 函数名 + String格式的参数列表 - byte[] encodeMethodFromString(String ABI, String methodName, List params); - // 函数声明 + String格式的参数列表 - byte[] encodeMethodByInterfaceFromString(String methodInterface, List params); - // 函数签名 + String格式的参数列表 - byte[] encodeMethodByIdFromString(String ABI, byte[] methodId, List params); -``` - -以下以`encodeMethod`为例举例说明使用方法,其他接口的使用方法类似。 - -```Java -// 初始化SDK -BcosSDK sdk = BcosSDK.build(configFile); -// 初始化group群组 -Client client = sdk.getClient("group0"); -// 使用Solidity合约 -boolean isWasm = false; -ContractCodec contractCodec = new ContractCodec(client.getCryptoSuite(), isWasm); -String abi = ""; // 合约ABI编码,省略 - -// 构造参数列表 -List argsObjects = new ArrayList(); -argsObjects.add(new BigInteger("60")); -try { - String encoded = contractCodec.encodeMethod(abi, "add", argsObjects)); - logger.info("encode method result, " + encoded); - // encoded = "0x1003e2d2000000000000000000000000000000000000000000000000000000000000003c" -} catch (ContractCodecException e) { - logger.info("encode method error, " + e.getMessage()); -} -``` - -## 3. 解析交易返回值 - -根据函数指定方式及返回值类型的不同,`ContractCodec`分别提供了以下接口解析函数返回值。 - -```Java - // 函数名 + Object格式的返回列表 - List decodeMethod(String ABI, String methodName, String output) - // 函数声明 + Object格式的返回列表 - List decodeMethodByInterface(String ABI, String methodInterface, byte[] output) - // 函数签名 + Object格式的返回列表 - List decodeMethodById(String ABI, byte[] methodId, byte[] output) - // 函数名 + String格式的返回列表 - List decodeMethodToString(String ABI, String methodName, byte[] output) - // 函数声明 + String格式的返回列表 - List decodeMethodByInterfaceToString(String ABI, String methodInterface, byte[] output) - // 函数签名 + String格式的返回列表 - List decodeMethodByIdToString(String ABI, byte[] methodId, byte[] output) -``` - -上述接口参数中的`output`为交易回执中的`output`字段("0x00000000000000000000000000000000000000000000000000000000000000a0")。接口的使用方法可参考构造交易input的接口用法。 - -## 4. 解析合约事件推送内容 - -根据事件指定方式及解析结果类型的不同,`ContractCodec`分别提供了以下接口解析事件内容。 - -```Java - // 事件名 + Object格式的解析结果列表 - List decodeEvent(String ABI, String eventName, String output) - // 事件声明 + Object格式的解析结果列表 - List decodeEventByInterface(String ABI, String eventSignature, String output) - // 事件签名/Topic + Object格式的解析结果列表 - List decodeEventByTopic(String ABI, String eventTopic, String output) - // 事件名 + String格式的解析结果列表 - List decodeEventToString(String ABI, String eventName, String output) - // 事件声明 + String格式的解析结果列表 - List decodeEventByInterfaceToString(String ABI, String eventSignature, String output) - // 事件签名/Topic + String格式的解析结果列表 - List decodeEventByTopicToString(String ABI, String eventTopic, String output) -``` - -对于事件推送,Java SDK需用户可以通过继承`EventCallback`类,重写`onReceiveLog`接口,实现自己对回调的处理逻辑。以下例子使用`decodeEvent`对推送的事件内容进行解析。其他接口的使用方法类似。 - -```Java -class SubscribeCallback implements EventCallback { - public void onReceiveLog(int status, List logs) { - if (logs != null) { - String abi = ""; // 合约ABI编码,省略 - for (EventLog log : logs) { - // 使用Solidity - boolean isWasm = false; - ContractCodec contractCodec = new ContractCodec(client.getCryptoSuite(), isWasm); // client初始化,省略 - try { - List list = contractCodec.decodeEvent(abi, "LogAdd", log.getData()); - logger.debug("decode event log content, " + list); - // list.size() = 2 - } catch (ContractCodecException e) { - logger.error("decode event log error, " + e.getMessage()); - } - } - } -} -``` diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/event_sub.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/event_sub.md deleted file mode 100644 index c379f92dd..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/event_sub.md +++ /dev/null @@ -1,454 +0,0 @@ -# 合约事件推送 - -标签:``java-sdk`` ``事件订阅`` ``Event`` - ----- - -## 1. 功能简介 - -合约事件推送功能提供了合约事件的异步推送机制,客户端向节点发送注册请求,在请求中携带客户端关注的合约事件的参数,节点根据请求参数对请求区块范围的`Event Log`进行过滤,将结果分次推送给客户端。 - -## 2. 交互协议 - -客户端与节点的交互基于WebSocket协议。交互分为三个阶段:注册请求,节点回复,`Event Log`数据推送。 - -### 2.1 注册请求 - -客户端向节点发送事件推送的注册请求: - -```Json -// request sample: -{ - "fromBlock": "latest", - "toBlock": "latest", - "addresses": [ - "0xca5ed56862869c25da0bdf186e634aac6c6361ee" - ], - "topics": [ - "0x91c95f04198617c60eaf2180fbca88fc192db379657df0e412a9f7dd4ebbe95d" - ], - "groupID": "group0", - "filterID": "bb31e4ec086c48e18f21cb994e2e5967" -} -``` - -- filerID:字符串类型,每次请求唯一,标记一次注册任务 -- groupID:字符串类型,群组ID -- fromBlock:整形字符串,初始区块。“latest” 当前块高 -- toBlock:整形字符串,最终区块。“latest” 处理至当前块高时,继续等待新区块 -- addresses:字符串或者字符串数组:字符串表示单个合约地址,数组为多个合约地址,数组可以为空 -- topics:字符串类型或者数组类型:字符串表示单个topic,数组为多个topic,数组可以为空 - -### 2.2 节点回复 - -节点接受客户端注册请求时,会对请求参数进行校验,将是否成功接受该注册请求结果回复给客户端。 - -```Json -// response sample: -{ - "filterID": "bb31e4ec086c48e18f21cb994e2e5967", - "result": 0 -} -``` - -- filterID:字符串类型,每次请求唯一,标记一次注册任务 -- result:整形,返回结果。0成功,其余为失败状态码 - -### 2.3 Event Log数据推送 - -节点验证客户端注册请求成功之后,根据客户端请求参数条件,向客户端推送`Event Log`数据。 - -```Json -// event log push sample: -{ - "filterID": "bb31e4ec086c48e18f21cb994e2e5967", - "result": 0, - "logs": [ - - ] -} -``` - -- filterID:字符串类型,每次请求唯一,标记一次注册任务 -- result:整形 0:`Event Log`数据推送 1:推送完成。客户端一次注册请求对应节点的数据推送会有多次(请求区块范围比较大或者等待新的区块),`result`字段为1时说明节点推送已经结束 -- logs:Log对象数组,result为0时有效 - -## 3. Java SDK 合约事件教程 - -### 注册接口 - -Java SDK中`org.fisco.bcos.sdk.v3.eventsub.EventSubscribe`类提供合约事件的注册接口,用户可以调用`subscribeEvent`向节点发送注册请求,并设置回调函数。 - -```Java - public String subscribeEvent(EventSubParams params, EventSubCallback callback); -``` - -#### `params`注册参数 - -事件回调请求注册的参数: - -```Java -public class EventSubParams { - private BigInteger fromBlock; - private BigInteger toBlock; - private List addresses; - private List> topics; -} -``` - -#### `callback`回调对象 - -```Java -public interface EventSubCallback { - void onReceiveLog(int status, List logs); -} -``` - -- `status` 回调返回状态: - -```Java - 0 : 正常推送,此时logs为节点推送的事件日志 - 1 : 推送完成,执行区间的区块都已经处理 - -41000 : 参数无效,客户端验证参数错误返回 - -41001 : 参数错误,节点验证参数错误返回 - -41002 : 群组不存在 - -41003 : 请求错误的区块区间 - -41004 : 节点推送数据格式错误 - -41005 : 请求发送超时 - -41006 : 客户端无订阅权限 - -41007 : 事件尚未注册,取消订阅失败 - 42000 : 其他错误 -``` - -- `logs`表示回调的`Event Log`对象列表,status为0有效。默认值`null`,可以在子类中通过`org.fisco.bcos.sdk.v3.abi.ContractCodec`解析以下EventLog对象的`data`字段。 - -```Java - // EventLog 对象 - public class EventLog { - private String logIndex; - private String transactionIndex; - private String transactionHash; - private String blockNumber; - private String address; - private String data; - private List topics; - } -``` - -- 实现回调对象 - -Java SDK对回调类`EventSubCallback`无默认实现,用户可以通过继承`EventSubCallback`类,重写`onReceiveLog`接口,实现自己的回调逻辑处理。 - -```Java -class SubscribeCallback implements EventSubCallback { - public void onReceiveLog(int status, List logs) { - // ADD CODE - } -} -``` - -**注意:`onReceiveLog`接口多次回调的`logs`有重复的可能性,可以根据`EventLog`对象中的`blockNumber,transactionIndex,logIndex`进行去重** - -#### topic工具 - -`org.fisco.bcos.sdk.v3.codec.abi.TopicTools`提供将各种类型参数转换为对应topic的工具,用户设置`EventSubParams`的`topics`参数可以使用。 - -```Java - class TopicTools { - // int1/uint1~uint1/uint256 - public static String integerToTopic(BigInteger i) - // bool - public static String boolToTopic(boolean b) - // address - public static String addressToTopic(String s) - // string - public static String stringToTopic(String s) - // bytes - public static String bytesToTopic(byte[] b) - // byte1~byte32 - public static String byteNToTopic(byte[] b) -} -``` - -## 4. 示例 - -这里以[`Asset`](https://github.com/FISCO-BCOS/LargeFiles/blob/master/tools/asset-app.tar.gz)合约的`TransferEvent`为例说明,给出合约事件推送的一些场景供用户参考。 - -```solidity -contract Asset { - event TransferEvent(int256 ret, string indexed from_account, string indexed to_account, uint256 indexed amount); - event TransferAccountEvent(string,string); - - function transfer(string from_account, string to_account, uint256 amount) public returns(int256) { - // 结果 - int result = 0; - - // 其他逻辑,省略 - - // TransferEvent 保存结果以及接口参数 - TransferEvent(result, from_account, to_account, amount); - - // TransferAccountEvent 保存账号 - TransferAccountEvent(from_account, to_account); - } -} -``` - -- 场景1:将链上所有/最新的事件回调至客户端 - -```Java - // 其他初始化逻辑,省略 - - // 参数设置 - EventSubParams params = new EventSubParams(); - - // 全部Event fromBlock设置为"1" - params.setFromBlock("1"); - - // toBlock设置为"latest",处理至最新区块继续等待新的区块 - params.setToBlock("latest"); - - // addresses设置为空数组,匹配所有的合约地址 - params.setAddresses(new ArrayList()); - - // topics设置为空数组,匹配所有的Event - params.setTopics(new ArrayList()); - - // 注册事件 - EventSubCallback callback = new EventSubCallback(); - String registerId = eventSubscribe.subscribeEvent(params, callback); -``` - -- 场景2: 将`Asset`合约最新的`TransferEvent`事件回调至客户端 - -```Java - // 其他初始化逻辑,省略 - - // 设置参数 - EventSubParams params = new EventSubParams(); - - // 从最新区块开始,fromBlock设置为"latest" - params.setFromBlock("latest"); - // toBlock设置为"latest",处理至最新区块继续等待新的区块 - params.setToBlock("latest"); - - // addresses设置为空数组,匹配所有的合约地址 - params.setAddresses(new ArrayList()); - - // topic0,TransferEvent(int256,string,string,uint256) - ArrayList topics = new ArrayList<>(); - topics.add(TopicTools.stringToTopic("TransferEvent(int256,string,string,uint256)")); - params.setTopics(topics); - - // 注册事件 - EventSubCallback callback = new EventSubCallback(); - String registerId = eventSubscribe.subscribeEvent(params, callback); -``` - -- 场景3: 将指定地址的`Asset`合约最新的`TransferEvent`事件回调至客户端 - -合约地址: `String addr = "0x06922a844c542df030a2a2be8f835892db99f324";` - -```Java - // 其他初始化逻辑,省略 - - String addr = "0x06922a844c542df030a2a2be8f835892db99f324"; - - // 设置参数 - EventSubParams params = new EventSubParams(); - - // 从最新区块开始,fromBlock设置为"latest" - params.setFromBlock("latest"); - // toBlock设置为"latest",处理至最新块并继续等待共识出块 - params.setToBlock("latest"); - - // 合约地址 - ArrayList addresses = new ArrayList(); - addresses.add(addr); - params.setAddresses(addresses); - - // topic0,匹配 TransferEvent(int256,string,string,uint256) 事件 - ArrayList topics = new ArrayList<>(); - topics.add(TopicTools.stringToTopic("TransferEvent(int256,string,uint256)")); - params.setTopics(topics); - - // 注册事件 - EventSubCallback callback = new EventSubCallback(); - String registerId = eventSubscribe.subscribeEvent(params, callback); -``` - -- 场景4: 将指定地址的`Asset`合约所有`TransferEvent`事件回调至客户端 - -合约地址: `String addr = "0x06922a844c542df030a2a2be8f835892db99f324";` - -```Java - // 其他初始化逻辑,省略 - - // 设置参数 - EventSubParams params = new EventSubParams(); - - // 从最初区块开始,fromBlock设置为"1" - params.setFromBlock("1"); - // toBlock设置为"latest",处理至最新块并继续等待共识出块 - params.setToBlock("latest"); - - // 设置合约地址 - ArrayList addresses = new ArrayList(); - addresses.add(addr); - params.setAddresses(addresses); - - // TransferEvent(int256,string,string,uint256) 转换为topic - ArrayList topics = new ArrayList<>(); - topics.add(TopicTools.stringToTopic("TransferEvent(int256,string,string,uint256)")); - params.setTopics(topics); - - // 注册事件 - EventSubCallback callback = new EventSubCallback(); - String registerId = eventSubscribe.subscribeEvent(params, callback); -``` - -- 场景5: 将`Asset`指定合约指定账户转账的所有事件回调至客户端 - -合约地址: `String addr = "0x06922a844c542df030a2a2be8f835892db99f324"` - -转账账户: `String fromAccount = "account"` - -```Java - // 其他初始化逻辑,省略 - - String addr = "0x06922a844c542df030a2a2be8f835892db99f324"; - String fromAccount = "account"; - - // 参数 - EventSubParams params = new EventSubParams(); - - // 从最初区块开始,fromBlock设置为"1" - params.setFromBlock("1"); - // toBlock设置为"latest" - params.setToBlock("latest"); - - // 设置合约地址 - ArrayList addresses = new ArrayList(); - addresses.add(addr); - params.setAddresses(addresses); - - // 设置topic - ArrayList topics = new ArrayList<>(); - // TransferEvent(int256,string,string,uint256) 转换为topic - topics.add(TopicTools.stringToTopic("TransferEvent(int256,string,string,uint256)")); - // 转账账户 fromAccount转换为topic - topics.add(TopicTools.stringToTopic(fromAccount)); - params.setTopics(topics); - - // 注册事件 - EventSubCallback callback = new EventSubCallback(); - String registerId = eventSubscribe.subscribeEvent(params, callback); -``` - -## 4. 解析例子 - -以`Asset`合约为例,描述合约部署、调用、注册事件及解析节点推送事件内容的实现。注意:对增加了indexed属性的事件参数,均不进行解码,在相应位置上直接记录,其余非indexed属性的事件参数将进行解码。 - -```Java - String contractAddress = ""; - try { - AssembleTransactionProcessor manager = - TransactionProcessorFactory.createAssembleTransactionProcessor( - client, client.getCryptoSuite().createKeyPair(), abiFile, binFile); - // deploy - TransactionResponse response = manager.deployByContractLoader("Asset", Lists.newArrayList()); - if (!response.getTransactionReceipt().getStatus().equals("0x0")) { - return; - } - contractAddress = response.getContractAddress(); - // call function with event - List paramsSetValues = new ArrayList(); - paramsSetValues.add("Alice"); - paramsSetValues.add("Bob"); - paramsSetValues.add(new BigInteger("100")); - TransactionResponse transactionResponse = - manager.sendTransactionAndGetResponse( - contractAddress, abi, "transfer", paramsSetValues); - logger.info("transaction response : " + JsonUtils.toJson(transactionResponse)); - } catch (Exception e) { - logger.error("exception:", e); - } - - // subscribe event - EventSubParams eventLogParams = new EventSubParams(); - eventLogParams.setFromBlock("latest"); - eventLogParams.setToBlock("latest"); - eventLogParams.setAddresses(new ArrayList<>()); - ArrayList topics = new ArrayList<>(); - ArrayList topicIdx0 = new ArrayList<>(); - CryptoSuite invalidCryptoSuite = - new CryptoSuite(client.getCryptoSuite().getCryptoTypeConfig()); - TopicTools topicTools = new TopicTools(invalidCryptoSuite); - topicIdx0.add(topicTools.stringToTopic("TransferEvent(int256,string,string,uint256)")); - topicIdx0.add(topicTools.stringToTopic("TransferAccountEvent(string,string)")); - eventLogParams.setTopics(topics); - - class SubscribeCallback implements EventSubCallback { - public transient Semaphore semaphore = new Semaphore(1, true); - - SubscribeCallback() { - try { - semaphore.acquire(1); - } catch (InterruptedException e) { - logger.error("error :", e); - Thread.currentThread().interrupt(); - } - } - - @Override - public void onReceiveLog(int status, List logs) { - Assert.assertEquals(status, 0); - String str = "status in onReceiveLog : " + status; - logger.debug(str); - semaphore.release(); - - // decode event - if (logs != null) { - for (EventLog log : logs) { - logger.debug( - " blockNumber:" - + log.getBlockNumber() - + ",txIndex:" - + log.getTransactionIndex() - + " data:" - + log.getData()); - ABICodec abiCodec = new ABICodec(client.getCryptoSuite()); - try { - List list = abiCodec.decodeEvent(abi, "TransferEvent", log); - logger.debug("decode event log content, " + list); - // list = [0, 0x81376b9868b292a46a1c486d344e427a3088657fda629b5f4a647822d329cd6a, 0x28cac318a86c8a0a6a9156c2dba2c8c2363677ba0514ef616592d81557e679b6, 0x0000000000000000000000000000000000000000000000000000000000000064] - // 后三个事件参数均为indexed属性 - Assert.assertEquals(4, list.size()); - } catch (ABICodecException e) { - logger.error("decode event log error, " + e.getMessage()); - } - try { - List list = abiCodec.decodeEvent(abi, "TransferAccountEvent", log); - logger.debug("decode event log content, " + list); - // list = [Alice, Bob] - Assert.assertEquals(2, list.size()); - } catch (ABICodecException e) { - logger.error("decode event log error, " + e.getMessage()); - } - } - } - } - } - - SubscribeCallback subscribeEventCallback1 = new SubscribeCallback(); - String registerId = - eventSubscribe.subscribeEvent(eventLogParams, subscribeEventCallback1); - try { - subscribeEventCallback1.semaphore.acquire(1); - subscribeEventCallback1.semaphore.release(); - logger.info("subscribe successful, registerId is " + registerId); - } catch (InterruptedException e) { - logger.error("system error:", e); - Thread.currentThread().interrupt(); - } -``` diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/index.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/index.md deleted file mode 100644 index 89981339a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/index.md +++ /dev/null @@ -1,32 +0,0 @@ -# Java SDK - -标签:``java-sdk`` ``区块链应用`` - ----- - -```eval_rst -.. important:: - 相关软件和环境版本说明!`请查看 `_ -``` - -Java SDK 提供了访问 FISCO BCOS 节点的Java API,支持节点状态查询、部署和调用合约等功能. - -```eval_rst -.. toctree:: - :maxdepth: 1 - - quick_start.md - config.md - rpc_api.md - assemble_transaction.md - retcode_retmsg.md - remote_sign_assemble_transaction.md - transaction_decode.md - contract_parser.md - crypto.md - keytool.md - amop.md - event_sub.md - spring_boot_starter.md - spring_boot_crud.md -``` diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/deprecated-list.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/deprecated-list.html deleted file mode 100644 index 04e007d57..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/deprecated-list.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - -已过时的列表 (java-sdk 3.0.0 API) - - - - - - - -
- - - - - - - -
- - -
-

已过时的 API

-

目录

- -
-
- - - - - - - -
- -
- - - - - - - -
- - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-frame.html deleted file mode 100644 index abb5948c7..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.amop (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.amop

-
-

接口

- -

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-summary.html deleted file mode 100644 index c8ce12f80..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-summary.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.amop (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.amop

-
-
-
    -
  • - - - - - - - - - - - - -
    接口概要 
    接口说明
    Amop -
    AMOP module interface.
    -
    -
  • -
  • - - - - - - - - - - - - -
    类概要 
    说明
    AmopImp 
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-tree.html deleted file mode 100644 index 9e896480e..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-tree.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.amop 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.amop的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.amop.AmopImp (implements org.fisco.bcos.sdk.v3.amop.Amop)
    • -
    -
  • -
-

接口分层结构

-
    -
  • org.fisco.bcos.sdk.v3.amop.Amop
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/Client.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/Client.html deleted file mode 100644 index d039910bc..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/Client.html +++ /dev/null @@ -1,2483 +0,0 @@ - - - - - - -Client (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.client
-

接口 Client

-
-
-
-
    -
  • -
    -
    所有已知实现类:
    -
    ClientImpl
    -
    -
    -
    -
    public interface Client
    -
    This is the interface of client module.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      字段详细资料

      - - - -
        -
      • -

        logger

        -
        static final org.slf4j.Logger logger
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        build

        -
        static Client build(ConfigOption configOption)
        -
        Build a client instance GroupId is identified, all interfaces are available
        -
        -
        参数:
        -
        configOption - the config
        -
        返回:
        -
        a client instance
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        static Client build(java.lang.String groupId,
        -                    ConfigOption configOption)
        -
        Build a client instance GroupId is identified, all interfaces are available
        -
        -
        参数:
        -
        groupId - the group info
        -
        configOption - the config
        -
        返回:
        -
        a client instance
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        static Client build(java.lang.String groupId,
        -                    ConfigOption configOption,
        -                    long nativePointer)
        -
        Build a client instance GroupId is identified, all interfaces are available, with specific - jniRPC
        -
        -
        参数:
        -
        groupId - the group info
        -
        configOption - the config
        -
        nativePointer - jni impl native handler
        -
        返回:
        -
        a client instance
        -
        -
      • -
      - - - -
        -
      • -

        getNativePointer

        -
        long getNativePointer()
        -
        -
        返回:
        -
        native pointer
        -
        -
      • -
      - - - -
        -
      • -

        getCryptoSuite

        -
        CryptoSuite getCryptoSuite()
        -
        Get CryptoSuite
        -
        -
        返回:
        -
        the CryptoSuite
        -
        -
      • -
      - - - -
        -
      • -

        getCryptoType

        -
        java.lang.Integer getCryptoType()
        -
        Get crypto type
        -
        -
        返回:
        -
        the CryptoType, e.g. ECDSA_TYPE
        -
        -
      • -
      - - - -
        -
      • -

        isWASM

        -
        java.lang.Boolean isWASM()
        -
        Whether is wasm exec env
        -
        -
        返回:
        -
        true when wasm exec env
        -
        -
      • -
      - - - -
        -
      • -

        isAuthCheck

        -
        java.lang.Boolean isAuthCheck()
        -
        Whether is auth check in chain
        -
        -
        返回:
        -
        true when chain in auth mode
        -
        -
      • -
      - - - -
        -
      • -

        isSerialExecute

        -
        java.lang.Boolean isSerialExecute()
        -
      • -
      - - - -
        -
      • -

        getGroup

        -
        java.lang.String getGroup()
        -
        get groupId of the client
        -
        -
        返回:
        -
        the groupId
        -
        -
      • -
      - - - -
        -
      • -

        getChainId

        -
        java.lang.String getChainId()
        -
        get groupId of the client
        -
        -
        返回:
        -
        the groupId
        -
        -
      • -
      - - - -
        -
      • -

        getConfigOption

        -
        ConfigOption getConfigOption()
        -
        -
        返回:
        -
        return client config
        -
        -
      • -
      - - - -
        -
      • -

        sendTransaction

        -
        BcosTransactionReceipt sendTransaction(java.lang.String signedTransactionData,
        -                                       boolean withProof)
        -
        Ledger operation: send transaction
        -
        -
        参数:
        -
        signedTransactionData - transaction string
        -
        withProof - whether contains merkle proof or not
        -
        返回:
        -
        Transaction receipt
        -
        -
      • -
      - - - -
        -
      • -

        sendTransaction

        -
        BcosTransactionReceipt sendTransaction(java.lang.String node,
        -                                       java.lang.String signedTransactionData,
        -                                       boolean withProof)
        -
        Ledger operation: send transaction
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        signedTransactionData - transaction string
        -
        withProof - whether contains merkle proof or not
        -
        返回:
        -
        Transaction receipt
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAsync

        -
        void sendTransactionAsync(java.lang.String signedTransactionData,
        -                          boolean withProof,
        -                          TransactionCallback callback)
        -
        Ledger operation: async send transaction
        -
        -
        参数:
        -
        signedTransactionData - transaction string
        -
        withProof - whether contains merkle proof or not
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAsync

        -
        void sendTransactionAsync(java.lang.String node,
        -                          java.lang.String signedTransactionData,
        -                          boolean withProof,
        -                          TransactionCallback callback)
        -
        Ledger operation: async send transaction
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        signedTransactionData - transaction string
        -
        withProof - whether contains merkle proof or not
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        call

        -
        Call call(Transaction transaction)
        -
        Ledger operation: call contract functions without sending transaction
        -
        -
        参数:
        -
        transaction - transaction instance
        -
        返回:
        -
        Call
        -
        -
      • -
      - - - -
        -
      • -

        call

        -
        Call call(java.lang.String node,
        -          Transaction transaction)
        -
        Ledger operation: call contract functions without sending transaction
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        transaction - transaction instance
        -
        返回:
        -
        Call
        -
        -
      • -
      - - - -
        -
      • -

        callAsync

        -
        void callAsync(Transaction transaction,
        -               RespCallback<Call> callback)
        -
        Ledger operation: async call contract functions without sending transaction
        -
        -
        参数:
        -
        transaction - transaction instance
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        callAsync

        -
        void callAsync(java.lang.String node,
        -               Transaction transaction,
        -               RespCallback<Call> callback)
        -
        Ledger operation: async call contract functions without sending transaction
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        transaction - transaction instance
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockNumber

        -
        BlockNumber getBlockNumber()
        -
        Ledger operation: get block number
        -
        -
        返回:
        -
        block number
        -
        -
      • -
      - - - -
        -
      • -

        getBlockNumber

        -
        BlockNumber getBlockNumber(java.lang.String node)
        -
        Ledger operation: get block number
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        block number
        -
        -
      • -
      - - - -
        -
      • -

        getBlockNumberAsync

        -
        void getBlockNumberAsync(RespCallback<BlockNumber> callback)
        -
        Ledger operation: async get block number
        -
        -
        参数:
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockNumberAsync

        -
        void getBlockNumberAsync(java.lang.String node,
        -                         RespCallback<BlockNumber> callback)
        -
        Ledger operation: async get block number
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getCode

        -
        Code getCode(java.lang.String address)
        -
        Ledger operation: get code
        -
        -
        参数:
        -
        address - the address string
        -
        返回:
        -
        a code instance
        -
        -
      • -
      - - - -
        -
      • -

        getCode

        -
        Code getCode(java.lang.String node,
        -             java.lang.String address)
        -
        Ledger operation: get code
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        address - the address string
        -
        返回:
        -
        a code instance
        -
        -
      • -
      - - - -
        -
      • -

        getCodeAsync

        -
        void getCodeAsync(java.lang.String address,
        -                  RespCallback<Code> callback)
        -
        Ledger operation: async get code
        -
        -
        参数:
        -
        address - the address string
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getCodeAsync

        -
        void getCodeAsync(java.lang.String node,
        -                  java.lang.String address,
        -                  RespCallback<Code> callback)
        -
        Ledger operation: async get code
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        address - the address string
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getABI

        -
        Abi getABI(java.lang.String address)
        -
        Scheduler: get abi
        -
        -
        参数:
        -
        address - the address string
        -
        返回:
        -
        abi string
        -
        -
      • -
      - - - -
        -
      • -

        getABI

        -
        Abi getABI(java.lang.String node,
        -           java.lang.String address)
        -
        Ledger operation: get abi
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        address - the address string
        -
        返回:
        -
        a code instance
        -
        -
      • -
      - - - -
        -
      • -

        getABIAsync

        -
        void getABIAsync(java.lang.String address,
        -                 RespCallback<Abi> callback)
        -
        Ledger operation: async get abi
        -
        -
        参数:
        -
        address - the address string
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getABIAsync

        -
        void getABIAsync(java.lang.String node,
        -                 java.lang.String address,
        -                 RespCallback<Abi> callback)
        -
        Ledger operation: async get abi
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        address - the address string
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTotalTransactionCount

        -
        TotalTransactionCount getTotalTransactionCount()
        -
        Ledger operation: get total transaction coun
        -
        -
        返回:
        -
        TotalTransactionCount
        -
        -
      • -
      - - - -
        -
      • -

        getTotalTransactionCount

        -
        TotalTransactionCount getTotalTransactionCount(java.lang.String node)
        -
        Ledger operation: get total transaction coun
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        TotalTransactionCount
        -
        -
      • -
      - - - -
        -
      • -

        getTotalTransactionCountAsync

        -
        void getTotalTransactionCountAsync(RespCallback<TotalTransactionCount> callback)
        -
        Ledger operation: async get total transaction count
        -
        -
        参数:
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTotalTransactionCountAsync

        -
        void getTotalTransactionCountAsync(java.lang.String node,
        -                                   RespCallback<TotalTransactionCount> callback)
        -
        Ledger operation: async get total transaction count
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByHash

        -
        BcosBlock getBlockByHash(java.lang.String blockHash,
        -                         boolean onlyHeader,
        -                         boolean onlyTxHash)
        -
        Ledger operation: get block by hash
        -
        -
        参数:
        -
        blockHash - the hashcode of the block
        -
        onlyHeader - if true then only return block header
        -
        onlyTxHash - the boolean define the tx is full or not
        -
        返回:
        -
        a block
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByHash

        -
        BcosBlock getBlockByHash(java.lang.String node,
        -                         java.lang.String blockHash,
        -                         boolean onlyHeader,
        -                         boolean onlyTxHash)
        -
        Ledger operation: get block by hash
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockHash - the hashcode of the block
        -
        onlyHeader - if true then only return block header
        -
        onlyTxHash - the boolean define the tx is full or not
        -
        返回:
        -
        a block
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByHashAsync

        -
        void getBlockByHashAsync(java.lang.String blockHash,
        -                         boolean onlyHeader,
        -                         boolean onlyTxHash,
        -                         RespCallback<BcosBlock> callback)
        -
        Ledger operation: async get block by hash
        -
        -
        参数:
        -
        blockHash - the hashcode of the block
        -
        onlyHeader - if true then only return block header
        -
        onlyTxHash - the boolean define the tx is full or not
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByHashAsync

        -
        void getBlockByHashAsync(java.lang.String node,
        -                         java.lang.String blockHash,
        -                         boolean onlyHeader,
        -                         boolean onlyTxHash,
        -                         RespCallback<BcosBlock> callback)
        -
        Ledger operation: async get block by hash
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockHash - the hashcode of the block
        -
        onlyHeader - if true then only return block header
        -
        onlyTxHash - the boolean define the tx is full or not
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByNumber

        -
        BcosBlock getBlockByNumber(java.math.BigInteger blockNumber,
        -                           boolean onlyHeader,
        -                           boolean onlyTxHash)
        -
        Ledger operation: get block by block number
        -
        -
        参数:
        -
        blockNumber - the number of the block
        -
        onlyHeader - the boolean define if only return header
        -
        onlyTxHash - the boolean define if only return tx hash
        -
        返回:
        -
        block
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByNumber

        -
        BcosBlock getBlockByNumber(java.lang.String node,
        -                           java.math.BigInteger blockNumber,
        -                           boolean onlyHeader,
        -                           boolean onlyTxHash)
        -
        Ledger operation: get block by block number
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockNumber - the number of the block
        -
        onlyHeader - the boolean define if only return header
        -
        onlyTxHash - the boolean define if only return tx hash
        -
        返回:
        -
        block
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByNumberAsync

        -
        void getBlockByNumberAsync(java.math.BigInteger blockNumber,
        -                           boolean onlyHeader,
        -                           boolean onlyTxHash,
        -                           RespCallback<BcosBlock> callback)
        -
        Ledger operation: async get block by block number
        -
        -
        参数:
        -
        blockNumber - the number of the block
        -
        onlyHeader - the boolean if only need header
        -
        onlyTxHash - the boolean if you need all transactions
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByNumberAsync

        -
        void getBlockByNumberAsync(java.lang.String node,
        -                           java.math.BigInteger blockNumber,
        -                           boolean onlyHeader,
        -                           boolean onlyTxHash,
        -                           RespCallback<BcosBlock> callback)
        -
        Ledger operation: async get block by block number
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockNumber - the number of the block
        -
        onlyHeader - the boolean if only need header
        -
        onlyTxHash - the boolean if you need all transactions
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockHashByNumber

        -
        BlockHash getBlockHashByNumber(java.math.BigInteger blockNumber)
        -
        Ledger operation: async get block hash by block number
        -
        -
        参数:
        -
        blockNumber - the number of the block
        -
        返回:
        -
        BlockHash
        -
        -
      • -
      - - - -
        -
      • -

        getBlockHashByNumberAsync

        -
        void getBlockHashByNumberAsync(java.math.BigInteger blockNumber,
        -                               RespCallback<BlockHash> callback)
        -
        Ledger operation: async get block hash by block number
        -
        -
        参数:
        -
        blockNumber - the number of the block
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockHashByNumber

        -
        BlockHash getBlockHashByNumber(java.lang.String node,
        -                               java.math.BigInteger blockNumber)
        -
        Ledger operation: async get block hash by block number
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockNumber - the number of the block
        -
        返回:
        -
        BlockHash
        -
        -
      • -
      - - - -
        -
      • -

        getBlockHashByNumberAsync

        -
        void getBlockHashByNumberAsync(java.lang.String node,
        -                               java.math.BigInteger blockNumber,
        -                               RespCallback<BlockHash> callback)
        -
        Ledger operation: async get block hash by block number
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockNumber - the number of the block
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTransaction

        -
        BcosTransaction getTransaction(java.lang.String transactionHash,
        -                               java.lang.Boolean withProof)
        -
        Ledger operation: get transaction by hash
        -
        -
        参数:
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        返回:
        -
        transaction
        -
        -
      • -
      - - - -
        -
      • -

        getTransaction

        -
        BcosTransaction getTransaction(java.lang.String node,
        -                               java.lang.String transactionHash,
        -                               java.lang.Boolean withProof)
        -
        Ledger operation: get trnasaction by hash
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        返回:
        -
        transaction
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionAsync

        -
        void getTransactionAsync(java.lang.String transactionHash,
        -                         java.lang.Boolean withProof,
        -                         RespCallback<BcosTransaction> callback)
        -
        Ledger operation: async get trnasaction by hash
        -
        -
        参数:
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionAsync

        -
        void getTransactionAsync(java.lang.String node,
        -                         java.lang.String transactionHash,
        -                         java.lang.Boolean withProof,
        -                         RespCallback<BcosTransaction> callback)
        -
        Ledger operation: async get trnasaction by hash
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionReceipt

        -
        BcosTransactionReceipt getTransactionReceipt(java.lang.String transactionHash,
        -                                             java.lang.Boolean withProof)
        -
        Ledger operation: get transaction receipt by transaction hash
        -
        -
        参数:
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        返回:
        -
        transaction receipt
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionReceipt

        -
        BcosTransactionReceipt getTransactionReceipt(java.lang.String node,
        -                                             java.lang.String transactionHash,
        -                                             java.lang.Boolean withProof)
        -
        Ledger operation: get transaction receipt by transaction hash
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction receipt proof
        -
        返回:
        -
        transaction receipt
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionReceiptAsync

        -
        void getTransactionReceiptAsync(java.lang.String transactionHash,
        -                                java.lang.Boolean withProof,
        -                                RespCallback<BcosTransactionReceipt> callback)
        -
        Ledger operation: async get transaction receipt by transaction hash
        -
        -
        参数:
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction receipt proof
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionReceiptAsync

        -
        void getTransactionReceiptAsync(java.lang.String node,
        -                                java.lang.String transactionHash,
        -                                java.lang.Boolean withProof,
        -                                RespCallback<BcosTransactionReceipt> callback)
        -
        Ledger operation: async get transaction receipt by transaction hash
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction receipt proof
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getPendingTxSize

        -
        PendingTxSize getPendingTxSize(java.lang.String node)
        -
        Ledger operation: get pending transaction size
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        PendingTxSize
        -
        -
      • -
      - - - -
        -
      • -

        getPendingTxSizeAsync

        -
        void getPendingTxSizeAsync(java.lang.String node,
        -                           RespCallback<PendingTxSize> callback)
        -
        Ledger operation: async get pending transaction size
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getPendingTxSize

        -
        PendingTxSize getPendingTxSize()
        -
        Ledger operation: get pending transaction size
        -
        -
        返回:
        -
        PendingTxSize
        -
        -
      • -
      - - - -
        -
      • -

        getPendingTxSizeAsync

        -
        void getPendingTxSizeAsync(RespCallback<PendingTxSize> callback)
        -
        Ledger operation: async get pending transaction size
        -
        -
        参数:
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockLimit

        -
        java.math.BigInteger getBlockLimit()
        -
        Get cached block height
        -
        -
        返回:
        -
        block number
        -
        -
      • -
      - - - -
        -
      • -

        getPeers

        -
        Peers getPeers()
        -
        Peer operation: get connected peers
        -
        -
        返回:
        -
        peers
        -
        -
      • -
      - - - -
        -
      • -

        getGroupPeers

        -
        GroupPeers getGroupPeers()
        -
        get the group peers
        -
        -
        返回:
        -
        the groupPeers
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getPeersAsync

        -
        void getPeersAsync(RespCallback<Peers> callback)
        -
        Peer operation: async get connected peers
        -
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getObserverList

        -
        ObserverList getObserverList()
        -
        Peer operation: get observer node list
        -
        -
        返回:
        -
        observer node list
        -
        -
      • -
      - - - -
        -
      • -

        getObserverList

        -
        ObserverList getObserverList(java.lang.String node)
        -
        Peer operation: get observer node list
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        observer node list
        -
        -
      • -
      - - - -
        -
      • -

        getObserverList

        -
        void getObserverList(RespCallback<ObserverList> callback)
        -
        Peer operation: async get observer node list
        -
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getObserverList

        -
        void getObserverList(java.lang.String node,
        -                     RespCallback<ObserverList> callback)
        -
        Peer operation: async get observer node list
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSealerList

        -
        SealerList getSealerList()
        -
        Peer operation: get sealer node list
        -
        -
        返回:
        -
        sealer node list
        -
        -
      • -
      - - - -
        -
      • -

        getSealerList

        -
        SealerList getSealerList(java.lang.String node)
        -
        Peer operation: get sealer node list
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        sealer node list
        -
        -
      • -
      - - - -
        -
      • -

        getSealerListAsync

        -
        void getSealerListAsync(RespCallback<SealerList> callback)
        -
        Peer operation: async get sealer node list
        -
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSealerListAsync

        -
        void getSealerListAsync(java.lang.String node,
        -                        RespCallback<SealerList> callback)
        -
        Peer operation: async get sealer node list
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getPbftView

        -
        PbftView getPbftView()
        -
        Peer operation: get pbft view
        -
        -
        返回:
        -
        pbft view
        -
        -
      • -
      - - - -
        -
      • -

        getPbftView

        -
        PbftView getPbftView(java.lang.String node)
        -
        Peer operation: get pbft view
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        pbft view
        -
        -
      • -
      - - - -
        -
      • -

        getPbftViewAsync

        -
        void getPbftViewAsync(RespCallback<PbftView> callback)
        -
        Peer operation: async get pbft view
        -
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getPbftViewAsync

        -
        void getPbftViewAsync(java.lang.String node,
        -                      RespCallback<PbftView> callback)
        -
        Peer operation: async get pbft view
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSystemConfigByKey

        -
        SystemConfig getSystemConfigByKey(java.lang.String key)
        -
        Peer operation: get system config
        -
        -
        参数:
        -
        key - the string of key
        -
        返回:
        -
        system config
        -
        -
      • -
      - - - -
        -
      • -

        getSystemConfigByKey

        -
        SystemConfig getSystemConfigByKey(java.lang.String node,
        -                                  java.lang.String key)
        -
        Peer operation: get system config
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        key - the string of key
        -
        返回:
        -
        system config
        -
        -
      • -
      - - - -
        -
      • -

        getSystemConfigByKeyAsync

        -
        void getSystemConfigByKeyAsync(java.lang.String key,
        -                               RespCallback<SystemConfig> callback)
        -
        Peer operation: async get system config
        -
        -
        参数:
        -
        key - the string of key
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSystemConfigByKeyAsync

        -
        void getSystemConfigByKeyAsync(java.lang.String node,
        -                               java.lang.String key,
        -                               RespCallback<SystemConfig> callback)
        -
        Peer operation: async get system config
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        key - the string of key
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSyncStatus

        -
        SyncStatus getSyncStatus(java.lang.String node)
        -
        Peer operation: get sync status
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        sync status
        -
        -
      • -
      - - - -
        -
      • -

        getSyncStatusAsync

        -
        void getSyncStatusAsync(java.lang.String node,
        -                        RespCallback<SyncStatus> callback)
        -
        Peer operation: async get sync status
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSyncStatus

        -
        SyncStatus getSyncStatus()
        -
        Peer operation: get sync status
        -
        -
        返回:
        -
        sync status
        -
        -
      • -
      - - - -
        -
      • -

        getSyncStatusAsync

        -
        void getSyncStatusAsync(RespCallback<SyncStatus> callback)
        -
        Peer operation: async get sync status
        -
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getConsensusStatusAsync

        -
        void getConsensusStatusAsync(java.lang.String node,
        -                             RespCallback<ConsensusStatus> callback)
        -
        async get consensus status
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback
        -
        -
      • -
      - - - -
        -
      • -

        getConsensusStatusAsync

        -
        void getConsensusStatusAsync(RespCallback<ConsensusStatus> callback)
        -
        async get consensus status
        -
        -
        参数:
        -
        callback - callback when get consensus status
        -
        -
      • -
      - - - -
        -
      • -

        getConsensusStatus

        -
        ConsensusStatus getConsensusStatus(java.lang.String node)
        -
        sync get consensus status
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        consensus status info
        -
        -
      • -
      - - - -
        -
      • -

        getConsensusStatus

        -
        ConsensusStatus getConsensusStatus()
        -
        sync get consensus status
        -
        -
        返回:
        -
        consensus status info
        -
        -
      • -
      - - - -
        -
      • -

        getGroupList

        -
        BcosGroupList getGroupList()
        -
        get group list
        -
        -
        返回:
        -
        group list
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getGroupInfo

        -
        BcosGroupInfo getGroupInfo()
        -
        get group info
        -
        -
        返回:
        -
        group info
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getGroupInfoList

        -
        BcosGroupInfoList getGroupInfoList()
        -
        get group info list
        -
        -
        返回:
        -
        group info list
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getGroupNodeInfo

        -
        BcosGroupNodeInfo getGroupNodeInfo(java.lang.String node)
        -
        get group node info
        -
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        group node info
        -
        -
      • -
      - - - - - - - -
        -
      • -

        start

        -
        void start()
        -
      • -
      - - - -
        -
      • -

        stop

        -
        void stop()
        -
      • -
      - - - -
        -
      • -

        destroy

        -
        void destroy()
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/ClientImpl.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/ClientImpl.html deleted file mode 100644 index 5095dd6b7..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/ClientImpl.html +++ /dev/null @@ -1,2855 +0,0 @@ - - - - - - -ClientImpl (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.client
-

类 ClientImpl

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.client.ClientImpl
    • -
    -
  • -
-
-
    -
  • -
    -
    所有已实现的接口:
    -
    Client
    -
    -
    -
    -
    public class ClientImpl
    -extends java.lang.Object
    -implements Client
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      字段详细资料

      - - - -
        -
      • -

        objectMapper

        -
        protected final com.fasterxml.jackson.databind.ObjectMapper objectMapper
        -
      • -
      -
    • -
    - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        ClientImpl

        -
        protected ClientImpl(java.lang.String groupID,
        -                     ConfigOption configOption,
        -                     long nativePointer)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        initGroupInfo

        -
        protected void initGroupInfo()
        -
      • -
      - - - -
        -
      • -

        getNativePointer

        -
        public long getNativePointer()
        -
        -
        指定者:
        -
        getNativePointer 在接口中 Client
        -
        返回:
        -
        native pointer
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getGroup

        -
        public java.lang.String getGroup()
        -
        从接口复制的说明: Client
        -
        get groupId of the client
        -
        -
        指定者:
        -
        getGroup 在接口中 Client
        -
        返回:
        -
        the groupId
        -
        -
      • -
      - - - -
        -
      • -

        getChainId

        -
        public java.lang.String getChainId()
        -
        从接口复制的说明: Client
        -
        get groupId of the client
        -
        -
        指定者:
        -
        getChainId 在接口中 Client
        -
        返回:
        -
        the groupId
        -
        -
      • -
      - - - -
        -
      • -

        getSmCrypto

        -
        public java.lang.Boolean getSmCrypto()
        -
      • -
      - - - -
        -
      • -

        getCryptoSuite

        -
        public CryptoSuite getCryptoSuite()
        -
        从接口复制的说明: Client
        -
        Get CryptoSuite
        -
        -
        指定者:
        -
        getCryptoSuite 在接口中 Client
        -
        返回:
        -
        the CryptoSuite
        -
        -
      • -
      - - - -
        -
      • -

        getCryptoType

        -
        public java.lang.Integer getCryptoType()
        -
        从接口复制的说明: Client
        -
        Get crypto type
        -
        -
        指定者:
        -
        getCryptoType 在接口中 Client
        -
        返回:
        -
        the CryptoType, e.g. ECDSA_TYPE
        -
        -
      • -
      - - - -
        -
      • -

        isWASM

        -
        public java.lang.Boolean isWASM()
        -
        从接口复制的说明: Client
        -
        Whether is wasm exec env
        -
        -
        指定者:
        -
        isWASM 在接口中 Client
        -
        返回:
        -
        true when wasm exec env
        -
        -
      • -
      - - - -
        -
      • -

        isAuthCheck

        -
        public java.lang.Boolean isAuthCheck()
        -
        从接口复制的说明: Client
        -
        Whether is auth check in chain
        -
        -
        指定者:
        -
        isAuthCheck 在接口中 Client
        -
        返回:
        -
        true when chain in auth mode
        -
        -
      • -
      - - - -
        -
      • -

        isSerialExecute

        -
        public java.lang.Boolean isSerialExecute()
        -
        -
        指定者:
        -
        isSerialExecute 在接口中 Client
        -
        -
      • -
      - - - -
        -
      • -

        sendTransaction

        -
        public BcosTransactionReceipt sendTransaction(java.lang.String signedTransactionData,
        -                                              boolean withProof)
        -
        从接口复制的说明: Client
        -
        Ledger operation: send transaction
        -
        -
        指定者:
        -
        sendTransaction 在接口中 Client
        -
        参数:
        -
        signedTransactionData - transaction string
        -
        withProof - whether contains merkle proof or not
        -
        返回:
        -
        Transaction receipt
        -
        -
      • -
      - - - -
        -
      • -

        sendTransaction

        -
        public BcosTransactionReceipt sendTransaction(java.lang.String node,
        -                                              java.lang.String signedTransactionData,
        -                                              boolean withProof)
        -
        从接口复制的说明: Client
        -
        Ledger operation: send transaction
        -
        -
        指定者:
        -
        sendTransaction 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        signedTransactionData - transaction string
        -
        withProof - whether contains merkle proof or not
        -
        返回:
        -
        Transaction receipt
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAsync

        -
        public void sendTransactionAsync(java.lang.String signedTransactionData,
        -                                 boolean withProof,
        -                                 TransactionCallback callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async send transaction
        -
        -
        指定者:
        -
        sendTransactionAsync 在接口中 Client
        -
        参数:
        -
        signedTransactionData - transaction string
        -
        withProof - whether contains merkle proof or not
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAsync

        -
        public void sendTransactionAsync(java.lang.String node,
        -                                 java.lang.String signedTransactionData,
        -                                 boolean withProof,
        -                                 TransactionCallback callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async send transaction
        -
        -
        指定者:
        -
        sendTransactionAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        signedTransactionData - transaction string
        -
        withProof - whether contains merkle proof or not
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        call

        -
        public Call call(Transaction transaction)
        -
        从接口复制的说明: Client
        -
        Ledger operation: call contract functions without sending transaction
        -
        -
        指定者:
        -
        call 在接口中 Client
        -
        参数:
        -
        transaction - transaction instance
        -
        返回:
        -
        Call
        -
        -
      • -
      - - - -
        -
      • -

        call

        -
        public Call call(java.lang.String node,
        -                 Transaction transaction)
        -
        从接口复制的说明: Client
        -
        Ledger operation: call contract functions without sending transaction
        -
        -
        指定者:
        -
        call 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        transaction - transaction instance
        -
        返回:
        -
        Call
        -
        -
      • -
      - - - -
        -
      • -

        callAsync

        -
        public void callAsync(Transaction transaction,
        -                      RespCallback<Call> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async call contract functions without sending transaction
        -
        -
        指定者:
        -
        callAsync 在接口中 Client
        -
        参数:
        -
        transaction - transaction instance
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        callAsync

        -
        public void callAsync(java.lang.String node,
        -                      Transaction transaction,
        -                      RespCallback<Call> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async call contract functions without sending transaction
        -
        -
        指定者:
        -
        callAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        transaction - transaction instance
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockNumber

        -
        public BlockNumber getBlockNumber()
        -
        从接口复制的说明: Client
        -
        Ledger operation: get block number
        -
        -
        指定者:
        -
        getBlockNumber 在接口中 Client
        -
        返回:
        -
        block number
        -
        -
      • -
      - - - -
        -
      • -

        getBlockNumber

        -
        public BlockNumber getBlockNumber(java.lang.String node)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get block number
        -
        -
        指定者:
        -
        getBlockNumber 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        block number
        -
        -
      • -
      - - - -
        -
      • -

        getBlockNumberAsync

        -
        public void getBlockNumberAsync(RespCallback<BlockNumber> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block number
        -
        -
        指定者:
        -
        getBlockNumberAsync 在接口中 Client
        -
        参数:
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockNumberAsync

        -
        public void getBlockNumberAsync(java.lang.String node,
        -                                RespCallback<BlockNumber> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block number
        -
        -
        指定者:
        -
        getBlockNumberAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getCode

        -
        public Code getCode(java.lang.String address)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get code
        -
        -
        指定者:
        -
        getCode 在接口中 Client
        -
        参数:
        -
        address - the address string
        -
        返回:
        -
        a code instance
        -
        -
      • -
      - - - -
        -
      • -

        getCode

        -
        public Code getCode(java.lang.String node,
        -                    java.lang.String address)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get code
        -
        -
        指定者:
        -
        getCode 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        address - the address string
        -
        返回:
        -
        a code instance
        -
        -
      • -
      - - - -
        -
      • -

        getCodeAsync

        -
        public void getCodeAsync(java.lang.String address,
        -                         RespCallback<Code> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get code
        -
        -
        指定者:
        -
        getCodeAsync 在接口中 Client
        -
        参数:
        -
        address - the address string
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getCodeAsync

        -
        public void getCodeAsync(java.lang.String node,
        -                         java.lang.String address,
        -                         RespCallback<Code> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get code
        -
        -
        指定者:
        -
        getCodeAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        address - the address string
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getABI

        -
        public Abi getABI(java.lang.String address)
        -
        从接口复制的说明: Client
        -
        Scheduler: get abi
        -
        -
        指定者:
        -
        getABI 在接口中 Client
        -
        参数:
        -
        address - the address string
        -
        返回:
        -
        abi string
        -
        -
      • -
      - - - -
        -
      • -

        getABI

        -
        public Abi getABI(java.lang.String node,
        -                  java.lang.String address)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get abi
        -
        -
        指定者:
        -
        getABI 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        address - the address string
        -
        返回:
        -
        a code instance
        -
        -
      • -
      - - - -
        -
      • -

        getABIAsync

        -
        public void getABIAsync(java.lang.String address,
        -                        RespCallback<Abi> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get abi
        -
        -
        指定者:
        -
        getABIAsync 在接口中 Client
        -
        参数:
        -
        address - the address string
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getABIAsync

        -
        public void getABIAsync(java.lang.String node,
        -                        java.lang.String address,
        -                        RespCallback<Abi> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get abi
        -
        -
        指定者:
        -
        getABIAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        address - the address string
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getTotalTransactionCount

        -
        public TotalTransactionCount getTotalTransactionCount(java.lang.String node)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get total transaction coun
        -
        -
        指定者:
        -
        getTotalTransactionCount 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        TotalTransactionCount
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getTotalTransactionCountAsync

        -
        public void getTotalTransactionCountAsync(java.lang.String node,
        -                                          RespCallback<TotalTransactionCount> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get total transaction count
        -
        -
        指定者:
        -
        getTotalTransactionCountAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByHash

        -
        public BcosBlock getBlockByHash(java.lang.String blockHash,
        -                                boolean onlyHeader,
        -                                boolean onlyTxHash)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get block by hash
        -
        -
        指定者:
        -
        getBlockByHash 在接口中 Client
        -
        参数:
        -
        blockHash - the hashcode of the block
        -
        onlyHeader - if true then only return block header
        -
        onlyTxHash - the boolean define the tx is full or not
        -
        返回:
        -
        a block
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByHash

        -
        public BcosBlock getBlockByHash(java.lang.String node,
        -                                java.lang.String blockHash,
        -                                boolean onlyHeader,
        -                                boolean onlyTxHash)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get block by hash
        -
        -
        指定者:
        -
        getBlockByHash 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockHash - the hashcode of the block
        -
        onlyHeader - if true then only return block header
        -
        onlyTxHash - the boolean define the tx is full or not
        -
        返回:
        -
        a block
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByHashAsync

        -
        public void getBlockByHashAsync(java.lang.String blockHash,
        -                                boolean onlyHeader,
        -                                boolean onlyTxHash,
        -                                RespCallback<BcosBlock> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block by hash
        -
        -
        指定者:
        -
        getBlockByHashAsync 在接口中 Client
        -
        参数:
        -
        blockHash - the hashcode of the block
        -
        onlyHeader - if true then only return block header
        -
        onlyTxHash - the boolean define the tx is full or not
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByHashAsync

        -
        public void getBlockByHashAsync(java.lang.String node,
        -                                java.lang.String blockHash,
        -                                boolean onlyHeader,
        -                                boolean onlyTxHash,
        -                                RespCallback<BcosBlock> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block by hash
        -
        -
        指定者:
        -
        getBlockByHashAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockHash - the hashcode of the block
        -
        onlyHeader - if true then only return block header
        -
        onlyTxHash - the boolean define the tx is full or not
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByNumber

        -
        public BcosBlock getBlockByNumber(java.math.BigInteger blockNumber,
        -                                  boolean onlyHeader,
        -                                  boolean onlyTxHash)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get block by block number
        -
        -
        指定者:
        -
        getBlockByNumber 在接口中 Client
        -
        参数:
        -
        blockNumber - the number of the block
        -
        onlyHeader - the boolean define if only return header
        -
        onlyTxHash - the boolean define if only return tx hash
        -
        返回:
        -
        block
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByNumber

        -
        public BcosBlock getBlockByNumber(java.lang.String node,
        -                                  java.math.BigInteger blockNumber,
        -                                  boolean onlyHeader,
        -                                  boolean onlyTxHash)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get block by block number
        -
        -
        指定者:
        -
        getBlockByNumber 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockNumber - the number of the block
        -
        onlyHeader - the boolean define if only return header
        -
        onlyTxHash - the boolean define if only return tx hash
        -
        返回:
        -
        block
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByNumberAsync

        -
        public void getBlockByNumberAsync(java.math.BigInteger blockNumber,
        -                                  boolean onlyHeader,
        -                                  boolean onlyTxHash,
        -                                  RespCallback<BcosBlock> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block by block number
        -
        -
        指定者:
        -
        getBlockByNumberAsync 在接口中 Client
        -
        参数:
        -
        blockNumber - the number of the block
        -
        onlyHeader - the boolean if only need header
        -
        onlyTxHash - the boolean if you need all transactions
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockByNumberAsync

        -
        public void getBlockByNumberAsync(java.lang.String node,
        -                                  java.math.BigInteger blockNumber,
        -                                  boolean onlyHeader,
        -                                  boolean onlyTxHash,
        -                                  RespCallback<BcosBlock> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block by block number
        -
        -
        指定者:
        -
        getBlockByNumberAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockNumber - the number of the block
        -
        onlyHeader - the boolean if only need header
        -
        onlyTxHash - the boolean if you need all transactions
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockHashByNumber

        -
        public BlockHash getBlockHashByNumber(java.math.BigInteger blockNumber)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block hash by block number
        -
        -
        指定者:
        -
        getBlockHashByNumber 在接口中 Client
        -
        参数:
        -
        blockNumber - the number of the block
        -
        返回:
        -
        BlockHash
        -
        -
      • -
      - - - -
        -
      • -

        getBlockHashByNumber

        -
        public BlockHash getBlockHashByNumber(java.lang.String node,
        -                                      java.math.BigInteger blockNumber)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block hash by block number
        -
        -
        指定者:
        -
        getBlockHashByNumber 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockNumber - the number of the block
        -
        返回:
        -
        BlockHash
        -
        -
      • -
      - - - -
        -
      • -

        getBlockHashByNumberAsync

        -
        public void getBlockHashByNumberAsync(java.math.BigInteger blockNumber,
        -                                      RespCallback<BlockHash> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block hash by block number
        -
        -
        指定者:
        -
        getBlockHashByNumberAsync 在接口中 Client
        -
        参数:
        -
        blockNumber - the number of the block
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockHashByNumberAsync

        -
        public void getBlockHashByNumberAsync(java.lang.String node,
        -                                      java.math.BigInteger blockNumber,
        -                                      RespCallback<BlockHash> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get block hash by block number
        -
        -
        指定者:
        -
        getBlockHashByNumberAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        blockNumber - the number of the block
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTransaction

        -
        public BcosTransaction getTransaction(java.lang.String transactionHash,
        -                                      java.lang.Boolean withProof)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get transaction by hash
        -
        -
        指定者:
        -
        getTransaction 在接口中 Client
        -
        参数:
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        返回:
        -
        transaction
        -
        -
      • -
      - - - -
        -
      • -

        getTransaction

        -
        public BcosTransaction getTransaction(java.lang.String node,
        -                                      java.lang.String transactionHash,
        -                                      java.lang.Boolean withProof)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get trnasaction by hash
        -
        -
        指定者:
        -
        getTransaction 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        返回:
        -
        transaction
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionAsync

        -
        public void getTransactionAsync(java.lang.String transactionHash,
        -                                java.lang.Boolean withProof,
        -                                RespCallback<BcosTransaction> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get trnasaction by hash
        -
        -
        指定者:
        -
        getTransactionAsync 在接口中 Client
        -
        参数:
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionAsync

        -
        public void getTransactionAsync(java.lang.String node,
        -                                java.lang.String transactionHash,
        -                                java.lang.Boolean withProof,
        -                                RespCallback<BcosTransaction> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get trnasaction by hash
        -
        -
        指定者:
        -
        getTransactionAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionReceipt

        -
        public BcosTransactionReceipt getTransactionReceipt(java.lang.String transactionHash,
        -                                                    java.lang.Boolean withProof)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get transaction receipt by transaction hash
        -
        -
        指定者:
        -
        getTransactionReceipt 在接口中 Client
        -
        参数:
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction proof
        -
        返回:
        -
        transaction receipt
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionReceipt

        -
        public BcosTransactionReceipt getTransactionReceipt(java.lang.String node,
        -                                                    java.lang.String transactionHash,
        -                                                    java.lang.Boolean withProof)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get transaction receipt by transaction hash
        -
        -
        指定者:
        -
        getTransactionReceipt 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction receipt proof
        -
        返回:
        -
        transaction receipt
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionReceiptAsync

        -
        public void getTransactionReceiptAsync(java.lang.String transactionHash,
        -                                       java.lang.Boolean withProof,
        -                                       RespCallback<BcosTransactionReceipt> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get transaction receipt by transaction hash
        -
        -
        指定者:
        -
        getTransactionReceiptAsync 在接口中 Client
        -
        参数:
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction receipt proof
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getTransactionReceiptAsync

        -
        public void getTransactionReceiptAsync(java.lang.String node,
        -                                       java.lang.String transactionHash,
        -                                       java.lang.Boolean withProof,
        -                                       RespCallback<BcosTransactionReceipt> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get transaction receipt by transaction hash
        -
        -
        指定者:
        -
        getTransactionReceiptAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        transactionHash - the hashcode of transaction
        -
        withProof - with the transaction receipt proof
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getPendingTxSize

        -
        public PendingTxSize getPendingTxSize()
        -
        从接口复制的说明: Client
        -
        Ledger operation: get pending transaction size
        -
        -
        指定者:
        -
        getPendingTxSize 在接口中 Client
        -
        返回:
        -
        PendingTxSize
        -
        -
      • -
      - - - -
        -
      • -

        getPendingTxSize

        -
        public PendingTxSize getPendingTxSize(java.lang.String node)
        -
        从接口复制的说明: Client
        -
        Ledger operation: get pending transaction size
        -
        -
        指定者:
        -
        getPendingTxSize 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        PendingTxSize
        -
        -
      • -
      - - - -
        -
      • -

        getPendingTxSizeAsync

        -
        public void getPendingTxSizeAsync(RespCallback<PendingTxSize> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get pending transaction size
        -
        -
        指定者:
        -
        getPendingTxSizeAsync 在接口中 Client
        -
        参数:
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getPendingTxSizeAsync

        -
        public void getPendingTxSizeAsync(java.lang.String node,
        -                                  RespCallback<PendingTxSize> callback)
        -
        从接口复制的说明: Client
        -
        Ledger operation: async get pending transaction size
        -
        -
        指定者:
        -
        getPendingTxSizeAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback that will be called when receive the response
        -
        -
      • -
      - - - -
        -
      • -

        getBlockLimit

        -
        public java.math.BigInteger getBlockLimit()
        -
        从接口复制的说明: Client
        -
        Get cached block height
        -
        -
        指定者:
        -
        getBlockLimit 在接口中 Client
        -
        返回:
        -
        block number
        -
        -
      • -
      - - - -
        -
      • -

        getGroupPeers

        -
        public GroupPeers getGroupPeers()
        -
        从接口复制的说明: Client
        -
        get the group peers
        -
        -
        指定者:
        -
        getGroupPeers 在接口中 Client
        -
        返回:
        -
        the groupPeers
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getPeers

        -
        public Peers getPeers()
        -
        从接口复制的说明: Client
        -
        Peer operation: get connected peers
        -
        -
        指定者:
        -
        getPeers 在接口中 Client
        -
        返回:
        -
        peers
        -
        -
      • -
      - - - -
        -
      • -

        getPeersAsync

        -
        public void getPeersAsync(RespCallback<Peers> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get connected peers
        -
        -
        指定者:
        -
        getPeersAsync 在接口中 Client
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getObserverList

        -
        public ObserverList getObserverList()
        -
        从接口复制的说明: Client
        -
        Peer operation: get observer node list
        -
        -
        指定者:
        -
        getObserverList 在接口中 Client
        -
        返回:
        -
        observer node list
        -
        -
      • -
      - - - -
        -
      • -

        getObserverList

        -
        public ObserverList getObserverList(java.lang.String node)
        -
        从接口复制的说明: Client
        -
        Peer operation: get observer node list
        -
        -
        指定者:
        -
        getObserverList 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        observer node list
        -
        -
      • -
      - - - -
        -
      • -

        getObserverList

        -
        public void getObserverList(RespCallback<ObserverList> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get observer node list
        -
        -
        指定者:
        -
        getObserverList 在接口中 Client
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getObserverList

        -
        public void getObserverList(java.lang.String node,
        -                            RespCallback<ObserverList> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get observer node list
        -
        -
        指定者:
        -
        getObserverList 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSealerList

        -
        public SealerList getSealerList()
        -
        从接口复制的说明: Client
        -
        Peer operation: get sealer node list
        -
        -
        指定者:
        -
        getSealerList 在接口中 Client
        -
        返回:
        -
        sealer node list
        -
        -
      • -
      - - - -
        -
      • -

        getSealerList

        -
        public SealerList getSealerList(java.lang.String node)
        -
        从接口复制的说明: Client
        -
        Peer operation: get sealer node list
        -
        -
        指定者:
        -
        getSealerList 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        sealer node list
        -
        -
      • -
      - - - -
        -
      • -

        getSealerListAsync

        -
        public void getSealerListAsync(RespCallback<SealerList> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get sealer node list
        -
        -
        指定者:
        -
        getSealerListAsync 在接口中 Client
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSealerListAsync

        -
        public void getSealerListAsync(java.lang.String node,
        -                               RespCallback<SealerList> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get sealer node list
        -
        -
        指定者:
        -
        getSealerListAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getPbftView

        -
        public PbftView getPbftView()
        -
        从接口复制的说明: Client
        -
        Peer operation: get pbft view
        -
        -
        指定者:
        -
        getPbftView 在接口中 Client
        -
        返回:
        -
        pbft view
        -
        -
      • -
      - - - -
        -
      • -

        getPbftViewAsync

        -
        public void getPbftViewAsync(RespCallback<PbftView> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get pbft view
        -
        -
        指定者:
        -
        getPbftViewAsync 在接口中 Client
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getPbftView

        -
        public PbftView getPbftView(java.lang.String node)
        -
        从接口复制的说明: Client
        -
        Peer operation: get pbft view
        -
        -
        指定者:
        -
        getPbftView 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        pbft view
        -
        -
      • -
      - - - -
        -
      • -

        getPbftViewAsync

        -
        public void getPbftViewAsync(java.lang.String node,
        -                             RespCallback<PbftView> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get pbft view
        -
        -
        指定者:
        -
        getPbftViewAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSystemConfigByKey

        -
        public SystemConfig getSystemConfigByKey(java.lang.String key)
        -
        从接口复制的说明: Client
        -
        Peer operation: get system config
        -
        -
        指定者:
        -
        getSystemConfigByKey 在接口中 Client
        -
        参数:
        -
        key - the string of key
        -
        返回:
        -
        system config
        -
        -
      • -
      - - - -
        -
      • -

        getSystemConfigByKey

        -
        public SystemConfig getSystemConfigByKey(java.lang.String node,
        -                                         java.lang.String key)
        -
        从接口复制的说明: Client
        -
        Peer operation: get system config
        -
        -
        指定者:
        -
        getSystemConfigByKey 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        key - the string of key
        -
        返回:
        -
        system config
        -
        -
      • -
      - - - -
        -
      • -

        getSystemConfigByKeyAsync

        -
        public void getSystemConfigByKeyAsync(java.lang.String key,
        -                                      RespCallback<SystemConfig> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get system config
        -
        -
        指定者:
        -
        getSystemConfigByKeyAsync 在接口中 Client
        -
        参数:
        -
        key - the string of key
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSystemConfigByKeyAsync

        -
        public void getSystemConfigByKeyAsync(java.lang.String node,
        -                                      java.lang.String key,
        -                                      RespCallback<SystemConfig> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get system config
        -
        -
        指定者:
        -
        getSystemConfigByKeyAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        key - the string of key
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSyncStatus

        -
        public SyncStatus getSyncStatus(java.lang.String node)
        -
        从接口复制的说明: Client
        -
        Peer operation: get sync status
        -
        -
        指定者:
        -
        getSyncStatus 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        sync status
        -
        -
      • -
      - - - -
        -
      • -

        getSyncStatus

        -
        public SyncStatus getSyncStatus()
        -
        从接口复制的说明: Client
        -
        Peer operation: get sync status
        -
        -
        指定者:
        -
        getSyncStatus 在接口中 Client
        -
        返回:
        -
        sync status
        -
        -
      • -
      - - - -
        -
      • -

        getSyncStatusAsync

        -
        public void getSyncStatusAsync(RespCallback<SyncStatus> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get sync status
        -
        -
        指定者:
        -
        getSyncStatusAsync 在接口中 Client
        -
        参数:
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getSyncStatusAsync

        -
        public void getSyncStatusAsync(java.lang.String node,
        -                               RespCallback<SyncStatus> callback)
        -
        从接口复制的说明: Client
        -
        Peer operation: async get sync status
        -
        -
        指定者:
        -
        getSyncStatusAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback instance
        -
        -
      • -
      - - - -
        -
      • -

        getConsensusStatusAsync

        -
        public void getConsensusStatusAsync(java.lang.String node,
        -                                    RespCallback<ConsensusStatus> callback)
        -
        从接口复制的说明: Client
        -
        async get consensus status
        -
        -
        指定者:
        -
        getConsensusStatusAsync 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        callback - the callback
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getConsensusStatus

        -
        public ConsensusStatus getConsensusStatus(java.lang.String node)
        -
        从接口复制的说明: Client
        -
        sync get consensus status
        -
        -
        指定者:
        -
        getConsensusStatus 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        consensus status info
        -
        -
      • -
      - - - -
        -
      • -

        getConsensusStatus

        -
        public ConsensusStatus getConsensusStatus()
        -
        从接口复制的说明: Client
        -
        sync get consensus status
        -
        -
        指定者:
        -
        getConsensusStatus 在接口中 Client
        -
        返回:
        -
        consensus status info
        -
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        getGroupNodeInfo

        -
        public BcosGroupNodeInfo getGroupNodeInfo(java.lang.String node)
        -
        从接口复制的说明: Client
        -
        get group node info
        -
        -
        指定者:
        -
        getGroupNodeInfo 在接口中 Client
        -
        参数:
        -
        node - the node rpc request send to
        -
        返回:
        -
        group node info
        -
        -
      • -
      - - - - - - - -
        -
      • -

        start

        -
        public void start()
        -
        -
        指定者:
        -
        start 在接口中 Client
        -
        -
      • -
      - - - -
        -
      • -

        stop

        -
        public void stop()
        -
        -
        指定者:
        -
        stop 在接口中 Client
        -
        -
      • -
      - - - -
        -
      • -

        destroy

        -
        public void destroy()
        -
        -
        指定者:
        -
        destroy 在接口中 Client
        -
        -
      • -
      - - - -
        -
      • -

        callRemoteMethod

        -
        public <T extends JsonRpcResponse<?>> T callRemoteMethod(java.lang.String groupID,
        -                                                         java.lang.String node,
        -                                                         JsonRpcRequest<?> request,
        -                                                         java.lang.Class<T> responseType)
        -
      • -
      - - - -
        -
      • -

        asyncCallRemoteMethod

        -
        public <T extends JsonRpcResponse<?>> void asyncCallRemoteMethod(java.lang.String groupID,
        -                                                                 java.lang.String node,
        -                                                                 JsonRpcRequest<?> request,
        -                                                                 java.lang.Class<T> responseType,
        -                                                                 RespCallback<T> callback)
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/RespCallback.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/RespCallback.html deleted file mode 100644 index 917bf8111..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/RespCallback.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - -RespCallback (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.client
-

接口 RespCallback<T>

-
-
-
-
    -
  • -
    -
    类型参数:
    -
    T - for the response data structures in package client/response
    -
    -
    -
    -
    public interface RespCallback<T>
    -
    Callback function to executed when client get response from the node.
    -
  • -
-
-
-
    -
  • - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      方法详细资料

      - - - - - -
        -
      • -

        onResponse

        -
        void onResponse(T t)
        -
        onResponse is the call back function
        -
        -
        参数:
        -
        t - the response data structure
        -
        -
      • -
      - - - -
        -
      • -

        onError

        -
        void onError(Response errorResponse)
        -
        onError is called when get error
        -
        -
        参数:
        -
        errorResponse - callback error response
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-frame.html deleted file mode 100644 index 2f93fa598..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.exceptions (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.client.exceptions

-
-

异常错误

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-summary.html deleted file mode 100644 index 980d04059..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-summary.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.exceptions (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.client.exceptions

-
-
-
    -
  • - - - - - - - - - - - - -
    异常错误概要 
    异常错误说明
    ClientException -
    Throw exception when calling.
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-tree.html deleted file mode 100644 index cb73eca82..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.exceptions 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.client.exceptions的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • java.lang.Throwable (implements java.io.Serializable) -
        -
      • java.lang.Exception -
          -
        • java.lang.RuntimeException - -
        • -
        -
      • -
      -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-frame.html deleted file mode 100644 index b5c3a7378..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-frame.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.client

-
-

接口

- -

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-summary.html deleted file mode 100644 index b4f3c690a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-summary.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.client

-
-
-
    -
  • - - - - - - - - - - - - - - - - -
    接口概要 
    接口说明
    Client -
    This is the interface of client module.
    -
    RespCallback<T> -
    Callback function to executed when client get response from the node.
    -
    -
  • -
  • - - - - - - - - - - - - -
    类概要 
    说明
    ClientImpl 
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-tree.html deleted file mode 100644 index 517fe6c50..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.client的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.client.ClientImpl (implements org.fisco.bcos.sdk.v3.client.Client)
    • -
    -
  • -
-

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/JsonTransactionResponse.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/JsonTransactionResponse.html deleted file mode 100644 index 37f5e3a74..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/JsonTransactionResponse.html +++ /dev/null @@ -1,667 +0,0 @@ - - - - - - -JsonTransactionResponse (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.client.protocol.model
-

类 JsonTransactionResponse

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.client.protocol.model.JsonTransactionResponse
    • -
    -
  • -
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        JsonTransactionResponse

        -
        public JsonTransactionResponse()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        getAbi

        -
        public java.lang.String getAbi()
        -
      • -
      - - - -
        -
      • -

        setAbi

        -
        public void setAbi(java.lang.String abi)
        -
      • -
      - - - -
        -
      • -

        getTransactionProof

        -
        public java.util.List<MerkleProofUnit> getTransactionProof()
        -
      • -
      - - - -
        -
      • -

        setTransactionProof

        -
        public void setTransactionProof(java.util.List<MerkleProofUnit> transactionProof)
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        public java.lang.Integer getVersion()
        -
      • -
      - - - -
        -
      • -

        setVersion

        -
        public void setVersion(java.lang.Integer version)
        -
      • -
      - - - -
        -
      • -

        getFrom

        -
        public java.lang.String getFrom()
        -
      • -
      - - - -
        -
      • -

        setFrom

        -
        public void setFrom(java.lang.String from)
        -
      • -
      - - - -
        -
      • -

        getHash

        -
        public java.lang.String getHash()
        -
      • -
      - - - -
        -
      • -

        setHash

        -
        public void setHash(java.lang.String hash)
        -
      • -
      - - - -
        -
      • -

        getInput

        -
        public java.lang.String getInput()
        -
      • -
      - - - -
        -
      • -

        setInput

        -
        public void setInput(java.lang.String input)
        -
      • -
      - - - -
        -
      • -

        getNonce

        -
        public java.lang.String getNonce()
        -
      • -
      - - - -
        -
      • -

        setNonce

        -
        public void setNonce(java.lang.String nonce)
        -
      • -
      - - - -
        -
      • -

        getTo

        -
        public java.lang.String getTo()
        -
      • -
      - - - -
        -
      • -

        setTo

        -
        public void setTo(java.lang.String to)
        -
      • -
      - - - -
        -
      • -

        getBlockLimit

        -
        public long getBlockLimit()
        -
      • -
      - - - -
        -
      • -

        setBlockLimit

        -
        public void setBlockLimit(long blockLimit)
        -
      • -
      - - - -
        -
      • -

        getChainID

        -
        public java.lang.String getChainID()
        -
      • -
      - - - -
        -
      • -

        setChainID

        -
        public void setChainID(java.lang.String chainId)
        -
      • -
      - - - -
        -
      • -

        getGroupID

        -
        public java.lang.String getGroupID()
        -
      • -
      - - - -
        -
      • -

        setGroupID

        -
        public void setGroupID(java.lang.String groupID)
        -
      • -
      - - - -
        -
      • -

        getSignature

        -
        public java.lang.String getSignature()
        -
      • -
      - - - -
        -
      • -

        setSignature

        -
        public void setSignature(java.lang.String signature)
        -
      • -
      - - - - - - - -
        -
      • -

        equals

        -
        public boolean equals(java.lang.Object o)
        -
        -
        覆盖:
        -
        equals 在类中 java.lang.Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        覆盖:
        -
        hashCode 在类中 java.lang.Object
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public java.lang.String toString()
        -
        -
        覆盖:
        -
        toString 在类中 java.lang.Object
        -
        -
      • -
      - - - -
        -
      • -

        getImportTime

        -
        public long getImportTime()
        -
      • -
      - - - -
        -
      • -

        setImportTime

        -
        public void setImportTime(long importTime)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-frame.html deleted file mode 100644 index a3892ef9a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-frame.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.protocol.model (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.client.protocol.model

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-summary.html deleted file mode 100644 index 2377f345e..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-summary.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.protocol.model (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.client.protocol.model

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-tree.html deleted file mode 100644 index d30f29cb5..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-tree.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.protocol.model 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.client.protocol.model的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-frame.html deleted file mode 100644 index 886718087..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.protocol.request (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.client.protocol.request

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-summary.html deleted file mode 100644 index 5574a4cd4..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.protocol.request (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.client.protocol.request

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-tree.html deleted file mode 100644 index 3283efbaa..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-tree.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.protocol.request 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.client.protocol.request的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object - -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/BcosBlock.TransactionObject.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/BcosBlock.TransactionObject.html deleted file mode 100644 index b46db306c..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/BcosBlock.TransactionObject.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - -BcosBlock.TransactionObject (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.client.protocol.response
-

类 BcosBlock.TransactionObject

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-frame.html deleted file mode 100644 index 72f741451..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-frame.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.protocol.response (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.client.protocol.response

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-summary.html deleted file mode 100644 index e9faae39e..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-summary.html +++ /dev/null @@ -1,397 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.protocol.response (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.client.protocol.response

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-tree.html deleted file mode 100644 index 92be597c1..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-tree.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.client.protocol.response 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.client.protocol.response的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodec.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodec.html deleted file mode 100644 index e64f13254..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodec.html +++ /dev/null @@ -1,803 +0,0 @@ - - - - - - -ContractCodec (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec
-

类 ContractCodec

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.codec.ContractCodec
    • -
    -
  • -
-
-
    -
  • -
    -
    -
    public class ContractCodec
    -extends java.lang.Object
    -
    ABI encode and decode tool
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      方法概要

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      所有方法 实例方法 具体方法 
      限定符和类型方法和说明
      java.util.List<java.lang.Object>decodeEvent(java.lang.String abi, - java.lang.String eventName, - EventLog log) 
      java.util.List<java.lang.Object>decodeEventByInterface(java.lang.String abi, - java.lang.String eventSignature, - EventLog log) 
      java.util.List<java.lang.String>decodeEventByInterfaceToString(java.lang.String abi, - java.lang.String eventSignature, - EventLog log) 
      java.util.List<java.lang.Object>decodeEventByTopic(java.lang.String abi, - java.lang.String eventTopic, - EventLog log) 
      java.util.List<java.lang.String>decodeEventByTopicToString(java.lang.String abi, - java.lang.String eventTopic, - EventLog log) 
      java.util.List<java.lang.String>decodeEventToString(java.lang.String abi, - java.lang.String eventName, - EventLog log) 
      java.util.List<java.lang.Object>decodeMethod(ABIDefinition abiDefinition, - java.lang.String output) 
      java.util.List<Type>decodeMethod(java.lang.String ABI, - java.lang.String methodName, - java.lang.String output) 
      org.apache.commons.lang3.tuple.Pair<java.util.List<java.lang.Object>,java.util.List<ABIObject>>decodeMethodAndGetOutputObject(ABIDefinition abiDefinition, - java.lang.String output) 
      java.util.List<Type>decodeMethodAndGetOutputObject(java.lang.String abi, - java.lang.String methodName, - java.lang.String output) 
      java.util.List<java.lang.Object>decodeMethodById(java.lang.String abi, - byte[] methodId, - byte[] output) 
      java.util.List<java.lang.String>decodeMethodByIdToString(java.lang.String abi, - byte[] methodId, - byte[] output) 
      java.util.List<java.lang.Object>decodeMethodByInterface(java.lang.String abi, - java.lang.String methodInterface, - byte[] output) 
      java.util.List<java.lang.String>decodeMethodByInterfaceToString(java.lang.String abi, - java.lang.String methodInterface, - byte[] output) 
      java.util.List<java.lang.String>decodeMethodToString(java.lang.String abi, - java.lang.String methodName, - byte[] output) 
      byte[]encodeConstructor(java.lang.String abi, - java.lang.String bin, - java.util.List<java.lang.Object> params) 
      byte[]encodeConstructorFromBytes(java.lang.String bin, - byte[] params) 
      byte[]encodeConstructorFromString(java.lang.String abi, - java.lang.String bin, - java.util.List<java.lang.String> params) 
      byte[]encodeMethod(java.lang.String abi, - java.lang.String methodName, - java.util.List<java.lang.Object> params) 
      byte[]encodeMethodById(java.lang.String abi, - byte[] methodId, - java.util.List<java.lang.Object> params) 
      byte[]encodeMethodByIdFromString(java.lang.String abi, - byte[] methodId, - java.util.List<java.lang.String> params) 
      byte[]encodeMethodByInterface(java.lang.String methodInterface, - java.util.List<java.lang.Object> params) 
      byte[]encodeMethodByInterfaceFromString(java.lang.String methodInterface, - java.util.List<java.lang.String> params) 
      byte[]encodeMethodFromString(java.lang.String abi, - java.lang.String methodName, - java.util.List<java.lang.String> params) 
      CryptoSuitegetCryptoSuite() 
      booleanisWasm() 
      -
        -
      • - - -

        从类继承的方法 java.lang.Object

        -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
- -
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/Encoder.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/Encoder.html deleted file mode 100644 index 1101c8467..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/Encoder.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - -Encoder (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec
-

类 Encoder

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.codec.Encoder
    • -
    -
  • -
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        Encoder

        -
        public Encoder(CryptoSuite cryptoSuite)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        getCryptoSuite

        -
        public CryptoSuite getCryptoSuite()
        -
        -
        返回:
        -
        the cryptoSuite
        -
        -
      • -
      - - - -
        -
      • -

        setCryptoSuite

        -
        public void setCryptoSuite(CryptoSuite cryptoSuite)
        -
        -
        参数:
        -
        cryptoSuite - the cryptoSuite to set
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/FunctionEncoder.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/FunctionEncoder.html deleted file mode 100644 index e53582458..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/FunctionEncoder.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - -FunctionEncoder (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec.abi
-

类 FunctionEncoder

-
-
- -
-
    -
  • -
    -
    -
    public class FunctionEncoder
    -extends FunctionEncoderInterface
    -
    Ethereum Contract Application Binary Interface (ABI) encoding for functions. Further details are - available here.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        FunctionEncoder

        -
        public FunctionEncoder(CryptoSuite cryptoSuite)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - - - - - -
        -
      • -

        encodeConstructor

        -
        public static byte[] encodeConstructor(java.util.List<Type> parameters)
        -
      • -
      - - - -
        -
      • -

        encodeParameters

        -
        public static byte[] encodeParameters(java.util.List<Type> parameters,
        -                                      byte[] methodID)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/FunctionReturnDecoder.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/FunctionReturnDecoder.html deleted file mode 100644 index b894c5a19..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/FunctionReturnDecoder.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - -FunctionReturnDecoder (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec.abi
-

类 FunctionReturnDecoder

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.codec.abi.FunctionReturnDecoder
    • -
    -
  • -
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      方法概要

      - - - - - - - - - - - - - - - - - - -
      所有方法 静态方法 实例方法 具体方法 
      限定符和类型方法和说明
      java.util.List<Type>decode(java.lang.String rawInput, - java.util.List<TypeReference<Type>> outputParameters) -
      Decode ABI encoded return values from smart contract function call.
      -
      <T extends Type>
      Type
      decodeIndexedValue(java.lang.String rawInput, - TypeReference<T> typeReference) -
      Decodes an indexed parameter associated with an event.
      -
      static <T extends Type>
      int
      getDataOffset(byte[] input, - int offset, - TypeReference<?> typeReference) 
      -
        -
      • - - -

        从类继承的方法 java.lang.Object

        -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        FunctionReturnDecoder

        -
        public FunctionReturnDecoder()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        decode

        -
        public java.util.List<Type> decode(java.lang.String rawInput,
        -                                   java.util.List<TypeReference<Type>> outputParameters)
        -
        Decode ABI encoded return values from smart contract function call.
        -
        -
        指定者:
        -
        decode 在接口中 FunctionReturnDecoderInterface
        -
        参数:
        -
        rawInput - ABI encoded input
        -
        outputParameters - list of return types as TypeReference
        -
        返回:
        -
        List of values returned by function, Collections.emptyList() if - invalid response
        -
        -
      • -
      - - - -
        -
      • -

        decodeIndexedValue

        -
        public <T extends TypeType decodeIndexedValue(java.lang.String rawInput,
        -                                                TypeReference<T> typeReference)
        -
        Decodes an indexed parameter associated with an event. Indexed parameters are individually - encoded, unlike non-indexed parameters which are encoded as per ABI-encoded function - parameters and return values. - -

        If any of the following types are indexed, the Keccak-256 hashes of the values are - returned instead. These are returned as a bytes32 value. - -

          -
        • Arrays -
        • Strings -
        • Bytes -
        - -

        See the Solidity - documentation for further information.

        -
        -
        指定者:
        -
        decodeIndexedValue 在接口中 FunctionReturnDecoderInterface
        -
        类型参数:
        -
        T - type of TypeReference
        -
        参数:
        -
        rawInput - ABI encoded input
        -
        typeReference - of expected result type
        -
        返回:
        -
        the decode value
        -
        -
      • -
      - - - -
        -
      • -

        getDataOffset

        -
        public static <T extends Type> int getDataOffset(byte[] input,
        -                                                 int offset,
        -                                                 TypeReference<?> typeReference)
        -                                          throws java.lang.ClassNotFoundException
        -
        -
        抛出:
        -
        java.lang.ClassNotFoundException
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeDecoder.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeDecoder.html deleted file mode 100644 index b4f4ab123..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeDecoder.html +++ /dev/null @@ -1,469 +0,0 @@ - - - - - - -TypeDecoder (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec.abi
-

类 TypeDecoder

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.codec.abi.TypeDecoder
    • -
    -
  • -
-
-
    -
  • -
    -
    -
    public class TypeDecoder
    -extends java.lang.Object
    -
    Ethereum Contract Application Binary Interface (ABI) decoding for types. Decoding is not - documented, but is the reverse of the encoding details located here.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        TypeDecoder

        -
        public TypeDecoder()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        decode

        -
        public static <T extends Type> T decode(byte[] input,
        -                                        int offset,
        -                                        TypeReference<T> type)
        -                                 throws java.lang.ClassNotFoundException
        -
        -
        抛出:
        -
        java.lang.ClassNotFoundException
        -
        -
      • -
      - - - -
        -
      • -

        decodeAddress

        -
        public static Address decodeAddress(byte[] input)
        -
      • -
      - - - -
        -
      • -

        decodeNumeric

        -
        public static <T extends NumericType> T decodeNumeric(byte[] inputByteArray,
        -                                                      java.lang.Class<T> type)
        -
      • -
      - - - -
        -
      • -

        decodeUintAsInt

        -
        public static int decodeUintAsInt(byte[] rawInput,
        -                                  int offset)
        -
      • -
      - - - -
        -
      • -

        decodeBool

        -
        public static Bool decodeBool(byte[] rawInput,
        -                              int offset)
        -
      • -
      - - - -
        -
      • -

        decodeBytes

        -
        public static <T extends Bytes> T decodeBytes(byte[] input,
        -                                              java.lang.Class<T> type)
        -
      • -
      - - - -
        -
      • -

        decodeBytes

        -
        public static <T extends Bytes> T decodeBytes(byte[] input,
        -                                              int offset,
        -                                              java.lang.Class<T> type)
        -
      • -
      - - - -
        -
      • -

        decodeDynamicBytes

        -
        public static DynamicBytes decodeDynamicBytes(byte[] input,
        -                                              int offset)
        -
      • -
      - - - -
        -
      • -

        decodeUtf8String

        -
        public static Utf8String decodeUtf8String(byte[] input,
        -                                          int offset)
        -
      • -
      - - - -
        -
      • -

        decodeStaticArray

        -
        public static <T extends Type> T decodeStaticArray(byte[] input,
        -                                                   int offset,
        -                                                   TypeReference<T> typeReference,
        -                                                   int length)
        -
      • -
      - - - -
        -
      • -

        instantiateStaticArray

        -
        public static <T extends Type> T instantiateStaticArray(java.util.List<T> elements,
        -                                                        int length)
        -
      • -
      - - - -
        -
      • -

        decodeDynamicArray

        -
        public static <T extends Type> T decodeDynamicArray(byte[] input,
        -                                                    int offset,
        -                                                    TypeReference<T> typeReference)
        -
      • -
      - - - -
        -
      • -

        decodeStaticStruct

        -
        public static <T extends Type> T decodeStaticStruct(byte[] input,
        -                                                    int offset,
        -                                                    TypeReference<T> typeReference)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeEncoder.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeEncoder.html deleted file mode 100644 index 0ecc23adf..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeEncoder.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - -TypeEncoder (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec.abi
-

类 TypeEncoder

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.codec.abi.TypeEncoder
    • -
    -
  • -
-
-
    -
  • -
    -
    -
    public class TypeEncoder
    -extends java.lang.Object
    -
    Ethereum Contract Application Binary Interface (ABI) encoding for types. Further details are - available here.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        encode

        -
        public static byte[] encode(Type parameter)
        -
      • -
      - - - -
        -
      • -

        encodeAddress

        -
        public static byte[] encodeAddress(Address address)
        -
      • -
      - - - -
        -
      • -

        encodeNumeric

        -
        public static byte[] encodeNumeric(NumericType numericType)
        -
      • -
      - - - -
        -
      • -

        encodeBool

        -
        public static byte[] encodeBool(Bool value)
        -
      • -
      - - - -
        -
      • -

        encodeBytes

        -
        public static byte[] encodeBytes(BytesType bytesType)
        -
      • -
      - - - -
        -
      • -

        encodeDynamicBytes

        -
        public static byte[] encodeDynamicBytes(DynamicBytes dynamicBytes)
        -
      • -
      - - - -
        -
      • -

        encodeString

        -
        public static byte[] encodeString(Utf8String string)
        -
      • -
      - - - -
        -
      • -

        encodeArrayValues

        -
        public static <T extends Type> byte[] encodeArrayValues(Array<T> value)
        -
      • -
      - - - -
        -
      • -

        encodeDynamicArray

        -
        public static <T extends Type> byte[] encodeDynamicArray(DynamicArray<T> value)
        -
      • -
      - - - -
        -
      • -

        encodeDynamicStruct

        -
        public static byte[] encodeDynamicStruct(DynamicStruct value)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-frame.html deleted file mode 100644 index ef4e6b777..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-frame.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.abi (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.abi

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-summary.html deleted file mode 100644 index 33f0f868e..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-summary.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.abi (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.abi

-
-
-
    -
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    类概要 
    说明
    Constant 
    FunctionEncoder -
    Ethereum Contract Application Binary Interface (ABI) encoding for functions.
    -
    FunctionReturnDecoder -
    Decodes values returned by function or event calls.
    -
    TypeDecoder -
    Ethereum Contract Application Binary Interface (ABI) decoding for types.
    -
    TypeEncoder -
    Ethereum Contract Application Binary Interface (ABI) encoding for types.
    -
    -
  • -
  • - - - - - - - - - - - - -
    异常错误概要 
    异常错误说明
    TypeMappingException 
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-tree.html deleted file mode 100644 index 1b4206d9a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-tree.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.abi 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.abi的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-frame.html deleted file mode 100644 index b8cfec7ae..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.abi.tools (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.abi.tools

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-summary.html deleted file mode 100644 index 59ea7fbd9..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-summary.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.abi.tools (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.abi.tools

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-tree.html deleted file mode 100644 index 666769cae..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-tree.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.abi.tools 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.abi.tools的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object - -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-frame.html deleted file mode 100644 index 720b18b64..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-frame.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes.generated (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.datatypes.generated

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-summary.html deleted file mode 100644 index 19880930d..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-summary.html +++ /dev/null @@ -1,910 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes.generated (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.datatypes.generated

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-tree.html deleted file mode 100644 index da1a1ff3d..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-tree.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes.generated 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.datatypes.generated的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.codec.datatypes.Array<T> (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) -
        -
      • org.fisco.bcos.sdk.v3.codec.datatypes.StaticArray<T> -
          -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray1<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray10<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray11<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray12<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray128<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray13<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray14<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray15<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray16<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray17<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray18<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray19<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray2<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray20<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray21<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray22<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray23<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray24<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray25<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray26<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray27<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray28<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray29<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray3<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray30<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray31<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray32<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray4<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray5<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray6<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray7<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray8<T>
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray9<T>
        • -
        -
      • -
      -
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.BytesType (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) -
        -
      • org.fisco.bcos.sdk.v3.codec.datatypes.Bytes -
          -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes1
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes10
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes11
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes12
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes13
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes14
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes15
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes16
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes17
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes18
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes19
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes2
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes20
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes21
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes22
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes23
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes24
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes25
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes26
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes27
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes28
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes29
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes3
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes30
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes31
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes4
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes5
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes6
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes7
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes8
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes9
        • -
        -
      • -
      -
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.NumericType (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) -
        -
      • org.fisco.bcos.sdk.v3.codec.datatypes.IntType -
          -
        • org.fisco.bcos.sdk.v3.codec.datatypes.Int -
            -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int104
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int112
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int120
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int128
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int136
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int144
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int152
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int16
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int160
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int168
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int176
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int184
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int192
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int200
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int208
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int216
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int224
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int232
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int24
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int240
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int248
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int256
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int32
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int40
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int48
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int56
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int64
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int72
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int8
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int80
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int88
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int96
          • -
          -
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.Uint -
            -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint104
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint112
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint120
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint128
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint136
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint144
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint152
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint16
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint160
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint168
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint176
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint184
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint192
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint200
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint208
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint216
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint224
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint232
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint24
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint240
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint248
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint40
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint48
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint56
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint72
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint80
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint88
          • -
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint96
          • -
          -
        • -
        -
      • -
      -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-frame.html deleted file mode 100644 index 12a06ad9e..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-frame.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-summary.html deleted file mode 100644 index 72387751b..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-summary.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated

-
-
-
    -
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    类概要 
    说明
    Tuple1<T1> -
    Auto generated code.
    -
    Tuple10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> -
    Auto generated code.
    -
    Tuple11<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11> -
    Auto generated code.
    -
    Tuple12<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12> -
    Auto generated code.
    -
    Tuple13<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13> -
    Auto generated code.
    -
    Tuple14<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14> -
    Auto generated code.
    -
    Tuple15<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15> -
    Auto generated code.
    -
    Tuple16<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16> -
    Auto generated code.
    -
    Tuple17<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17> -
    Auto generated code.
    -
    Tuple18<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18> -
    Auto generated code.
    -
    Tuple19<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> -
    Auto generated code.
    -
    Tuple2<T1,T2> -
    Auto generated code.
    -
    Tuple20<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20> -
    Auto generated code.
    -
    Tuple3<T1,T2,T3> -
    Auto generated code.
    -
    Tuple4<T1,T2,T3,T4> -
    Auto generated code.
    -
    Tuple5<T1,T2,T3,T4,T5> -
    Auto generated code.
    -
    Tuple6<T1,T2,T3,T4,T5,T6> -
    Auto generated code.
    -
    Tuple7<T1,T2,T3,T4,T5,T6,T7> -
    Auto generated code.
    -
    Tuple8<T1,T2,T3,T4,T5,T6,T7,T8> -
    Auto generated code.
    -
    Tuple9<T1,T2,T3,T4,T5,T6,T7,T8,T9> -
    Auto generated code.
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-tree.html deleted file mode 100644 index aa902bfd2..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-tree.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple1<T1> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple11<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple12<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple13<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple14<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple15<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple16<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple17<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple18<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple19<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple2<T1,T2> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple20<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple3<T1,T2,T3> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple4<T1,T2,T3,T4> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple5<T1,T2,T3,T4,T5> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple6<T1,T2,T3,T4,T5,T6> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple7<T1,T2,T3,T4,T5,T6,T7> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple8<T1,T2,T3,T4,T5,T6,T7,T8> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple9<T1,T2,T3,T4,T5,T6,T7,T8,T9> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-frame.html deleted file mode 100644 index 25322772f..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples

-
-

接口

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-summary.html deleted file mode 100644 index 923e0a05d..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-summary.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples

-
-
-
    -
  • - - - - - - - - - - - - -
    接口概要 
    接口说明
    Tuple -
    Tuple abstraction.
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-tree.html deleted file mode 100644 index 2adab3c89..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-tree.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples的分层结构

-程序包分层结构: - -
-
-

接口分层结构

-
    -
  • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-frame.html deleted file mode 100644 index 6609098c5..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-frame.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.datatypes

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-summary.html deleted file mode 100644 index 8f7798e0e..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-summary.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.datatypes

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-tree.html deleted file mode 100644 index 514e4d971..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-tree.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.datatypes 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.datatypes的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.codec.datatypes.AbiTypes
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.Address (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.Array<T> (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) -
        -
      • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicArray<T> -
          -
        • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicStruct (implements org.fisco.bcos.sdk.v3.codec.datatypes.StructType)
        • -
        -
      • -
      • org.fisco.bcos.sdk.v3.codec.datatypes.StaticArray<T> -
          -
        • org.fisco.bcos.sdk.v3.codec.datatypes.StaticStruct (implements org.fisco.bcos.sdk.v3.codec.datatypes.StructType)
        • -
        -
      • -
      -
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.Bool (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>)
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.BytesType (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) -
        -
      • org.fisco.bcos.sdk.v3.codec.datatypes.Bytes
      • -
      • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes
      • -
      -
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.Event
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.Function
    • -
    • com.fasterxml.jackson.databind.JsonSerializer<T> (implements com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable) - -
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.NumericType (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) -
        -
      • org.fisco.bcos.sdk.v3.codec.datatypes.FixedPointType -
          -
        • org.fisco.bcos.sdk.v3.codec.datatypes.Fixed
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.Ufixed
        • -
        -
      • -
      • org.fisco.bcos.sdk.v3.codec.datatypes.IntType -
          -
        • org.fisco.bcos.sdk.v3.codec.datatypes.Int
        • -
        • org.fisco.bcos.sdk.v3.codec.datatypes.Uint
        • -
        -
      • -
      -
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.TypeReference<T> (implements java.lang.Comparable<T>) - -
    • -
    • org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>)
    • -
    -
  • -
-

接口分层结构

-
    -
  • org.fisco.bcos.sdk.v3.codec.datatypes.StructType
  • -
  • org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-frame.html deleted file mode 100644 index 6db9087b7..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-frame.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-summary.html deleted file mode 100644 index 2811204f7..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-summary.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-tree.html deleted file mode 100644 index 7bd262189..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-tree.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/FunctionEncoder.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/FunctionEncoder.html deleted file mode 100644 index 7ea1ec161..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/FunctionEncoder.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - -FunctionEncoder (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec.scale
-

类 FunctionEncoder

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        FunctionEncoder

        -
        public FunctionEncoder(CryptoSuite cryptoSuite)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - - - - - -
        -
      • -

        encodeConstructor

        -
        public static byte[] encodeConstructor(java.util.List<Type> parameters)
        -
      • -
      - - - -
        -
      • -

        encodeParameters

        -
        public static byte[] encodeParameters(java.util.List<Type> parameters,
        -                                      byte[] methodID)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/FunctionReturnDecoder.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/FunctionReturnDecoder.html deleted file mode 100644 index b6fe89091..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/FunctionReturnDecoder.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - -FunctionReturnDecoder (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec.scale
-

类 FunctionReturnDecoder

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.codec.scale.FunctionReturnDecoder
    • -
    -
  • -
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      方法概要

      - - - - - - - - - - - - - - -
      所有方法 实例方法 具体方法 
      限定符和类型方法和说明
      java.util.List<Type>decode(java.lang.String rawInput, - java.util.List<TypeReference<Type>> outputParameters) -
      Decode SCALE encoded return values from smart contract function call.
      -
      <T extends Type>
      Type
      decodeIndexedValue(java.lang.String rawInput, - TypeReference<T> typeReference) -
      Decodes an indexed parameter associated with an event.
      -
      -
        -
      • - - -

        从类继承的方法 java.lang.Object

        -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        FunctionReturnDecoder

        -
        public FunctionReturnDecoder()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        decodeIndexedValue

        -
        public <T extends TypeType decodeIndexedValue(java.lang.String rawInput,
        -                                                TypeReference<T> typeReference)
        -
        Decodes an indexed parameter associated with an event. Indexed parameters are individually - encoded, unlike non-indexed parameters which are encoded as per ABI-encoded function - parameters and return values. - -

        If any of the following types are indexed, the Keccak-256 hashes of the values are - returned instead. These are returned as a bytes32 value. - -

          -
        • Arrays -
        • Strings -
        • Bytes -
        - -

        See the Solidity - documentation for further information.

        -
        -
        指定者:
        -
        decodeIndexedValue 在接口中 FunctionReturnDecoderInterface
        -
        类型参数:
        -
        T - type of TypeReference
        -
        参数:
        -
        rawInput - ABI encoded input
        -
        typeReference - of expected result type
        -
        返回:
        -
        the decode value
        -
        -
      • -
      - - - -
        -
      • -

        decode

        -
        public java.util.List<Type> decode(java.lang.String rawInput,
        -                                   java.util.List<TypeReference<Type>> outputParameters)
        -
        Decode SCALE encoded return values from smart contract function call.
        -
        -
        指定者:
        -
        decode 在接口中 FunctionReturnDecoderInterface
        -
        参数:
        -
        rawInput - SCALE encoded input
        -
        outputParameters - list of return types as TypeReference
        -
        返回:
        -
        List of values returned by function, Collections.emptyList() if - invalid response
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/TypeDecoder.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/TypeDecoder.html deleted file mode 100644 index 9edf22ac3..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/TypeDecoder.html +++ /dev/null @@ -1,464 +0,0 @@ - - - - - - -TypeDecoder (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec.scale
-

类 TypeDecoder

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.codec.scale.TypeDecoder
    • -
    -
  • -
-
-
    -
  • -
    -
    -
    public class TypeDecoder
    -extends java.lang.Object
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        TypeDecoder

        -
        public TypeDecoder()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        decode

        -
        public static <T extends Type> T decode(ScaleCodecReader reader,
        -                                        TypeReference<T> typeReference)
        -                                 throws java.lang.ClassNotFoundException
        -
        -
        抛出:
        -
        java.lang.ClassNotFoundException
        -
        -
      • -
      - - - -
        -
      • -

        decode

        -
        public static <T extends Type> T decode(byte[] input,
        -                                        TypeReference<T> typeReference)
        -                                 throws java.lang.ClassNotFoundException
        -
        -
        抛出:
        -
        java.lang.ClassNotFoundException
        -
        -
      • -
      - - - -
        -
      • -

        decode

        -
        public static <T extends Type> T decode(java.lang.String input,
        -                                        TypeReference<T> typeReference)
        -                                 throws java.lang.ClassNotFoundException
        -
        -
        抛出:
        -
        java.lang.ClassNotFoundException
        -
        -
      • -
      - - - - - - - - - - - - - - - -
        -
      • -

        decodeBytes

        -
        public static <T extends BytesType> T decodeBytes(ScaleCodecReader reader,
        -                                                  java.lang.Class<T> type)
        -
      • -
      - - - -
        -
      • -

        decodeStaticBytes

        -
        public static <T extends BytesType> T decodeStaticBytes(ScaleCodecReader reader,
        -                                                        java.lang.Class<T> type)
        -
      • -
      - - - - - - - -
        -
      • -

        decodeArray

        -
        public static <T extends Type> T decodeArray(ScaleCodecReader reader,
        -                                             TypeReference<T> typeReference,
        -                                             java.util.function.BiFunction<java.util.List<T>,java.lang.String,T> consumer,
        -                                             java.lang.Integer length)
        -
      • -
      - - - - - - - - - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/TypeEncoder.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/TypeEncoder.html deleted file mode 100644 index bce5a781c..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/TypeEncoder.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - -TypeEncoder (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.codec.scale
-

类 TypeEncoder

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.codec.scale.TypeEncoder
    • -
    -
  • -
-
-
    -
  • -
    -
    -
    public class TypeEncoder
    -extends java.lang.Object
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        TypeEncoder

        -
        public TypeEncoder()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        encode

        -
        public static void encode(Type parameter,
        -                          ScaleCodecWriter writer)
        -                   throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      - - - -
        -
      • -

        encode

        -
        public static byte[] encode(Type parameter)
        -                     throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      - - - -
        -
      • -

        encodeAddress

        -
        public static void encodeAddress(Address address,
        -                                 ScaleCodecWriter writer)
        -                          throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      - - - -
        -
      • -

        encodeNumeric

        -
        public static void encodeNumeric(NumericType numericType,
        -                                 ScaleCodecWriter writer)
        -                          throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      - - - -
        -
      • -

        encodeBool

        -
        public static void encodeBool(Bool boolType,
        -                              ScaleCodecWriter writer)
        -                       throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      - - - -
        -
      • -

        encodeBytes

        -
        public static void encodeBytes(BytesType bytesType,
        -                               ScaleCodecWriter writer)
        -                        throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      - - - -
        -
      • -

        encodeStaticBytes

        -
        public static void encodeStaticBytes(Bytes bytesType,
        -                                     ScaleCodecWriter writer)
        -                              throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      - - - -
        -
      • -

        encodeString

        -
        public static void encodeString(Utf8String stringType,
        -                                ScaleCodecWriter writer)
        -                         throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      - - - -
        -
      • -

        encodeStruct

        -
        public static void encodeStruct(StructType structType,
        -                                ScaleCodecWriter writer)
        -                         throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      - - - -
        -
      • -

        encodeArray

        -
        public static void encodeArray(Array array,
        -                               ScaleCodecWriter writer)
        -                        throws java.io.IOException
        -
        -
        抛出:
        -
        java.io.IOException
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-frame.html deleted file mode 100644 index db7b35a80..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-frame.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.scale (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.scale

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-summary.html deleted file mode 100644 index bd7bf3dbd..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-summary.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.scale (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.scale

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-tree.html deleted file mode 100644 index a3fc9f748..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-tree.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.scale 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.scale的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -

枚举分层结构

-
    -
  • java.lang.Object -
      -
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) - -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-frame.html deleted file mode 100644 index 737c3d181..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.scale.reader (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.scale.reader

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-summary.html deleted file mode 100644 index 0de0b4cea..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-summary.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.scale.reader (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.scale.reader

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-tree.html deleted file mode 100644 index e18905e9d..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-tree.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.scale.reader 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.scale.reader的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object - -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-frame.html deleted file mode 100644 index 7534f02e4..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.scale.writer (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.scale.writer

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-summary.html deleted file mode 100644 index 8f51a86cd..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.scale.writer (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.scale.writer

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-tree.html deleted file mode 100644 index 4f156bd85..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-tree.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.scale.writer 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.scale.writer的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-frame.html deleted file mode 100644 index e149105aa..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-frame.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.wrapper (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.codec.wrapper

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-summary.html deleted file mode 100644 index f2863b9f9..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-summary.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.wrapper (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.codec.wrapper

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-tree.html deleted file mode 100644 index 99bcaf1d3..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-tree.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.codec.wrapper 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.codec.wrapper的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

枚举分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-frame.html deleted file mode 100644 index b1cd7e54c..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.config.exceptions (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.config.exceptions

-
-

异常错误

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-summary.html deleted file mode 100644 index f2f27e236..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-summary.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.config.exceptions (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.config.exceptions

-
-
-
    -
  • - - - - - - - - - - - - -
    异常错误概要 
    异常错误说明
    ConfigException 
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-tree.html deleted file mode 100644 index 6ca2e1d98..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-tree.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.config.exceptions 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.config.exceptions的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • java.lang.Throwable (implements java.io.Serializable) -
        -
      • java.lang.Exception - -
      • -
      -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-frame.html deleted file mode 100644 index 55f34b8c1..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-frame.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.config.model (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.config.model

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-summary.html deleted file mode 100644 index f7139b10e..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-summary.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.config.model (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.config.model

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-tree.html deleted file mode 100644 index 5663d6075..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-tree.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.config.model 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.config.model的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-frame.html deleted file mode 100644 index ac168e8dc..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.config (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.config

-
-

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-summary.html deleted file mode 100644 index 1d93bbd03..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.config (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.config

-
-
-
    -
  • - - - - - - - - - - - - - - - - -
    类概要 
    说明
    Config -
    Config is to load config file and verify.
    -
    ConfigOption -
    ConfigOption is the java object of the config file.
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-tree.html deleted file mode 100644 index 1b7d583ab..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-tree.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.config 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.config的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object - -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/Contract.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/Contract.html deleted file mode 100644 index 3ef989d53..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/Contract.html +++ /dev/null @@ -1,901 +0,0 @@ - - - - - - -Contract (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.contract
-

类 Contract

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.contract.Contract
    • -
    -
  • -
-
- -
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        Contract

        -
        protected Contract(java.lang.String contractBinary,
        -                   java.lang.String contractAddress,
        -                   Client client,
        -                   CryptoKeyPair credential,
        -                   TransactionProcessor transactionProcessor)
        -
        Constructor
        -
        -
        参数:
        -
        contractBinary - the contract binary code hex string
        -
        contractAddress - the contract address
        -
        client - a Client object
        -
        credential - key pair to use when sign transaction
        -
        transactionProcessor - TransactionProcessor object
        -
        -
      • -
      - - - -
        -
      • -

        Contract

        -
        protected Contract(java.lang.String contractBinary,
        -                   java.lang.String contractAddress,
        -                   Client client,
        -                   CryptoKeyPair credential)
        -
        Constructor, auto create a TransactionProcessor object
        -
        -
        参数:
        -
        contractBinary - the contract binary code hex string
        -
        contractAddress - the contract address
        -
        client - a Client object to send requests
        -
        credential - key pair to use when sign transaction
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        getContractAddress

        -
        public java.lang.String getContractAddress()
        -
      • -
      - - - -
        -
      • -

        setContractAddress

        -
        public void setContractAddress(java.lang.String contractAddress)
        -
      • -
      - - - - - - - -
        -
      • -

        setDeployReceipt

        -
        public void setDeployReceipt(TransactionReceipt deployReceipt)
        -
      • -
      - - - - - - - -
        -
      • -

        getCurrentExternalAccountAddress

        -
        public java.lang.String getCurrentExternalAccountAddress()
        -
      • -
      - - - -
        -
      • -

        isEnableDAG

        -
        public boolean isEnableDAG()
        -
      • -
      - - - -
        -
      • -

        setEnableDAG

        -
        public void setEnableDAG(boolean enableDAG)
        -
      • -
      - - - -
        -
      • -

        deploy

        -
        protected static <T extends Contract> T deploy(java.lang.Class<T> type,
        -                                               Client client,
        -                                               CryptoKeyPair credential,
        -                                               java.lang.String binary,
        -                                               java.lang.String abi,
        -                                               byte[] encodedConstructor,
        -                                               java.lang.String path)
        -                                        throws ContractException
        -
        Deploy contract
        -
        -
        类型参数:
        -
        T - a smart contract object extends Contract
        -
        参数:
        -
        type - class type
        -
        client - a Client object to send requests
        -
        credential - key pair to use when sign transaction
        -
        abi - ABI json string
        -
        binary - the contract binary code hex string
        -
        encodedConstructor - constructor params
        -
        path - bfs path, this param only use in wasm vm
        -
        返回:
        -
        T type smart contract
        -
        抛出:
        -
        ContractException - throws when deploy failed
        -
        -
      • -
      - - - - - - - - - - - -
        -
      • -

        generateTxAttributeWithDagFlag

        -
        protected int generateTxAttributeWithDagFlag(java.lang.String functionName,
        -                                             int dagAttribute)
        -
      • -
      - - - -
        -
      • -

        asyncExecuteTransaction

        -
        protected java.lang.String asyncExecuteTransaction(byte[] data,
        -                                                   java.lang.String funName,
        -                                                   TransactionCallback callback,
        -                                                   int dagAttribute)
        -
      • -
      - - - -
        -
      • -

        asyncExecuteTransaction

        -
        protected java.lang.String asyncExecuteTransaction(Function function,
        -                                                   TransactionCallback callback)
        -
      • -
      - - - - - - - -
        -
      • -

        executeDeployTransaction

        -
        protected TransactionReceipt executeDeployTransaction(byte[] data,
        -                                                      java.lang.String abi)
        -
      • -
      - - - -
        -
      • -

        createSignedTransaction

        -
        protected java.lang.String createSignedTransaction(Function function)
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        convertToNative

        -
        public static <S extends Type,T> java.util.List<T> convertToNative(java.util.List<S> arr)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-frame.html deleted file mode 100644 index 64ba37b9a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.auth.contracts (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.auth.contracts

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-summary.html deleted file mode 100644 index 778887214..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-summary.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.auth.contracts (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.auth.contracts

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-tree.html deleted file mode 100644 index d3d1e188c..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-tree.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.auth.contracts 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.auth.contracts的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-frame.html deleted file mode 100644 index 97d333daf..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.auth.manager (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.auth.manager

-
-

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-summary.html deleted file mode 100644 index a8e3d738a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-summary.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.auth.manager (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.auth.manager

-
-
-
    -
  • - - - - - - - - - - - - -
    类概要 
    说明
    AuthManager 
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-tree.html deleted file mode 100644 index f00aac59b..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-tree.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.auth.manager 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.auth.manager的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.contract.auth.manager.AuthManager
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-frame.html deleted file mode 100644 index 4dd9f38fd..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-frame.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.auth.po (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.auth.po

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-summary.html deleted file mode 100644 index c777acc79..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-summary.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.auth.po (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.auth.po

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-tree.html deleted file mode 100644 index 9aee2a865..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-tree.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.auth.po 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.auth.po的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.codec.datatypes.Array<T> (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) -
        -
      • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicArray<T> -
          -
        • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicStruct (implements org.fisco.bcos.sdk.v3.codec.datatypes.StructType) - -
        • -
        -
      • -
      -
    • -
    • org.fisco.bcos.sdk.v3.contract.auth.po.CommitteeInfo
    • -
    • org.fisco.bcos.sdk.v3.contract.auth.po.GovernorInfo
    • -
    -
  • -
-

枚举分层结构

-
    -
  • java.lang.Object -
      -
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) - -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-frame.html deleted file mode 100644 index 1b0cb8aba..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-summary.html deleted file mode 100644 index cc482fb23..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-summary.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract

-
-
-
    -
  • - - - - - - - - - - - - - - - - -
    类概要 
    说明
    Contract -
    Contract help manage all operations including deploy, send transaction, call contract, and - subscribe event of one specific contract.
    -
    Contract.EventValuesWithLog -
    Adds a log field to EventValues.
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-tree.html deleted file mode 100644 index 5ba907c7a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-tree.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSPrecompiled.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSPrecompiled.html deleted file mode 100644 index c0665fd7c..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSPrecompiled.html +++ /dev/null @@ -1,642 +0,0 @@ - - - - - - -BFSPrecompiled (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.contract.precompiled.bfs
-

类 BFSPrecompiled

-
-
- -
-
    -
  • -
    -
    -
    public class BFSPrecompiled
    -extends Contract
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      字段详细资料

      - - - -
        -
      • -

        ABI_ARRAY

        -
        public static final java.lang.String[] ABI_ARRAY
        -
      • -
      - - - -
        -
      • -

        ABI

        -
        public static final java.lang.String ABI
        -
      • -
      - - - -
        -
      • -

        FUNC_LINK

        -
        public static final java.lang.String FUNC_LINK
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        FUNC_LIST

        -
        public static final java.lang.String FUNC_LIST
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        FUNC_MKDIR

        -
        public static final java.lang.String FUNC_MKDIR
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        FUNC_READLINK

        -
        public static final java.lang.String FUNC_READLINK
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        BFSPrecompiled

        -
        protected BFSPrecompiled(java.lang.String contractAddress,
        -                         Client client,
        -                         CryptoKeyPair credential)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        getABI

        -
        public static java.lang.String getABI()
        -
      • -
      - - - -
        -
      • -

        link

        -
        public TransactionReceipt link(java.lang.String name,
        -                               java.lang.String version,
        -                               java.lang.String address,
        -                               java.lang.String abi)
        -
      • -
      - - - -
        -
      • -

        link

        -
        public void link(java.lang.String name,
        -                 java.lang.String version,
        -                 java.lang.String address,
        -                 java.lang.String abi,
        -                 TransactionCallback callback)
        -
      • -
      - - - -
        -
      • -

        getSignedTransactionForLink

        -
        public java.lang.String getSignedTransactionForLink(java.lang.String name,
        -                                                    java.lang.String version,
        -                                                    java.lang.String address,
        -                                                    java.lang.String abi)
        -
      • -
      - - - -
        -
      • -

        getLinkInput

        -
        public Tuple4<java.lang.String,java.lang.String,java.lang.String,java.lang.String> getLinkInput(TransactionReceipt transactionReceipt)
        -
      • -
      - - - - - - - - - - - - - - - -
        -
      • -

        mkdir

        -
        public void mkdir(java.lang.String absolutePath,
        -                  TransactionCallback callback)
        -
      • -
      - - - -
        -
      • -

        getSignedTransactionForMkdir

        -
        public java.lang.String getSignedTransactionForMkdir(java.lang.String absolutePath)
        -
      • -
      - - - - - - - - - - - - - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSService.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSService.html deleted file mode 100644 index 5e0a78e75..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSService.html +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - -BFSService (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.contract.precompiled.bfs
-

类 BFSService

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.contract.precompiled.bfs.BFSService
    • -
    -
  • -
-
-
    -
  • -
    -
    -
    public class BFSService
    -extends java.lang.Object
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      方法概要

      - - - - - - - - - - - - - - - - - - - - - - -
      所有方法 实例方法 具体方法 
      限定符和类型方法和说明
      RetCodelink(java.lang.String name, - java.lang.String version, - java.lang.String contractAddress, - java.lang.String abi) 
      java.util.List<BFSPrecompiled.BfsInfo>list(java.lang.String path) 
      RetCodemkdir(java.lang.String path) 
      java.lang.Stringreadlink(java.lang.String absolutePath) 
      -
        -
      • - - -

        从类继承的方法 java.lang.Object

        -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
- -
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-frame.html deleted file mode 100644 index 00748dd5f..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.bfs (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.precompiled.bfs

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-summary.html deleted file mode 100644 index 222f50bf5..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.bfs (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.precompiled.bfs

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-tree.html deleted file mode 100644 index 8d3290ed9..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-tree.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.bfs 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.precompiled.bfs的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.codec.datatypes.Array<T> (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) - -
    • -
    • org.fisco.bcos.sdk.v3.contract.precompiled.bfs.BFSService
    • -
    • org.fisco.bcos.sdk.v3.contract.Contract - -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-frame.html deleted file mode 100644 index 51f2b024b..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.callback (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.precompiled.callback

-
-

接口

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-summary.html deleted file mode 100644 index 80abe6bbd..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-summary.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.callback (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.precompiled.callback

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-tree.html deleted file mode 100644 index 22655e994..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-tree.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.callback 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.precompiled.callback的分层结构

-程序包分层结构: - -
-
-

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-frame.html deleted file mode 100644 index 025653452..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.consensus (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.precompiled.consensus

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-summary.html deleted file mode 100644 index 84c9f524f..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-summary.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.consensus (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.precompiled.consensus

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-tree.html deleted file mode 100644 index 1b723eccb..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.consensus 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.precompiled.consensus的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableCRUDService.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableCRUDService.html deleted file mode 100644 index 7d17e750b..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableCRUDService.html +++ /dev/null @@ -1,979 +0,0 @@ - - - - - - -TableCRUDService (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.contract.precompiled.crud
-

类 TableCRUDService

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.contract.precompiled.crud.TableCRUDService
    • -
    -
  • -
-
-
    -
  • -
    -
    -
    public class TableCRUDService
    -extends java.lang.Object
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      方法概要

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      所有方法 实例方法 具体方法 
      限定符和类型方法和说明
      RetCodeappendColumns(java.lang.String tableName, - java.util.List<java.lang.String> newColumns) -
      append new columns to a specific table with table name, new value field names
      -
      voidasyncAppendColumns(java.lang.String tableName, - java.util.List<java.lang.String> newColumns, - PrecompiledCallback callback) -
      async append new columns to a specific table with table name, new value field names
      -
      voidasyncCreateTable(java.lang.String tableName, - java.lang.String keyFieldName, - java.util.List<java.lang.String> valueFields, - PrecompiledCallback callback) -
      async create a table with table name, key name, value field names
      -
      voidasyncInsert(java.lang.String tableName, - Entry entry, - PrecompiledCallback callback) -
      async insert data to a specific table with table name, data entry
      -
      voidasyncRemove(java.lang.String tableName, - Condition condition, - PrecompiledCallback callback) -
      async remove data in a specific table with table name, key condition
      -
      voidasyncRemove(java.lang.String tableName, - java.lang.String key, - PrecompiledCallback callback) -
      async remove data in a specific table with table name, single key
      -
      voidasyncUpdate(java.lang.String tableName, - Condition condition, - UpdateFields updateFields, - PrecompiledCallback callback) -
      async update data to a specific table with table name, condition, updateFields
      -
      voidasyncUpdate(java.lang.String tableName, - java.lang.String key, - UpdateFields updateFields, - PrecompiledCallback callback) -
      async update data to a specific table with table name, single key, updateFields
      -
      RetCodecreateTable(java.lang.String tableName, - java.lang.String keyFieldName, - java.util.List<java.lang.String> valueFields) -
      create a table with table name, key name, value field names
      -
      java.util.Map<java.lang.String,java.util.List<java.lang.String>>desc(java.lang.String tableName) -
      get a specific table key and value fields with table name
      -
      RetCodeinsert(java.lang.String tableName, - Entry entry) -
      insert data to a specific table with table name, data entry.
      -
      RetCodeinsert(TablePrecompiled tablePrecompiled, - Entry entry) -
      insert data to a specific table with table precompiled, data entry. this method will reduce - tableManager.openTable() overhead
      -
      RetCoderemove(java.lang.String tableName, - Condition condition) -
      remove data in a specific table with table name, key condition
      -
      RetCoderemove(java.lang.String tableName, - java.lang.String key) -
      remove data in a specific table with table name, single key
      -
      RetCoderemove(TablePrecompiled tablePrecompiled, - Condition condition) -
      remove data in a specific table with table name, key condition this method will reduce - tableManager.openTable() overhead
      -
      RetCoderemove(TablePrecompiled tablePrecompiled, - java.lang.String key) -
      remove data in a specific table with tablePrecompiled, single key this method will reduce - tableManager.openTable() overhead
      -
      java.util.List<java.util.Map<java.lang.String,java.lang.String>>select(java.lang.String tableName, - Condition condition) -
      select data in a specific table with table name, condition
      -
      java.util.List<java.util.Map<java.lang.String,java.lang.String>>select(java.lang.String tableName, - java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc, - Condition condition) -
      select data in a specific table with table name, table desc info, condition. this method will - reduce table.desc() overhead
      -
      java.util.Map<java.lang.String,java.lang.String>select(java.lang.String tableName, - java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc, - java.lang.String key) -
      select data in a specific table with table name, table desc info, single key this method will - reduce table.desc() overhead
      -
      java.util.Map<java.lang.String,java.lang.String>select(java.lang.String tableName, - java.lang.String key) -
      select data in a specific table with table name, single key
      -
      RetCodeupdate(java.lang.String tableName, - Condition condition, - UpdateFields updateFields) -
      update data to a specific table with table name, condition, updateFields
      -
      RetCodeupdate(java.lang.String tableName, - java.lang.String key, - UpdateFields updateFields) -
      update data to a specific table with table name, single key, updateFields
      -
      RetCodeupdate(TablePrecompiled tablePrecompiled, - Condition condition, - UpdateFields updateFields) -
      update data to a specific table with tablePrecompiled, key condition, updateFields this - method will reduce tableManager.openTable() overhead
      -
      RetCodeupdate(TablePrecompiled tablePrecompiled, - java.lang.String key, - UpdateFields updateFields) -
      update data to a specific table with tablePrecompiled, single key, updateFields this method - will reduce tableManager.openTable() overhead
      -
      -
        -
      • - - -

        从类继承的方法 java.lang.Object

        -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        TableCRUDService

        -
        public TableCRUDService(Client client,
        -                        CryptoKeyPair credential)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        createTable

        -
        public RetCode createTable(java.lang.String tableName,
        -                           java.lang.String keyFieldName,
        -                           java.util.List<java.lang.String> valueFields)
        -                    throws ContractException
        -
        create a table with table name, key name, value field names
        -
        -
        参数:
        -
        tableName - table name, will add prefix /tables/ in blockchain, tableName length not - longer than 50 with prefix
        -
        keyFieldName - key field name, which length should not be longer than 64
        -
        valueFields - value field names, which length in total should not be longer than 1024
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        asyncCreateTable

        -
        public void asyncCreateTable(java.lang.String tableName,
        -                             java.lang.String keyFieldName,
        -                             java.util.List<java.lang.String> valueFields,
        -                             PrecompiledCallback callback)
        -
        async create a table with table name, key name, value field names
        -
        -
        参数:
        -
        tableName - table name, will add prefix /tables/ in blockchain, tableName length not - longer than 50 with prefix
        -
        keyFieldName - key field name, which length should not be longer than 64
        -
        valueFields - value field names, which length in total should not be longer than 1024
        -
        callback - callback when get receipt
        -
        -
      • -
      - - - -
        -
      • -

        appendColumns

        -
        public RetCode appendColumns(java.lang.String tableName,
        -                             java.util.List<java.lang.String> newColumns)
        -                      throws ContractException
        -
        append new columns to a specific table with table name, new value field names
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        newColumns - new value field names, which length in total should not be longer than - 1024, and should not be duplicate
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        asyncAppendColumns

        -
        public void asyncAppendColumns(java.lang.String tableName,
        -                               java.util.List<java.lang.String> newColumns,
        -                               PrecompiledCallback callback)
        -
        async append new columns to a specific table with table name, new value field names
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        newColumns - new value field names, which length in total should not be longer than - 1024, and should not be duplicate
        -
        callback - callback when get receipt
        -
        -
      • -
      - - - -
        -
      • -

        select

        -
        public java.util.List<java.util.Map<java.lang.String,java.lang.String>> select(java.lang.String tableName,
        -                                                                               Condition condition)
        -                                                                        throws ContractException
        -
        select data in a specific table with table name, condition
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        condition - condition about key
        -
        返回:
        -
        return a list of select result which match condition
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        select

        -
        public java.util.List<java.util.Map<java.lang.String,java.lang.String>> select(java.lang.String tableName,
        -                                                                               java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc,
        -                                                                               Condition condition)
        -                                                                        throws ContractException
        -
        select data in a specific table with table name, table desc info, condition. this method will - reduce table.desc() overhead
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        desc - table key field and value fields info, [(key_field: [""]),(value_fields: [""])]
        -
        condition - condition about key
        -
        返回:
        -
        return a list of select result which match condition
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        select

        -
        public java.util.Map<java.lang.String,java.lang.String> select(java.lang.String tableName,
        -                                                               java.lang.String key)
        -                                                        throws ContractException
        -
        select data in a specific table with table name, single key
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        key - specific key
        -
        返回:
        -
        return select result which key in table matches the key given
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        select

        -
        public java.util.Map<java.lang.String,java.lang.String> select(java.lang.String tableName,
        -                                                               java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc,
        -                                                               java.lang.String key)
        -                                                        throws ContractException
        -
        select data in a specific table with table name, table desc info, single key this method will - reduce table.desc() overhead
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        desc - table key field and value fields info, [(key_field: [""]),(value_fields: [""])]
        -
        key - specific key
        -
        返回:
        -
        return select result which key in table matches the key given
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        insert

        -
        public RetCode insert(java.lang.String tableName,
        -                      Entry entry)
        -               throws ContractException
        -
        insert data to a specific table with table name, data entry.
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        entry - data entry, which contains key and values map, values size should match the - table value field size
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        insert

        -
        public RetCode insert(TablePrecompiled tablePrecompiled,
        -                      Entry entry)
        -               throws ContractException
        -
        insert data to a specific table with table precompiled, data entry. this method will reduce - tableManager.openTable() overhead
        -
        -
        参数:
        -
        tablePrecompiled - specific tablePrecompiled, already load a specific contract address
        -
        entry - data entry, which contains key and values map, values size should match the - table value field size
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        asyncInsert

        -
        public void asyncInsert(java.lang.String tableName,
        -                        Entry entry,
        -                        PrecompiledCallback callback)
        -                 throws ContractException
        -
        async insert data to a specific table with table name, data entry
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        entry - data entry, which contains key and values map, values size should match the - table value field size
        -
        callback - callback when get receipt
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        public RetCode update(java.lang.String tableName,
        -                      java.lang.String key,
        -                      UpdateFields updateFields)
        -               throws ContractException
        -
        update data to a specific table with table name, single key, updateFields
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        key - specific key, key should exist
        -
        updateFields - update specific fields' data
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        public RetCode update(TablePrecompiled tablePrecompiled,
        -                      java.lang.String key,
        -                      UpdateFields updateFields)
        -               throws ContractException
        -
        update data to a specific table with tablePrecompiled, single key, updateFields this method - will reduce tableManager.openTable() overhead
        -
        -
        参数:
        -
        tablePrecompiled - specific tablePrecompiled, already load a specific contract address
        -
        key - specific key, key should exist
        -
        updateFields - update specific fields' data
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        public RetCode update(java.lang.String tableName,
        -                      Condition condition,
        -                      UpdateFields updateFields)
        -               throws ContractException
        -
        update data to a specific table with table name, condition, updateFields
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        condition - key condition
        -
        updateFields - update specific fields' data
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        public RetCode update(TablePrecompiled tablePrecompiled,
        -                      Condition condition,
        -                      UpdateFields updateFields)
        -               throws ContractException
        -
        update data to a specific table with tablePrecompiled, key condition, updateFields this - method will reduce tableManager.openTable() overhead
        -
        -
        参数:
        -
        tablePrecompiled - specific tablePrecompiled, already load a specific contract address
        -
        condition - key condition
        -
        updateFields - update specific fields' data
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        asyncUpdate

        -
        public void asyncUpdate(java.lang.String tableName,
        -                        java.lang.String key,
        -                        UpdateFields updateFields,
        -                        PrecompiledCallback callback)
        -                 throws ContractException
        -
        async update data to a specific table with table name, single key, updateFields
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        key - specific key, key should exist
        -
        updateFields - update specific fields' data
        -
        callback - callback when get receipt
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        asyncUpdate

        -
        public void asyncUpdate(java.lang.String tableName,
        -                        Condition condition,
        -                        UpdateFields updateFields,
        -                        PrecompiledCallback callback)
        -                 throws ContractException
        -
        async update data to a specific table with table name, condition, updateFields
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        condition - key condition
        -
        updateFields - update specific fields' data
        -
        callback - callback when get receipt
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        public RetCode remove(java.lang.String tableName,
        -                      java.lang.String key)
        -               throws ContractException
        -
        remove data in a specific table with table name, single key
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        key - specific key, key should exist
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        public RetCode remove(TablePrecompiled tablePrecompiled,
        -                      java.lang.String key)
        -               throws ContractException
        -
        remove data in a specific table with tablePrecompiled, single key this method will reduce - tableManager.openTable() overhead
        -
        -
        参数:
        -
        tablePrecompiled - specific tablePrecompiled, already load a specific contract address
        -
        key - specific key, key should exist
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        public RetCode remove(java.lang.String tableName,
        -                      Condition condition)
        -               throws ContractException
        -
        remove data in a specific table with table name, key condition
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        condition - key condition
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        public RetCode remove(TablePrecompiled tablePrecompiled,
        -                      Condition condition)
        -               throws ContractException
        -
        remove data in a specific table with table name, key condition this method will reduce - tableManager.openTable() overhead
        -
        -
        参数:
        -
        tablePrecompiled - specific tablePrecompiled, already load a specific contract address
        -
        condition - key condition
        -
        返回:
        -
        if success then return 0; otherwise is failed then see the retCode message
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        asyncRemove

        -
        public void asyncRemove(java.lang.String tableName,
        -                        java.lang.String key,
        -                        PrecompiledCallback callback)
        -                 throws ContractException
        -
        async remove data in a specific table with table name, single key
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        key - specific key, key should exist
        -
        callback - callback when get receipt
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        asyncRemove

        -
        public void asyncRemove(java.lang.String tableName,
        -                        Condition condition,
        -                        PrecompiledCallback callback)
        -                 throws ContractException
        -
        async remove data in a specific table with table name, key condition
        -
        -
        参数:
        -
        tableName - specific table name, table should exist
        -
        condition - key condition
        -
        callback - callback when get receipt
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      - - - -
        -
      • -

        desc

        -
        public java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc(java.lang.String tableName)
        -                                                                      throws ContractException
        -
        get a specific table key and value fields with table name
        -
        -
        参数:
        -
        tableName - specific table name, it should exist
        -
        返回:
        -
        table key field and value fields info, [("key_field": [""]),("value_fields": [""])]
        -
        抛出:
        -
        ContractException - throw when contract exec exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.html deleted file mode 100644 index 5448e6980..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.html +++ /dev/null @@ -1,797 +0,0 @@ - - - - - - -TableManagerPrecompiled (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.contract.precompiled.crud
-

类 TableManagerPrecompiled

-
-
- -
-
    -
  • -
    -
    -
    public class TableManagerPrecompiled
    -extends Contract
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      字段详细资料

      - - - -
        -
      • -

        BINARY_ARRAY

        -
        public static final java.lang.String[] BINARY_ARRAY
        -
      • -
      - - - -
        -
      • -

        BINARY

        -
        public static final java.lang.String BINARY
        -
      • -
      - - - -
        -
      • -

        SM_BINARY_ARRAY

        -
        public static final java.lang.String[] SM_BINARY_ARRAY
        -
      • -
      - - - -
        -
      • -

        SM_BINARY

        -
        public static final java.lang.String SM_BINARY
        -
      • -
      - - - -
        -
      • -

        ABI_ARRAY

        -
        public static final java.lang.String[] ABI_ARRAY
        -
      • -
      - - - -
        -
      • -

        ABI

        -
        public static final java.lang.String ABI
        -
      • -
      - - - -
        -
      • -

        FUNC_APPENDCOLUMNS

        -
        public static final java.lang.String FUNC_APPENDCOLUMNS
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        FUNC_CREATEKVTABLE

        -
        public static final java.lang.String FUNC_CREATEKVTABLE
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        FUNC_CREATETABLE

        -
        public static final java.lang.String FUNC_CREATETABLE
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        FUNC_DESC

        -
        public static final java.lang.String FUNC_DESC
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        FUNC_OPENTABLE

        -
        public static final java.lang.String FUNC_OPENTABLE
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        TableManagerPrecompiled

        -
        protected TableManagerPrecompiled(java.lang.String contractAddress,
        -                                  Client client,
        -                                  CryptoKeyPair credential)
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.html deleted file mode 100644 index 35e66ecb3..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.html +++ /dev/null @@ -1,937 +0,0 @@ - - - - - - -TablePrecompiled (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.contract.precompiled.crud
-

类 TablePrecompiled

-
-
- -
-
    -
  • -
    -
    -
    public class TablePrecompiled
    -extends Contract
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Condition.ConditionOperator.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Condition.ConditionOperator.html deleted file mode 100644 index 08d124992..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Condition.ConditionOperator.html +++ /dev/null @@ -1,422 +0,0 @@ - - - - - - -Condition.ConditionOperator (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.contract.precompiled.crud.common
-

枚举 Condition.ConditionOperator

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • java.lang.Enum<Condition.ConditionOperator>
    • -
    • -
        -
      • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.Condition.ConditionOperator
      • -
      -
    • -
    -
  • -
-
- -
-
-
    -
  • - -
      -
    • - - -

      枚举常量概要

      - - - - - - - - - - - - - - - - - - - - -
      枚举常量 
      枚举常量和说明
      EQ 
      GE 
      GT 
      LE 
      LT 
      -
    • -
    - -
      -
    • - - -

      方法概要

      - - - - - - - - - - - - - - - - - - - - - - - - - - -
      所有方法 静态方法 实例方法 具体方法 
      限定符和类型方法和说明
      java.math.BigIntegergetBigIntValue() 
      intgetValue() 
      java.lang.StringtoString() 
      static Condition.ConditionOperatorvalueOf(java.lang.String name) -
      返回带有指定名称的该类型的枚举常量。
      -
      static Condition.ConditionOperator[]values() -
      按照声明该枚举类型的常量的顺序, 返回 -包含这些常量的数组。
      -
      -
        -
      • - - -

        从类继承的方法 java.lang.Enum

        -clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, valueOf
      • -
      -
        -
      • - - -

        从类继承的方法 java.lang.Object

        -getClass, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        values

        -
        public static Condition.ConditionOperator[] values()
        -
        按照声明该枚举类型的常量的顺序, 返回 -包含这些常量的数组。该方法可用于迭代 -常量, 如下所示: -
        -for (Condition.ConditionOperator c : Condition.ConditionOperator.values())
        -    System.out.println(c);
        -
        -
        -
        返回:
        -
        按照声明该枚举类型的常量的顺序返回的包含这些常量的数组
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static Condition.ConditionOperator valueOf(java.lang.String name)
        -
        返回带有指定名称的该类型的枚举常量。 -字符串必须与用于声明该类型的枚举常量的 -标识符完全匹配。(不允许有多余 -的空格字符。)
        -
        -
        参数:
        -
        name - 要返回的枚举常量的名称。
        -
        返回:
        -
        返回带有指定名称的枚举常量
        -
        抛出:
        -
        java.lang.IllegalArgumentException - 如果该枚举类型没有带有指定名称的常量
        -
        java.lang.NullPointerException - 如果参数为空值
        -
        -
      • -
      - - - -
        -
      • -

        getValue

        -
        public int getValue()
        -
      • -
      - - - -
        -
      • -

        getBigIntValue

        -
        public java.math.BigInteger getBigIntValue()
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-frame.html deleted file mode 100644 index 21b8d1e08..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.crud.common (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.precompiled.crud.common

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-summary.html deleted file mode 100644 index 92e7632e5..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-summary.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.crud.common (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.precompiled.crud.common

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-tree.html deleted file mode 100644 index 6d3d16312..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-tree.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.crud.common 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.precompiled.crud.common的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.Common
    • -
    • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.Condition
    • -
    • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.Entry
    • -
    • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.UpdateFields
    • -
    -
  • -
-

枚举分层结构

-
    -
  • java.lang.Object -
      -
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) - -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-frame.html deleted file mode 100644 index 40e6ed47a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-frame.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.crud (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.precompiled.crud

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-summary.html deleted file mode 100644 index abd5018a2..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-summary.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.crud (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.precompiled.crud

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-tree.html deleted file mode 100644 index bd74961aa..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-tree.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.crud 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.precompiled.crud的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/PrecompiledAddress.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/PrecompiledAddress.html deleted file mode 100644 index c9fa2ab98..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/PrecompiledAddress.html +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - -PrecompiledAddress (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.contract.precompiled.model
-

类 PrecompiledAddress

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.contract.precompiled.model.PrecompiledAddress
    • -
    -
  • -
-
-
    -
  • -
    -
    -
    public class PrecompiledAddress
    -extends java.lang.Object
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      字段详细资料

      - - - -
        -
      • -

        SYS_CONFIG_PRECOMPILED_ADDRESS

        -
        public static final java.lang.String SYS_CONFIG_PRECOMPILED_ADDRESS
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        TABLE_MANAGER_PRECOMPILED_ADDRESS

        -
        public static final java.lang.String TABLE_MANAGER_PRECOMPILED_ADDRESS
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        CONSENSUS_PRECOMPILED_ADDRESS

        -
        public static final java.lang.String CONSENSUS_PRECOMPILED_ADDRESS
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        BFS_PRECOMPILED_ADDRESS

        -
        public static final java.lang.String BFS_PRECOMPILED_ADDRESS
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        COMMITTEE_MANAGER_ADDRESS

        -
        public static final java.lang.String COMMITTEE_MANAGER_ADDRESS
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        CONTRACT_AUTH_ADDRESS

        -
        public static final java.lang.String CONTRACT_AUTH_ADDRESS
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        SYS_CONFIG_PRECOMPILED_NAME

        -
        public static final java.lang.String SYS_CONFIG_PRECOMPILED_NAME
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        CONSENSUS_PRECOMPILED_NAME

        -
        public static final java.lang.String CONSENSUS_PRECOMPILED_NAME
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        BFS_PRECOMPILED_NAME

        -
        public static final java.lang.String BFS_PRECOMPILED_NAME
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      - - - -
        -
      • -

        TABLE_MANAGER_PRECOMPILED_NAME

        -
        public static final java.lang.String TABLE_MANAGER_PRECOMPILED_NAME
        -
        -
        另请参阅:
        -
        常量字段值
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-frame.html deleted file mode 100644 index 739d05623..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.model (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.precompiled.model

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-summary.html deleted file mode 100644 index d73697e88..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-summary.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.model (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.precompiled.model

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-tree.html deleted file mode 100644 index a593d7852..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-tree.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.model 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.precompiled.model的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.contract.precompiled.model.PrecompiledAddress
    • -
    • org.fisco.bcos.sdk.v3.contract.precompiled.model.Version
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-frame.html deleted file mode 100644 index d39e19672..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-summary.html deleted file mode 100644 index e037d5755..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-summary.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-tree.html deleted file mode 100644 index cab6ee553..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-frame.html deleted file mode 100644 index 5df9f83b4..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-frame.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.exceptions (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.crypto.exceptions

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-summary.html deleted file mode 100644 index 40bf819c4..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-summary.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.exceptions (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.crypto.exceptions

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-tree.html deleted file mode 100644 index 2c17712e6..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-tree.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.exceptions 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.crypto.exceptions的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-frame.html deleted file mode 100644 index 6483ef15a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-frame.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.hash (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.crypto.hash

-
-

接口

- -

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-summary.html deleted file mode 100644 index 4c18bf096..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-summary.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.hash (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.crypto.hash

-
-
-
    -
  • - - - - - - - - - - - - -
    接口概要 
    接口说明
    Hash 
    -
  • -
  • - - - - - - - - - - - - - - - - -
    类概要 
    说明
    Keccak256 
    SM3Hash 
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-tree.html deleted file mode 100644 index a8fe21b32..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.hash 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.crypto.hash的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.crypto.hash.Keccak256 (implements org.fisco.bcos.sdk.v3.crypto.hash.Hash)
    • -
    • org.fisco.bcos.sdk.v3.crypto.hash.SM3Hash (implements org.fisco.bcos.sdk.v3.crypto.hash.Hash)
    • -
    -
  • -
-

接口分层结构

-
    -
  • org.fisco.bcos.sdk.v3.crypto.hash.Hash
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-frame.html deleted file mode 100644 index 17cd226ce..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.keypair (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.crypto.keypair

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-summary.html deleted file mode 100644 index cc6d32f41..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.keypair (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.crypto.keypair

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-tree.html deleted file mode 100644 index f0aa377ee..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.keypair 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.crypto.keypair的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object - -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-frame.html deleted file mode 100644 index 7cf521082..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.keystore (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.crypto.keystore

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-summary.html deleted file mode 100644 index 7826dcbbb..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.keystore (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.crypto.keystore

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-tree.html deleted file mode 100644 index c47ee776b..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.keystore 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.crypto.keystore的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.crypto.keystore.KeyTool - -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-frame.html deleted file mode 100644 index dd9214968..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.crypto

-
-

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-summary.html deleted file mode 100644 index f14634cac..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-summary.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.crypto

-
-
-
    -
  • - - - - - - - - - - - - -
    类概要 
    说明
    CryptoSuite 
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-tree.html deleted file mode 100644 index 6cfe0de16..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-tree.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.crypto的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object - -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-frame.html deleted file mode 100644 index 7404fd435..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-frame.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.signature (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.crypto.signature

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-summary.html deleted file mode 100644 index 559cddc22..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-summary.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.signature (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.crypto.signature

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-tree.html deleted file mode 100644 index b5f84c0fe..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-tree.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.signature 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.crypto.signature的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

-
    -
  • org.fisco.bcos.sdk.v3.crypto.signature.Signature
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-frame.html deleted file mode 100644 index 83ac33033..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-frame.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.vrf (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.crypto.vrf

-
-

接口

- -

- -

异常错误

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-summary.html deleted file mode 100644 index f99f0c7db..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-summary.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.vrf (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.crypto.vrf

-
-
-
    -
  • - - - - - - - - - - - - -
    接口概要 
    接口说明
    VRFInterface 
    -
  • -
  • - - - - - - - - - - - - - - - - -
    类概要 
    说明
    Curve25519VRF 
    VRFKeyPair 
    -
  • -
  • - - - - - - - - - - - - -
    异常错误概要 
    异常错误说明
    VRFException -
    Exceptioned when calling vrf related functions.
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-tree.html deleted file mode 100644 index 1a869acce..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-tree.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.crypto.vrf 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.crypto.vrf的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.crypto.vrf.Curve25519VRF (implements org.fisco.bcos.sdk.v3.crypto.vrf.VRFInterface)
    • -
    • java.lang.Throwable (implements java.io.Serializable) -
        -
      • java.lang.Exception -
          -
        • java.lang.RuntimeException - -
        • -
        -
      • -
      -
    • -
    • org.fisco.bcos.sdk.v3.crypto.vrf.VRFKeyPair
    • -
    -
  • -
-

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-frame.html deleted file mode 100644 index a2fae3e75..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-frame.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.eventsub (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.eventsub

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-summary.html deleted file mode 100644 index 2398139b6..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-summary.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.eventsub (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.eventsub

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-tree.html deleted file mode 100644 index d7fa90a59..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-tree.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.eventsub 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.eventsub的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -

枚举分层结构

-
    -
  • java.lang.Object -
      -
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) - -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/EnumNodeVersion.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/EnumNodeVersion.html deleted file mode 100644 index 11b8c9aed..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/EnumNodeVersion.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - - -EnumNodeVersion (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.model
-

枚举 EnumNodeVersion

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • java.lang.Enum<EnumNodeVersion>
    • -
    • -
        -
      • org.fisco.bcos.sdk.v3.model.EnumNodeVersion
      • -
      -
    • -
    -
  • -
-
-
    -
  • -
    -
    所有已实现的接口:
    -
    java.io.Serializable, java.lang.Comparable<EnumNodeVersion>
    -
    -
    -
    -
    public enum EnumNodeVersion
    -extends java.lang.Enum<EnumNodeVersion>
    -
  • -
-
-
-
    -
  • - - - - - -
      -
    • - - -

      方法概要

      - - - - - - - - - - - - - - - - - - - - - - - - - - -
      所有方法 静态方法 实例方法 具体方法 
      限定符和类型方法和说明
      static EnumNodeVersion.VersiongetClassVersion(java.lang.String version) 
      java.lang.StringgetVersion() 
      voidsetVersion(java.lang.String version) 
      static EnumNodeVersionvalueOf(java.lang.String name) -
      返回带有指定名称的该类型的枚举常量。
      -
      static EnumNodeVersion[]values() -
      按照声明该枚举类型的常量的顺序, 返回 -包含这些常量的数组。
      -
      -
        -
      • - - -

        从类继承的方法 java.lang.Enum

        -clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
      • -
      -
        -
      • - - -

        从类继承的方法 java.lang.Object

        -getClass, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        values

        -
        public static EnumNodeVersion[] values()
        -
        按照声明该枚举类型的常量的顺序, 返回 -包含这些常量的数组。该方法可用于迭代 -常量, 如下所示: -
        -for (EnumNodeVersion c : EnumNodeVersion.values())
        -    System.out.println(c);
        -
        -
        -
        返回:
        -
        按照声明该枚举类型的常量的顺序返回的包含这些常量的数组
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static EnumNodeVersion valueOf(java.lang.String name)
        -
        返回带有指定名称的该类型的枚举常量。 -字符串必须与用于声明该类型的枚举常量的 -标识符完全匹配。(不允许有多余 -的空格字符。)
        -
        -
        参数:
        -
        name - 要返回的枚举常量的名称。
        -
        返回:
        -
        返回带有指定名称的枚举常量
        -
        抛出:
        -
        java.lang.IllegalArgumentException - 如果该枚举类型没有带有指定名称的常量
        -
        java.lang.NullPointerException - 如果参数为空值
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        public java.lang.String getVersion()
        -
      • -
      - - - -
        -
      • -

        setVersion

        -
        public void setVersion(java.lang.String version)
        -
      • -
      - - - -
        -
      • -

        getClassVersion

        -
        public static EnumNodeVersion.Version getClassVersion(java.lang.String version)
        -                                               throws java.lang.Exception
        -
        -
        抛出:
        -
        java.lang.Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/TransactionReceipt.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/TransactionReceipt.html deleted file mode 100644 index 420f3442a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/TransactionReceipt.html +++ /dev/null @@ -1,737 +0,0 @@ - - - - - - -TransactionReceipt (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.model
-

类 TransactionReceipt

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.model.TransactionReceipt
    • -
    -
  • -
-
-
    -
  • -
    -
    -
    public class TransactionReceipt
    -extends java.lang.Object
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        TransactionReceipt

        -
        public TransactionReceipt()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        isStatusOK

        -
        public boolean isStatusOK()
        -
      • -
      - - - -
        -
      • -

        getReceiptProof

        -
        public java.util.List<MerkleProofUnit> getReceiptProof()
        -
      • -
      - - - -
        -
      • -

        setReceiptProof

        -
        public void setReceiptProof(java.util.List<MerkleProofUnit> receiptProof)
        -
      • -
      - - - -
        -
      • -

        getTransactionHash

        -
        public java.lang.String getTransactionHash()
        -
      • -
      - - - -
        -
      • -

        setTransactionHash

        -
        public void setTransactionHash(java.lang.String transactionHash)
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        public java.lang.String getVersion()
        -
      • -
      - - - -
        -
      • -

        setVersion

        -
        public void setVersion(java.lang.String version)
        -
      • -
      - - - -
        -
      • -

        getReceiptHash

        -
        public java.lang.String getReceiptHash()
        -
      • -
      - - - -
        -
      • -

        setReceiptHash

        -
        public void setReceiptHash(java.lang.String receiptHash)
        -
      • -
      - - - -
        -
      • -

        getBlockNumber

        -
        public java.lang.String getBlockNumber()
        -
      • -
      - - - -
        -
      • -

        setBlockNumber

        -
        public void setBlockNumber(java.lang.String blockNumber)
        -
      • -
      - - - -
        -
      • -

        getFrom

        -
        public java.lang.String getFrom()
        -
      • -
      - - - -
        -
      • -

        setFrom

        -
        public void setFrom(java.lang.String from)
        -
      • -
      - - - -
        -
      • -

        getTo

        -
        public java.lang.String getTo()
        -
      • -
      - - - -
        -
      • -

        setTo

        -
        public void setTo(java.lang.String to)
        -
      • -
      - - - -
        -
      • -

        getGasUsed

        -
        public java.lang.String getGasUsed()
        -
      • -
      - - - -
        -
      • -

        setGasUsed

        -
        public void setGasUsed(java.lang.String gasUsed)
        -
      • -
      - - - -
        -
      • -

        getContractAddress

        -
        public java.lang.String getContractAddress()
        -
      • -
      - - - -
        -
      • -

        setContractAddress

        -
        public void setContractAddress(java.lang.String contractAddress)
        -
      • -
      - - - - - - - - - - - -
        -
      • -

        getStatus

        -
        public int getStatus()
        -
      • -
      - - - -
        -
      • -

        setStatus

        -
        public void setStatus(int status)
        -
      • -
      - - - -
        -
      • -

        getInput

        -
        public java.lang.String getInput()
        -
      • -
      - - - -
        -
      • -

        setInput

        -
        public void setInput(java.lang.String input)
        -
      • -
      - - - -
        -
      • -

        getOutput

        -
        public java.lang.String getOutput()
        -
      • -
      - - - -
        -
      • -

        setOutput

        -
        public void setOutput(java.lang.String output)
        -
      • -
      - - - -
        -
      • -

        getTransactionProof

        -
        public java.util.List<MerkleProofUnit> getTransactionProof()
        -
      • -
      - - - -
        -
      • -

        setTransactionProof

        -
        public void setTransactionProof(java.util.List<MerkleProofUnit> transactionProof)
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(java.lang.Object o)
        -
        -
        覆盖:
        -
        equals 在类中 java.lang.Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        覆盖:
        -
        hashCode 在类中 java.lang.Object
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public java.lang.String toString()
        -
        -
        覆盖:
        -
        toString 在类中 java.lang.Object
        -
        -
      • -
      - - - -
        -
      • -

        getMessage

        -
        public java.lang.String getMessage()
        -
        -
        返回:
        -
        the message
        -
        -
      • -
      - - - -
        -
      • -

        setMessage

        -
        public void setMessage(java.lang.String message)
        -
        -
        参数:
        -
        message - the message to set
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-frame.html deleted file mode 100644 index e9a69c6b2..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.model.callback (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.model.callback

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-summary.html deleted file mode 100644 index 94e220368..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-summary.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.model.callback (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.model.callback

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-tree.html deleted file mode 100644 index 5b96b40df..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-tree.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.model.callback 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.model.callback的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-frame.html deleted file mode 100644 index 0feabd3cb..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.model (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.model

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-summary.html deleted file mode 100644 index 9d97e196a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-summary.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.model (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.model

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-tree.html deleted file mode 100644 index e01fed7e0..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-tree.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.model 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.model的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

枚举分层结构

-
    -
  • java.lang.Object -
      -
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) - -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-frame.html deleted file mode 100644 index 32ff10269..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3 (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3

-
-

- -

异常错误

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-summary.html deleted file mode 100644 index 969aa6ee5..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-summary.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3

-
-
-
    -
  • - - - - - - - - - - - - -
    类概要 
    说明
    BcosSDK 
    -
  • -
  • - - - - - - - - - - - - -
    异常错误概要 
    异常错误说明
    BcosSDKException -
    Throw exception when calling BcosSDK.
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-tree.html deleted file mode 100644 index 3cb0f48da..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-tree.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.BcosSDK
    • -
    • java.lang.Throwable (implements java.io.Serializable) -
        -
      • java.lang.Exception - -
      • -
      -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-frame.html deleted file mode 100644 index eb37cb7f2..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-frame.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.codec.decode (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.codec.decode

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-summary.html deleted file mode 100644 index 25a644292..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-summary.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.codec.decode (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.codec.decode

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-tree.html deleted file mode 100644 index c02feea72..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-tree.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.codec.decode 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.codec.decode的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-frame.html deleted file mode 100644 index b86027ce9..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.codec.encode (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.codec.encode

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-summary.html deleted file mode 100644 index c390e4894..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-summary.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.codec.encode (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.codec.encode

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-tree.html deleted file mode 100644 index 2291937aa..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-tree.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.codec.encode 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.codec.encode的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionWithRemoteSignProcessor.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionWithRemoteSignProcessor.html deleted file mode 100644 index 6f128d52c..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionWithRemoteSignProcessor.html +++ /dev/null @@ -1,707 +0,0 @@ - - - - - - -AssembleTransactionWithRemoteSignProcessor (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.transaction.manager
-

类 AssembleTransactionWithRemoteSignProcessor

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessor.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessor.html deleted file mode 100644 index 8c1cd981a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessor.html +++ /dev/null @@ -1,757 +0,0 @@ - - - - - - -TransactionProcessor (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.transaction.manager
-

类 TransactionProcessor

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.fisco.bcos.sdk.v3.transaction.manager.TransactionProcessor
    • -
    -
  • -
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      字段详细资料

      - - - -
        -
      • -

        log

        -
        protected static org.slf4j.Logger log
        -
      • -
      - - - -
        -
      • -

        cryptoSuite

        -
        protected final CryptoSuite cryptoSuite
        -
      • -
      - - - -
        -
      • -

        client

        -
        protected final Client client
        -
      • -
      - - - -
        -
      • -

        groupId

        -
        protected final java.lang.String groupId
        -
      • -
      - - - -
        -
      • -

        chainId

        -
        protected final java.lang.String chainId
        -
      • -
      - - - - - - - - -
    • -
    - -
      -
    • - - -

      构造器详细资料

      - - - -
        -
      • -

        TransactionProcessor

        -
        public TransactionProcessor(Client client,
        -                            CryptoKeyPair cryptoKeyPair,
        -                            java.lang.String groupId,
        -                            java.lang.String chainId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        getCryptoKeyPair

        -
        public CryptoKeyPair getCryptoKeyPair()
        -
      • -
      - - - -
        -
      • -

        setCryptoKeyPair

        -
        public void setCryptoKeyPair(CryptoKeyPair cryptoKeyPair)
        -
      • -
      - - - -
        -
      • -

        deployAndGetReceipt

        -
        public TransactionReceipt deployAndGetReceipt(java.lang.String to,
        -                                              byte[] data,
        -                                              java.lang.String abi,
        -                                              CryptoKeyPair cryptoKeyPair,
        -                                              int txAttribute)
        -
        从接口复制的说明: TransactionProcessorInterface
        -
        send deploy transaction to fisco bcos node and get transaction receipt.
        -
        -
        指定者:
        -
        deployAndGetReceipt 在接口中 TransactionProcessorInterface
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        abi - ABI json string, deploy into chain with code, can be empty string
        -
        cryptoKeyPair - key pair
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        transaction receipt
        -
        -
      • -
      - - - -
        -
      • -

        deployAndGetReceipt

        -
        public TransactionReceipt deployAndGetReceipt(java.lang.String to,
        -                                              byte[] data,
        -                                              java.lang.String abi,
        -                                              int txAttribute)
        -                                       throws org.fisco.bcos.sdk.jni.common.JniException
        -
        从接口复制的说明: TransactionProcessorInterface
        -
        send deploy transaction to fisco bcos node and get transaction receipt. this method use - default keyPair
        -
        -
        指定者:
        -
        deployAndGetReceipt 在接口中 TransactionProcessorInterface
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        abi - ABI json string, deploy into chain with code, can be empty string
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        transaction receipt
        -
        抛出:
        -
        org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
        -
        -
      • -
      - - - - - - - -
        -
      • -

        sendTransactionAndGetReceipt

        -
        public TransactionReceipt sendTransactionAndGetReceipt(java.lang.String to,
        -                                                       byte[] data,
        -                                                       int txAttribute)
        -                                                throws org.fisco.bcos.sdk.jni.common.JniException
        -
        从接口复制的说明: TransactionProcessorInterface
        -
        send transaction to fisco bcos node and get transaction receipt. this method use default - keyPair
        -
        -
        指定者:
        -
        sendTransactionAndGetReceipt 在接口中 TransactionProcessorInterface
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        transaction receipt
        -
        抛出:
        -
        org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAsync

        -
        public java.lang.String sendTransactionAsync(java.lang.String to,
        -                                             byte[] data,
        -                                             CryptoKeyPair cryptoKeyPair,
        -                                             int txAttribute,
        -                                             TransactionCallback callback)
        -
        从接口复制的说明: TransactionProcessorInterface
        -
        send transaction to fisco bcos node and get transaction receipt asynchronously.
        -
        -
        指定者:
        -
        sendTransactionAsync 在接口中 TransactionProcessorInterface
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        cryptoKeyPair - key pair
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        callback - define hook function
        -
        返回:
        -
        transaction hash
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAsync

        -
        public java.lang.String sendTransactionAsync(java.lang.String to,
        -                                             byte[] data,
        -                                             int txAttribute,
        -                                             TransactionCallback callback)
        -
        从接口复制的说明: TransactionProcessorInterface
        -
        send transaction to fisco bcos node and get transaction receipt asynchronously. this method - use default keyPair
        -
        -
        指定者:
        -
        sendTransactionAsync 在接口中 TransactionProcessorInterface
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        callback - define hook function
        -
        返回:
        -
        transaction hash
        -
        -
      • -
      - - - - - - - -
        -
      • -

        executeCall

        -
        public Call executeCall(java.lang.String from,
        -                        java.lang.String to,
        -                        byte[] encodedFunction)
        -
        从接口复制的说明: TransactionProcessorInterface
        -
        send encoded function call to fisco bcos node and receive call response.
        -
        -
        指定者:
        -
        executeCall 在接口中 TransactionProcessorInterface
        -
        参数:
        -
        from - outer account address of sender
        -
        to - target contract address
        -
        encodedFunction - signed transaction string
        -
        返回:
        -
        Call
        -
        -
      • -
      - - - -
        -
      • -

        createDeploySignedTransaction

        -
        public org.fisco.bcos.sdk.jni.utilities.tx.TxPair createDeploySignedTransaction(java.lang.String to,
        -                                                                                byte[] data,
        -                                                                                java.lang.String abi,
        -                                                                                CryptoKeyPair cryptoKeyPair,
        -                                                                                int txAttribute)
        -
        从接口复制的说明: TransactionProcessorInterface
        -
        create deploy signed transaction
        -
        -
        指定者:
        -
        createDeploySignedTransaction 在接口中 TransactionProcessorInterface
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        abi - ABI
        -
        cryptoKeyPair - key pair
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        hexed data of signed transaction
        -
        -
      • -
      - - - -
        -
      • -

        createSignedTransaction

        -
        public org.fisco.bcos.sdk.jni.utilities.tx.TxPair createSignedTransaction(java.lang.String to,
        -                                                                          byte[] data,
        -                                                                          CryptoKeyPair cryptoKeyPair,
        -                                                                          int txAttribute)
        -
        从接口复制的说明: TransactionProcessorInterface
        -
        create signed transaction
        -
        -
        指定者:
        -
        createSignedTransaction 在接口中 TransactionProcessorInterface
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        cryptoKeyPair - key pair
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        hexed data of signed transaction
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessorInterface.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessorInterface.html deleted file mode 100644 index 27d4d27f1..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessorInterface.html +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - -TransactionProcessorInterface (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.transaction.manager
-

接口 TransactionProcessorInterface

-
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      方法概要

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      所有方法 实例方法 抽象方法 
      限定符和类型方法和说明
      org.fisco.bcos.sdk.jni.utilities.tx.TxPaircreateDeploySignedTransaction(java.lang.String to, - byte[] data, - java.lang.String abi, - CryptoKeyPair cryptoKeyPair, - int txAttribute) -
      create deploy signed transaction
      -
      org.fisco.bcos.sdk.jni.utilities.tx.TxPaircreateSignedTransaction(java.lang.String to, - byte[] data, - CryptoKeyPair cryptoKeyPair, - int txAttribute) -
      create signed transaction
      -
      TransactionReceiptdeployAndGetReceipt(java.lang.String to, - byte[] data, - java.lang.String abi, - CryptoKeyPair cryptoKeyPair, - int txAttribute) -
      send deploy transaction to fisco bcos node and get transaction receipt.
      -
      TransactionReceiptdeployAndGetReceipt(java.lang.String to, - byte[] data, - java.lang.String abi, - int txAttribute) -
      send deploy transaction to fisco bcos node and get transaction receipt. this method use - default keyPair
      -
      CallexecuteCall(CallRequest callRequest) -
      send call to fisco bcos node and receive call response.
      -
      CallexecuteCall(java.lang.String from, - java.lang.String to, - byte[] encodedFunction) -
      send encoded function call to fisco bcos node and receive call response.
      -
      TransactionReceiptsendTransactionAndGetReceipt(java.lang.String to, - byte[] data, - CryptoKeyPair cryptoKeyPair, - int txAttribute) -
      send transaction to fisco bcos node and get transaction receipt.
      -
      TransactionReceiptsendTransactionAndGetReceipt(java.lang.String to, - byte[] data, - int txAttribute) -
      send transaction to fisco bcos node and get transaction receipt. this method use default - keyPair
      -
      java.lang.StringsendTransactionAsync(java.lang.String to, - byte[] data, - CryptoKeyPair cryptoKeyPair, - int txAttribute, - TransactionCallback callback) -
      send transaction to fisco bcos node and get transaction receipt asynchronously.
      -
      java.lang.StringsendTransactionAsync(java.lang.String to, - byte[] data, - int txAttribute, - TransactionCallback callback) -
      send transaction to fisco bcos node and get transaction receipt asynchronously. this method - use default keyPair
      -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        deployAndGetReceipt

        -
        TransactionReceipt deployAndGetReceipt(java.lang.String to,
        -                                       byte[] data,
        -                                       java.lang.String abi,
        -                                       CryptoKeyPair cryptoKeyPair,
        -                                       int txAttribute)
        -                                throws org.fisco.bcos.sdk.jni.common.JniException
        -
        send deploy transaction to fisco bcos node and get transaction receipt.
        -
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        abi - ABI json string, deploy into chain with code, can be empty string
        -
        cryptoKeyPair - key pair
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        transaction receipt
        -
        抛出:
        -
        org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
        -
        -
      • -
      - - - -
        -
      • -

        deployAndGetReceipt

        -
        TransactionReceipt deployAndGetReceipt(java.lang.String to,
        -                                       byte[] data,
        -                                       java.lang.String abi,
        -                                       int txAttribute)
        -                                throws org.fisco.bcos.sdk.jni.common.JniException
        -
        send deploy transaction to fisco bcos node and get transaction receipt. this method use - default keyPair
        -
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        abi - ABI json string, deploy into chain with code, can be empty string
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        transaction receipt
        -
        抛出:
        -
        org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAndGetReceipt

        -
        TransactionReceipt sendTransactionAndGetReceipt(java.lang.String to,
        -                                                byte[] data,
        -                                                CryptoKeyPair cryptoKeyPair,
        -                                                int txAttribute)
        -                                         throws org.fisco.bcos.sdk.jni.common.JniException
        -
        send transaction to fisco bcos node and get transaction receipt.
        -
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        cryptoKeyPair - key pair
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        transaction receipt
        -
        抛出:
        -
        org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAndGetReceipt

        -
        TransactionReceipt sendTransactionAndGetReceipt(java.lang.String to,
        -                                                byte[] data,
        -                                                int txAttribute)
        -                                         throws org.fisco.bcos.sdk.jni.common.JniException
        -
        send transaction to fisco bcos node and get transaction receipt. this method use default - keyPair
        -
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        transaction receipt
        -
        抛出:
        -
        org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAsync

        -
        java.lang.String sendTransactionAsync(java.lang.String to,
        -                                      byte[] data,
        -                                      CryptoKeyPair cryptoKeyPair,
        -                                      int txAttribute,
        -                                      TransactionCallback callback)
        -
        send transaction to fisco bcos node and get transaction receipt asynchronously.
        -
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        cryptoKeyPair - key pair
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        callback - define hook function
        -
        返回:
        -
        transaction hash
        -
        -
      • -
      - - - -
        -
      • -

        sendTransactionAsync

        -
        java.lang.String sendTransactionAsync(java.lang.String to,
        -                                      byte[] data,
        -                                      int txAttribute,
        -                                      TransactionCallback callback)
        -
        send transaction to fisco bcos node and get transaction receipt asynchronously. this method - use default keyPair
        -
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        callback - define hook function
        -
        返回:
        -
        transaction hash
        -
        -
      • -
      - - - -
        -
      • -

        executeCall

        -
        Call executeCall(CallRequest callRequest)
        -
        send call to fisco bcos node and receive call response.
        -
        -
        参数:
        -
        callRequest - signed transaction string
        -
        返回:
        -
        Call
        -
        -
      • -
      - - - -
        -
      • -

        executeCall

        -
        Call executeCall(java.lang.String from,
        -                 java.lang.String to,
        -                 byte[] encodedFunction)
        -
        send encoded function call to fisco bcos node and receive call response.
        -
        -
        参数:
        -
        from - outer account address of sender
        -
        to - target contract address
        -
        encodedFunction - signed transaction string
        -
        返回:
        -
        Call
        -
        -
      • -
      - - - -
        -
      • -

        createDeploySignedTransaction

        -
        org.fisco.bcos.sdk.jni.utilities.tx.TxPair createDeploySignedTransaction(java.lang.String to,
        -                                                                         byte[] data,
        -                                                                         java.lang.String abi,
        -                                                                         CryptoKeyPair cryptoKeyPair,
        -                                                                         int txAttribute)
        -                                                                  throws org.fisco.bcos.sdk.jni.common.JniException
        -
        create deploy signed transaction
        -
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        abi - ABI
        -
        cryptoKeyPair - key pair
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        hexed data of signed transaction
        -
        抛出:
        -
        org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
        -
        -
      • -
      - - - -
        -
      • -

        createSignedTransaction

        -
        org.fisco.bcos.sdk.jni.utilities.tx.TxPair createSignedTransaction(java.lang.String to,
        -                                                                   byte[] data,
        -                                                                   CryptoKeyPair cryptoKeyPair,
        -                                                                   int txAttribute)
        -                                                            throws org.fisco.bcos.sdk.jni.common.JniException
        -
        create signed transaction
        -
        -
        参数:
        -
        to - target contract address
        -
        data - ABI encoded transaction data
        -
        cryptoKeyPair - key pair
        -
        txAttribute - transaction attribute, see more in TransactionAttribute
        -
        返回:
        -
        hexed data of signed transaction
        -
        抛出:
        -
        org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-frame.html deleted file mode 100644 index 15f7b845f..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-frame.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.manager (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.manager

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-summary.html deleted file mode 100644 index d9417b394..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-summary.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.manager (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.manager

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-tree.html deleted file mode 100644 index 92fff2b71..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-tree.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.manager 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.manager的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-frame.html deleted file mode 100644 index bc2006d33..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model.bo (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.model.bo

-
-

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-summary.html deleted file mode 100644 index e55a17c11..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-summary.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model.bo (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.model.bo

-
-
-
    -
  • - - - - - - - - - - - - - - - - -
    类概要 
    说明
    AbiInfo 
    BinInfo 
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-tree.html deleted file mode 100644 index bc571da54..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-tree.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model.bo 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.model.bo的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • org.fisco.bcos.sdk.v3.transaction.model.bo.AbiInfo
    • -
    • org.fisco.bcos.sdk.v3.transaction.model.bo.BinInfo
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-frame.html deleted file mode 100644 index 614fc2dcb..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model.dto (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.model.dto

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-summary.html deleted file mode 100644 index 3939ebc4c..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-summary.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model.dto (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.model.dto

-
-
-
    -
  • - - - - - - - - - - - - - - - - - - - - - - - - -
    类概要 
    说明
    CallRequest -
    CallRequest @Description: CallRequest
    -
    CallResponse -
    CallResponse @Description: CallResponse
    -
    CommonResponse -
    CommonResponse @Description: CommonResponse
    -
    TransactionResponse -
    TransactionResponse @Description: TransactionResponse
    -
    -
  • -
  • - - - - - - - - - - - - -
    枚举概要 
    枚举说明
    ResultCodeEnum -
    ResultCodeEnum @Description: ResultCodeEnum
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-tree.html deleted file mode 100644 index cbaa383bd..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-tree.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model.dto 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.model.dto的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

枚举分层结构

-
    -
  • java.lang.Object -
      -
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) - -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-frame.html deleted file mode 100644 index 45d15bbc0..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-frame.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model.exception (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.model.exception

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-summary.html deleted file mode 100644 index 0cb23f8f5..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-summary.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model.exception (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.model.exception

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-tree.html deleted file mode 100644 index 2b8fed466..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-tree.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model.exception 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.model.exception的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-frame.html deleted file mode 100644 index e08eab9b3..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.model

-
-

- -
- - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-summary.html deleted file mode 100644 index 10640d62a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-summary.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.model

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-tree.html deleted file mode 100644 index 91e8eac3d..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-tree.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.model 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.model的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object - -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-frame.html deleted file mode 100644 index d7c9307d8..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.pusher (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.pusher

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-summary.html deleted file mode 100644 index cdc802573..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-summary.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.pusher (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.pusher

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-tree.html deleted file mode 100644 index a0780758b..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-tree.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.pusher 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.pusher的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerInterface.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerInterface.html deleted file mode 100644 index a3d7546e3..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerInterface.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - -TransactionSignerInterface (java-sdk 3.0.0 API) - - - - - - - - - - - -
-
org.fisco.bcos.sdk.v3.transaction.signer
-

接口 TransactionSignerInterface

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      方法详细资料

      - - - -
        -
      • -

        sign

        -
        SignatureResult sign(java.lang.String hash,
        -                     CryptoKeyPair cryptoKeyPair)
        -
        sign raw transaction hash string and get signatrue result
        -
        -
        参数:
        -
        hash - raw transaction hash string to be signed
        -
        cryptoKeyPair - keypair
        -
        返回:
        -
        signature result
        -
        -
      • -
      - - - -
        -
      • -

        sign

        -
        SignatureResult sign(byte[] hash,
        -                     CryptoKeyPair cryptoKeyPair)
        -
        sign raw transaction hash byte array and get signatrue result
        -
        -
        参数:
        -
        hash - raw transaction hash byte array to be signed
        -
        cryptoKeyPair - keypair
        -
        返回:
        -
        signature result
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-frame.html deleted file mode 100644 index bc8c23d02..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-frame.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.signer (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.signer

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-summary.html deleted file mode 100644 index 7833c7bf5..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-summary.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.signer (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.signer

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-tree.html deleted file mode 100644 index 336b85548..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-tree.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.signer 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.signer的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-frame.html deleted file mode 100644 index a85aa5bb3..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.tools (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.transaction.tools

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-summary.html deleted file mode 100644 index a1566d99e..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.tools (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.transaction.tools

-
-
-
    -
  • - - - - - - - - - - - - - - - - -
    类概要 
    说明
    ContractLoader -
    ContractLoader @Description: ContractLoader
    -
    JsonUtils -
    a useful toolkit of json based on Jackson.
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-tree.html deleted file mode 100644 index 17c082c0c..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-tree.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.transaction.tools 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.transaction.tools的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object - -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-frame.html deleted file mode 100644 index d532783d2..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.utils.exceptions (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.utils.exceptions

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-summary.html deleted file mode 100644 index 26260e887..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-summary.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.utils.exceptions (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.utils.exceptions

-
-
-
    -
  • - - - - - - - - - - - - - - - - - - - - - - - - -
    异常错误概要 
    异常错误说明
    DecoderException -
    Exception thrown if an attempt is made to decode invalid data, or some other failure occurs.
    -
    EncoderException -
    Exception thrown if an attempt is made to encode invalid data, or some other failure occurs.
    -
    MessageDecodingException -
    Encoding exception.
    -
    MessageEncodingException -
    Encoding exception.
    -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-tree.html deleted file mode 100644 index d9c92fc04..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-tree.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.utils.exceptions 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.utils.exceptions的分层结构

-程序包分层结构: - -
-
-

类分层结构

-
    -
  • java.lang.Object -
      -
    • java.lang.Throwable (implements java.io.Serializable) - -
    • -
    -
  • -
-
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-frame.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-frame.html deleted file mode 100644 index 227defaa6..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-frame.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.utils (java-sdk 3.0.0 API) - - - - -

org.fisco.bcos.sdk.v3.utils

- - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-summary.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-summary.html deleted file mode 100644 index 1bc30e72a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-summary.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.utils (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包 org.fisco.bcos.sdk.v3.utils

-
-
- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-tree.html b/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-tree.html deleted file mode 100644 index 4c3bd284f..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-tree.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - -org.fisco.bcos.sdk.v3.utils 类分层结构 (java-sdk 3.0.0 API) - - - - - - - - - - -
-

程序包org.fisco.bcos.sdk.v3.utils的分层结构

-程序包分层结构: - -
-
-

类分层结构

- -

接口分层结构

- -
- - - - - - diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/quick_start.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/quick_start.md deleted file mode 100644 index b89ce810c..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/quick_start.md +++ /dev/null @@ -1,423 +0,0 @@ -# 快速入门 - -标签:``java-sdk`` ``引入Java SDK`` - ----- - -## 1. 安装环境 - -- Java推荐:JDK 11 (JDK8 至 JDK 14 都支持) - - 首先,在官网上下载JDK11并安装 - -- IDE:IntelliJ IDE. - - 进入[IntelliJ IDE官网](https://www.jetbrains.com/idea/download/),下载并安装社区版IntelliJ IDE - -## 2. 搭建一条FISCO BCOS链 - -请参考[搭建第一个区块链网络](../../../quick_start/air_installation.html#airfisco-bcos)搭建。 - -## 3. 开发智能合约应用 - -### 第一步. 创建一个Gradle应用 - -在IntelliJ IDE中创建一个gradle项目。勾选Gradle和Java - -### 第二步. 引入Java SDK - -在build.gradle中引入Java SDK - -```gradle -compile ('org.fisco-bcos.java-sdk:fisco-bcos-java-sdk:3.1.0') -``` - -如果您使用maven 通过以下方法引入Java SDK - -``` xml - - org.fisco-bcos.java-sdk - fisco-bcos-java-sdk - 3.1.0 - -``` - -### 第三步. 配置SDK证书 - -参考[SDK连接证书配置](../cert_config.md) 进行配置即可,Java SDK证书配置项细则参考[Java SDK证书配置](./config.html#id5)。 - -将SDK证书拷贝到Java SDK的示例如下(这里假设SDK证书位于`~/fisco/nodes/127.0.0.1/sdk`目录): - -```shell -# 假设SDK证书位于~/fisco/nodes/127.0.0.1/sdk/目录 -mkdir -p conf && cp -r ~/fisco/nodes/127.0.0.1/sdk/* conf -``` - -### 第四步. 准备智能合约 - -控制台`console`和``java-sdk-demo``均提供了工具,可以将`solidity`合约生成出调用该合约`java`工具类。本例中使用``console``做为例子,使用``java-sdk-demo``的例子请看第6章“附录一. 使用``java-sdk-demo``给智能合约生成调用它的Java工具类” - -#### 1. 下载控制台 - -```shell -$ mkdir -p ~/fisco && cd ~/fisco -# 获取控制台 -$ curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v3.2.0/download_console.sh - -# 若因为网络问题导致长时间无法执行以上命令,请尝试以下命令: -$ curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master/tools/download_console.sh - -$ bash download_console.sh -$ cd ~/fisco/console -``` - -**然后,将您要用到的Solidity智能合约放入``~/fisco/console/contracts/solidity``的目录**。本次我们用console中的HelloWorld.sol作为例子。保证HelloWorld.sol在指定的目录下。 - -```shell -# 当前目录~/fisco/console -$ ls contracts/solidity -``` - -得到返回 - -```shell -HelloWorld.sol KVTableTest.sol ShaTest.sol KVTable.sol -``` - -**特别的: 如果你想体验 webankblockchain-liquid(以下简称WBC-Liquid)的部署操作,控制台也为你提供了例子。** - -在使用之前,请先保证cargo liquid的编译环境,使用搭建请参考:https://liquid-doc.readthedocs.io/。 - -可在控制台dist目录下contracts/liquid下查看,下面以hello_world为例子: - -```shell -$ ls contracts/liquid -asset_test hello_world kv_table_test - -$ cd contracts/liquid/hello_world - -# 使用cargo liquid 编译 -$ cargo liquid build -[1/4] 🔍 Collecting crate metadata -[2/4] 🚚 Building cargo project -[3/4] 🔗 Optimizing Wasm bytecode -[4/4] 📃 Generating ABI file - -✨ Done in 1 minute, your project is ready now: -Binary: ~/fisco/contracts/liquid/hello_world/target/hello_world.wasm - ABI: ~/fisco/console/dist/contracts/liquid/hello_world/target/hello_world.abi -``` - -生成`hello_world.wasm`和`hello_world.abi`两个文件 - -#### 2. 生成调用该智能合约的java类 - -```shell -# 当前目录~/fisco/console -$ bash contract2java.sh solidity -p org.com.fisco -# 以上命令中参数“org.com.fisco”是指定产生的java类所属的包名。 -# 通过命令./contract2java.sh -h可查看该脚本使用方法 -``` - -得到返回 - -```shell - -*** Compile solidity KVTableTest.sol*** -INFO: Compile for solidity KVTableTest.sol success. -*** Convert solidity to java for KVTableTest.sol success *** - -*** Compile solidity HelloWorld.sol*** -INFO: Compile for solidity HelloWorld.sol success. -*** Convert solidity to java for HelloWorld.sol success *** - -*** Compile solidity KVTable.sol*** -INFO: Compile for solidity Table.sol success. -*** Convert solidity to java for Table.sol success *** - -*** Compile solidity ShaTest.sol*** -INFO: Compile for solidity ShaTest.sol success. -*** Convert solidity to java for ShaTest.sol success *** -``` - -`contract2java.sh`使用方法将在附录2中详细介绍。 - -查看编译结果 - -```shell -$ ls contracts/sdk/java/org/com/fisco -# 得到返回 -# HelloWorld.java KVTableTest.java ShaTest.java KVTable.java TableTest.java -``` - -**特别的,如果你想使用WBC-Liquid合约编译后的wasm二进制和abi文件生成Java合约** - -```shell -# 当前目录~/fisco/console -$ bash contract2java.sh liquid -b ./contracts/liquid/hello_world/hello_world.wasm -a ./contracts/liquid/hello_world/hello_world.abi -s ./contracts/liquid/hello_world/hello_world_sm.wasm -p org.com.fisco -# 通过命令./contract2java.sh -h可查看该脚本使用方法 - -$ ls contracts/sdk/java/org/com/fisco -# 得到返回 -# HelloWorld.java -``` - -**最后, 将编译得到的HelloWorld.java放入应用中。** - -### 第五步. 创建配置文件 - -在项目中创建配置文件``config.toml``, 可参照[配置向导](./config.html)进行配置,也可以参照[``config-example.toml``](https://github.com/FISCO-BCOS/java-sdk/blob/master/src/test/resources/config-example.toml) - -通过``xml``配置请参照第4章“附录三. 使用xml配置进行配置”。 - -### 第六步. 使用Java SDK部署和调用智能合约 - -以使用Java SDK调用群组1的`getBlockNumber`接口获取群组1最新块高,并向群组1部署和调用`HelloWorld`合约为例,对应的示例代码如下: - -```java -public class BcosSDKTest -{ - // 获取配置文件路径 - public final String configFile = BcosSDKTest.class.getClassLoader().getResource("config-example.toml").getPath(); - public void testClient() throws ConfigException { - // 初始化BcosSDK - BcosSDK sdk = BcosSDK.build(configFile); - // 为群组group初始化client - Client client = sdk.getClient("group0"); - - // 获取群组1的块高 - BlockNumber blockNumber = client.getBlockNumber(); - - // 向群组1部署HelloWorld合约 - CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair(); - HelloWorld helloWorld = HelloWorld.deploy(client, cryptoKeyPair); - - // 调用HelloWorld合约的get接口 - String getValue = helloWorld.get(); - - // 调用HelloWorld合约的set接口 - TransactionReceipt receipt = helloWorld.set("Hello, fisco"); - } -} -``` - -## 4. 附录 - -### 附录一. 使用``java-sdk-demo``给智能合约生成调用它的Java工具类 - -```shell -$ mkdir -p ~/fisco && cd ~/fisco -# 获取java-sdk代码 -$ git clone https://github.com/FISCO-BCOS/java-sdk-demo - -# 若因为网络问题导致长时间无法执行以上命令,请尝试以下命令: -$ git clone https://gitee.com/FISCO-BCOS/java-sdk-demo - -$ cd java-sdk-demo -# 编译 -$ ./gradlew clean build -x test -# 进入sdk-demo/dist目录,创建合约存放目录 -$ cd dist && mkdir -p contracts/solidity -# 将需要转换为java代码的sol文件拷贝到~/fisco/java-sdk/dist/contracts/solidity路径下 -# 转换sol, 其中${packageName}是生成的java代码包路径 -# 生成的java代码位于 ~/fisco/java-sdk/dist/contracts/sdk/java目录下 -java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.codegen.DemoSolcToJava ${packageName} -``` - -### 附录二. ``contract2java.sh``脚本的使用方法 - -控制台提供一个专门的生成Java合约工具,方便开发者将Solidity和WBC-Liquid合约文件编译为Java合约文件。 - -当前合约生成工具支持Solidity的自动编译并生成Java文件、支持指定WBC-Liquid编译后的WASM文件以及ABI文件生成Java文件。 - -**Solidity合约使用** - -```shell -$ bash contract2java.sh solidity -h -usage: contract2java.sh [OPTIONS...] - -h,--help - -l,--libraries [Optional] Set library address information built - into the solidity contract - eg: - --libraries lib1:lib1_address lib2:lib2_address - -o,--output [Optional] The file path of the generated java - code, default is contracts/sdk/java/ - -p,--package [Optional] The package name of the generated java - code, default is com - -s,--sol [Optional] The solidity file path or the solidity - directory path, default is contracts/solidity/ -``` - -参数详细: - -- `package`: 生成`Java`文件的包名。 -- `sol`: (可选)`solidity`文件的路径,支持文件路径和目录路径两种方式,参数为目录时将目录下所有的`solidity`文件进行编译转换。默认目录为`contracts/solidity`。 -- `output`: (可选)生成`Java`文件的目录,默认生成在`contracts/sdk/java`目录。 - -**WBC-Liquid合约使用** - -```shell -$ bash contract2java.sh liquid -h -usage: contract2java.sh [OPTIONS...] - -a,--abi [Required] The ABI file path of WBC-Liquid contract. - -b,--bin [Required] The binary file path of WBC-Liquid contract. - -h,--help - -o,--output [Optional] The file path of the generated java code, - default is contracts/sdk/java/ - -p,--package [Optional] The package name of the generated java - code, default is com - -s,--sm-bin [Required] The SM binary file path of WBC-Liquid - contract. -``` - -参数详细: - -- `abi `:(必选)WBC-Liquid合约`ABI`文件的路径,在使用`cargo liquid build`命令之后生成在target文件夹中。 -- `bin`:(必选)WBC-Liquid合约`wasm bin`文件的路径,在使用`cargo liquid build`命令之后生成在target文件夹中。 -- `package`:(可选)生成`Java`文件的包名,默认为`org`。 -- `sm-bin`:(必选)WBC-Liquid合约`wasm sm bin`文件的路径,在使用`cargo liquid build -g`命令之后生成在target文件夹中。 - -**使用** - -```shell -$ cd ~/fisco/console - -# 生成Solidity合约的Java代码 -$ bash contract2java.sh solidity -p org.com.fisco - -# 生成WBC-Liquid合约的Java代码 -$ bash contract2java.sh liquid -p org.com.fisco -b ./contracts/liquid/asset_test/asset_test.wasm -a ./contracts/liquid/asset_test/asset_test.abi -s ./contracts/liquid/asset_test/asset_test_sm.wasm -``` - -运行成功之后,将会在`console/contracts/sdk`目录生成java、abi和bin目录,如下所示。 - -```shell -|-- abi # 编译生成的abi目录,存放solidity合约编译的abi文件 -| |-- HelloWorld.abi -| |-- KVTable.abi -| |-- KVTableTest.abi -|-- bin # 编译生成的bin目录,存放solidity合约编译的bin文件 -| |-- HelloWorld.bin -| |-- KVTable.bin -| |-- KVTableTest.bin -|-- java # 存放编译的包路径及Java合约文件 -| |-- org -| |-- com -| |-- fisco -| |-- HelloWorld.java # Solidity编译的HelloWorld Java文件 -| |-- KVTable.java # Solidity编译的KV存储接口合约 Java文件 -| |-- KVTableTest.java # Solidity编译的KVTableTest Java文件 -| |-- AssetTest.java # WBC-Liquid生成的AssetTest文件 -``` - -Java目录下生成了`org/com/fisco/`包路径目录。包路径目录下将会生成Java合约文件`HelloWorld.java`、`KVTableTest.java`、`KVTable.java`和`AssetTest.java`。其中`HelloWorld.java`、`KVTableTest.java`和`AssetTest.java`是Java应用所需要的Java合约文件。 - -### 附录三. 使用xml配置进行配置 - -为了适配更多场景,Java SDK支持使用`xml`初始化`BcosSDK`, `xml`配置示例请参考Java SDK源码的[`applicationContext-sample.xml`](https://github.com/FISCO-BCOS/java-sdk/blob/master/src/test/resources/applicationContext-sample.xml), 配置项的含义参考[配置说明](./config.md). - -通过`xml`配置文件初始化`BcosSDK`之前,需要先引入`spring`。 - -**通过gradle引入`spring`如下**: - -```shell -def spring_version = "4.3.27.RELEASE" -List spring = [ - "org.springframework:spring-core:$spring_version", - "org.springframework:spring-beans:$spring_version", - "org.springframework:spring-context:$spring_version", - "org.springframework:spring-tx:$spring_version", -] -compile spring -``` - -**通过maven引入`spring`如下**: - -```xml - - org.springframework - spring-core - 4.3.27.RELEASE - - org.springframework - spring-beans - 4.3.27.RELEASE - - org.springframework - spring-context - 4.3.27.RELEASE - - org.springframework - spring-tx - 4.3.27.RELEASE - -``` - -**使用`applicationContext-sample`初始化`BcosSDK`如下**: - -```java -ApplicationContext context = - new ClassPathXmlApplicationContext("classpath:applicationContext-sample.xml"); -BcosSDK sdk = context.getBean(BcosSDK.class); -``` - -### 附录四. 使用`ConfigOption`初始化`BcosSDK` - -Java SDK提供了灵活的`BcosSDK`初始化方式,应用除了直接通过`toml`和`xml`直接初始化`BcosSDK`外,还可通过`ConfigProperty`对象加载`ConfigOption`,并使用`ConfigOption`初始化`BcosSDK`。 - -`ConfigProperty`维护了`key, value`类型配置映射,其核心的数据结构如下: - -```java -public class ConfigProperty { - // 证书配置选项,目前主要包括以下几个配置项: - // certPath: 证书路径 - // caCert: CA证书路径 - // sslCert: SDK证书 - // sslKey: SDK私钥 - // enSslCert: 国密SSL的SDK证书 - // enSslKey: 国密SSL的SDK私钥 - public Map cryptoMaterial; - - // SDK到节点的网络配置选项,目前包含以下配置选项: - // peers: 配置SDK连接的节点列表 - public Map network; - - // AMOP配置选项,目前包括以下配置项: - // topicName: 订阅的AMOP topic - // publicKeys: 私有AMOP topic中,定义允许接收本客户端消息的其他客户端的公钥列表,用于进行topic认证 - // privateKey: 私有AMOP topic中,定义本客户端的私钥,用于进行topic认证 - // password: 若客户端私钥是p12文件,此配置项定义私钥文件的加载密码 - public List amop; - - // 账户配置项,目前包括以下配置项: - // keyStoreDir: 账户私钥保存路径,默认为account - // accountFilePath: 从配置文件中加载的账户路劲 - // accountFileFormat: 账户格式,目前支持pem和p12 - // accountAddress: 加载的账户地址 - // password: 加载p12类型账户私钥时,定义访问账户私钥的口令 - public Map account; - - // 线程池配置项,目前主要包括以下配置项: - // threadPoolSize: 处理RPC消息包的线程数目,默认为CPU核心线程数目 - public Map threadPool; -} -``` - -应用可根据实际情况初始化`ConfigProperty`,`ConfigProperty`初始化完毕后,可加载产生`ConfigOption`,示例代码如下: - -```java -// 从ConfigProperty加载ConfigOption -public ConfigOption loadConfigOption(ConfigProperty configProperty)throws ConfigException -{ - return new ConfigOption(configProperty); -} -``` - -初始化`ConfigOption`后,可通过`ConfigOption`创建`BcosSDK`,示例代码如下: - -```java -public BcosSDK createBcosSDK(ConfigOption configOption)throws BcosSDKException -{ - return new BcosSDK(configOption); -} -``` diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/remote_sign_assemble_transaction.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/remote_sign_assemble_transaction.md deleted file mode 100644 index 98fe5f0c6..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/remote_sign_assemble_transaction.md +++ /dev/null @@ -1,398 +0,0 @@ -# 集成外部签名服务调用合约 - -标签:``java-sdk`` ``发送交易`` ``外部签名`` ``组装交易`` ``合约调用`` - ----- - -[AssembleTransactionProcessor](./assemble_transaction.md)已经支持和覆盖了常见的合约操作接口。但是在真实的业务场景中,对于某些特定的业务场景,需要调用硬件加密机或远程签名服务对该哈希进行签名。为此,我们在AssembleTransactionProcessor的基础上进一步提供了AssembleTransactionWithRemoteSignProcessor,来便于用户集成自定义签名服务。 - -## 1. 概念解析:部署和调用 - -部署、调用(交易和查询)的相关概念可参考[概念解析:部署和调用](./assemble_transaction.html#id1) - -## 2. 快速上手 - -SDK支持同步和异步方式来调用合约。在快速上手环节,首先展示使用同步方式来调用合约。 - -### 2.1 准备abi和binary文件 - -控制台提供一个专门的编译合约工具,方便开发者将Solidity/webankblockchain-liquid(简称WBC-Liquid)合约文件编译生成Java文件和abi、binary文件,具体使用方式[参考这里](../../console/console_config.html#java) - -通过运行contract2java 脚本,生成的abi和binary文件分别位于contracts/sdk/abi、contracts/sdk/bin目录下(其中,国密版本编译产生的文件位于contracts/sdk/abi/sm和contracts/sdk/bin/sm文件夹下)。可将文件复制到项目的目录下,例如src/main/resources/abi和src/main/resources/bin。 - -为了便于演示,我们使用了以下HelloWorld的Solidity合约。 - -```solidity -pragma solidity ^0.6.0; - -contract HelloWorld{ - string public name; - constructor() public{ - name = "Hello, World!"; - } - - function set(string memory n) public{ - name = n; - } -} -``` - -**编译合约,生成abi和binary:** - -```shell -# 切换到控制台所在目录 -$ cd ~/fisco/console - -# 调用sol2java.sh脚本,编译contracts/solidity/目录下的HelloWorld合约: -$ bash contract2java.sh solidity -p org -s contracts/solidity/HelloWorld.sol - -# 生成的abi位于contracts/sdk/abi/HelloWorld.abi路径 -$ ls contracts/sdk/abi/HelloWorld.abi - -# 生成的非国密版本的bin位于contracts/sdk/bin/HelloWorld.bin路径 -$ ls contracts/sdk/bin/HelloWorld.bin - -# 生成的国密版本bin位于contracts/sdk/bin/sm/HelloWorld.bin路径 -$ ls contracts/sdk/bin/sm/HelloWorld.bin -``` - -至此`HelloWorld`合约的abi和binary文件均已生成 - -### 2.2 初始化SDK - -基于配置文件,初始化SDK,如: - -```java -// 初始化BcosSDK对象 -BcosSDK sdk = new BcosSDK(configFile); -// 获取Client对象,此处传入的群组名为 group -Client client = sdk.getClient("group0"); -// 构造AssembleTransactionProcessor对象,需要传入client对象,CryptoKeyPair对象和abi、binary文件存放的路径。abi和binary文件需要在上一步复制到定义的文件夹中。 -CryptoKeyPair keyPair = client.getCryptoSuite().getCryptoKeyPair(); -``` - -### 2.3 初始化配置对象 - -#### 2.3.1 自定义外部签名服务 - -外部签名的服务需要实现`RemoteSignProviderInterface`接口。 - -``` java -public interface RemoteSignProviderInterface { - // 同步签名接口 - public SignatureResult requestForSign(byte[] dataToSign, int cryptoType); - - // 异步签名接口 - public void requestForSignAsync( - byte[] dataToSign, int cryptoType, RemoteSignCallbackInterface callback); -} -``` - -用户可按需实现`requestForSign和requestForSignAsync`接口,实现调用外部签名服务,同步或异步返回结果的逻辑。具体的业务逻辑视业务场景自主封装,可以是调用硬件加签机服务,也可以是调用外部托管的签名服务。当异步签名接口结果返回后,会自动回调`RemoteSignCallbackInterface`中定义的`handleSignedTransaction`接口。该接口定义如下: - -```java -public interface RemoteSignCallbackInterface { - /** - * receive the signature,and execute the callback function later. - * - * @param signature - * @return result code - */ - public int handleSignedTransaction(SignatureResult signature); -} -``` - -为了便于演示,我们创建一个外部签名服务的Mock类(代码位置`src/integration-test/java/org/fisco/bcos/sdk/transaction/mock/RemoteSignProviderMock` ),该类模拟实现了`RemoteSignProviderInterface`的同步签名接口`requestForSign`和异步签名接口`requestForSignAsync`。 - -#### 2.3.2 部署、交易和查询 - -Java SDK提供了基于abi和binary文件来直接部署和调用合约的方式。本场景下适用于默认的情况,通过创建和使用`AssembleTransactionWithRemoteSignProcessor`对象来完成合约相关的部署、调用和查询等操作。此处, 假设我们创建了一个外部签名的Mock类 `RemoteSignProviderMock`。 - -```java - // remoteSignProviderMock 对象需实现RemoteSignCallbackInterface 接口 - AssembleTransactionWithRemoteSignProcessor assembleTransactionWithRemoteSignProcessor = - TransactionProcessorFactory.createAssembleTransactionWithRemoteSignProcessor( - client, cryptoKeyPair, "src/main/resources/abi/", "src/main/resources/bin/", remoteSignProviderMock); -``` - -#### 2.3.3 仅交易和查询 - -假如只交易和查询,而不部署合约,那么就不需要复制binary文件,且在构造时无需传入binary文件的路径,例如binary路径参数可传入空字符串。 - -```java - // remoteSignProviderMock 对象需实现RemoteSignCallbackInterface 接口 - AssembleTransactionWithRemoteSignProcessor assembleTransactionWithRemoteSignProcessor = - TransactionProcessorFactory.createAssembleTransactionWithRemoteSignProcessor( - client, cryptoKeyPair, "src/main/resources/abi/", "", remoteSignProviderMock); -``` - -### 2.4 发送操作指令 - -完成初始化SDK和配置对象后,可以发起合约操作指令。 - -#### 2.4.1 同步方式部署合约 - -部署合约调用了`deployByContractLoader`方法,传入合约名和构造函数的参数,上链部署合约,并获得`TransactionResponse`的结果。 - -```java - // 部署HelloWorld合约。第一个参数为合约名称,第二个参数为合约构造函数的列表,是List类型。 - TransactionResponse response = - assembleTransactionWithRemoteSignProcessor.deployByContractLoader( - "HelloWorld", new ArrayList<>()); -``` - -`TransactionResponse`的数据结构如下: - -- returnCode: 返回的响应码。其中0为成功。 -- returnMessages: 返回的错误信息。 -- TransactionReceipt:上链返回的交易回执。 -- ContractAddress: 部署或调用的合约地址。 -- values: 如果调用的函数存在返回值,则返回解析后的交易返回值,返回Json格式的字符串。 -- events: 如果有触发日志记录,则返回解析后的日志返回值,返回Json格式的字符串。 -- receiptMessages: 返回解析后的交易回执信息。 - -例如,部署`HelloWorld`合约的返回结果: - -```json -{ - "returnCode": 0, - "returnMessage": "Success", - "transactionReceipt": { - "transactionHash": "0xcfdfb78be52b232afdee717826f9516af98fb2d67ee743da4b78e8c22172112b", - "transactionIndex": "0x0", - "root": "0xf6503b5f1a319dbd2c938d7e371b89441c238271bbaabf3d650112017158a658", - "blockNumber": "0x14b", - "blockHash": "0x817e0aaaba5448a6ac62fc2531be793cf6de9fed70c73ed8837082b7fcf74881", - "from": "0xcaa405b5dd47e7f28e6b862c198c15e923000c0b", - "to": "0x0000000000000000000000000000000000000000", - "gasUsed": "0x44683", - "contractAddress": "0x9dbaf42da05a0148d2ca9905870a91085c23ce71", - "logs": [], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "status": "0x0", - "input": "0x608060405234801561001057600080fd5b506040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061005c929190610062565b50610107565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b61010491905b808211156101005760008160009055506001016100e8565b5090565b90565b6102d3806101166000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633590b49f14610051578063b11b6883146100ba575b600080fd5b34801561005d57600080fd5b506100b8600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061014a565b005b3480156100c657600080fd5b506100cf610164565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010f5780820151818401526020810190506100f4565b50505050905090810190601f16801561013c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b8060009080519060200190610160929190610202565b5050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101fa5780601f106101cf576101008083540402835291602001916101fa565b820191906000526020600020905b8154815290600101906020018083116101dd57829003601f168201915b505050505081565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024357805160ff1916838001178555610271565b82800160010185558215610271579182015b82811115610270578251825591602001919060010190610255565b5b50905061027e9190610282565b5090565b6102a491905b808211156102a0576000816000905550600101610288565b5090565b905600a165627a7a723058209072782fc019ac745aa91b6fede6c358df1b03584b1bf5193a8c66d68a6880f30029", - "output": "0x", - "txProof": null, - "receiptProof": null, - "message": null, - "statusOK": true - }, - "contractAddress": "0x9dbaf42da05a0148d2ca9905870a91085c23ce71", - "values": null, - "events": "{}", - "receiptMessages": "Success" -} -``` - -#### 2.4.2 同步方式发送交易 - -调用合约交易使用了`sendTransactionAndGetResponseByContractLoader`来调用合约交易,此处展示了如何调用`HelloWorld`中的`set`函数。 - -```java - // 创建调用交易函数的参数,此处为传入一个参数 - List params = Lists.newArrayList("test"); - // 调用HelloWorld合约,合约地址为helloWorldAddress, 调用函数名为『set』,函数参数类型为params - TransactionResponse transactionResponse = - assembleTransactionWithRemoteSignProcessor.sendTransactionAndGetResponse( - helloWorldAddrss, abi, "set", params); -``` - -例如,调用`HelloWorld`合约的返回如下: - -```json -{ - "returnCode": 0, - "returnMessage": "Success", - "transactionReceipt": { - "transactionHash": "0x46b510dfff02c327432362db76555c75211aab17b3b75221137132123773fe8f", - "transactionIndex": "0x0", - "root": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x156", - "blockHash": "0x2d1ef0246bc0484e0fecd2a0b6671c19b69c86ac9e464b162ff4a932908151a0", - "from": "0x77a5933b5af032a313fde655d8290c134aeeb0d5", - "to": "0x975810f096e8d8b2daa9ee399f5ce809c0a12f1b", - "gasUsed": "0x6032", - "contractAddress": "0x0000000000000000000000000000000000000000", - "logs": [], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "status": "0x0", - "input": "0x4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000", - "output": "0x", - "txProof": null, - "receiptProof": null, - "message": null, - "statusOK": true - }, - "contractAddress": "0x0000000000000000000000000000000000000000", - "values": "[]", - "events": "{}", - "receiptMessages": "Success" -} -``` - -#### 2.4.3 调用合约查询接口 - -查询合约直接通过调用链上的节点查询函数即可返回结果,无需共识;因此所有的查询交易都是同步的。查询合约使用了`sendCallByContractLoader`函数来查询合约,此处展示了如何调用`HelloWorld`中的`name`函数来进行查询。 - -```java - // 查询HelloWorld合约的『name』函数,合约地址为helloWorldAddress,参数为空 - CallResponse callResponse1 = - assembleTransactionWithRemoteSignProcessor.sendCallByContractLoader( - "HelloWorld", helloWorldAddrss, "name", new ArrayList<>()); -``` - -查询函数返回如下: - -```json -{ - "returnCode": 0, - "returnMessage": "Success", - "values": "[\"test\"]" -} -``` - -## 3. 更多操作接口 - -在调用外部签名服务的时候,可通过同步或异步的方式。异步调用可采用callback或CompletableFuture等方式。 - -### 3.1 采用callback的方式异步操作合约 - -#### 3.1.1 定义回调类 - -异步调用外部签名服务的时候,可以自定义回调类,实现和重写回调处理函数。 - -自定义的回调类需要继承抽象类`RemoteSignCallbackInterface`, 实现`handleSignedTransaction`方法。 - -例如,我们定义一个简单的回调类。该回调类实现了异步回调发送交易到节点的效果。 - -```java -public class RemoteSignCallbackMock implements RemoteSignCallbackInterface { - - AssembleTransactionWithRemoteSignProcessor assembleTransactionWithRemoteSignProcessor; - RawTransaction rawTransaction; - - public RemoteSignCallbackMock( - AssembleTransactionWithRemoteSignProcessor assembleTransactionWithRemoteSignProcessor, - RawTransaction rawTransaction) { - this.assembleTransactionWithRemoteSignProcessor = - assembleTransactionWithRemoteSignProcessor; - this.rawTransaction = rawTransaction; - } - - /** - * 签名结果回调的实现 - * - * @param signatureStr 签名服务回调返回的签名结果串 - * @return * - */ - @Override - public int handleSignedTransaction(String signatureStr) { - System.out.println(System.currentTimeMillis() + " SignatureResult: " + signatureStr); - // 完成了交易签名后,将其发送出去 - TransactionReceipt tr = - assembleTransactionWithRemoteSignProcessor.signAndPush( - rawTransaction, signatureStr); - return 0; - } -} - -``` - -#### 3.1.2 采用callback的方式异步部署合约 - -首先,创建一个回调类的实例。然后使用`deployAsync`方法异步部署合约。 - -```java - // 创建 RawTransaction - RawTransaction rawTransaction = - assembleTransactionWithRemoteSignProcessor.getDeployedRawTransaction( - abi, bin, new ArrayList<>()); - // 创建回调实例 - RemoteSignCallbackMock callbackMock = - new RemoteSignCallbackMock( - assembleTransactionWithRemoteSignProcessor, rawTransaction); - // 异步部署合约 - assembleTransactionWithRemoteSignProcessor.deployAsync(rawTransaction, callbackMock); -``` - -#### 3.1.3 采用callback的方式调用交易 - -参考部署合约交易,可采用异步的方式发送交易。 - -```java - // 创建 RawTransaction - RawTransaction sendTxRawTransaction = - assembleTransactionWithRemoteSignProcessor.getRawTransaction( - helloWorldAddrss, abi, "set", params); - // 创建回调实例 - RemoteSignCallbackMock callbackMock2 = - new RemoteSignCallbackMock( - assembleTransactionWithRemoteSignProcessor, sendTxRawTransaction); - // 发送异步回调交易 - assembleTransactionWithRemoteSignProcessor.sendTransactionAsync( - helloWorldAddrss, abi, "set", params, callbackMock2); -``` - -### 3.2 采用CompletableFuture的方式异步操作合约 - -#### 3.2.1 采用CompletableFuture的方式部署合约 - -SDK还支持使用CompletableFuture封装的方式异步部署合约。 - -```java - // 异步部署交易,并获得CompletableFuture 对象 - CompletableFuture future = - assembleTransactionWithRemoteSignProcessor.deployAsync(abi, bin, new ArrayList<>()); - // 定义正常返回的业务逻辑 - future.thenAccept( - tr -> { - doSomething(tr); - }); - // 定义异常返回的业务逻辑 - future.exceptionally( - e -> { - doSomething(e); - return null; - }); -``` - -#### 3.2.2 采用CompletableFuture的方式发送交易 - -同部署合约。 - -```java - // 异步部署交易,并获得CompletableFuture 对象 - CompletableFuture future2 = - assembleTransactionWithRemoteSignProcessor.sendTransactionAsync( - helloWorldAddrss, abi, "set", params); - // 定义正常返回的业务逻辑 - future.thenAccept( - tr -> { - doSomething(tr); - }); - // 定义异常返回的业务逻辑 - future.exceptionally( - e -> { - doSomething(e); - return null; - }); -``` - -## 4. 详细API功能介绍 - -`AssembleTransactionWithRemoteSignProcessor`支持自定义参数发送交易,支持异步的方式来发送交易,也支持返回多种封装方式的结果。 - -`AssembleTransactionWithRemoteSignProcessor`继承了 `AssembleTransactionProcessor`类,实现了`AssembleTransactionWithRemoteSignProviderInterface`接口。 - -继承的接口参考[AssembleTransactionWithRemoteSignProcessor](./assemble_transaction.md)。 - -详细的API功能如下。 - -- **void deployAsync(RawTransaction rawTransaction, RemoteSignCallbackInterface remoteSignCallbackInterface):** 传入部署合约的RawTransaction报文和签名服务的callback来部署合约,自动执行回调函数。 -- **void deployAsync(String abi, String bin, List\ params, RemoteSignCallbackInterface remoteSignCallbackInterface) :** 传入合约abi、bin和构造函数参数和签名服务的callback来部署合约,自动执行回调函数。 -- **void deployByContractLoaderAsync(String contractName, List\ params, RemoteSignCallbackInterface remoteSignCallbackInterface):** 传入合约名和构造参数以及callback,来异步部署合约 -- **void sendTransactionAndGetReceiptByContractLoaderAsync(String contractName, String to, String functionName, List\ params,RemoteSignCallbackInterface remoteSignCallbackInterface):** 传入调用合约名、合约地址、函数名、函数参数、签名服务的callback,异步发送交易。 -- **CompletableFuture\ sendTransactionAsync(String to,String abi,String functionName,List\ params,RemoteSignCallbackInterface remoteSignCallbackInterface):** 传入调用合约地址、abi、函数名、函数参数、签名服务的callback,同步返回调用,异步获取CompletableFuture处理回执结果。 -- **CompletableFuture\ sendTransactionAsync(String to, String abi, String functionName, List\ params):** 传入调用合约地址、abi、函数名、函数参数,同步签名,并同步返回调用,异步获取CompletableFuture处理回执结果。 -- **TransactionReceipt signAndPush(RawTransaction rawTransaction, String signatureStr):** 传入RawTransaction和签名结果,推送给节点,同步接收交易回执。 -- **CompletableFuture\ signAndPush(RawTransaction rawTransaction, byte[] rawTxHash) :** 传入RawTransaction和签名结果,同步调用签名服务,并异步接收交易回执结果。 diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/retcode_retmsg.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/retcode_retmsg.md deleted file mode 100644 index 411760f81..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/retcode_retmsg.md +++ /dev/null @@ -1,49 +0,0 @@ -# Response返回码与错误信息汇总 - -标签:``TransactionResponse`` ``响应码`` ``错误信息`` ``returnCode`` ``returnMessages`` - ----- - -**响应码**与**错误信息**对应表 - -| returnCode | returnMessages | -|------------|------------------------------------------------------------------------------------| -| 0 | Success | -| -53006 | Invalid file type | -| -53005 | Invalid path | -| -53003 | Make directory failed | -| -53002 | File already existed | -| -53001 | File not exist | -| -51507 | Key not exist in table, use insert method | -| -51506 | Don't insert the key already existed | -| -51505 | Add specific table key EQ syntax in condition | -| -51504 | Add specific table key in entry | -| -51503 | Don't update the table key | -| -51502 | Undefined function of Condition Precompiled | -| -51501 | Parse the input of Condition Precompiled failed | -| -51500 | Parse the inpput of the Entriy Precompiled failed | -| -51300 | Invalid configuration value | -| -51202 | The version string or address is error | -| -51103 | The node is not exist | -| -51102 | The weight is invalid | -| -51101 | The last sealer cannot be removed | -| -51100 | Invalid node ID | -| -51004 | Auth map decode error | -| -51003 | Error auth type input | -| -51002 | The contract method auth type not set, please set method auth type first | -| -51001 | The contract method auth not exist | -| -51000 | The contract agent not exist | -| -50105 | Open table error | -| -50104 | Create table error | -| -50103 | Table set row error | -| -50102 | Invalid address format | -| -50101 | Undefined function | -| -50100 | Open table failed, please check the existence of the table | -| -50008 | Invalid table name or field name | -| -50007 | The table contains duplicated field | -| -50006 | The field value exceeds the limit 1024 | -| -50005 | The value exceeds the limit, key max length is 255, field value max length is 1024 | -| -50004 | The length of all the fields name exceeds the limit 1024 | -| -50003 | The table field name exceeds the limit 64 | -| -50002 | The table name length exceeds the limit 50 | -| -50001 | The table already exist | diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/rpc_api.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/rpc_api.md deleted file mode 100644 index 322fdd3f8..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/rpc_api.md +++ /dev/null @@ -1,1011 +0,0 @@ -# Java SDK 接口 - -标签:``RPC`` ``Interface`` - ---------- - -Java SDK为区块链应用开发者提供了Java API接口,按照功能,Java API可分为如下几类: - -- Client: 提供访问FISCO BCOS 3.x节点JSON-RPC接口支持、提供部署及调用合约的支持; -- Precompiled: 提供调用FISCO BCOS 3.x Precompiled合约(预编译合约)的接口,主要包括`ConsensusService`、`SystemConfigService`、`BFSService`、`KVTableService`。 -- AuthManager: 提供FISCO BCOS 3.x 权限控制预部署合约的调用。 - -```eval_rst -.. note:: - - Client接口声明位于 `Client.java` 文件中 - - Client是群组维度的对象,可参考 `快速入门 `_ 初始化Client,初始化Client时,必须传入群组名 -``` - -**特别注意:Client接口均有两种,一种是带有node的接口,另一种是不带node的接口。带有node的接口可以让节点RPC发送请求到指定已连接的节点。如果不指定,节点RPC则会随机发送请求到节点。** - -## 1. 合约操作接口 - -### sendTransaction - -发送交易到区块链RPC。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- signedTransactionData:签名后的交易 -- withProof:返回是否带上默克尔树证明 - -**返回值** - -- BcosTransactionReceipt: 节点收到交易后,回复给SDK的回包,包括交易哈希信息。 - -### sendTransactionAsync - -交易发布异步接口, 收到节点的响应之后,调用指定的callback。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- signedTransactionData: 签名后的交易字符串; -- withProof:返回是否带上默克尔树证明 -- callback: SDK收到节点的回包后,调用的回调函数,回调函数时将会带上交易回执。 - -**返回值** - -- 无 - -### call - -向节点发送请求,调用合约常量接口。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- transaction: 合约调用信息,包含合约地址、合约调用者以及调用的合约接口和参数的abi编码 - -**返回值** - -- Call: 合约常量接口的返回结果,包括当前块高、接口执行状态信息以及接口执行结果 - -### callAsync - -合约常量接口异步调用,接收到节点返回的合约接口执行结果后,执行指定的回调函数 - -**参数** - -- node:可让RPC发送请求到指定节点 -- transaction: 合约调用信息,包含合约地址、合约调用者以及调用的接口和参数信息; -- callback: 回调函数。 - -**返回值** - -- 无 - -### getCode - -查询指定合约地址对应的合约代码信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- address: 合约地址。 - -**返回值** - -- Code: 合约地址对应的合约代码。 - -## 2. 区块链查询接口 - -### getBlockNumber - -获取Client对象对应的群组最新块高。 - -**参数** - -- node:可让RPC发送请求到指定节点 - -**返回值** - -- BlockNumber: Client对象对应的群组最新区块高度。 - -### getBlockNumberAsync - -异步获取Client对象对应的群组最新块高。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- callback:获取块高后的回调 - -**返回值** - -- 无 - -### getTotalTransactionCount - -获取Client对应群组的交易统计信息,包括上链的交易数、上链失败的交易数目。 - -**参数** - -- node:可让RPC发送请求到指定节点 - -**返回值** - -- TotalTransactionCount: 交易统计信息,包括: - - txSum: 上链的交易总量 - - blockNumber: 群组的当前区块高度 - - failedTxSum: 上链执行异常的交易总量 - -### getTotalTransactionCountAsync - -异步获取Client对应群组的交易统计信息,包括上链的交易数、上链失败的交易数目。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- callback:获取交易信息后的回调 - -**返回值** - -- 无 - -### getBlockByNumber - -根据区块高度获取区块信息。 - -**参数** - -- node:可让RPC发送请求到指定节点; -- blockNumber: 区块高度; -- onlyHeader:true/false,表明获取的区块信息中是否只获取区块头数据; -- onlyTxHash:true/false,表明获取的区块信息中是否包含完整的交易信息; - - false: 节点返回的区块中包含完整的交易信息; - - true: 节点返回的区块中仅包含交易哈希。 - -**返回值** - -- BcosBlock: 查询获取的区块信息 - -### getBlockByNumberAsync - -根据区块高度异步获取区块信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- blockNumber: 区块高度; -- onlyHeader:true/false,表明获取的区块信息中是否只获取区块头数据; -- onlyTxHash: true/false,表明获取的区块信息中是否包含完整的交易信息; - - false: 节点返回的区块中包含完整的交易信息; - - true: 节点返回的区块中仅包含交易哈希; -- callback:获取区块完成后的回调。 - -**返回值** - -- 无 - -### getBlockByHash - -根据区块哈希获取区块信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- blockHash: 区块哈希 -- onlyHeader:true/false,表明获取的区块信息中是否只获取区块头数据; -- onlyTxHash: true/false,表明获取的区块信息中是否包含完整的交易信息; - - true: 节点返回的区块中仅包含交易哈希; - - false: 节点返回的区块中包含完整的交易信息。 - -**返回值** - -- BcosBlock: 查询获取的区块信息。 - -### getBlockByHashAsync - -根据区块哈希异步获取区块信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- blockHash: 区块哈希 -- onlyHeader:true/false,表明获取的区块信息中是否只获取区块头数据; -- onlyTxHash: true/false,表明获取的区块信息中是否包含完整的交易信息; - - true: 节点返回的区块中仅包含交易哈希; - - false: 节点返回的区块中包含完整的交易信息; -- callback:获取区块完成后的回调。 - -**返回值** - -- 无 - -### getBlockHashByNumber - -根据区块高度获取区块哈希 - -**参数** - -- node:可让RPC发送请求到指定节点 -- blockNumber: 区块高度 - -**返回值** - -- BlockHash: 指定区块高度对应的区块哈希 - -### getBlockHashByNumberAsync - -根据区块高度异步获取区块哈希 - -**参数** - -- node:可让RPC发送请求到指定节点 -- blockNumber: 区块高度 -- callback:获取之后的回调 - -**返回值** - -- 无 - -### getTransactionByHash - -根据交易哈希获取交易信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- transactionHash: 交易哈希 -- withProof:是否带上默克尔树证明 - -**返回值** - -- BcosTransaction: 指定哈希对应的交易信息。 - -### getTransactionByHashAsync - -根据交易哈异步希获取交易信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- transactionHash: 交易哈希 -- withProof:是否带上默克尔树证明 -- callback:获取到交易时的回调 - -**返回值** - -- 无 - -### getTransactionReceipt - -根据交易哈希获取交易回执信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- transactionHash: 交易哈希 -- withProof:返回是否带上默克尔树证明 - -**返回值** - -- BcosTransactionReceipt: 交易哈希对应的回执信息。 - -### getTransactionReceiptAync - -根据交易哈希获取交易回执信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- transactionHash: 交易哈希 -- withProof:返回是否带上默克尔树证明 -- callback:获取交易回执时的回调 - -**返回值** - -- 无 - -### getPendingTxSize - -获取交易池内未处理的交易数目。 - -**参数** - -- node:可让RPC发送请求到指定节点 - -**返回值** - -- PendingTxSize: 交易池内未处理的交易数目。 - -### getPendingTxSizeAsync - -获取交易池内未处理的交易数目。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- callback:获取交易回执时的回调 - -**返回值** - -- 无 - -### getBlockLimit - -获取Client对应群组的BlockLimit,BlockLimit主要用于交易防重。 - -**参数** - -- 无 - -**返回值** - -- BigInteger: 群组的BlockLimit。 - -### getPeers - -获取指定节点的网络连接信息。 - -**参数** - -- endpoint: 被查询的节点的`IP:Port`。 - -**返回值** - -- Peers: 指定节点的网络连接信息。 - -### getPeersAsync - -异步获取指定节点的网络连接信息。 - -**参数** - -- endpoint:被查询的节点的`IP:Port`。 -- callback:获取之后的回调 - -**返回值** - -- 无 - -### getSyncStatus - -获取节点同步状态。 - -**参数** - -- node:可让RPC发送请求到指定节点 - -**返回值** - -- SyncStatus: 区块链节点同步状态。 - -### getSyncStatusAsync - -异步获取节点同步状态。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- callback:获取同步信息之后的回调 - -**返回值** - -- 无 - -### getSystemConfigByKey - -根据指定配置关键字获取系统配置项的值。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- key: 系统配置项,目前包括`tx_count_limit`, `consensus_leader_period`. - -**返回值** - -- SystemConfig: 系统配置项的值。 - -### getSystemConfigByKeyAsync - -根据指定配置关键字异步获取系统配置项的值。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- key: 系统配置项,目前包括`tx_count_limit`, `consensus_leader_period`. -- callback:获取配置项之后的回调 - -**返回值** - -- 无 - -## 3. 共识查询接口 - -### getObserverList - -获取Client对应群组的观察节点列表。 - -**参数** - -- node:可让RPC发送请求到指定节点 - -**返回值** - -- ObserverList: 观察节点列表。 - -### getObserverListAsync - -异步获取Client对应群组的观察节点列表。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- callback:获取节点列表之后的回调 - -**返回值** - -- 无 - -### getSealerList - -获取Client对应群组的共识节点列表。 - -**参数** - -- node:可让RPC发送请求到指定节点 - -**返回值** - -- SealerList: 共识节点列表。 - -### getSealerListAsycn - -异步获取Client对应群组的共识节点列表。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- callback:获取节点列表之后的回调 - -**返回值** - -- 无 - -### getPbftView - -节点使用PBFT共识算法时,获取PBFT视图信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 - -**返回值** - -- PbftView: PBFT视图信息。 - -### getPbftViewAsync - -节点使用PBFT共识算法时,异步获取PBFT视图信息。 - -**参数** - -- node:可让RPC发送请求到指定节点 - -**返回值** - -- PbftView: PBFT视图信息。 - -### getConsensusStatus - -获取节点共识状态。 - -**参数** - -- node:可让RPC发送请求到指定节点 - -**返回值** - -- ConsensusStatus: 节点共识状态。 - -### getConsensusStatusAsync - -异步获取节点共识状态。 - -**参数** - -- node:可让RPC发送请求到指定节点 -- callback:获取状态后的回调 - -**返回值** - -- 无 - -## 4. 群组查询接口 - -### getGroupInfo - -查询当前群组的状态信息。 - -**参数** - -- 无 - -**返回值** - -- BcosGroupInfo: 被查询的群组状态信息。 - -### getGroupInfoAsync - -异步查询当前群组的状态信息。 - -**参数** - -- callback:查询到状态信息之后的回调 - -**返回值** - -- 无 - -### getGroupList - -获取当前节点的群组列表。 - -**参数** - -- 无 - -**返回值** - -- BcosGroupList: 当前节点的群组列表。 - -### getGroupListAsync - -异步获取当前节点的群组列表。 - -**参数** - -- callback:获取群组列表之后的回调 - -**返回值** - -- 无 - -### getGroupPeers - -获取当前节点指定群组连接的节点列表。 - -**参数** - -- 无 - -**返回值** - -- GroupPeers: 指定群组连接的节点列表。 - -### getGroupPeersAsync - -异步获取当前节点指定群组连接的节点列表。 - -**参数** - -- callback:获取节点列表之后的回调 - -**返回值** - -- 无 - -### getGroupInfoList - -获取当前节点群组信息列表。 - -**参数** - -- 无 - -**返回值** - -- BcosGroupInfoList: 当前节点群组信息列表。 - -### getGroupInfoListAsync - -异步获取当前节点群组信息列表。 - -**参数** - -- callback:获取群组信息之后的回调 - -**返回值** - -- 无 - -### getGroupNodeInfo - -获取群组内指定节点的信息。 - -**参数** - -- node: 指定节点名 - -**返回值** - -- BcosGroupNodeInfo: 查询获取的节点信息。 - -### getGroupNodeInfoAsync - -异步获取群组内指定节点的信息。 - -**参数** - -- node: 指定节点名 -- callback:获取信息后的回调 - -**返回值** - -- 无 - -## 5. 预编译合约服务接口 - -### 5.1 BFSService - -#### mkdir - -在指定的绝对路径下创建目录。 - -**参数** - -- path:绝对路径 - -**返回值** - -- RetCode:创建目录结果。 - -#### list - -查看指定的绝对路径的信息,如果是目录文件,则返回目录下所有子资源元信息,如果是合约文件,则返回合约文件的元信息。 - -**参数** - -- path:绝对路径 - -**返回值** - -- List:返回文件的元信息列表。 - -### 5.2 ConsensusService - -#### addSealer - - 将指定节点添加为共识节点。 - -**参数** - -- nodeId:被添加为共识节点的node ID. -- weight:添加共识节点的权重 - -**返回值** - -- RetCode: 共识节点添加结果。 - -```eval_rst -.. note:: - 为了保证新节点加入不影响共识,即将被添加为共识节点的节点必须与群组内其他节点建立P2P网络连接,否则其无法被添加为共识节点。 -``` - -#### addObserver - -将指定节点添加为观察节点。 - -**参数** - -- nodeId: 被添加为观察节点的node ID. - -**返回值** - -- RetCode: 观察节点添加结果。 - -#### removeNode - -将指定节点移出群组。 - -**参数** - -- nodeId: 被移出群组的节点的node ID. - -**返回值** - -- RetCode: 节点被移出群组的执行结果。 - -### 5.3 SystemConfigService - -#### setValueByKey - -设置指定系统配置项的值。 - -**参数** - -- key: 配置项,目前支持`tx_count_limit`, `consensus_leader_period`; - -- value: 系统配置项被设置的值。 - -**返回值** - -- RetCode: 系统配置项设置结果。 - -### 5.4 KVTableService - -#### createTable - -创建用户表。 - -**参数** - -- tableName: 创建的用户表名; -- keyFieldName: 用户表的主key名; -- valueFields: 用户表的fields. - -**返回值** - -- RetCode: 用户表创建结果。 - -#### set - -向指定用户表中写入一条记录。 - -**参数** - -- tableName: 需要插入记录的表名; -- key: 主key被设置的值; -- fieldNameToValue: 每个field到其对应值的映射。 - -**返回值** - -- RetCode: 记录是否插入成功。 - -#### get - -查询用户表指定记录。 - -**参数** - -- tableName: 被查询的用户表名; -- key: 被查询的主key值; - -**返回值** - -- Map: 查询结果。 - -#### desc - -获取指定用户表的描述信息。 - -**参数** - -- tableName: 被查询的用户表名。 - -**返回值** - -- Map: 用户表描述信息,记录了`PrecompiledConstant.KEY_NAME`到主key的映射,以及`PrecompiledConstant.FIELD_NAME`到所有field的映射,field之间用逗号分隔开。 - - -#### asyncSet - -`set`的异步接口,向指定表写入指定记录,并在接收到节点的回执后,调用指定回调函数。 - -**参数** - -- tableName: 需要插入记录的表名; -- key: 主key被设置的值; -- fieldNameToValue: 每个field到其对应值的映射; -- callback: 回调函数。 - -**返回值** - -- 无 - -### 5.5 CNSService - -**注意:** 从3.0.0-rc3版本开始,不再支持CNS。相应的合约别名功能请参考BFS link功能。 - -## 6. AuthManager权限管理接口 - -权限管理接口包含以下三种接口: - -- 无需权限的查询接口; -- 治理委员会专用接口:拥有治理委员会的私钥发起的交易才能正确执行的接口; -- 管理员专用接口:拥有相应合约的管理权限的管理员私钥发起的交易才能被正确执行的接口。 - -### 6.1 无需权限的查询接口 - -#### getCommitteeInfo - -在初始化时,将会部署一个治理委员,该治理委员的地址信息在 build_chain.sh时自动生成或者指定。初始化只有一个委员,并且委员的权重为1。 - -**参数** - -- 无 - -**返回值** - -- CommitteeInfo:治理委员会的详细信息 - -#### getProposalInfo - -获取某个特定的提案信息。 - -**参数** - -- proposalID:提案的ID号 - -**返回值** - -- ProposalInfo:提案的详细信息 - -#### getDeployAuthType - -获取当前全局部署的权限策略 - -**参数** - -- 无 - -**返回值** - -- BigInteger:策略类型:0则无策略,1则为白名单模式,2则为黑名单模式 - -#### checkDeployAuth - -检查某个账号是否有部署权限 - -**参数** - -- account:账号地址 - -**返回值** - -- Boolean:是否有权限 - -#### checkMethodAuth - -检查某个账号是否有某个合约的一个接口的调用权限 - -**参数** - -- contractAddr:合约地址 -- func:接口的函数选择器,为4个字节 -- account:账号地址 - -**返回值** - -- Boolean:是否有权限 - -#### getAdmin - -获取特定合约的管理员地址 - -**参数** - -- contractAddr:合约地址 - -**返回值** - -- account:账号地址 - -### 6.2 治理委员账号专用接口 - -必须要有治理委员会的Governors中的账户才可以调用,如果治理委员只有一个,且提案是该委员发起的,那么这个提案一定能成功。 - -#### updateGovernor - -如果是新加治理委员,新增地址和权重即可。如果是删除治理委员,将一个治理委员的权重设置为0 即可。 - -**参数** - -- account:账号地址 -- weight:账号权重 - -**返回值** - -- proposalId:返回提案的ID号 - -#### setRate - -设置提案阈值,提案阈值分为参与阈值和权重阈值。 - -**参数** - -- participatesRate:参与阈值,百分比单位 -- winRate:通过权重阈值,百分比单位 - -**返回值** - -- proposalId:返回提案的ID号 - -#### setDeployAuthType - -设置部署的ACL策略,只支持 white_list 和 black_list 两种策略 - -**参数** - -- deployAuthType:type为1时,设置为白名单,type为2时,设置为黑名单。 - -**返回值** - -- proposalId:返回提案的ID号 - -#### modifyDeployAuth - -修改某个管理员账户的部署权限提案 - -**参数** - -- account:账号地址 -- openFlag:是开启权限还是关闭权限 - -**返回值** - -- proposalId:返回提案的ID号 - -#### resetAdmin - -重置某个合约的管理员账号提案 - -**参数** - -- newAdmin:账号地址 -- contractAddr:合约地址 - -**返回值** - -- proposalId:返回提案的ID号 - -#### revokeProposal - -撤销提案的发起,该操作只有发起提案的治理委员才能操作 - -**参数** - -- proposalId:提案的ID号 - -**返回值** - -- TransactionReceipt:执行回执 - -#### voteProposal - -向某个提案进行投票 - -**参数** - -- proposalId:提案的ID号 -- agree:是否同意这个提案 - -**返回值** - -- TransactionReceipt:执行回执 - -### 6.3 合约管理员账号专用接口 - -每个合约都有独立的管理员,持有某个合约的管理员账号才能对合约的接口权限进行设置。 - -#### setMethodAuthType - -设置某个合约的接口调用ACL策略,只支持 white_list 和 black_list 两种策略 - -**参数** - -- contractAddr:合约地址 -- func:合约接口的函数选择器,长度是四个字节。 -- authType:type为1时,设置为白名单,type为2时,设置为黑名单。 - -**返回值** - -- result:如果是0则设置成功。 - -#### setMethodAuth - -修改某个合约的接口调用ACL策略。 - -**参数** - -- contractAddr:合约地址 -- func:合约接口的函数选择器,长度是四个字节。 -- account:账号地址 -- isOpen:是开启权限,还是关闭权限 - -**返回值** - -- result:如果是0则设置成功。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/transaction_decode.md b/3.x/zh_CN/docs/develop/sdk/java_sdk/transaction_decode.md deleted file mode 100644 index 595e29774..000000000 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/transaction_decode.md +++ /dev/null @@ -1,280 +0,0 @@ -# 交易回执解析 - -标签:``java-sdk`` ``回执解析`` ``事件解析`` - ----- -FISCO BCOS的交易是一段发往区块链系统的请求数据,用于部署合约,调用合约接口,维护合约的生命周期以及管理资产,进行价值交换等。当交易确认后会产生交易回执,[交易回执](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/api.html#gettransactionreceipt)和[交易](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/api.html#gettransactionbyhash)均保存在区块里,用于记录交易执行过程生成的信息,如结果码、事件、消耗的gas量等。用户可以使用交易哈希查询交易回执,判定交易是否完成。 - -交易回执包含三个关键字段,分别是input, output , logs: - -| 字段 | 类型 | 描述 | -|:-------|:------------|:-----------------------------------| -| input | String | 交易输入的ABI编码十六进制字符串 | -| output | String | 交易返回的ABI编码十六进制字符串 | -| logs | List\ | event log列表,保存交易的event信息 | - -交易解析功能帮助用户把交易回执解析为json数据。 - -## 1. 构造TransactionDecoderInterface - -创建一个TransactionDecoderService对象。 - -```Java -// 初始化SDK -BcosSDK sdk = BcosSDK.build(configFile); -// 发送群组group -Client client = sdk.getClient("group0"); -// 获取当前群组对应的密码学接口 -CryptoSuite cryptoSuite = client.getCryptoSuite(); -// 构造TransactionDecoderService实例,传入是否密钥类型参数。并且传入是否使用scale解码 -TransactionDecoderInterface decoder = new TransactionDecoderService(cryptoSuite, client.isWASM()); -``` - -TransactionDecoderInterface 主要包括以下功能: -abi在合约生成的java客户端文件夹下,以HelloWorld.sol为例,为HelloWorld.abi中的json字符串。 - -- **public TransactionResponse decodeReceiptWithValues(String abi, String functionName, TransactionReceipt receipt):** 解析带函数返回值的交易回执。 -- **public TransactionResponse decodeReceiptWithoutValues(String abi, TransactionReceipt transactionReceipt):** 解析不带函数返回值的交易回执。 -- **public Map\\>\>\> decodeEvents(String abi, List\ logs):** 解析交易事件。 -- **public TransactionResponse decodeReceiptStatus(TransactionReceipt receipt):** 解析回执的状态和报错信息等。 - -### 解析合约函数示例 - -我们以一个简单的递增函数为例,来演示如何解析交易。递增函数对应的solidity代码如下: - -```solidity -function incrementUint256(uint256 v) public returns(uint256){ - _uint256V = v + 1 ; - emit LogIncrement(msg.sender, v); - return _uint256V; -} -``` - -在上面这段代码中,首先将传入的参数加1,然后记录了递增事件(event),最后返回结果。 - -## 2. 解析带返回值的交易 - -传入合约的abi文件,调用函数的名称,以及交易回执,解析交易结果。 - -```Java -TransactionResponse transactionResponse = decoder.decodeReceiptWithValues(abi, "incrementUint256", transactionReceipt); -``` - -### 解析结果示例 - -以上函数定义中,有函数返回值,也触发了event调用。我们的传入值v为1. 解析交易执行返回的TransactionReceipt以后,对应的结果如下: - -```json -{ - "returnCode": 2, - "returnMessage": "Success", - "transactionReceipt": { - "transactionHash": "0x433c41e0bdd5420f07186eb33d47aac9cf4bbfff040d27213f17ad739096f19b", - "transactionIndex": "0x0", - "root": "0x3094859967ad37882b450ffa97dc15ad9d1d69cab8d3ff8212f6c200185f7bae", - "blockNumber": "0x20a", - "blockHash": "0x02143583560dd1bc0c226f0d2a7bd947170c322ef5be203da3308fdd36fde87e", - "from": "0x7c8000530ae01adb3f8f77e7096b335eef83172f", - "to": "0xa90bec2f9957eed99c6856172f0c58a5cb2a46fd", - "gasUsed": "0xab6a", - "contractAddress": "0x0000000000000000000000000000000000000000", - "logs": [ - { - "address": "0xa90bec2f9957eed99c6856172f0c58a5cb2a46fd", - "topics": [ - "0xaca9a02cfe513f3f88c54a860469369849c8fa0a2119a8d1f3f75c67ac0c9547" - ], - "data": "0x0000000000000000000000007c8000530ae01adb3f8f77e7096b335eef83172f0000000000000000000000000000000000000000000000000000000000000001", - "blockNumber": null - } - ], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000040000000000000000000000000000000000000000000000000000000000000000000000000000400000", - "status": "0x0", - "input": "0x7c1bf3c50000000000000000000000000000000000000000000000000000000000000001", - "output": "0x0000000000000000000000000000000000000000000000000000000000000002", - "txProof": null, - "receiptProof": null, - "message": "Success", - "statusOK": true - }, - "contractAddress": "0x0000000000000000000000000000000000000000", - "values": "[2]", - "events": "{\"LogIncrement\":[\"0x7c8000530ae01adb3f8f77e7096b335eef83172f\",1]}", - "receiptMessages": "Success", - "valuesList": [ - 2 - ], - "eventResultMap": { - "LogIncrement": [ - [ - "0x7c8000530ae01adb3f8f77e7096b335eef83172f", - 1 - ] - ] - } -} -``` - -上述解析的报文中,包含了区块链回执的数据结构的详细字段值。此外,还解析了函数的事件(event)以及返回值。 - -解析后的函数事件(event)以及返回值,可查看`events`或`eventResultMap`以及`values`或`valuesList`字段。 - -```json -{ - …… - "values": "[2]", - "events": "{\"LogIncrement\":[\"0x7c8000530ae01adb3f8f77e7096b335eef83172f\",1]}", - "valuesList": [ - 2 - ], - "eventResultMap": { - "LogIncrement": [ - [ - "0x7c8000530ae01adb3f8f77e7096b335eef83172f", - 1 - ] - ] - } -} -``` - -## 3. 解析无返回值的交易 - -在某些场景下,我们不关心交易的返回值,只需解析函数中触发的事件(event)以及交易回执的详细数据结构。 - -传入合约的abi文件和交易回执,解析交易结果。 - -```Java -TransactionResponse transactionResponseWithoutValues = decoder.decodeReceiptWithoutValues(abi, transactionReceipt); -``` - -### 解析结果示例 - -还是以上节调用incrementUint256函数为例,我们还是解析此交易回执,但不解析函数返回值,返回的结果如下: - -```json -{ - "returnCode": 2, - "returnMessage": "Success", - "transactionReceipt": { - "transactionHash": "0x433c41e0bdd5420f07186eb33d47aac9cf4bbfff040d27213f17ad739096f19b", - "transactionIndex": "0x0", - "root": "0x3094859967ad37882b450ffa97dc15ad9d1d69cab8d3ff8212f6c200185f7bae", - "blockNumber": "0x20a", - "blockHash": "0x02143583560dd1bc0c226f0d2a7bd947170c322ef5be203da3308fdd36fde87e", - "from": "0x7c8000530ae01adb3f8f77e7096b335eef83172f", - "to": "0xa90bec2f9957eed99c6856172f0c58a5cb2a46fd", - "gasUsed": "0xab6a", - "contractAddress": "0x0000000000000000000000000000000000000000", - "logs": [ - { - "address": "0xa90bec2f9957eed99c6856172f0c58a5cb2a46fd", - "topics": [ - "0xaca9a02cfe513f3f88c54a860469369849c8fa0a2119a8d1f3f75c67ac0c9547" - ], - "data": "0x0000000000000000000000007c8000530ae01adb3f8f77e7096b335eef83172f0000000000000000000000000000000000000000000000000000000000000001", - "blockNumber": null - } - ], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000040000000000000000000000000000000000000000000000000000000000000000000000000000400000", - "status": "0x0", - "input": "0x7c1bf3c50000000000000000000000000000000000000000000000000000000000000001", - "output": "0x0000000000000000000000000000000000000000000000000000000000000002", - "txProof": null, - "receiptProof": null, - "message": "Success", - "statusOK": true - }, - "contractAddress": "0x0000000000000000000000000000000000000000", - "values": null, - "events": "{\"LogIncrement\":[\"0x7c8000530ae01adb3f8f77e7096b335eef83172f\",1]}", - "receiptMessages": "Success", - "valuesList": null, - "eventResultMap": { - "LogIncrement": [ - [ - "0x7c8000530ae01adb3f8f77e7096b335eef83172f", - 1 - ] - ] - } -} -``` - -上述解析的报文结果中,包含了区块链回执的数据结构的详细字段值和解析后的函数事件(event)。 - -解析后的函数事件(event),可查看`events`或`eventResultMap`字段。 - -```json -{ - …… - "events": "{\"LogIncrement\":[\"0x7c8000530ae01adb3f8f77e7096b335eef83172f\",1]}", - "eventResultMap": { - "LogIncrement": [ - [ - "0x7c8000530ae01adb3f8f77e7096b335eef83172f", - 1 - ] - ] - } -} -``` - -## 4. 解析事件(event) - -只解析调用函数过程中触发的事件。传入合约的abi文件和交易回执的logs,解析交易结果;返回事件名和事件List的Map。 - -```Java -Map>>> events = decoder.decodeEvents(abi, transactionReceipt.getLogs()); -``` - -### 解析结果示例 - -还是以上节调用incrementUint256函数为例,现在演示只解析事件(event),返回的结果如下: - -```json -{ - "LogIncrement": [ - [ - "0x7c8000530ae01adb3f8f77e7096b335eef83172f", - 1 - ] - ] -} -``` - -## 5. 解析回执的错误信息 - -传入交易回执,解析返回数据,并解析为TransactionResponse对象。 - -```Java -TransactionResponse transactionResponse = decoder.decodeReceiptStatus(transactionReceipt); -``` - -### 解析结果示例 - -对应的solidity代码: - -```solidity -function setBytesMapping(bytes[] bytesArray) public returns (bool) { - require(bytesArray.length>1, "Bytes array is less than 2"); - _bytesMapping[bytesArray[0]] = bytesArray; - return true; -} -``` - -以下函数执行中,交易执行失败,在执行require语句后报错。解析交易执行返回的TransactionReceipt以后,对应的结果如下: - -```json -{ - "returnCode": 16, - "returnMessage": "Bytes array is less than 2", - "transactionReceipt": null, - "contractAddress": null, - "values": null, - "events": null, - "receiptMessages": "Bytes array is less than 2", - "valuesList": null, - "eventResultMap": null -} -``` diff --git a/3.x/zh_CN/docs/develop/sdk/rust_sdk/index.md b/3.x/zh_CN/docs/develop/sdk/rust_sdk/index.md deleted file mode 100644 index 8fe91eb1a..000000000 --- a/3.x/zh_CN/docs/develop/sdk/rust_sdk/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Rust SDK - -标签:``Rust SDK`` ``区块链应用`` - ----- - -Rust SDK for FISCO-BCOS ,like some rusted but solid gears , help to build blockchain application with FISCO-BCOS - -[FISCO BCOS](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master)的轻量级版本Rust SDK, 基础网络、国密非国密算法支持、合约解析能力较为完备,附带命令行交互控制台。 - -- 本项目的定位是一个学习/研究/编程兴趣的项目,仅供学习参考。如有正式的使用需求,建议在熟悉rust语言的前提下,仅部分参考本项目和FISCO BCOS相关的实现,去开发自己的生产级sdk,并经过严谨测试验证后使用。 - -- 本项目并非唯一且官方的fisco bcos rust sdk,社区陆续会有其他优秀的rust的sdk实现,提供多种选择和参考可能性 - -安装配置环境,使用Rust SDK进行应用开发请参见[【github链接】](https://github.com/FISCO-BCOS/rust-gears-sdk/) diff --git a/3.x/zh_CN/docs/develop/smartdev_index.md b/3.x/zh_CN/docs/develop/smartdev_index.md new file mode 100644 index 000000000..425a8bb62 --- /dev/null +++ b/3.x/zh_CN/docs/develop/smartdev_index.md @@ -0,0 +1,114 @@ +# 6. SmartDev应用开发组件 + +标签:``WeBankBlockchain-SmartDev`` ``应用开发`` ``通用组件`` ``智能合约库`` ``智能合约编译插件`` ``应用开发脚手架`` + +---- + +## 组件定位 + +区块链技术在经历了十余年的发展历程以后,渐呈“燎原之势”,不断在各行业落地生根。但同时,从技术角度看,区块链应用开发仍然有着较高的门槛,存在不少痛点,在应用开发各个环节上的用户体验有待提升。 + +WeBankBlockchain-SmartDev应用开发组件的初衷是全方位助力开发者高效、敏捷地开发区块链应用。SmartDev包含了一套开放、轻量的开发组件集,覆盖智能合约的开发、调试、应用开发等环节,开发者可根据自己的情况自由选择相应的开发工具,提升开发效率。 + +## 设计目标 + +在社区中,我们也经常听到关于区块链应用开发的诸多问题: +如何在solidity代码中将账户地址和字符串互转? +现有的solidity代码是否支持高级语言中常用但相对复杂的数据结构,例如可迭代的mapping? +是否可以提供一套基于明确应用场景的可供复用、参考的智能合约代码? +solidity智能合约如何快速编译为abi和binary文件? +如何在使用gradle构建的区块链应用中快速编译智能合约代码,而不必使用编译脚本? +写完智能合约后,如何编写区块链应用? +是否可以提供一个便于开发的区块链应用代码生成器? +编程小白如何快速上手区块链应用开发? +... + +这些问题既有与合约开发相关的,也有与应用开发相关的。基于此类场景问题,结合自身实践经验,微众银行区块链正式开源区块链应用开发组件WeBankBlockchain-SmartDev,期望从区块链应用开发中的各个环节入手,多维度地提高区块链应用的开发效率,帮助开发者成为区块链应用开发的“10倍工程师”。目前,整个组件基于solidity语言开发。近期微众银行区块链还开源了webankblockchain-liquid(以下简称WBC-Liquid)合约语言,未来我们也会适配WBC-Liquid语言。 + +区块链应用开发组件WeBankBlockchain-SmartDev的研发初衷在于打造低代码开发的组件库,全方位助力开发者高效、敏捷地开发区块链应用。WeBankBlockchain-SmartDev包含了一套开放、轻量的开发组件集,覆盖合约的开发、编译、应用开发等环节,开发者可根据自己的情况选择相应开发工具,提升开发效率。 + +从合约开发的视角来看,对于常用的功能,不必再重复造轮子,只需按需引用,参考“智能合约库”中的代码,就可以引入相应功能,为合约开发的效率和安全保驾护航。对于非基础性功能,例如业务场景,我们也提供了代码模板供参考复用。 + +从合约编译的视角来看,对于正在开发中的区块链应用,不必再依赖控制台对合约代码进行编译,只需使用合约gradle编译插件就地编译,便可立即得到abi、bin和java合约。这些编译物直接被输出到Java项目中,省去了拷贝的步骤,提供了如开发原生java程序一样迅捷、丝滑的体验。 + +从应用开发的视角来看,从智能合约到项目搭建,包含了大量机械而重复的工作,如创建项目、引入依赖、编写配置代码、访问智能合约、编写相关实体类等。相形之下,通过WeBankBlockchain-SmartDev,开发者可以选用应用开发脚手架。脚手架会根据智能合约自动生成项目工程。工程中已经包含了上述逻辑代码,开发者只需基于该工程继续添加业务逻辑代码,聚焦在自身的业务上即可。 + +![](../../../../2.x/images/governance/SmartDev/compare.png) + +## 组件简介 +SmartDev包含了一套开放、轻量的开发组件集,覆盖智能合约的开发、调试、应用开发等环节,包括智能合约库(SmartDev-Contract)、智能合约编译插件(SmartDev-SCGP)和应用开发脚手架(SmartDev-Scaffold)。开发者可根据自己的情况自由选择相应的开发工具,提升开发效率。 + +![](../../../../2.x/images/governance/SmartDev/smartdev_overview.png) + +### SmartDev-Contract 智能合约库 +solidity智能合约代码库。包含基础类型、数据结构、通用功能、上层业务等智能合约库。用户可根据实际需求进行参考、复用。 + +![](../../../../2.x/images/governance/SmartDev/contract_lib.png) + +请参考 + +- [Github地址](https://github.com/WeBankBlockchain/SmartDev-Contract) + +- [gitee地址](https://gitee.com/WeBankBlockchain/SmartDev-Contract) + +- [文档地址](https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html) + +- [快速开始](https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/quick_start.html) + + +### SmartDev-SCGP (Solidity Compiler Gradle Plugin) 智能合约编译插件 +将solidity智能合约代码编译为Java代码的gradle插件,可以编译项目中的智能合约,生成对应的Java文件,并自动拷贝到对应包目录下。 + +![](../../../../2.x/images/governance/SmartDev/compile_plugin.png) + +请参考 + +- [Github地址](https://github.com/WeBankBlockchain/SmartDev-SCGP) + +- [gitee地址](https://gitee.com/WeBankBlockchain/SmartDev-SCGP) + +- [文档地址](https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/index.html) + +- [快速开始](https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/quick_start.html) + +### SmartDev-Scaffold 应用开发脚手架 +基于配置的智能合约文件,自动生成应用项目的脚手架代码,包含了智能合约所对应的实体类、服务类等内容,帮助用户只需要修改和编写较少量的代码,即可实现一个应用,大大简化了智能合约开发。 + +![](../../../../2.x/images/governance/SmartDev/scaffold.png) + +请参考 + +- [Github地址](https://github.com/WeBankBlockchain/SmartDev-Scaffold) + +- [gitee地址](https://gitee.com/WeBankBlockchain/SmartDev-Scaffold) + +- [文档地址](https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html) + +- [快速开始](https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/quick_start.html) + + +## 使用场景 + +### 场景1:智能合约开发 + +在智能合约开发中,从基础的四则运算到上层的业务场景,都可以使用成熟的、可复用的库。 + +以四则运算为例,需要判断是否存在溢出的风险,此时可以使用数学相关库LibSafeMathForUint256Utils。 + +以数据结构为例,在solidity中,mapping类型的key不可被迭代,此时若需要使用对key进行迭代的映射,可以使用mapping相关的库LibBytesMap。 + +以通用功能为例,如果希望引入哈希、验签等密码学功能,则可以使用Crypto库。 + +以业务场景为例,如果想实现存证功能,可以参考场景模板Evidence,模板中纳入了相关实现,起到抛砖引玉的效果。 + +### 场景2:合约修改与调试 + +在区块链应用开发、调试过程中,通常需要在项目中用到abi、bin、java合约等内容,并基于这些内容进行相应的调试。如果合约出于调整等原因而需要重新编译,此时不必将合约拷入控制台编译,只需运行相应的gradle指令,就可以生成新的编译物。同时,这些编译物直接嵌在了项目中。如下图示例中,对HelloWorld合约编译后,产生的编译物示例: + +![](../../../../2.x/images/governance/SmartDev/example.png) + +### 场景3:区块链应用开发 + +假如用户已经写好了智能合约,需要基于智能合约,开发一个提供rest接口的web项目。在这种情况下,用户可以将合约拖入脚手架,一键生成项目。下图是生成的样例工程,包含了必要的配置类、DAO(Data Access Object)相关代码。开发者只需对项目进行必要的配置,并添加相应的controller等代码,就可以轻松实现上述需求。 + +![](../../../../2.x/images/governance/SmartDev/dir.png) diff --git a/3.x/zh_CN/docs/introduction.md b/3.x/zh_CN/docs/introduction.md deleted file mode 100644 index 6765f976a..000000000 --- a/3.x/zh_CN/docs/introduction.md +++ /dev/null @@ -1,133 +0,0 @@ -# FISCO BCOS 区块链 - -标签:``FISCO BCOS介绍`` ``关键特性`` ``开发工具`` - ---- - -FISCO BCOS是由国内企业主导研发、对外开源、安全可控的企业级金融联盟链底层平台,由金链盟开源工作组协作打造,并于2017年正式对外开源。 - -社区以开源链接多方,截止2020年5月,汇聚了超1000家企业及机构、逾万名社区成员参与共建共治,发展成为最大最活跃的国产开源联盟链生态圈。底层平台可用性经广泛应用实践检验,数百个应用项目基于FISCO BCOS底层平台研发,超80个已在生产环境中稳定运行,覆盖文化版权、司法服务、政务服务、物联网、金融、智慧社区等领域。 - -```eval_rst -.. note:: - FISCO BCOS以联盟链的实际需求为出发点,兼顾性能、安全、可运维性、易用性、可扩展性,支持多种SDK,并提供了可视化的中间件工具,大幅缩短建链、开发、部署应用的时间。此外,FISCO BCOS通过信通院可信区块链评测功能、性能两项评测,单链TPS可达两万。 -``` - -为了支撑海量服务的需求,v3.0稳定版从系统架构、处理流程、执行、存储上进行了相应的设计,并推出3种不同形态满足不同区块链部署场景的差异化需求。 - -## 关键特性 - -**Air 、Pro、Max:可部署为三种架构形态** - -- **轻便Air版**:拥有与 v2.0版本相同的形态,所有功能在一个区块链节点中(all-in-one)。该架构简单,可快速部署在任意环境中。你可以用它进行区块链入门、开发、测试、POC验证等工作。 -- **专业Pro版**:该架构通过将区块链节点的接入层模块独立为进程,在实现接入层与核心模块分区部署的同时,让区块链核心功模块以多群组方式扩展。该架构实现了分区隔离,可应对将来可能的业务拓展,适合有持续业务扩展的生产环境。 -- **大容量Max版**:该架构在Pro版的基础上提供链的核心模块主备切换的能力,并可通过多机部署交易执行器和接入分布式存储TiKV,实现计算与存储的平行拓展。该架构中的一个节点由一系列微服务组成,但它依赖较高的运维能力,适合需要海量计算和存储的场景。 - -**Pipeline:区块流水线,连续且紧凑地生成区块** - -* 区块生成过程可拆分成四个阶段:打包、共识、执行、落盘。在过往设计中,系统需等待上一个区块完成四个阶段后才可进入下一个区块的生成。本版本采用流水线设计,让相邻区块的四个阶段前后交叠在一起,减少区块间的等待时间,提高连续出块速度。如:区块103在打包的同时,102在共识,101在执行,100在落盘。[相关文档:两阶段并行拜占庭共识](./design/consensus/consensus.md) - -**DMC实现交易处理性能的多机拓展** - -* 在传统设计中,交易执行只可单机进行。v3.0稳定版采用独创的确定性多合约并行方案(Deterministic Multi-Contract,简称DMC),能够在系统运行时自动进行交易冲突处理,并将多个交易调度到不同机器中并行执行,用户可通过拓展计算实例实现交易处理性能的平行拓展。[相关文档:确定性多合约并行](./design/DMC.md) - -**+TiKV:分布式事务性提交,支撑海量存储** - -* v3.0稳定版集成TiKV存储引擎,并且在其基础上二次开发,支持分布式事务性提交,结合DMC多计算实例,充分发挥存储性能,支撑海量数据上链。同时,本版本引入KeyPage机制,参考内存页的缓存机制,将key-value组织成页的方式存取,解决了以往采用key-value的方式存储数据时,存储数据零散的问题,提升数据访问局部性,更适合大批量数据存取。[相关文档:基于事务的存储模块](./design/storage.md) - -**区块链文件系统:所见即所得的合约数据管理** - -* 支持通过区块链文件系统管理链上资源,可像操作文件系统一样管理链上的合约,并通过合约的路径进行调用,命令包括:pwd、cd、ls、tree、mkdir、ln。用户可以通过控制台体验该功能。[相关文档:区块链合约文件系统](./design/contract_directory.md) - -**SDK基础库:更方便的全平台国密接入** - -* v3.0稳定版构建了通用国密基础组件,将国密算法、国密通信协议、国产密码机接入协议与FISCO BCOS的区块链基础数据结构封装于其中,基于该基础组件可快速开发出不同平台、不同操作系统和不同编程语言的SDK,大大提升研发效率。[相关文档:多语言SDK](./develop/sdk/index.md) - - **交易并行冲突分析工具:自动生成交易冲突变量** - -* 在v2.0版本中要实现并行交易,需要在写合约时手动指定交易冲突变量。本版本引入了交易并行冲突分析工具,写合约时无需手动指定交易冲突变量,只需关注自身代码实现,合约编译时工具自动生成交易冲突变量,相应的交易即可自动并行执行。 - - **WBC-Liquid:用Rust写合约** - -* 除支持Soldity语言外,本版本也支持用Rust写合约。WBC-Liquid是微众区块链开发的基于Rust的智能合约编程语言,借助Rust语言特性,能够实现比Solidity语言更强大的编程功能。[相关文档:Liquid 在线文档](https://liquid-doc.readthedocs.io/zh_CN/latest/) - -**权限治理框架:多方投票治理区块链** - -* 本版本内置权限治理框架,直接从区块链实现层提供有效的权限控制。开启权限治理功能后,对区块链的修改需进行多方投票的授权。基于该框架,区块链参与者们能够定制区块链上的治理策略并通过投票的方式不断迭代更新。[相关文档:权限治理体系设计](./design/committee_design.md) - -**特性继承与升级** - -v3.0稳定版也继承了 v2.0版本的诸多重要特性并进行升级,包括: - -- PBFT共识算法:立即一致的共识算法,实现交易秒级确认 -- Solidity:支持至0.8.11版本 -- CRUD:采用表结构存储数据,本版本中封装了更易用的接口,对业务开发更友好 -- AMOP:链上信使协议,借助区块链的P2P网络实现信息传输,实现接入区块链的应用间数据通信 -- 落盘加密:区块链节点的私钥和数据加密存储于物理硬盘中,物理硬件丢失也无法解密 -- 密码算法:内置群环签名等密码算法,可支持各种安全多方计算场景 -- 区块链监控:实现区块链状态的实时监控与数据上报 - -**整体架构** | | -| - | - | -| 架构模型 | 灵活自适应的区块链框架,目前包括轻量级的Air版本FISCO BCOS和适用于复杂业务场景的Pro版本FISCO BCOS| -| 群组架构 | 支持链内动态扩展多群组| -| 分布式存储 | 支持海量数据存储| -| 并行计算 | 支持基于DAG(有向无环图)和DMC(确定性合约并行算法)块内交易并行执行 | -| 节点类型 | 共识节点、观察节点 | -| 计算模型 | 排序-执行-验证 | -| **系统性能** | -| 峰值TPS | 4万+ TPS(PBFT)| -| 交易确认时延 | 秒级| -| **硬件推荐配置** | -| CPU | 2.4GHz * 8核| -| 内存 | 8GB | -| 存储 | 4TB | -| 网络带宽| 10Mb | -| **账本模型** | -| 数据结构 | 链式结构,区块通过哈希链相连| -| 是否分叉|不分叉| -| 记账类型 | 账户模型(非UTXO)| -| **共识算法** | -| 共识框架 | 可插拔设计 | -| 共识算法 | PBFT| -| **存储引擎** | -| 存储设计 | 支持KV和SQL | -| 引擎类型 | 支持rocksdb| -| CRUD接口 | 提供CRUD接口访问链上数据 | -| **网络协议** | -| 节点间通信 | P2P协议 | -| 客户端与节点通信 | WebSocket协议 | -| 消息订阅服务 | AMOP协议 | -| **智能合约**| -|合约引擎| 支持WASM和EVM| -|合约语言| 支持Solidity, C++和WBC-Liquid| -|引擎特点| 图灵完备,沙盒运行 | -|版本控制| 基于CNS支持多版本合约 | -| **密码算法和协议** | -| 国密算法 | 支持 | -| 国密SSL | 支持 | -| 哈希算法 | Keccak256、SM3 | -| 对称加密算法 | AES、SM4 | -| 非对称加密算法 |ECDSA、SM2| -| 非对称加密椭圆曲线|secp256k1、sm2p256v1| -| **安全控制** | -|通信安全| 支持全流程SSL | -|准入安全| 基于PKI身份认证体系 | -|证书管理| 支持证书颁发、撤销、更新| -|权限控制| 支持细粒度权限控制| -| **隐私保护** | -|物理隔离| 群组间数据隔离 | -|场景化隐私保护机制|基于[WeDPR](https://fintech.webank.com/wedpr)支持隐匿支付、匿名投票、匿名竞拍、选择性披露等场景| -| **跨链协议** | -|SPV|提供获取SPV证明的接口| -|跨链协议|基于[WeCross](https://github.com/WeBankBlockchain/WeCross)支持同构、异构跨链| -| **开发支持** | -|开发建链工具|提供[Air版本区块链部署工具build_chain](./tutorial/air/build_chain.html), [Pro版本区块链部署工具BcosBuilder/pro](./tutorial/pro/pro_builder.html)和[Maxb版本部署工具BcosBuilder/max](./tutorial/max/max_builder.html)| -|合约部署与测试工具|交互式控制台 [基于Java SDK的控制台](./develop/console/index.html)| -|SDK语言|[Java](./develop/sdk/java_sdk/index.html)(待适配语言:go、nodejs、Rust、Python、iOS、Android) -|快速开发组件|提供[Spring-boot-starter](https://github.com/FISCO-BCOS/spring-boot-starter)| -| **运维支持** | -|动态管理节点|支持动态新增、剔除、变更节点| -|动态更改配置|支持动态变更系统配置| -|数据备份与恢复|提供数据导出与恢复服务组件| -|监控统计|输出统计日志,提供监控工具| \ No newline at end of file diff --git a/3.x/zh_CN/docs/change_log/3_0_0.md b/3.x/zh_CN/docs/introduction/change_log/3_0_0.md similarity index 96% rename from 3.x/zh_CN/docs/change_log/3_0_0.md rename to 3.x/zh_CN/docs/introduction/change_log/3_0_0.md index 9dc85c059..edc31d55f 100644 --- a/3.x/zh_CN/docs/change_log/3_0_0.md +++ b/3.x/zh_CN/docs/introduction/change_log/3_0_0.md @@ -3,7 +3,7 @@ ```eval_rst .. admonition:: v2.x升级到v3.0.0 - - **全面升级** :参考 `搭建第一个区块链网络 <../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc3新特性 + - **全面升级** :参考 `搭建第一个区块链网络 <../../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc3新特性 - v3.0.0与v3.0.0-rc*不兼容,从本版本开始进行版本间兼容性支持 diff --git a/3.x/zh_CN/docs/change_log/3_0_0_rc1.md b/3.x/zh_CN/docs/introduction/change_log/3_0_0_rc1.md similarity index 93% rename from 3.x/zh_CN/docs/change_log/3_0_0_rc1.md rename to 3.x/zh_CN/docs/introduction/change_log/3_0_0_rc1.md index 52c86fe91..95c0518cc 100644 --- a/3.x/zh_CN/docs/change_log/3_0_0_rc1.md +++ b/3.x/zh_CN/docs/introduction/change_log/3_0_0_rc1.md @@ -1,7 +1,7 @@ ```eval_rst .. admonition:: v2.x升级到v3.0.0-rc1 - - **全面升级** :参考 `搭建第一个区块链网络 <../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc1新特性 + - **全面升级** :参考 `搭建第一个区块链网络 <../../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc1新特性 - v3.0.0-rc1不包括 ``FISCO BCOS Max`` 版本,Max版本的FISCO BCOS会在后续版本中推出 diff --git a/3.x/zh_CN/docs/change_log/3_0_0_rc2.md b/3.x/zh_CN/docs/introduction/change_log/3_0_0_rc2.md similarity index 93% rename from 3.x/zh_CN/docs/change_log/3_0_0_rc2.md rename to 3.x/zh_CN/docs/introduction/change_log/3_0_0_rc2.md index dc3437bf3..ce2690957 100644 --- a/3.x/zh_CN/docs/change_log/3_0_0_rc2.md +++ b/3.x/zh_CN/docs/introduction/change_log/3_0_0_rc2.md @@ -1,7 +1,7 @@ ```eval_rst .. admonition:: v2.x升级到v3.0.0-rc2 - - **全面升级** :参考 `搭建第一个区块链网络 <../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc2新特性 + - **全面升级** :参考 `搭建第一个区块链网络 <../../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc2新特性 - v3.0.0-rc2不包括 ``FISCO BCOS Max`` 版本,Max版本的FISCO BCOS会在后续版本中推出 diff --git a/3.x/zh_CN/docs/change_log/3_0_0_rc3.md b/3.x/zh_CN/docs/introduction/change_log/3_0_0_rc3.md similarity index 94% rename from 3.x/zh_CN/docs/change_log/3_0_0_rc3.md rename to 3.x/zh_CN/docs/introduction/change_log/3_0_0_rc3.md index 916e3f5db..ddf4bf6f8 100644 --- a/3.x/zh_CN/docs/change_log/3_0_0_rc3.md +++ b/3.x/zh_CN/docs/introduction/change_log/3_0_0_rc3.md @@ -1,7 +1,7 @@ ```eval_rst .. admonition:: v2.x升级到v3.0.0-rc3 - - **全面升级** :参考 `搭建第一个区块链网络 <../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc3新特性 + - **全面升级** :参考 `搭建第一个区块链网络 <../../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc3新特性 - v3.0.0-rc3不包括 ``FISCO BCOS Max`` 版本,Max版本的FISCO BCOS会在后续版本中推出 diff --git a/3.x/zh_CN/docs/change_log/3_0_0_rc4.md b/3.x/zh_CN/docs/introduction/change_log/3_0_0_rc4.md similarity index 94% rename from 3.x/zh_CN/docs/change_log/3_0_0_rc4.md rename to 3.x/zh_CN/docs/introduction/change_log/3_0_0_rc4.md index 543591110..3b8ee23d8 100644 --- a/3.x/zh_CN/docs/change_log/3_0_0_rc4.md +++ b/3.x/zh_CN/docs/introduction/change_log/3_0_0_rc4.md @@ -3,7 +3,7 @@ ```eval_rst .. admonition:: v2.x升级到v3.0.0-rc4 - - **全面升级** :参考 `搭建第一个区块链网络 <../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc3新特性 + - **全面升级** :参考 `搭建第一个区块链网络 <../..//quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc3新特性 - v3.0.0-rc4与v3.0.0-rc3不兼容,预计从正式版本进行版本间兼容性支持 diff --git a/3.x/zh_CN/docs/change_log/3_0_1.md b/3.x/zh_CN/docs/introduction/change_log/3_0_1.md similarity index 90% rename from 3.x/zh_CN/docs/change_log/3_0_1.md rename to 3.x/zh_CN/docs/introduction/change_log/3_0_1.md index 8a1ecb7fa..6bf6d0d5e 100644 --- a/3.x/zh_CN/docs/change_log/3_0_1.md +++ b/3.x/zh_CN/docs/introduction/change_log/3_0_1.md @@ -3,7 +3,7 @@ ```eval_rst .. admonition:: v2.x升级到v3.x - - **全面升级** :参考 `搭建第一个区块链网络 <../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc3新特性 + - **全面升级** :参考 `搭建第一个区块链网络 <../../quick_start/air_installation.html>`_ 搭建新链,重新向新节点提交所有历史交易,升级后节点包含v3.0.0-rc3新特性 - v3.0.1与v3.0.0 兼容,可直接替换二进制实现升级 diff --git a/3.x/zh_CN/docs/change_log/3_1_0.md b/3.x/zh_CN/docs/introduction/change_log/3_1_0.md similarity index 92% rename from 3.x/zh_CN/docs/change_log/3_1_0.md rename to 3.x/zh_CN/docs/introduction/change_log/3_1_0.md index a3ef57fd5..9c672ec2a 100644 --- a/3.x/zh_CN/docs/change_log/3_1_0.md +++ b/3.x/zh_CN/docs/introduction/change_log/3_1_0.md @@ -50,11 +50,11 @@ ##### 查询数据兼容版本号(compatibility_version) -用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.1 +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.0 ``` [group0]: /apps> getSystemConfigByKey compatibility_version -3.0.1 +3.0.0 ``` ##### 替换节点二进制 @@ -63,7 +63,7 @@ ##### 设置数据兼容版本号(compatibility_version) -用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.1.0 +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.1.0 ``` [group0]: /apps> setSystemConfigByKey compatibility_version 3.1.0 diff --git a/3.x/zh_CN/docs/change_log/3_1_1.md b/3.x/zh_CN/docs/introduction/change_log/3_1_1.md similarity index 87% rename from 3.x/zh_CN/docs/change_log/3_1_1.md rename to 3.x/zh_CN/docs/introduction/change_log/3_1_1.md index d5259832a..57d1088ba 100644 --- a/3.x/zh_CN/docs/change_log/3_1_1.md +++ b/3.x/zh_CN/docs/introduction/change_log/3_1_1.md @@ -15,10 +15,10 @@ * 历史版本升级 - 需要升级的链的“数据兼容版本号([compatibility_version](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/change_log/3_1_1.html#id5))”为如下版本时: + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: * 3.1.0:本版本的数据兼容版本号依然为3.1.0,直接替换二进制即可完成升级 - * 3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/change_log/3_1_1.html#id5) + * 3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 @@ -38,11 +38,11 @@ ##### 查询数据兼容版本号(compatibility_version) -用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.1 +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.0 ``` [group0]: /apps> getSystemConfigByKey compatibility_version -3.0.1 +3.0.0 ``` ##### 替换节点二进制 @@ -51,7 +51,7 @@ ##### 设置数据兼容版本号(compatibility_version) -用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.1.0 +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.1.0 ``` [group0]: /apps> setSystemConfigByKey compatibility_version 3.1.0 diff --git a/3.x/zh_CN/docs/change_log/3_1_2.md b/3.x/zh_CN/docs/introduction/change_log/3_1_2.md similarity index 84% rename from 3.x/zh_CN/docs/change_log/3_1_2.md rename to 3.x/zh_CN/docs/introduction/change_log/3_1_2.md index db3b2c649..f9c7bd4ca 100644 --- a/3.x/zh_CN/docs/change_log/3_1_2.md +++ b/3.x/zh_CN/docs/introduction/change_log/3_1_2.md @@ -8,10 +8,10 @@ * 历史版本升级 - 需要升级的链的“数据兼容版本号([compatibility_version](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/change_log/3_1_2.html#id5))”为如下版本时: + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: * 3.1.0:本版本的数据兼容版本号依然为3.1.0,直接替换二进制即可完成升级 - * 3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/change_log/3_1_1.html#id5) + * 3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 @@ -31,11 +31,11 @@ ##### 查询数据兼容版本号(compatibility_version) -用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.1 +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.0 ``` [group0]: /apps> getSystemConfigByKey compatibility_version -3.0.1 +3.0.0 ``` ##### 替换节点二进制 @@ -44,7 +44,7 @@ ##### 设置数据兼容版本号(compatibility_version) -用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.1.0 +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.1.0 ``` [group0]: /apps> setSystemConfigByKey compatibility_version 3.1.0 diff --git a/3.x/zh_CN/docs/introduction/change_log/3_2_0.md b/3.x/zh_CN/docs/introduction/change_log/3_2_0.md new file mode 100644 index 000000000..7eb05aced --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_2_0.md @@ -0,0 +1,86 @@ +# v3.2.0 + +#### 新增 + +* CRUD 新增更多接口 +* 网关内白名单 +* 适配硬件加密机 +* 适配麒麟操作系统 +* 新增EVM的analysis缓存,降低大合约的执行开销 +* 出块时间可配置上限 +* 数据归档工具 +* tikv 读写工具 +* max支持手动部署 + +#### 更改 + +* 配置文件中重要字段去除默认值,必须在配置文件中进行配置 +* INFO 日志优化日志大小 + +#### 修复 + +* 超过3级跳转的消息路由问题 +* rpc sendTransaction接口的交易哈希校验问题 + +#### 兼容性 + +* 历史版本升级 + + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: + + * 3.2.0:数据完全兼容当前版本,直接替换二进制即可完成升级 + * 3.1.x/3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) + * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 + * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 + +* 组件兼容性 + +| | 推荐版本 | 最低版本 | 说明 | +| ---------- | --------- | ------------------------ | --------------------------------------- | +| Console | 3.2.0 | 3.0.0 | | +| Java SDK | 3.2.0 | 3.0.0 | | +| CPP SDK | 3.2.0 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | +| WeBASE | - | - | 存在兼容bug,建议升级节点二进制至3.2.1+ | +| WeIdentity | - | - | 存在兼容bug,建议升级节点二进制至3.2.1+ | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点**的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.2.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.2.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.2.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.2.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 diff --git a/3.x/zh_CN/docs/introduction/change_log/3_2_1.md b/3.x/zh_CN/docs/introduction/change_log/3_2_1.md new file mode 100644 index 000000000..c34f18f5d --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_2_1.md @@ -0,0 +1,72 @@ +# v3.2.1 + +#### 修复 + +* 修复使用`3.2.0`版本二进制将链版本号从`3.0.0`到`3.1.0`及以上的版本触发的BFS不可用、链执行不一致的问题 +* 修复`P2P`消息解析异常,导致网络断连的问题 +* 修复`StateStorage`读操作时提交,导致迭代器失效的问题 +* 修复`Pro`版本扩容操作没有生成节点私钥文件`node.pem`,扩容失败的问题 + +#### 兼容性 + +* 历史版本升级 + + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: + + * 3.2.1:数据完全兼容当前版本,直接替换二进制即可完成升级 + * 3.1.x/3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) + * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 + * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 + +* 组件兼容性 + +| | 推荐版本 | 最低版本 | 说明 | +| ---------- | ----------- | ------------------------ | ---------------------------------- | +| Console | 3.2.0 | 3.0.0 | | +| Java SDK | 3.2.0 | 3.0.0 | | +| CPP SDK | 3.2.0 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点**的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.2.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.2.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.2.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.2.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 + diff --git a/3.x/zh_CN/docs/introduction/change_log/3_2_2.md b/3.x/zh_CN/docs/introduction/change_log/3_2_2.md new file mode 100644 index 000000000..dac2fd64e --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_2_2.md @@ -0,0 +1,86 @@ +# v3.2.2 + +#### 新增 + +* 新增交易同步模式开关,支持3.1.x灰度升级至3.2.2版本([#3678](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3678)) + +#### 修复 + +* 修复交易同步在极端场景下P2P比RPC写交易池快的问题([#3683](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3683)) +* 调整scheduler模块中的日志等级([#3707](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3707)) + +#### 升级描述 + +* 升级节点可执行程序 + + 效果:修复bug,并带来稳定性、性能的提升 + + 操作:停止节点服务,升级节点可执行程序为当前版本,重启节点服务 + + 注意事项:推荐逐步替换可执行程序进行灰度升级 + + 支持升级的版本:v3.0.0+ + +* 升级链数据版本 + + 效果:可使用当前版本的最新特性 + + 操作:先完成升级所有节点可执行程序,再参考[文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/introduction/change_log/3_2_1.html#id5)发送交易升级链数据版本至 v3.2.2 + + 注意事项:务必备份原节点的所有账本数据,若操作失误造成升级失败,可通过原数据回滚到升级前的状态 + 支持升级的版本:v3.0.0+ + +* 组件兼容性 + + 请查阅[完整描述](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-2-2) + +| | 推荐版本 | 最低版本 | 说明 | +|------------|-------------|--------------------------|------------------------------------| +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | +| Console | 3.2.0 | 3.0.0 | | +| Java SDK | 3.2.2 | 3.0.0 | | +| CPP SDK | 3.2.2 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点**的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.2.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.2.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.2.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.2.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 + diff --git a/3.x/zh_CN/docs/introduction/change_log/3_2_3.md b/3.x/zh_CN/docs/introduction/change_log/3_2_3.md new file mode 100644 index 000000000..a0536d472 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_2_3.md @@ -0,0 +1,108 @@ +# v3.2.3 + +#### 新增 + +* [新增features功能,支持启用特定bug修复和新功能](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3749) +* [新增轻节点获取所有P2P节点信息接口](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3775) + +#### 修改 + +* [修改核心模块日志等级,减少不必要的error与warning日志](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3787) +* [CI检查设置openjdk版本为1.8.0.345](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3783) +* [修改共识节点在区块落后于最高块时,打印日志](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3744) + +#### 修复 + +* [MemoryStorage::getTxsHash 接口加锁,提升稳定性](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3789) +* [迁移3.4.0版本中对keypage的修复](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3702) +* [完善交易池清理失效交易逻辑,提升稳定性](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3774) +* [完善权限getMethodAuth接口参数为不存在合约的情况](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3823) +* [完善轻节点在国密模式下getBlockByNumber接口](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3750) +* [完善轻节点getAbi接口,提升稳定性](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3768) +* [修复清理打包交易逻辑](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3678) +* [修复同步区块可能出现死锁的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3751) +* [修复交易回滚只回滚一层跨合约调用的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3620) +* [修复存在交易池中且未设置为打包的交易可能出现重复打包的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3755) +* [修复共识checkPoint计时未被重置的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3760) +* [修复对时逻辑在初始化时未对比阈值导致区块打包时间非线性的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3776) +* [修复同步区块时长时间锁等待的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3807) + +#### 升级描述 + +* 升级节点可执行程序 + + 效果:修复bug,并带来稳定性、性能的提升 + + 操作:停止节点服务,升级节点可执行程序为当前版本,重启节点服务 + + 注意事项:推荐逐步替换可执行程序进行灰度升级 + + 支持升级的版本:v3.0.0+ + +* 升级链数据版本 + + 效果:可使用当前版本的最新特性 + + 操作:先完成升级所有节点可执行程序,再参考[文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/introduction/change_log/3_2_1.html#id5) + 发送交易升级链数据版本至 v3.2.3 + + 注意事项:务必备份原节点的所有账本数据,若操作失误造成升级失败,可通过原数据回滚到升级前的状态 + 支持升级的版本:v3.0.0+ + +* 组件兼容性 + + 请查阅[完整描述](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-2-2) + +| | 推荐版本 | 最低版本 | 说明 | +|------------|-------------|---------------------|-------------------| +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | +| Console | 3.2.0 | 3.0.0 | | +| Java SDK | 3.2.2 | 3.0.0 | | +| CPP SDK | 3.2.2 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey) +进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点** +的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey) +设置数据兼容版本号,如当前版本为3.2.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.2.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.2.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.2.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 + diff --git a/3.x/zh_CN/docs/introduction/change_log/3_2_4.md b/3.x/zh_CN/docs/introduction/change_log/3_2_4.md new file mode 100644 index 000000000..e83c8dc06 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_2_4.md @@ -0,0 +1,101 @@ +# v3.2.4 + +#### 新增 + +* [新增feature开关dmc2Serial,支持执行模式从dmc切换为串行模式](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3914) +* [新增节点只读开关](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3930) +* [新增允许非群组节点同步区块开关](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3937) +* [新增解决stateStorage_hash计算错误的bugfix](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3951) +* [新增控制启用rip功能的开关](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3970) +* [新增节点配置的getFeatureKeys功能](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4012) + +#### 修改 + +* [支持并修复evm中create2等操作码](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3787) +* [修改不必要的错误日志级别](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3981) + +#### 修复 + +* [修复自由节点同步区块过程中错误](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3942) +* [迁移3.5.0版本中对交易池同步dag的修复](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3861) +* [修复建链脚本build_chain.sh一些小问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3998) + +#### 升级描述 + +* 升级节点可执行程序 + + 效果:修复bug,并带来稳定性、性能的提升 + + 操作:停止节点服务,升级节点可执行程序为当前版本,重启节点服务 + + 注意事项:推荐逐步替换可执行程序进行灰度升级 + + 支持升级的版本:v3.0.0+ + +* 升级链数据版本 + + 效果:可使用当前版本的最新特性 + + 操作:先完成升级所有节点可执行程序,再参考[文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/introduction/change_log/3_2_1.html#id5) + 发送交易升级链数据版本至 v3.2.0 + + 注意事项:务必备份原节点的所有账本数据,若操作失误造成升级失败,可通过原数据回滚到升级前的状态 + 支持升级的版本:v3.0.0+ + +* 组件兼容性 + + 请查阅[完整描述](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-2-2) + +| | 推荐版本 | 最低版本 | 说明 | +|------------|-------------|---------------------|-------------------| +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | +| Console | 3.2.0 | 3.0.0 | | +| Java SDK | 3.2.2 | 3.0.0 | | +| CPP SDK | 3.2.2 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey) +进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点** +的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey) +设置数据兼容版本号,如当前版本为3.2.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.2.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.2.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.2.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 + diff --git a/3.x/zh_CN/docs/introduction/change_log/3_2_5.md b/3.x/zh_CN/docs/introduction/change_log/3_2_5.md new file mode 100644 index 000000000..d8caa60a8 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_2_5.md @@ -0,0 +1,85 @@ +# v3.2.5 + +#### 修复 + +* [修复build_chain脚本中安全漏洞的系统调用](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4039) +* [修复节点开启只读模式后收到AMOP消息报错的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4043) + +#### 升级描述 + +* 升级节点可执行程序 + + 效果:修复bug,并带来稳定性、性能的提升 + + 操作:停止节点服务,升级节点可执行程序为当前版本,重启节点服务 + + 注意事项:推荐逐步替换可执行程序进行灰度升级 + + 支持升级的版本:v3.0.0+ + +* 升级链数据版本 + + 效果:可使用当前版本的最新特性 + + 操作:先完成升级所有节点可执行程序,再参考[文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/introduction/change_log/3_2_1.html#id5) + 发送交易升级链数据版本至 v3.2.0 + + 注意事项:务必备份原节点的所有账本数据,若操作失误造成升级失败,可通过原数据回滚到升级前的状态 + 支持升级的版本:v3.0.0+ + +* 组件兼容性 + + 请查阅[完整描述](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html#fisco-bcos-v3-2-2) + +| | 推荐版本 | 最低版本 | 说明 | +|------------|-------------|---------------------|-------------------| +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | +| Console | 3.2.0 | 3.0.0 | | +| Java SDK | 3.2.2 | 3.0.0 | | +| CPP SDK | 3.2.2 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey) +进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点** +的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey) +设置数据兼容版本号,如当前版本为3.2.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.2.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.2.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.2.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/introduction/change_log/3_2_6.md b/3.x/zh_CN/docs/introduction/change_log/3_2_6.md new file mode 100644 index 000000000..3ccf2369d --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_2_6.md @@ -0,0 +1,84 @@ +# v3.2.6 + +#### 修复 + +* [调整p2p连接断连、重连和证书错误信息的日志级别](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4169) + +#### 升级描述 + +* 升级节点可执行程序 + + 效果:修复bug,并带来稳定性、性能的提升 + + 操作:停止节点服务,升级节点可执行程序为当前版本,重启节点服务 + + 注意事项:推荐逐步替换可执行程序进行灰度升级 + + 支持升级的版本:v3.0.0+ + +* 升级链数据版本 + + 效果:可使用当前版本的最新特性 + + 操作:先完成升级所有节点可执行程序,再参考[文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/introduction/change_log/3_2_1.html#id5) + 发送交易升级链数据版本至 v3.2.0 + + 注意事项:务必备份原节点的所有账本数据,若操作失误造成升级失败,可通过原数据回滚到升级前的状态 + 支持升级的版本:v3.0.0+ + +* 组件兼容性 + + 请查阅[完整描述](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/compatibility.html) + +| | 推荐版本 | 最低版本 | 说明 | +|------------|-------------|---------------------|-------------------| +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | +| Console | 3.2.0 | 3.0.0 | | +| Java SDK | 3.2.2 | 3.0.0 | | +| CPP SDK | 3.2.2 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey) +进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点** +的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey) +设置数据兼容版本号,如当前版本为3.2.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.2.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.2.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.2.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/introduction/change_log/3_3_0.md b/3.x/zh_CN/docs/introduction/change_log/3_3_0.md new file mode 100644 index 000000000..8deafeb35 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_3_0.md @@ -0,0 +1,86 @@ +# v3.3.0 + +#### 新增 + +* [块内分片](https://fisco-bcos-doc.readthedocs.io/zh_CN/release-3.3.0/docs/design/parallel/sharding.html):将合约分组,不同组的交易调度到不同执行器执行,片内DAG调度,片间DMC调度 +* [权限动态可配]():可在运行时动态关闭/开启权限功能 +* [SDK支持硬件加密机](https://fisco-bcos-doc.readthedocs.io/zh_CN/release-3.3.0/docs/design/hsm.html):SDK支持通过加密机运行密码学算法 +* [网关入限速](../../tutorial/air/config.md):通过配置文件 (config.ini) 控制入流量大小 +* [Merkle树缓存](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3430):提升取交易证明的性能 +* 网关模块支持多CA:不同的链可共用同一个网关模块转发消息,在目录下配置多个ca即可。 + +#### 修改 + +* 优化各种细节,提升节点性能 +* rpc的交易接口返回input字段:可在配置文件中控制是否需要返回 + +#### 修复 + +* 修复使用`3.3.0`版本二进制将链版本号从`3.0.0`到`3.1.0`及以上的版本触发的BFS不可用、链执行不一致的问题 +* 修复`P2P`消息解析异常,导致网络断连的问题 +* 修复`StateStorage`读操作时提交,导致迭代器失效的问题 +* 修复`Pro`版本扩容操作没有生成节点私钥文件`node.pem`,扩容失败的问题 +* 修复交易回执返回时,回执hash偶现不正确的问题 + +#### 兼容性 + +* 历史版本升级 + + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: + + * 3.3.x:数据完全兼容当前版本,直接替换二进制即可完成升级 + * 3.2.x、3.1.x、3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) + * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 + * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 + +* 组件兼容性 + +| | 推荐版本 | 最低版本 | 说明 | +| ---------- | ----------- | ------------------------ | ---------------------------------- | +| Console | 3.3.0 | 3.0.0 | | +| Java SDK | 3.3.0 | 3.0.0 | | +| CPP SDK | 3.3.0 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点**的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.3.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.3.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.3.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.3.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 diff --git a/3.x/zh_CN/docs/introduction/change_log/3_4_0.md b/3.x/zh_CN/docs/introduction/change_log/3_4_0.md new file mode 100644 index 000000000..1f2050a30 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_4_0.md @@ -0,0 +1,84 @@ +# v3.4.0 + +#### 新增 + +* [RPC支持带签名的Call接口](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3611) +* [P2P动态加载黑白名单](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3621) + +#### 修改 + +* [升级TBB版本到2021.8.0](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3656) +* [优化同步场景读写锁的互斥范围](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3650) + +#### 修复 + +* [修复在极端场景下偶现的同步失效的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3674) +* [修复交易回滚时只回滚部分合约的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3629) +* [修复viewchange时标记交易操作中返回值处理的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3654) +* [修复pro架构下断连场景中偶现的proxy为空的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3684) +* [修复AMOP回调析构的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3673) +* [修复BucketMap极端情况下的线程安全问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3666) +* [修复Session中反复创建多个task_group的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3662) +* [修复轻节点发送交易因为编码问题导致Response为空的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3670) +* [修复KeyPage在删空表中数据后可能触发的fatal](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3686) + +* 历史版本升级 + + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: + + * 3.4.x:数据完全兼容当前版本,直接替换二进制即可完成升级 + * 3.3.x、3.2.x、3.1.x、3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) + * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 + * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 + +**组件兼容性** + +| | 推荐版本 | 最低版本 | 说明 | +| ---------- | --------- | ------------------------ | ---------------------------------- | +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1| v3.0.0-rc.1 | | +| Console | 3.4.0 | 3.0.0 | | +| Java SDK | 3.4.0 | 3.0.0 | | +| CPP SDK | 3.4.0 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点**的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如当前版本为3.4.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.4.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.4.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.4.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 diff --git a/3.x/zh_CN/docs/introduction/change_log/3_5_0.md b/3.x/zh_CN/docs/introduction/change_log/3_5_0.md new file mode 100644 index 000000000..3be315080 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_5_0.md @@ -0,0 +1,138 @@ +# v3.5.0 + +#### 新增 + +* [新增rPBFT共识算法](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3602) +* [支持交易同步、区块同步的树状广播](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3630,) +* [新增Paillier预编译合约](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3757) +* [支持用tars rpc协议发交易](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3718) + +#### 修改 + +* [日志打印优化](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3845) + +#### 修复 + +* [修复交易池通知打包模块错误交易量的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3715) +* [修复共识模块Proposal验证漏洞以及CheckPoint的Timer计时问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3759) +* [修复共识模块Proposal验证失败未正确处理交易导致交易池积压交易的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3809) +* [修复call with sign接口在Pro架构的国密节点中验证失败的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3797) +* [修复代码覆盖率统计异常的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3777) +* [修复DAG执行时自锁的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3831) +* [同步3.2.x修复的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3899) +* [修复evm缓存失效的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3854) +* [修复gateway发送损坏消息包的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3825) +* [修复归档工具重导入时对abi字段的处理](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3820) +* [修复归档工具重导入时对nonce字段的处理](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3811) +* [build_chain.sh 建链脚本-l参数支持解析域名](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3931) +* [修复节点接收到USR1/USR2信号后导致boost log死锁问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3947) +* [修复取默克尔证明时阻塞rpc请求的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3955) + + +* 历史版本升级 + + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: + + * 3.4.x、3.5.x:数据完全兼容当前版本,直接替换二进制即可完成升级 + * 3.3.x、3.2.x、3.1.x、3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) + * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 + * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 + + +* 开启实验功能 + + 效果:通过feature开关控制实验功能的开启 + + 操作:升级节点可执行程序后,通过控制台命令`setSystemConfigByKey 1` 开启对应实验功能,具体操作见文档升级方法部分 + + 注意事项: + * feature操作不可逆,打开后不可关闭 + * 需确认所有可执行程序版本相同后,再进行feature开启操作 + +| | Feature 名 | 默认状态 | 说明 | +|---------|---------------------|------|--------------------------------------------| +| 块内分片 | feature_sharding | 关:0 | 默认关闭,仅在从3.3、3.4升级至当前版本时,feature_sharding打开 | +| 同态加密 | feature_paillier | 关:0 | 默认关闭 | +| rpbft共识 | feature_rpbft | 关:0 | 默认关闭 | +| bug修复 | bugfix_\ | 开:1 | 从低版本升级默认关闭 | + +**组件兼容性** + +| | 推荐版本 | 最低版本 | 说明 | +|------------|-------------|---------------------|-------------------| +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | +| Console | 3.5.0 | 3.0.0 | | +| Java SDK | 3.5.0 | 3.0.0 | | +| CPP SDK | 3.5.0 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey) +进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点** +的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey) +设置数据兼容版本号,如当前版本为3.5.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.5.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.5.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.5.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 + +##### 通过feature开关开启rpbft共识 + +通过控制台getSystemConfigByKey命令,查看当前rpbft的feature的状态 + +``` +[group0]: /apps> getSystemConfigByKey feature_rpbft +0 +``` + +通过setSystemConfigByKey 命令,开启rpbft的feature,启用rpbft共识 + +``` +[group0]: /apps> setSystemConfigByKey feature_rpbft 1 +{ + "code":0, + "msg":"success" +} +``` + +通过控制台getSystemConfigByKey命令,查看当前rpbft的feature是否已开启,feature的值为1表示已开启 + +``` +[group0]: /apps> getSystemConfigByKey feature_rpbft +1 +``` \ No newline at end of file diff --git a/3.x/zh_CN/docs/introduction/change_log/3_6_0.md b/3.x/zh_CN/docs/introduction/change_log/3_6_0.md new file mode 100644 index 000000000..9577568fa --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_6_0.md @@ -0,0 +1,129 @@ +# v3.6.0 + +#### 新增 + +* [sdk新增交易流程的编解码接口](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4035) +* [建链脚本build_chain.sh支持直接搭建pro/max区块链](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/3994) +* [新增日志配置项,支持日志归档与压缩](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4184) + +#### 修复 + +* [opcode对齐以太坊的执行行为](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4221) +* [修复dmc只回滚部分状态的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4214) +* [网络连接支持配置hostname](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4200) +* [修复交易池交易MarkTxs失败的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4198) +* [修复feature升级时bugfix启用的bug](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4222) +* [修复轻节点创世块校验失败无法同步的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4170) + + +* 历史版本升级 + + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: + + * 3.4.x、3.5.x,3.6.x:数据完全兼容当前版本,直接替换二进制即可完成升级 + * + 3.3.x、3.2.x、3.1.x、3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) + * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 + * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 + + +* 开启实验功能 + + 效果:通过feature开关控制实验功能的开启 + + 操作:升级节点可执行程序后,通过控制台命令`setSystemConfigByKey 1` 开启对应实验功能,具体操作见文档升级方法部分 + + 注意事项: + * feature操作不可逆,打开后不可关闭 + * 需确认所有可执行程序版本相同后,再进行feature开启操作 + +| | Feature 名 | 默认状态 | 说明 | +|-----------|----------------------------|------|--------------------------------------------| +| 资产管理 | feature_balance | 关:0 | 默认关闭 | +| 资产操作预编译合约 | feature_balance_precompile | 关:0 | 默认关闭 | +| 计费模式 | feature_policy1 | 关:0 | 默认关闭 | +| 块内分片 | feature_sharding | 关:0 | 默认关闭,仅在从3.3、3.4升级至当前版本时,feature_sharding打开 | +| 同态加密 | feature_paillier | 关:0 | 默认关闭 | +| rpbft共识 | feature_rpbft | 关:0 | 默认关闭 | +| bug修复 | bugfix_\ | 开:1 | 从低版本升级默认关闭 | + +**组件兼容性** + +| | 推荐版本 | 最低版本 | 说明 | +|------------|-------------|---------------------|-------------------| +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | +| Console | 3.6.0 | 3.0.0 | | +| Java SDK | 3.6.0 | 3.0.0 | | +| CPP SDK | 3.6.0 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey) +进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点** +的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey) +设置数据兼容版本号,如当前版本为3.6.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.6.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.6.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.6.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 + +##### 通过feature开关开启balance资产管理 + +通过控制台getSystemConfigByKey命令,查看当前资产管理的feature的状态 + +``` +[group0]: /apps> getSystemConfigByKey feature_balance +0 +``` + +通过setSystemConfigByKey 命令,开启资产管理的feature,启用账户balance + +``` +[group0]: /apps> setSystemConfigByKey feature_balance 1 +{ + "code":0, + "msg":"success" +} +``` + +通过控制台getSystemConfigByKey命令,查看当前资产管理的feature是否已开启,feature的值为1表示已开启 + +``` +[group0]: /apps> getSystemConfigByKey feature_balance +1 +``` \ No newline at end of file diff --git a/3.x/zh_CN/docs/introduction/change_log/3_6_1.md b/3.x/zh_CN/docs/introduction/change_log/3_6_1.md new file mode 100644 index 000000000..8341d1e0f --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_6_1.md @@ -0,0 +1,95 @@ +# v3.6.1 + +#### 修复 + +* [修复DagTransfer的兼容问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4245) +* [开启网络层限流](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4241) +* [修复keyPage哈希不一致的兼容问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4230) +* [internalCreate复用现有部署合约逻辑](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4243) + + +* 历史版本升级 + + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: + + * 3.4.x、3.5.x,3.6.x:数据完全兼容当前版本,直接替换二进制即可完成升级 + * + 3.3.x、3.2.x、3.1.x、3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) + * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 + * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 + + +* 开启实验功能 + + 效果:通过feature开关控制实验功能的开启 + + 操作:升级节点可执行程序后,通过控制台命令`setSystemConfigByKey 1` 开启对应实验功能,具体操作见文档升级方法部分 + + 注意事项: + * feature操作不可逆,打开后不可关闭 + * 需确认所有可执行程序版本相同后,再进行feature开启操作 + +| | Feature 名 | 默认状态 | 说明 | +|-----------|----------------------------|------|--------------------------------------------| +| 资产管理 | feature_balance | 关:0 | 默认关闭 | +| 资产操作预编译合约 | feature_balance_precompile | 关:0 | 默认关闭 | +| 计费模式 | feature_policy1 | 关:0 | 默认关闭 | +| 块内分片 | feature_sharding | 关:0 | 默认关闭,仅在从3.3、3.4升级至当前版本时,feature_sharding打开 | +| 同态加密 | feature_paillier | 关:0 | 默认关闭 | +| rpbft共识 | feature_rpbft | 关:0 | 默认关闭 | +| bug修复 | bugfix_\ | 开:1 | 从低版本升级默认关闭 | + +**组件兼容性** + +| | 推荐版本 | 最低版本 | 说明 | +|------------|-------------|---------------------|-------------------| +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | +| Console | 3.6.0 | 3.0.0 | | +| Java SDK | 3.6.0 | 3.0.0 | | +| CPP SDK | 3.6.0 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey) +进行查询,如当前返回的版本为3.0.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.0 +``` + +##### 替换节点二进制 + +需将**所有节点** +的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey) +设置数据兼容版本号,如当前版本为3.6.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.6.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.6.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.6.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 diff --git a/3.x/zh_CN/docs/introduction/change_log/3_7_0.md b/3.x/zh_CN/docs/introduction/change_log/3_7_0.md new file mode 100644 index 000000000..f41d02be7 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/3_7_0.md @@ -0,0 +1,100 @@ +# v3.7.0 + +#### 新增 + +* [交易数据结构新增memo字段](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4253) + +#### 修复 + +* [更新 tikv_client/bcos-wasm/wedprcrypto和rust工具链版本](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4255) +* [更新TASSL以解决mac上的编译问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4289) +* [修复已部署空abi,部署相同的合约getABI失败的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4276) +* [修复开启合约部署权限后账户资产转移受限的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4252) +* [修复build_chain.sh一键搭建pro/max区块链过程中安装python失败的问题](https://github.com/FISCO-BCOS/FISCO-BCOS/pull/4307) + + +* 历史版本升级 + + 需要升级的链的“数据兼容版本号([compatibility_version](#id5))”为如下版本时: + + * 3.4.x、3.5.x,3.6.x、3.7.x:数据完全兼容当前版本,直接替换二进制即可完成升级 + * + 3.3.x、3.2.x、3.1.x、3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见[文档](#id5) + * 3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版 + * 2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本 + + +* 开启实验功能 + + 效果:通过feature开关控制实验功能的开启 + + 操作:升级节点可执行程序后,通过控制台命令`setSystemConfigByKey 1` 开启对应实验功能,具体操作见文档升级方法部分 + + 注意事项: + * feature操作不可逆,打开后不可关闭 + * 需确认所有可执行程序版本相同后,再进行feature开启操作 + +| | Feature 名 | 默认状态 | 说明 | +|-----------|----------------------------|------|--------------------------------------------| +| 资产管理 | feature_balance | 关:0 | 默认关闭 | +| 资产操作预编译合约 | feature_balance_precompile | 关:0 | 默认关闭 | +| 计费模式 | feature_policy1 | 关:0 | 默认关闭 | +| 块内分片 | feature_sharding | 关:0 | 默认关闭,仅在从3.3、3.4升级至当前版本时,feature_sharding打开 | +| 同态加密 | feature_paillier | 关:0 | 默认关闭 | +| rpbft共识 | feature_rpbft | 关:0 | 默认关闭 | +| bug修复 | bugfix_\ | 开:1 | 从低版本升级默认关闭 | + +**组件兼容性** + +| | 推荐版本 | 最低版本 | 说明 | +|------------|-------------|---------------------|-------------------| +| WeBASE | 3.0.2 | 3.0.2 | | +| WeIdentity | v3.0.0-rc.1 | v3.0.0-rc.1 | | +| Console | 3.7.0 | 3.0.0 | | +| Java SDK | 3.7.0 | 3.0.0 | | +| CPP SDK | 3.7.0 | 3.0.0 | | +| Solidity | 0.8.11 | 最低 0.4.25,最高 0.8.11 | 需根据合约版本下载编译器(控制台) | +| WBC-Liquid | 1.0.0-rc3 | 1.0.0-rc3 | | + +#### 升级方法 + +该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。 + +##### 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey) +进行查询,如当前返回的版本为3.6.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.6.0 +``` + +##### 替换节点二进制 + +需将**所有节点** +的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +##### 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey) +设置数据兼容版本号,如当前版本为3.7.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.7.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.7.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.7.0 +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 diff --git a/3.x/zh_CN/docs/introduction/change_log/feature_bugfix_list.md b/3.x/zh_CN/docs/introduction/change_log/feature_bugfix_list.md new file mode 100644 index 000000000..a6487b604 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/feature_bugfix_list.md @@ -0,0 +1,33 @@ +# feature and bugfix list + +本文档归档了FISCO BCOS 3.0+ 版本所有的feature功能开关和bugfix列表,随版本更新持续更新。 + +## 1. feature功能开关 + +| | Feature 名 | 默认状态 | 说明 | +|-----------|----------------------------|------|--------------------------------------------| +| 资产管理 | feature_balance | 关:0 | 默认关闭 | +| 资产操作预编译合约 | feature_balance_precompile | 关:0 | 默认关闭 | +| 计费模式 | feature_policy1 | 关:0 | 默认关闭 | +| 块内分片 | feature_sharding | 关:0 | 默认关闭,仅在从3.3、3.4升级至当前版本时,feature_sharding打开 | +| 同态加密 | feature_paillier | 关:0 | 默认关闭 | +| rpbft共识 | feature_rpbft | 关:0 | 默认关闭 | +| dmc切换至串行 | feature_dmc2serial | 关:0 | 默认关闭 | + +## 2. bugfix列表 + +| | bugfix 名 | 默认状态 | 说明 | +|----------------------------|-----------------------------------------------------|------|------------------------| +| 修复串行模式下回滚时不回滚子合约的bug | bugfix_revert | 开启:1 | 3.2.3、3.5.0 默认开启 | +| 修复stateStorage_hash计算错误的问题 | bugfix_statestorage_hash | 开启:1 | 3.2.4、3.5.0、3.6.0 默认开启 | +| 适配以太坊的调用行为 | bugfix_evm_create2_delegatecall_staticcall_codecopy | 开启:1 | 3.2.4、3.6.0 默认开启 | +| 修复抛出事件的顺序问题 | bugfix_event_log_order | 开启:1 | 3.2.7、 3.6.0 默认开启 | +| 修复call没有地址返回的问题 | bugfix_call_noaddr_return | 开启:1 | 3.2.7、3.6.0 默认开启 | +| 修复预编译合约算哈希与以太坊不同的问题 | bugfix_precompiled_codehash | 开启:1 | 3.2.7、3.6.0 默认开启 | +| 修复dmc模式下回滚时不回滚子合约的bug | bugfix_dmc_revert | 开启:1 | 3.2.7、3.6.0 默认开启 | +| 修复keyPage哈希不一致的兼容问 | bugfix_keypage_system_entry_hash | 开启:1 | 3.6.1 默认开启 | +| InternalCreate复用现有部署合约逻辑 | bugfix_internal_create_redundant_storage | 开启:1 | 3.6.1 默认开启 | +| 修复开启合约部署权限后资产转移受限问题 | bugfix_internal_create_permission_denied | 开启:1 | 3.7.0 默认开启 | +| 修复块内分片合约调用合约的问题 | bugfix_sharding_call_in_child_executive | 开启:1 | 3.7.0 默认开启 | +| 修复已部署空abi,部署相同的合约无abi的问题 | bugfix_empty_abi_reset | 开启:1 | 3.7.0 默认开启 | +| 修复无法通过eip55类型的合约地址调用合约的问题 | bugfix_eip55_addr | 开启:1 | 3.7.0 默认开启 | \ No newline at end of file diff --git a/3.x/zh_CN/docs/introduction/change_log/index.rst b/3.x/zh_CN/docs/introduction/change_log/index.rst new file mode 100644 index 000000000..20dff4b33 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/index.rst @@ -0,0 +1,306 @@ +############################################################## +4. 版本说明 +############################################################## + +标签:``版本特性`` ``Release Note`` + +------------ + +.. important:: + 相关软件和环境版本说明!`请查看 `_ + +升级指南 +------------ +FISCO BCOS 版本迭代,支持版本之间的兼容升级,支持可灰度升级,且灰度升级过程中,系统可以正常共识、出块。详情可参考 `升级指南 <./upgrade.html>`_ 。 + +FISCO BCOS 设计 Feature控制特性功能开启关闭,用户可以根据自己的需求,按需选择开启。通过bugfix修复一些具备兼容性问题的bug。详情可参考 `Feature and Bugfix List <./feature_bugfix_list.html>`_ 。 + + +.. toctree:: + :hidden: + :maxdepth: 0 + + upgrade.md +v3.7.x +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.7.0 <./3_7_0.html>`_ [`release `_] + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` + - 查看轻节点二进制版本:``../fisco-bcos-lightnode --version`` + - 查看轻节点相关文档,请参考 [`轻节点搭建工具 `_] + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_7_0.md + +v3.6.x +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.6.0 <./3_6_0.html>`_ [`release `_] + - `FISCO BCOS v3.6.1 <./3_6_1.html>`_ [`release `_] + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` + - 查看轻节点二进制版本:``../fisco-bcos-lightnode --version`` + - 查看轻节点相关文档,请参考 [`轻节点搭建工具 `_] + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_6_0.md + 3.6.1.md + +v3.5.x +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.5.0 <./3_5_0.html>`_ [`release `_] + + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` + - 查看轻节点二进制版本:``../fisco-bcos-lightnode --version`` + - 查看轻节点相关文档,请参考 [`轻节点搭建工具 `_] + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_5_0.md + +v3.4.x +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.4.0 <./3_4_0.html>`_ [`release `_] + + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` + - 查看轻节点二进制版本:``../fisco-bcos-lightnode --version`` + - 查看轻节点相关文档,请参考 [`轻节点搭建工具 `_] + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_4_0.md + +v3.3.x +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.3.0 <./3_3_0.html>`_ [`release `_] + + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` + - 查看轻节点二进制版本:``../fisco-bcos-lightnode --version`` + - 查看轻节点相关文档,请参考 [`轻节点搭建工具 `_] + + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_3_0.md + + + +v3.2.x +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + - `FISCO BCOS v3.2.6 <./3_2_6.html>`_ [`release `_] + - `FISCO BCOS v3.2.5 <./3_2_5.html>`_ [`release `_] + - `FISCO BCOS v3.2.4 <./3_2_4.html>`_ [`release `_] + - `FISCO BCOS v3.2.3 <./3_2_3.html>`_ [`release `_] + - `FISCO BCOS v3.2.2 <./3_2_2.html>`_ [`release `_] + - `FISCO BCOS v3.2.1 <./3_2_1.html>`_ [`release `_] + - `FISCO BCOS v3.2.0 <./3_2_0.html>`_ [`release `_] + + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` + - 查看轻节点二进制版本:``../fisco-bcos-lightnode --version`` + - 查看轻节点相关文档,请参考 [`轻节点搭建工具 `_] + + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_2_6.md + 3_2_5.md + 3_2_4.md + 3_2_3.md + 3_2_2.md + 3_2_1.md + 3_2_0.md + +v3.1.x +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.1.2 <./3_1_2.html>`_ [`release `_] + - `FISCO BCOS v3.1.1 <./3_1_1.html>`_ [`release `_] + - `FISCO BCOS v3.1.0 <./3_1_0.html>`_ [`release `_] + + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` + + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_1_2.md + 3_1_1.md + 3_1_0.md + +v3.0.x +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.0.1 <./3_0_1.html>`_ [`release `_] + - `FISCO BCOS v3.0.0 <./3_0_0.html>`_ [`release `_] + + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` + + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_0_1.md + 3_0_0.md + +v3.0.0-rc4 +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.0.0-rc4 <./3_0_0_rc4.html>`_ [`release `_] + + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + - 查看Max版本FISCO BCOS节点二进制版本:``./BcosMaxNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version``, ``./BcosExecutorService --version`` + + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_0_0_rc4.md + + +v3.0.0-rc3 +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.0.0-rc3 <./3_0_0_rc3.html>`_ [`release `_] + + - v3.0.0-rc3不包括 ``FISCO BCOS Max`` 版本,Max版本的FISCO BCOS会在后续版本中推出 + + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_0_0_rc3.md + + +v3.0.0-rc2 +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.0.0-rc2 <./3_0_0_rc2.html>`_ [`release `_] + + - v3.0.0-rc2不包括 ``FISCO BCOS Max`` 版本,Max版本的FISCO BCOS会在后续版本中推出 + + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_0_0_rc2.md + + + +v3.0.0-rc1 +------------------ + +.. admonition:: FISCO BCOS 3.x Releases + + - `FISCO BCOS v3.0.0-rc1 <./3_0_0_rc1.html>`_ [`release `_] + + - v3.0.0-rc1不包括 ``FISCO BCOS Max`` 版本,Max版本的FISCO BCOS会在后续版本中推出 + +.. admonition:: 查看节点和数据版本 + + - 查看Air版本FISCO BCOS节点二进制版本:``./fisco-bcos --version`` + - 查看Pro版本FISCO BCOS节点二进制版本:``./BcosNodeService --version``, ``./BcosRpcService --version``, ``./BcosGatewayService --version`` + +.. toctree:: + :hidden: + :maxdepth: 0 + + 3_0_0_rc1.md diff --git a/3.x/zh_CN/docs/introduction/change_log/upgrade.md b/3.x/zh_CN/docs/introduction/change_log/upgrade.md new file mode 100644 index 000000000..3956ec0b7 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/change_log/upgrade.md @@ -0,0 +1,25 @@ +# 版本升级指南 +FISCO BCOS 版本迭代,为支持版本之间的兼容升级,设计了[兼容性方案](../design/compatibility.md), 支持可灰度升级,且灰度升级过程中,系统可以正常共识、出块。 + +具体系统版本升级步骤如下: +1. 升级二进制:停止需要升级版本的节点,需将所有节点的二进制逐步替换为当前版本。为不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。 +2. 升级数据兼容版本号:当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本,步骤如下: +- 通过控制台连接节点,执行升级兼容版本号命令:```setSystemConfigByKey compatibility_version 3.x.x``` + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.x.x +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` +- 设置成功,再次查询,得到当前版本已升级 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.x.x +``` + +当前链已经完成升级,至此,**链开始以新的逻辑继续运行**,并支持了新的特性。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/introduction/function_overview.md b/3.x/zh_CN/docs/introduction/function_overview.md new file mode 100644 index 000000000..a8a615ba1 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/function_overview.md @@ -0,0 +1,71 @@ +# 3. 功能概览 +标签: ``功能概览`` + +----- + +FISCO BCOS为了支撑海量服务的需求,v3.0稳定版从系统架构、处理流程、执行、存储上进行了相应的设计,并推出3种不同形态满足不同区块链部署场景的差异化需求。功能概览如下: + +|**整体架构** | | +| - | - | +| 架构模型 | 灵活自适应的区块链框架,目前包括轻量级的Air版本、适用于复杂业务场景的Pro版本以及可扩展的Max版本| +| 群组架构 | 支持链内动态扩展多群组| +| 分布式存储 | 支持海量数据存储| +| 并行计算 | 支持基于DAG(有向无环图)、DMC(确定性合约并行算法)与块内分片技术 | +| 节点类型 | 共识节点、观察节点、轻节点 | +| 计算模型 | 排序-执行-验证 | +| **系统性能** || +| 峰值TPS | 10万+ TPS(PBFT)| +| 交易确认时延 | 秒级| +| **硬件推荐配置** || +| CPU | 2.4GHz * 8核| +| 内存 | 8GB | +| 存储 | 4TB | +| 网络带宽| 10Mb | +| **账本模型** || +| 数据结构 | 链式结构,区块通过哈希链相连| +| 是否分叉|不分叉| +| 记账类型 | 账户模型(非UTXO)| +| **共识算法** || +| 共识框架 | 可插拔设计 | +| 共识算法 | PBFT | +| **存储引擎** || +| 存储设计 | 支持KV和SQL | +| 引擎类型 | 支持rocksdb和TikvDB| +| CRUD接口 | 提供CRUD接口访问链上数据 | +| **网络协议** || +| 节点间通信 | P2P协议 | +| 客户端与节点通信 | WebSocket协议 | +| 消息订阅服务 | AMOP协议 | +| **智能合约** || +|合约引擎| 支持WASM和EVM| +|合约语言| 支持Solidity, C++和WBC-Liquid| +|引擎特点| 图灵完备,沙盒运行 | +|版本控制| 基于BFS支持多版本合约 | +| **密码算法和协议** || +| 国密算法 | 支持 | +| 国密SSL | 支持 | +| 哈希算法 | Keccak256、SM3 | +| 对称加密算法 | AES、SM4 | +| 非对称加密算法 |ECDSA、SM2| +| 非对称加密椭圆曲线|secp256k1、sm2p256v1| +| **安全控制** || +|通信安全| 支持全流程SSL | +|准入安全| 基于PKI身份认证体系 | +|证书管理| 支持证书颁发、撤销、更新| +|权限控制| 支持细粒度权限控制| +| **隐私保护** || +|物理隔离| 群组间数据隔离 | +|场景化隐私保护机制|基于[WeDPR](https://github.com/WeBankBlockchain/WeDPR-Lab-Core)支持隐匿支付、匿名投票、匿名竞拍、选择性披露等场景| +| **跨链协议** || +|SPV|提供获取SPV证明的接口| +|跨链协议|基于[WeCross](https://github.com/WeBankBlockchain/WeCross)支持同构、异构跨链| +| **开发支持** || +|开发建链工具|提供[Air版本区块链部署工具](../tutorial/air/build_chain.html), [Pro版本区块链部署工具](../tutorial/pro/pro_builder.html)和[Maxb版本区块链部署工具](../tutorial/max/max_builder.html)| +|合约部署与测试工具|交互式控制台 [基于Java SDK的控制台](../operation_and_maintenance/console/index.html)| +|SDK语言|[Java(推荐使用)](../sdk/java_sdk/index.html)、[Go](../sdk/go_sdk/index.html)、[Python](../sdk/python_sdk/index.html)、[C++](../sdk/cpp_sdk/index.html)、[C](../sdk/c_sdk/index.html)、[Rust](../sdk/rust_sdk/index.html)(待适配语言:Node.js、C#、iOS、Android)| +|快速开发组件|提供[Spring-boot-starter](https://github.com/FISCO-BCOS/spring-boot-starter)、[Spring-boot-crud](https://github.com/FISCO-BCOS/spring-boot-crud)| +| **运维支持** || +|动态管理节点|支持动态新增、剔除、变更节点| +|动态更改配置|支持动态变更系统配置| +|数据备份与恢复|提供数据导出与恢复服务组件| +|监控统计|输出统计日志,提供监控工具| \ No newline at end of file diff --git a/3.x/zh_CN/docs/introduction/introduction.md b/3.x/zh_CN/docs/introduction/introduction.md new file mode 100644 index 000000000..b996661c9 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/introduction.md @@ -0,0 +1,24 @@ +# 1. FISCO BCOS 区块链 + +标签:``FISCO BCOS介绍`` + +--- + +FISCO BCOS是由深圳市金融区块链发展促进会(以下简称“金链盟”)开源工作组牵头研发的金融级、国产安全可控的区块链底层平台。作为最早开源的国产联盟链底层平台之一,FISCO BCOS于2017年面向全球开源。 + +开源六周年至今,FISCO BCOS开源社区在技术创新、应用产业以及开源生态均取得了非凡成绩。 + +FISCO BCOS持续攻关核心关键技术,单链性能突破10万TPS。首创DMC算法大幅度提升性能、推出三种架构形态灵活适配业务需求;全链路国产化,采用国密算法与软硬件体系,支持国产OS,适配国产芯片和服务器,支持多语言多终端国密接入。拥有覆盖底层+中间件+应用组件的丰富周边组件。 + +底层平台可用性已经广泛应用实践检验,支撑政务、金融、医疗、双碳、跨境数据流通等关乎国计民生的重点领域落地超过400个标杆应用,在助力实体经济发展、促进公平与可持续等方面贡献力量。 + +社区以开源链接多方,截止2023年12月,围绕FISCO BCOS构建的国产开源联盟链生态圈已汇聚了超过5000家机构、超10万名个人成员,以及50家认证合作伙伴、500余名核心贡献者。社区认证了63位FISCO BCOS MVP, 发展了12个专项兴趣小组SIG,此外与上百所知名院校开展人才共育合作,培育区块链产业人才超8万人次,已发展成为最大最活跃的国产开源联盟链生态圈之一。 + + +- [六年共生共进 缔造雨林生态 | FISCO BCOS开源六周年成绩单](https://mp.weixin.qq.com/s/VVxRQaRJrwqZqOIgzpN3bQ) + +- [FISCO BCOS MVP 名单](https://mp.weixin.qq.com/s/TBo4SLkgY7HSVZoyuR6prQ) + +- [FISCO BCOS 2023年度贡献者榜单](https://mp.weixin.qq.com/s/PzGTa7BFixK1tynFgI3eMA) + +![](../../images/introduction/6th_anniversary_report_card.jpeg) diff --git a/3.x/zh_CN/docs/introduction/key_feature.md b/3.x/zh_CN/docs/introduction/key_feature.md new file mode 100644 index 000000000..068397ba9 --- /dev/null +++ b/3.x/zh_CN/docs/introduction/key_feature.md @@ -0,0 +1,53 @@ +# 2. 关键特性 + +标签:``关键特性`` + +**Air 、Pro、Max:可部署为三种架构形态** + +- **轻便Air版**:拥有与 v2.0版本相同的形态,所有功能在一个区块链节点中(all-in-one)。该架构简单,可快速部署在任意环境中。你可以用它进行区块链入门、开发、测试、POC验证等工作。 +- **专业Pro版**:该架构通过将区块链节点的接入层模块独立为进程,在实现接入层与核心模块分区部署的同时,让区块链核心功模块以多群组方式扩展。该架构实现了分区隔离,可应对将来可能的业务拓展,适合有持续业务扩展的生产环境。 +- **大容量Max版**:该架构在Pro版的基础上提供链的核心模块主备切换的能力,并可通过多机部署交易执行器和接入分布式存储TiKV,实现计算与存储的平行拓展。该架构中的一个节点由一系列微服务组成,但它依赖较高的运维能力,适合需要海量计算和存储的场景。 + +**Pipeline:区块流水线,连续且紧凑地生成区块** + +- 区块生成过程可拆分成四个阶段:打包、共识、执行、落盘。在过往设计中,系统需等待上一个区块完成四个阶段后才可进入下一个区块的生成。本版本采用流水线设计,让相邻区块的四个阶段前后交叠在一起,减少区块间的等待时间,提高连续出块速度。如:区块103在打包的同时,102在共识,101在执行,100在落盘。[相关文档:两阶段并行拜占庭共识](../design/consensus/consensus.md) + +**DMC实现交易处理性能的多机拓展** + +- 在传统设计中,交易执行只可单机进行。v3.0稳定版采用独创的确定性多合约并行方案(Deterministic Multi-Contract,简称DMC),能够在系统运行时自动进行交易冲突处理,并将多个交易调度到不同机器中并行执行,用户可通过拓展计算实例实现交易处理性能的平行拓展。[相关文档:确定性多合约并行](../design/parallel/DMC.md) + +**+TiKV:分布式事务性提交,支撑海量存储** + +- v3.0稳定版集成TiKV存储引擎,并且在其基础上二次开发,支持分布式事务性提交,结合DMC多计算实例,充分发挥存储性能,支撑海量数据上链。同时,本版本引入KeyPage机制,参考内存页的缓存机制,将key-value组织成页的方式存取,解决了以往采用key-value的方式存储数据时,存储数据零散的问题,提升数据访问局部性,更适合大批量数据存取。[相关文档:基于事务的存储模块](../design/storage/storage.md) + +**区块链文件系统:所见即所得的合约数据管理** + +- 支持通过区块链文件系统管理链上资源,可像操作文件系统一样管理链上的合约,并通过合约的路径进行调用,命令包括:pwd、cd、ls、tree、mkdir、ln。用户可以通过控制台体验该功能。[相关文档:区块链合约文件系统](../design/contract_directory.md) + +**SDK基础库:更方便的全平台国密接入** + +- v3.0稳定版构建了通用国密基础组件,将国密算法、国密通信协议、国产密码机接入协议与FISCO BCOS的区块链基础数据结构封装于其中,基于该基础组件可快速开发出不同平台、不同操作系统和不同编程语言的SDK,大大提升研发效率。[相关文档:多语言SDK](../sdk/index.md) + +**交易并行冲突分析工具:自动生成交易冲突变量** + +- 在v2.0版本中要实现并行交易,需要在写合约时手动指定交易冲突变量。本版本引入了交易并行冲突分析工具,写合约时无需手动指定交易冲突变量,只需关注自身代码实现,合约编译时工具自动生成交易冲突变量,相应的交易即可自动并行执行。 + +**WBC-Liquid:用Rust写合约** + +- 除支持Soldity语言外,本版本也支持用Rust写合约。WBC-Liquid是微众区块链开发的基于Rust的智能合约编程语言,借助Rust语言特性,能够实现比Solidity语言更强大的编程功能。[相关文档:Liquid 在线文档](https://liquid-doc.readthedocs.io/zh_CN/latest/) + +**权限治理框架:多方投票治理区块链** + +- 本版本内置权限治理框架,直接从区块链实现层提供有效的权限控制。开启权限治理功能后,对区块链的修改需进行多方投票的授权。基于该框架,区块链参与者们能够定制区块链上的治理策略并通过投票的方式不断迭代更新。[相关文档:权限治理体系设计](../design/committee_design.md) + +**特性继承与升级** + +v3.0稳定版也继承了 v2.0版本的诸多重要特性并进行升级,包括: + +- PBFT共识算法:立即一致的共识算法,实现交易秒级确认 +- Solidity:支持至0.8.11版本 +- CRUD:采用表结构存储数据,本版本中封装了更易用的接口,对业务开发更友好 +- AMOP:链上信使协议,借助区块链的P2P网络实现信息传输,实现接入区块链的应用间数据通信 +- 落盘加密:区块链节点的私钥和数据加密存储于物理硬盘中,物理硬件丢失也无法解密 +- 密码算法:内置群环签名等密码算法,可支持各种安全多方计算场景 +- 区块链监控:实现区块链状态的实时监控与数据上报 diff --git a/3.x/zh_CN/docs/manual/certificate_list.md b/3.x/zh_CN/docs/manual/certificate_list.md new file mode 100644 index 000000000..f97b824fd --- /dev/null +++ b/3.x/zh_CN/docs/manual/certificate_list.md @@ -0,0 +1,332 @@ +# 配置CA黑白名单 + +标签:``CA黑白名单`` ``开发手册`` ``拒绝连接`` + +---- + +本文档描述CA黑、白名单的实践操作,建议阅读本操作文档前请先行了解[《CA黑白名单介绍》](../design/security_control/certificate_list.md)。 + +## 黑名单 + +通过配置黑名单,能够拒绝与指定的节点连接。 + +**配置方法** + +编辑`config.ini` + +``` ini +[certificate_blacklist] + ; crl.0 should be nodeid, nodeid's length is 128 + ;crl.0= +``` + +重启节点生效 + +``` shell +$ bash stop.sh && bash start.sh +``` + +查看节点连接 + +``` shell +$ curl -X POST --data '{"jsonrpc":"2.0","method":"getPeers","params":[1],"id":1}' http://127.0.0.1:8545 |jq +``` + +## 白名单 + +通过配置白名单,能够只与指定的节点连接,拒绝与白名单之外的节点连接。 + +**配置方法** + +编辑`config.ini`,**不配置表示白名单关闭,可与任意节点建立连接。** + +```ini +[certificate_whitelist] + ; cal.0 should be nodeid, nodeid's length is 128 + cal.0=7718df20f0f7e27fdab97b3d69deebb6e289b07eb7799c7ba92fe2f43d2efb4c1250dd1f11fa5b5ce687c8283d65030aae8680093275640861bc274b1b2874cb + cal.1=f306eb1066ceb9d46e3b77d2833a1bde2a9899cfc4d0433d64b01d03e79927aa60a40507c5739591b8122ee609cf5636e71b02ce5009f3b8361930ecc3a9abb0 +``` + +若节点未启动,则直接启动节点,若节点已启动,可直接用脚本`reload_whitelist.sh`刷新白名单配置即可(暂不支持动态刷新黑名单)。 + +```shell +# 若节点未启动 +$ bash start.sh +# 若节点已启动 +$ cd scripts +$ bash reload_whitelist.sh +node_127.0.0.1_30300 is not running, use start.sh to start and enable whitelist directlly. +``` + +查看节点连接 + +```shell +$ curl -X POST --data '{"jsonrpc":"2.0","method":"getPeers","params":[1],"id":1}' http://127.0.0.1:8545 |jq +``` + +## 使用场景:公共CA + +所有用CFCA颁发证书搭的链,链的CA都是CFCA。此CA是共用的。必须启用白名单功能。使用公共CA搭的链,会存在两条链共用同一个CA的情况,造成无关的两条链的节点能彼此建立连接。此时需要配置白名单,拒绝与无关的链的节点建立连接。 + +**搭链操作步骤** + +1. 用工具搭链 +2. 查询所有节点的NodeID +3. 将所有NodeID配置入**每个**节点的白名单中 +4. 启动节点或用脚本`reload_whitelist.sh`刷新节点白名单配置 + +**扩容操作步骤** + +1. 用工具扩容一个节点 +2. 查询此扩容节点的NodeID +3. 将此NodeID**追加**到入所有节点的白名单配置中 +4. 将其他节点的白名单配置拷贝到新扩容的节点上 +5. 用脚本`reload_whitelist.sh`刷新已启动的所有节点的白名单配置 +6. 启动扩容节点 +7. 将扩容节点加成组员(addSealer 或 addObserver) + +## 黑白名单操作举例 + +### 准备 + +搭一个四个节点的链 + +``` bash +bash build_chain.sh -l 127.0.0.1:4 +``` + +查看四个节点的NodeID + +``` shell +$ cat node*/conf/node.nodeid +219b319ba7b2b3a1ecfa7130ea314410a52c537e6e7dda9da46dec492102aa5a43bad81679b6af0cd5b9feb7cfdc0b395cfb50016f56806a2afc7ee81bbb09bf +7718df20f0f7e27fdab97b3d69deebb6e289b07eb7799c7ba92fe2f43d2efb4c1250dd1f11fa5b5ce687c8283d65030aae8680093275640861bc274b1b2874cb +f306eb1066ceb9d46e3b77d2833a1bde2a9899cfc4d0433d64b01d03e79927aa60a40507c5739591b8122ee609cf5636e71b02ce5009f3b8361930ecc3a9abb0 +38158ef34eb2d58ce1d31c8f3ef9f1fa829d0eb8ed1657f4b2a3ebd3265d44b243c69ffee0519c143dd67e91572ea8cb4e409144a1865f3e980c22d33d443296 +``` + +可得四个节点的NodeID: + +* **node0**: 219b319b.... +* **node1**: 7718df20.... +* **node2**: f306eb10.... +* **node3**: 38158ef3.... + +启动所有节点 + +``` shell +$ cd node/127.0.0.1/ +$ bash start_all.sh +``` + +查看连接,以node0为例。(8545是node0的rpc端口) + +``` shell +$ curl -X POST --data '{"jsonrpc":"2.0","method":"getPeers","params":[1],"id":1}' http://127.0.0.1:8545 |jq +``` + +可看到连接信息,node0连接了除自身之外的其它三个节点。 + +``` json +{ + "id": 1, + "jsonrpc": "2.0", + "result": [ + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:62774", + "Node": "node3", + "NodeID": "38158ef34eb2d58ce1d31c8f3ef9f1fa829d0eb8ed1657f4b2a3ebd3265d44b243c69ffee0519c143dd67e91572ea8cb4e409144a1865f3e980c22d33d443296", + "Topic": [] + }, + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:62766", + "Node": "node1", + "NodeID": "7718df20f0f7e27fdab97b3d69deebb6e289b07eb7799c7ba92fe2f43d2efb4c1250dd1f11fa5b5ce687c8283d65030aae8680093275640861bc274b1b2874cb", + "Topic": [] + }, + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:30302", + "Node": "node2", + "NodeID": "f306eb1066ceb9d46e3b77d2833a1bde2a9899cfc4d0433d64b01d03e79927aa60a40507c5739591b8122ee609cf5636e71b02ce5009f3b8361930ecc3a9abb0", + "Topic": [] + } + ] +} +``` + + + +### 配置黑名单:node0拒绝node1的连接 + +将node1的NodeID写入node0的配置中 + +``` shell +vim node0/config.ini +``` + +需要进行的配置如下,白名单为空(默认关闭) + +``` ini +[certificate_blacklist] + ; crl.0 should be nodeid, nodeid's length is 128 + crl.0=7718df20f0f7e27fdab97b3d69deebb6e289b07eb7799c7ba92fe2f43d2efb4c1250dd1f11fa5b5ce687c8283d65030aae8680093275640861bc274b1b2874cb + +[certificate_whitelist] + ; cal.0 should be nodeid, nodeid's length is 128 + ; cal.0= + +``` + +重启节点生效 + +``` shell +$ cd node0 +$ bash stop.sh && bash start.sh +``` + +查看节点连接 + +``` shell +$ curl -X POST --data '{"jsonrpc":"2.0","method":"getPeers","params":[1],"id":1}' http://127.0.0.1:8545 |jq +``` + +可看到只与两个节点建立的连接,未与node1建立连接 + +``` json +{ + "id": 1, + "jsonrpc": "2.0", + "result": [ + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:30303", + "Node": "node3", + "NodeID": "38158ef34eb2d58ce1d31c8f3ef9f1fa829d0eb8ed1657f4b2a3ebd3265d44b243c69ffee0519c143dd67e91572ea8cb4e409144a1865f3e980c22d33d443296", + "Topic": [] + }, + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:30302", + "Node": "node2", + "NodeID": "f306eb1066ceb9d46e3b77d2833a1bde2a9899cfc4d0433d64b01d03e79927aa60a40507c5739591b8122ee609cf5636e71b02ce5009f3b8361930ecc3a9abb0", + "Topic": [] + } + ] +} +``` + + + +### 配置白名单:node0拒绝与node1,node2之外的节点连接 + +将node1和node2的NodeID写入node0的配置中 + +```shell +$ vim node0/config.ini +``` + +需要进行的配置如下,黑名单置空,白名单配置上node1,node2 + +```ini +[certificate_blacklist] + ; crl.0 should be nodeid, nodeid's length is 128 + ;crl.0= + +[certificate_whitelist] + ; cal.0 should be nodeid, nodeid's length is 128 + cal.0=7718df20f0f7e27fdab97b3d69deebb6e289b07eb7799c7ba92fe2f43d2efb4c1250dd1f11fa5b5ce687c8283d65030aae8680093275640861bc274b1b2874cb + cal.1=f306eb1066ceb9d46e3b77d2833a1bde2a9899cfc4d0433d64b01d03e79927aa60a40507c5739591b8122ee609cf5636e71b02ce5009f3b8361930ecc3a9abb0 +``` + +重启节点生效 + +```shell +$ bash stop.sh && bash start.sh +``` + +查看节点连接 + +```shell +$ curl -X POST --data '{"jsonrpc":"2.0","method":"getPeers","params":[1],"id":1}' http://127.0.0.1:8545 |jq +``` + +可看到只与两个节点建立的连接,未与node3建立连接 + +``` json +{ + "id": 1, + "jsonrpc": "2.0", + "result": [ + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:30302", + "Node": "node2", + "NodeID": "f306eb1066ceb9d46e3b77d2833a1bde2a9899cfc4d0433d64b01d03e79927aa60a40507c5739591b8122ee609cf5636e71b02ce5009f3b8361930ecc3a9abb0", + "Topic": [] + }, + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:30301", + "Node": "node1", + "NodeID": "7718df20f0f7e27fdab97b3d69deebb6e289b07eb7799c7ba92fe2f43d2efb4c1250dd1f11fa5b5ce687c8283d65030aae8680093275640861bc274b1b2874cb", + "Topic": [] + } + ] +} +``` + + + +### 黑名单与白名单混合配置:黑名单优先级高于白名单,白名单配置的基础上拒绝与node1建立连接 + +编辑node0的配置 + +```shell +$ vim node0/config.ini +``` + +需要进行的配置如下,黑名单配置上node1,白名单配置上node1,node2 + +```ini +[certificate_blacklist] + ; crl.0 should be nodeid, nodeid's length is 128 + crl.0=7718df20f0f7e27fdab97b3d69deebb6e289b07eb7799c7ba92fe2f43d2efb4c1250dd1f11fa5b5ce687c8283d65030aae8680093275640861bc274b1b2874cb + +[certificate_whitelist] + ; cal.0 should be nodeid, nodeid's length is 128 + cal.0=7718df20f0f7e27fdab97b3d69deebb6e289b07eb7799c7ba92fe2f43d2efb4c1250dd1f11fa5b5ce687c8283d65030aae8680093275640861bc274b1b2874cb + cal.1=f306eb1066ceb9d46e3b77d2833a1bde2a9899cfc4d0433d64b01d03e79927aa60a40507c5739591b8122ee609cf5636e71b02ce5009f3b8361930ecc3a9abb0 +``` + +重启节点生效 + +```shell +$ bash stop.sh && bash start.sh +``` + +查看节点连接 + +```shell +$ curl -X POST --data '{"jsonrpc":"2.0","method":"getPeers","params":[1],"id":1}' http://127.0.0.1:8545 |jq +``` + +可看到虽然白名单上配置了node1,但由于node1在黑名单中也有配置,node0也不能与node1建立连接 + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": [ + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:30302", + "Node": "node2", + "NodeID": "f306eb1066ceb9d46e3b77d2833a1bde2a9899cfc4d0433d64b01d03e79927aa60a40507c5739591b8122ee609cf5636e71b02ce5009f3b8361930ecc3a9abb0", + "Topic": [] + } + ] +} +``` diff --git a/3.x/zh_CN/docs/manual/operation_and_maintenance.md b/3.x/zh_CN/docs/manual/operation_and_maintenance.md index 0089a0cfc..1f4a47cb3 100644 --- a/3.x/zh_CN/docs/manual/operation_and_maintenance.md +++ b/3.x/zh_CN/docs/manual/operation_and_maintenance.md @@ -37,14 +37,14 @@ FISCO BCOS的监控包括区块链监控和系统监控两部分。 【区块链监控】FISCO BCOS提供自身系统的监控工具monitor.sh,可以对节点存活、共识状态、账本情况等进行监控。monitor.sh工具可以将输出内容对接到机构自身的运维监控系统中去,使得区块链的监控可以接入机构运维监控平台。 -【系统监控】除了监控FISCO BCOS节点自身,还需要从系统环境角度监控相关指标。建议运维要对节点运行的CPU、内存、带宽占用以及磁盘占用进行监控,及时发现系统环境异常。FISCO BCOS3.0 可以监控区块链是否正常工作,包括监控共识、同步是否异常、监控磁盘空间,也提供简单的接入用户告警系统的方式,可查看[light_monitor.sh监控工具](../develop/light_monitor.md)。 +【系统监控】除了监控FISCO BCOS节点自身,还需要从系统环境角度监控相关指标。建议运维要对节点运行的CPU、内存、带宽占用以及磁盘占用进行监控,及时发现系统环境异常。FISCO BCOS3.0 可以监控区块链是否正常工作,包括监控共识、同步是否异常、监控磁盘空间,也提供简单的接入用户告警系统的方式,可查看[light_monitor.sh监控工具](../operation_and_maintenance/light_monitor.md)。 ## 数据备份与恢复 FISCO BCOS支持两种数据备份方式,可以根据需要选择合适的方式。 【方式一】:停止节点,将节点的data目录整体打包压缩并备份到其他位置,待需要的时候从备份数据解压缩,恢复节点。这种方式相当于快照一个账本状态的数据,以便后续从这个状态进行恢复,具体操作可参考[节点监控配置](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/tutorial/air/build_chain.html?highlight=%E7%9B%91%E6%8E%A7#id4)。 -【方式二】:可根据数据归档服务工具,将链上数据进行归档存储。待需要恢复或新增节点时,可以将归档存储的数据进行恢复,以此实现数据备份与恢复,具体数据归档操作可参考[数据归档使用](../develop/data_archive_tool.md) +【方式二】:可根据数据归档服务工具,将链上数据进行归档存储。待需要恢复或新增节点时,可以将归档存储的数据进行恢复,以此实现数据备份与恢复,具体数据归档操作可参考[数据归档使用](../operation_and_maintenance/data_archive_tool.md) 方式一的优点是无需部署新的服务和操作,运维简单,缺点是备份的是某个历史状态,从这个状态恢复的数据不是最新数据,恢复之后需要从其他节点同步账本更新的数据。方法二则与方法一相反,需要部署服务,运维成本更高,但是可以随时恢复到最新账本状态。 diff --git a/3.x/zh_CN/docs/operation_and_maintenance/add_new_node.md b/3.x/zh_CN/docs/operation_and_maintenance/add_new_node.md new file mode 100644 index 000000000..a39142b61 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/add_new_node.md @@ -0,0 +1,178 @@ +# 8. 区块链扩容 + +标签:``节点管理`` ``扩容群组`` ``游离节点`` ``新增节点`` ``共识节点`` + +---- + +FISCO BCOS引入了[游离节点、观察者节点和共识节点](../design/security_control/node_management.html#id6),这三种节点类型可通过控制台相互转换。 + +- 共识节点:参与共识的节点,拥有群组的所有数据(搭链时默认都生成共识节点)。 +- 观察者节点:不参与共识,但能实时同步链上数据的节点。 +- 游离节点:已启动,待等待加入群组的节点。处在一种暂时的节点状态,不能获取链上的数据。 + +将指定节点分别转换成共识节点、观察者节点、游离节点,相关操作命令如下: + +- [addSealer:根据节点NodeID设置对应节点为共识节点](./console/console_commands.html#addsealer) +- [addObserver:根据节点NodeID设置对应节点为观察节点](./console/console_commands.html#addobserver) +- [removeNode:根据节点NodeID设置对应节点为游离节点](./console/console_commands.html#removenode) +- [getSealerList:查看群组中共识节点列表](./console/console_commands.html#getsealerlist) +- [getObserverList:查看群组中观察节点列表](./console/console_commands.html#getobserverlist) +- [getNodeIDList:查看节点已连接的所有其他节点的NodeID](./console/console_commands.html#getnodeidlist) + + +下面结合具体操作案例详细阐述群组如何扩容一个新节点。扩容操作分两个阶段, 分别为**为节点生成证书并启动**、**将节点加入群组**。 + +本节假设用户已经参照[搭建第一个区块链网络](../quick_start/air_installation.md)搭建了一条4节点的联盟链,接下来的操作将生成一个新的节点,然后将节点加入群组1。 + +如果是使用运维部署工具,请参考[这里进行扩容操作](./build_chain.md)。 + +## 1. 为节点生成证书并启动 + +每个节点都需要有一套证书来与链上的其他节点建立连接,扩容一个新节点,首先需要为其签发证书。 + +### 为新节点生成私钥证书 + +接下来的操作都在`nodes/127.0.0.1`目录下进行 + +1. 获取证书生成脚本 + +```bash +curl -#LO https://raw.githubusercontent.com/FISCO-BCOS/FISCO-BCOS/master-2.0/tools/gen_node_cert.sh +``` + +```eval_rst +.. note:: + - 如果因为网络问题导致长时间无法下载,请尝试 `curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master-2.0/tools/gen_node_cert.sh` +``` + +2. 生成新节点私钥证书 + +```bash +# -c指定机构证书及私钥所在路径 +# -o输出到指定文件夹,其中node4/conf中会存在机构agency新签发的证书和私钥 +# 成功会输出 All completed 提示 +bash gen_node_cert.sh -c ../cert/agency -o node4 +``` + +国密版本请执行下面的指令生成证书。 +```bash +bash gen_node_cert.sh -c ../cert/agency -o node4 -g ../gmcert/agency/ +``` + +### 准备节点配置文件 + +1. 拷贝`node0/config.ini`、`node0/start.sh`和`node0/stop.sh`到node4目录; + +``` +cp node0/config.ini node0/start.sh node0/stop.sh node4/ +``` + +2. 修改`node4/config.ini`。对于`[rpc]`模块,修改`channel_listen_port=20204`和`jsonrpc_listen_port=8549`;对于`[p2p]`模块,修改`listen_port=30304`并在`node.`中增加自身节点信息; + +``` +$ vim node4/config.ini +[rpc] + ;rpc listen ip + listen_ip=127.0.0.1 + ;channelserver listen port + channel_listen_port=20204 + ;jsonrpc listen port + jsonrpc_listen_port=8549 +[p2p] + ;p2p listen ip + listen_ip=0.0.0.0 + ;p2p listen port + listen_port=30304 + ;nodes to connect + node.0=127.0.0.1:30300 + node.1=127.0.0.1:30301 + node.2=127.0.0.1:30302 + node.3=127.0.0.1:30303 + node.4=127.0.0.1:30304 +``` + +3. 节点3拷贝节点1的`node0/conf/group.1.genesis`(内含**群组节点初始列表**)和`node0/conf/group.1.ini`到`node4/conf`目录下,不需改动; +``` +cp node0/conf/group.1.genesis node0/conf/group.1.ini node4/conf/ +``` + +4. 执行`node4/start.sh`启动节点; +``` +bash node4/start.sh +``` + +5. 确认node4与其他节点连接已经建立,加入网络操作完成。 + +```bash +tail -f node4/log/log* | grep "connected count" +``` + +``` +# 以下日志表明节点node4与其他4个节点建立了连接 +info|2020-12-22 20:44:36.113611|[P2P][Service] heartBeat,connected count=4 +info|2020-12-22 20:44:46.117942|[P2P][Service] heartBeat,connected count=4 +info|2020-12-22 20:44:56.120799|[P2P][Service] heartBeat,connected count=4 +``` + +## 2. 节点加入群组 + +### 获取node4的nodeid + +```bash +cat node4/conf/node.nodeid +``` + +得到类似下面的字符串就是nodeid,nodeid是节点公钥的16进制表示,国密请执行`cat node4/conf/gmnode.nodeid` + +```bash +94ae60f93ef9a25a93666e0149b7b4cb0e044a61b7dcd1b00096f2bdb17d1c6853fc81a24e037c9d07803fcaf78f768de2ba56a4f729ef91baeadaa55a8ccd6e +``` + +### 使用控制台将node4加入群组1 + +1. 使用addObserver将node4作为观察节点加入群组1 + +```bash +[group:1]> getObserverList +[] + +[group:1]> addObserver 94ae60f93ef9a25a93666e0149b7b4cb0e044a61b7dcd1b00096f2bdb17d1c6853fc81a24e037c9d07803fcaf78f768de2ba56a4f729ef91baeadaa55a8ccd6e +{ + "code":1, + "msg":"Success" +} + +[group:1]> getObserverList +[ + 94ae60f93ef9a25a93666e0149b7b4cb0e044a61b7dcd1b00096f2bdb17d1c6853fc81a24e037c9d07803fcaf78f768de2ba56a4f729ef91baeadaa55a8ccd6e +] +``` + +2. 使用addSealer将node4作为共识节点加入群组1 + +```bash +[group:1]> getSealerList +[ + 6c41f7e138051a13a220cb186e934398e37700295ff355b87f113704996b3e03750100e16653cda18b5f954d3b7b08d068ca4a9d65cec5a40db980b697ffb699, + 7404cdf7f34f038aba90059ff25dc5f05f538010c55e98976aea6bc954910f34f15a255869751c8fe564bdb0fa1eee8e2db47eeca0fdd1359beaac6adcd37ede, + a7b856e5b59072c809ea963fa45ede72f7d37561affff989fbede6cd61a40137e2146db205434788e61b89a57f08c614cd283e5e915c23714c2fa685237e8bdb, + e5ea1e18717418a57f115bf1cea5168250f86e5b77f74dd15d0c4bf3758ca37002059ba2e54131296d1646a62be5faf85e243dac8d33d452acd63e20428b72ed +] + +[group:1]> addSealer 94ae60f93ef9a25a93666e0149b7b4cb0e044a61b7dcd1b00096f2bdb17d1c6853fc81a24e037c9d07803fcaf78f768de2ba56a4f729ef91baeadaa55a8ccd6e +{ + "code":1, + "msg":"Success" +} + +[group:1]> getSealerList +[ + 6c41f7e138051a13a220cb186e934398e37700295ff355b87f113704996b3e03750100e16653cda18b5f954d3b7b08d068ca4a9d65cec5a40db980b697ffb699, + 7404cdf7f34f038aba90059ff25dc5f05f538010c55e98976aea6bc954910f34f15a255869751c8fe564bdb0fa1eee8e2db47eeca0fdd1359beaac6adcd37ede, + a7b856e5b59072c809ea963fa45ede72f7d37561affff989fbede6cd61a40137e2146db205434788e61b89a57f08c614cd283e5e915c23714c2fa685237e8bdb, + e5ea1e18717418a57f115bf1cea5168250f86e5b77f74dd15d0c4bf3758ca37002059ba2e54131296d1646a62be5faf85e243dac8d33d452acd63e20428b72ed, + 94ae60f93ef9a25a93666e0149b7b4cb0e044a61b7dcd1b00096f2bdb17d1c6853fc81a24e037c9d07803fcaf78f768de2ba56a4f729ef91baeadaa55a8ccd6e +] +``` + +更多操作请参考[节点管理](../manual/node_management.md) diff --git a/3.x/zh_CN/docs/operation_and_maintenance/browser.md b/3.x/zh_CN/docs/operation_and_maintenance/browser.md new file mode 100644 index 000000000..c977c30aa --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/browser.md @@ -0,0 +1,36 @@ +# 15. 区块链浏览器 +标签:``区块链浏览器`` ``图形化`` + +------ + +区块链浏览器--WeBASE管理平台,可以将区块链中的数据进行可视化,并实时展示,方便用户以Web页面的方式,获取当前区块链中的信息。浏览器版本适配FISCO BCOS 2.0+以及3.0+,区块链浏览器主要展示了链上数据的具体信息,这些信息包括:概览信息,区块信息,交易信息等等。 +本文档将主要介绍区块链浏览器--WeBASE管理平台的功能特性以及其部署升级方法。 + +### 1. 功能概览 +WeBASE管理平台主要功能概括: +- 区块链数据概览 +- 节点管理 +- 合约管理 +- 私钥管理 +- 应用管理 +- 系统管理 +- 系统监控 +- 交易审计 +- 订阅事件 +- 账号管理 +- 群组管理 +- 移动端管理台 +- 数据监控大屏 + +各个功能详细描述可参考[WeBASE管理平台使用手册](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Console-Suit/index.html)。 + +### 2. 一键部署 +WeBASE管理平台支持[一键部署](https://webasedoc.readthedocs.io/zh_CN/lab-dev/docs/WeBASE/install.html),可以在同机快速搭建WeBASE管理台环境,方便用户快速体验WeBASE管理平台。 + +一键部署会搭建:节点(FISCO-BCOS 3.0+)、管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、节点前置子系统(WeBASE-Front)、签名服务(WeBASE-Sign)。 +其中,节点的搭建是可选的,可以通过配置来选择使用已有链或者搭建新链。 +一键部署架构如下: + +![](../../images/webase/img.png) + +详细的部署步骤可参考[WeBASE一键部署](https://webasedoc.readthedocs.io/zh_CN/lab-dev/docs/WeBASE/install.html)。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/operation_and_maintenance/build_chain.md b/3.x/zh_CN/docs/operation_and_maintenance/build_chain.md new file mode 100644 index 000000000..afef28046 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/build_chain.md @@ -0,0 +1,18 @@ +# 1. 一键建链工具 + +标签:``build_chain`` ``搭建Air版区块链网络`` + +---- + +```eval_rst +.. important:: + 相关软件和环境版本说明!`请查看 `_ +``` + + + +* 快速部署 Air 版区块链:[build_chain.sh](../tutorial/air/build_chain.md) + +* 快速部署 Pro 版区块链:[build_chain.py](../tutorial/pro/pro_builder.md) + +* 快速部署 Max 版区块链:[build_chain.py](../tutorial/max/max_builder.md) diff --git a/3.x/zh_CN/docs/operation_and_maintenance/committee_usage.md b/3.x/zh_CN/docs/operation_and_maintenance/committee_usage.md new file mode 100644 index 000000000..3f4f1498d --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/committee_usage.md @@ -0,0 +1,676 @@ +# 7. 区块链权限治理 + +标签:``合约权限`` ``部署权限`` ``权限控制`` ``权限使用`` + +---- + +FISCO BCOS 3.x 引入了合约粒度的权限治理体系。治理委员会可通过投票的方式管理合约的部署、合约的接口调用权限。 + +详细设计请参考链接:[权限治理体系设计](../design/committee_design.md) + +## 1. 开启权限治理模式 + +在区块链初始化启动之前,在配置中必须开启并设置好权限治理的配置,才能正确启动权限治理模式。区块链启动后再配置将不起作用。 + +开启权限治理模式的主要要点是:将`is_auth_check`选项置为`true`,`auth_admin_account`初始委员会账户地址需要配置正确的地址。 + +**更新:** 在3.3版本以后将支持在链启动以后动态开启权限模式,部署治理委员会合约。请关注本章动态开启权限模式小节。 + +FISCO BCOS不同的节点部署模式,开启权限治理的方式略有不同。本节将分开讨论不同的节点部署模式下开启权限治理的方式。 + +### 1.1 FISCO BCOS Air版开启权限治理 + +FISCO BCOS Air版的建链部署工具详情请参考:[Air版部署工具](../tutorial/air/build_chain.md)。在这里以搭建四节点为例,开启权限治理设置。 + +建链部署工具有`-A`和`-a`两种模式,用于开启权限模式: + +**注意:** 3.3版本以后,`build_chain.sh`脚本将默认开启权限模式,不再有`-A`选项,若不指定账户地址,那么将默认生成一个账户公私钥对,放置在链的`ca`目录中,账户的创建和使用请参考:[创建和使用账户](../develop/account.md)。 + +- `-A`: 将开启权限设置,并使用`get_account.sh`与`get_gm_account.sh`脚本随机生成一个账户地址,并将生成账户的公私密钥对放置在链的`ca`目录中,账户的创建和使用请参考:[创建和使用账户](../develop/account.md) +- `-a`:将开启权限设置,并指定一个账户地址作为初始化治理委员的唯一账户,**在指定时,必须确认账户是存在的且账户地址是正确的,否则将会因为没有治理委员权限而导致权限治理不可用的情况**。 + +#### 1.1.1 开启权限治理举例 + +使用`-A`选项开启权限模式,可以看到`Auth Mode`已经开启,`Auth init account`初始账户为`0x976fe0c250181c7ef68a17d3bc34916978da103a`。 + +**注意:** 3.3版本以后,`build_chain.sh`脚本将默认开启权限模式,若不指定账户地址,那么将默认生成一个账户公私钥对,放置在链的`ca`目录中,账户的创建和使用请参考:[创建和使用账户](../develop/account.md)。 + +```shell +## 如果使用-A选项,则开启权限设置,并且随机生成一个账户地址,作为初始化治理委员的唯一admin账户 +bash build_chain.sh -l 127.0.0.1:4 -o nodes -A + +[INFO] Downloading fisco-bcos binary from https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v3.0.0/fisco-bcos-linux-x86_64.tar.gz ... +######################################################################## 100.0% +[INFO] Generate ca cert successfully! +Processing IP:127.0.0.1 Total:4 +[INFO] Generate nodes/127.0.0.1/sdk cert successful! +[INFO] Generate nodes/127.0.0.1/node0/conf cert successful! +[INFO] Generate nodes/127.0.0.1/node1/conf cert successful! +[INFO] Generate nodes/127.0.0.1/node2/conf cert successful! +[INFO] Generate nodes/127.0.0.1/node3/conf cert successful! +[INFO] Downloading get_account.sh from https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/tools/get_account.sh... +######################################################################## 100.0% +[INFO] Generate uuid success: 4cf39d8a-9f9f-43d0-baa4-3b89d6c9e013 +[INFO] Generate uuid success: 16d14ff1-b3f0-4104-8b3e-1bb5faf0ee12 +[INFO] Generate uuid success: cc90fc61-bd2f-4029-adaa-135543ec887e +[INFO] Generate uuid success: 12799030-e698-4edd-8719-b5aaa6f8f4c7 +============================================================== +[INFO] GroupID : group0 +[INFO] ChainID : chain0 +[INFO] fisco-bcos path : bin/fisco-bcos +[INFO] Auth mode : true +[INFO] Auth account : 0x976fe0c250181c7ef68a17d3bc34916978da103a +[INFO] Start port : 30300 20200 3901 +[INFO] Server IP : 127.0.0.1:4 +[INFO] SM model : false +[INFO] Output dir : nodes +[INFO] All completed. Files in nodes + +# 随机生成的账户将放置在 {节点名}/ca/accounts 目录下 +ls nodes/ca/accounts +0x976fe0c250181c7ef68a17d3bc34916978da103a.pem 0x976fe0c250181c7ef68a17d3bc34916978da103a.public.pem +``` + +使用`-a`选项开启权限模式,指定账户地址为初始化的治理委员,可以看到`Auth Mode`已经开启,`Auth init account`初始账户为`0x976fe0c250181c7ef68a17d3bc34916978da103a` + +```shell + +## 如果使用-a选项,则开启权限设置,并指定账户地址作为初始化治理委员的唯一admin账户 +bash build_chain.sh -l 127.0.0.1:4 -o nodes -a 0x976fe0c250181c7ef68a17d3bc34916978da103a + +[INFO] Generate ca cert successfully! +Processing IP:127.0.0.1 Total:4 +[INFO] Generate nodes/127.0.0.1/sdk cert successful! +[INFO] Generate nodes/127.0.0.1/node0/conf cert successful! +[INFO] Generate nodes/127.0.0.1/node1/conf cert successful! +[INFO] Generate nodes/127.0.0.1/node2/conf cert successful! +[INFO] Generate nodes/127.0.0.1/node3/conf cert successful! +[INFO] Generate uuid success: 1b1a3ea8-cacf-498d-9609-6185500b724f +[INFO] Generate uuid success: e0099fb5-0a54-4073-9f67-077772187df6 +[INFO] Generate uuid success: 5a8c6f09-1984-4bbc-9c9b-627d6a125985 +[INFO] Generate uuid success: 688d7047-644b-48e3-b61b-6b4360b5ac2c +============================================================== +[INFO] GroupID : group0 +[INFO] ChainID : chain0 +[INFO] fisco-bcos path : bin/fisco-bcos +[INFO] Auth mode : true +[INFO] Auth account : 0x976fe0c250181c7ef68a17d3bc34916978da103a +[INFO] Start port : 30300 20200 3901 +[INFO] Server IP : 127.0.0.1:4 +[INFO] SM model : false +[INFO] Output dir : nodes +[INFO] All completed. Files in nodes +``` + +#### 1.1.2 查看节点权限配置 + +无论是使用`-A`还是`-a`选项开启权限治理,均会体现在每个节点的配置中。节点在启动初始化的时候将会读取配置,对权限合约进行初始化。 + +我们以 `nodes/127.0.0.1/node0/config.genesis` 为例: + +```ini +... +[executor] + ; use the wasm virtual machine or not + is_wasm=false + is_auth_check=true + auth_admin_account=0x976fe0c250181c7ef68a17d3bc34916978da103a + is_serial_execute=false +... +``` + +### 1.2 FISCO BCOS Pro/Max 版开启权限治理 + +FISCO BCOS Pro版的建链部署工具详情请参考:[搭建Pro版区块链网络](../tutorial/pro/installation.md)。在这里以BcosBuilder为例,开启权限治理设置。 + +在开启Pro/Max版区块链网络权限模式之前,请保证已经完成[部署Pro版本区块链节点](../tutorial/pro/installation.html#id4)之前的所有步骤。 + +在复制配置文件时,需要手动配置权限初始化配置。复制配置文件的步骤参考:[部署RPC服务](../tutorial/pro/installation.html#rpc) + +```shell +# 进入config.toml +vim config.toml +``` + +在这里我们选择开启`auth_check`配置项,并使用`0x976fe0c250181c7ef68a17d3bc34916978da103a`账户地址作为初始化治理委员,请以实际情况为准。 + +如何创建、使用链上账户,请参考链接:[创建和使用账户](./account.md)。 + +配置详情请参考:[tars服务配置](../tutorial/pro/pro_builder.html#tars) + +```toml +... + +[group] +group_id="group0" +vm_type="evm" +sm_crypto=false +auth_check=true +init_auth_address="0x976fe0c250181c7ef68a17d3bc34916978da103a" + +... +``` + +完成配置项之后,就可以继续部署RPC服务、GateWay服务和节点服务即可。继续流程参考:[部署RPC服务](../tutorial/pro/installation.html#rpc) + +### 1.3 动态开启权限 + +**注意:** 本小节仅仅适用于3.3.0及以后的二进制版本与链版本。 + +在区块链启动之后,若区块链之前的数据未曾配置过权限部分的功能,那么可通过控制台的 `initAuth` 命令初始化链的治理委员会,再使用`setSystemConfigByKey`开启权限检查。具体步骤如下: + +**在指定第一个治理委员时,必须确认账户是存在的且账户地址是正确的,否则将会因为没有治理委员权限而导致权限治理不可用的情况**。 + +```shell +# 首先必须将链的数据版本号升级到3.3.0及以上,若已经是3.3.0以上则跳过这一步 +[group0]: /apps> setSystemConfigByKey compatibility_version 3.3.0 +{ + "code":0, + "msg":"Success" +} +Switched to group group0. + +# 使用initAuth 初始化治理委员会 +[group0]: /apps> initAuth 0xf4a3d4177ce2bad732a63702a751a8e41ea6bce4 +{ + "code":0, + "msg":"Success" +} + +# 重启控制台之后,查看治理委员会信息 +[group0]: /apps> getCommitteeInfo +--------------------------------------------------------------------------------------------- +Committee address : 0xd04cfe0e4a8c9cafe504bbd68d665471d1ce5010 +ProposalMgr address : 0x0fb8268e0f749097844639dff0fc938d44fa55ba +--------------------------------------------------------------------------------------------- +ParticipatesRate: 0% , WinRate: 0% +--------------------------------------------------------------------------------------------- +Governor Address | Weight +index0 : 0xf4a3d4177ce2bad732a63702a751a8e41ea6bce4 | 1 + +# 此时已经初始化权限治理委员会,还未开启权限检查,使用setSystemConfigByKey命令开启即可 +[group0]: /apps> setSystemConfigByKey auth_check_status 1 +{ + "code":0, + "msg":"Success" +} +``` + +### 1.4 动态关闭权限检查 + +**注意:** 本小节仅仅适用于3.3.0及以后的二进制版本与链版本。 +本小节描述的是关闭权限的检查,治理委员会仍然可用。 + +```shell +# 使用setSystemConfigByKey命令将auth_check_status配置设置为0即可 +[group0]: /apps> setSystemConfigByKey auth_check_status 0 +{ + "code":0, + "msg":"Success" +} +``` + +## 2. 控制台使用 + +控制台有提供权限治理专属的命令,以及切换控制台账户的命令。用户可以通过控制台操作权限的治理,详情请参考:[权限操作命令](../operation_and_maintenance/console/console_commands.html#id14)。权限治理的命令只有控制台连入了开启权限治理的节点才会出现。 + +控制台操作命令包含以下三种类型,详情请参考[权限操作命令](../operation_and_maintenance/console/console_commands.html#id14): + +- 查询状态命令,该命令没有权限控制,所有账户均可访问。 +- 治理委员专用命令,这些命令只能持有治理委员的账户才可以使用。 +- 合约管理员专用命令,这些命令只有对某一个合约具有管理权限的管理员账户才可以访问。 + +## 3. 使用举例 + +首先使用build_chain.sh脚本搭建权限模式的区块链: + +这里参考[创建和使用账户](./account.md)链接创建新的账户,指定初始化治理委员的账户地址为 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 + +可以使用`-A`选项自动生成一个账户。账户是有国密和非国密区分的,会根据链的类型自动生成。 + +```shell + bash build_chain.sh -l 127.0.0.1:4 -o nodes4 -a 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +``` + +### 3.1 治理委员使用 + +使用`getCommitteeInfo`命令可以看到,初始化时治理委员只有一个,权重为1. + +并且当前控制台所用的账户就是委员 + +```shell +[group0]: /> getCommitteeInfo +--------------------------------------------------------------------------------------------- +Committee address : 0xcbc22a496c810dde3fa53c72f575ed024789b2cc +ProposalMgr address : 0xa0974646d4462913a36c986ea260567cf471db1f +--------------------------------------------------------------------------------------------- +ParticipatesRate: 0% , WinRate: 0% +--------------------------------------------------------------------------------------------- +Governor Address | Weight +index0 : 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 | 1 + +[group0]: /> getCurrentAccount +0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +``` + +用当前账户发起一个更新治理委员的提案: + +可以看到,发起了一个提案(proposal),提案编号为1。 + +因为当前治理委员会只有一个委员,且参与阈值和权重阈值都为0,因此发起的提案一定能成功。 + +使用`getCommitteeInfo` 命令看,确实已经更新了治理委员的权重 + +```shell +[group0]: /> updateGovernorProposal 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 2 +Update governor proposal created, ID is: 1 +--------------------------------------------------------------------------------------------- +Proposer: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +Proposal Type : setWeight +Proposal Status : finished +--------------------------------------------------------------------------------------------- +Agree Voters: +0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +--------------------------------------------------------------------------------------------- +Against Voters: + +``` + +也可以使用`updateGovernorProposal`添加新的治理委员: + +这里只会做长度和字符校验,不会对正确性校验。可以看到成功添加了一个治理委员,权重为1 + +```shell +[group0]: /> updateGovernorProposal 0xba0cd3e729cfe3ebdf1f74a10ec237bfd3954e1e 1 +Update governor proposal created, ID is: 2 +--------------------------------------------------------------------------------------------- +Proposer: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +Proposal Type : setWeight +Proposal Status : finished +--------------------------------------------------------------------------------------------- +Agree Voters: +0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +--------------------------------------------------------------------------------------------- +Against Voters: +``` + +也可以使用`updateGovernorProposal`删除治理委员: + +设置账户权重为0,则删除治理委员 + +```shell +[group0]: /> updateGovernorProposal 0xba0cd3e729cfe3ebdf1f74a10ec237bfd3954e1e 0 +Update governor proposal created, ID is: 3 +--------------------------------------------------------------------------------------------- +Proposer: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +Proposal Type : setWeight +Proposal Status : finished +--------------------------------------------------------------------------------------------- +Agree Voters: +0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +--------------------------------------------------------------------------------------------- +Against Voters: + +[group0]: /> getCommitteeInfo +--------------------------------------------------------------------------------------------- +Committee address : 0xcbc22a496c810dde3fa53c72f575ed024789b2cc +ProposalMgr address : 0xa0974646d4462913a36c986ea260567cf471db1f +--------------------------------------------------------------------------------------------- +ParticipatesRate: 0% , WinRate: 0% +--------------------------------------------------------------------------------------------- +Governor Address | Weight +index0 : 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 | 2 +``` + +使用`setRateProposal`命令更改治理委员的投票阈值 + +```shell +[group0]: /> setRateProposal 51 51 +Set rate proposal created, ID is: 4 +--------------------------------------------------------------------------------------------- +Proposer: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +Proposal Type : setRate +Proposal Status : finished +--------------------------------------------------------------------------------------------- +Agree Voters: +0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +--------------------------------------------------------------------------------------------- +Against Voters: + +[group0]: /> getCommitteeInfo +--------------------------------------------------------------------------------------------- +Committee address : 0xcbc22a496c810dde3fa53c72f575ed024789b2cc +ProposalMgr address : 0xa0974646d4462913a36c986ea260567cf471db1f +--------------------------------------------------------------------------------------------- +ParticipatesRate: 51% , WinRate: 51% +--------------------------------------------------------------------------------------------- +Governor Address | Weight +index0 : 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 | 2 +``` + +此时,委员会的参与率必须大于51,权重阈值也必须大于51,委员会有两名账户 + +使用当前账户发起 `setDeployAuthTypeProposal` 提案,变更全局部署权限策略,使用白名单模式。 + +此时,可以看到第6个提案的类型是`setDeployAuthType`,状态是 `notEnoughVotes`,还不可以通过提案,当前的部署权限策略还是处于无策略情况。 + +```shell +[group0]: /> setDeployAuthTypeProposal white_list +Set deploy auth type proposal created, ID is: 6 +--------------------------------------------------------------------------------------------- +Proposer: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +Proposal Type : setDeployAuthType +Proposal Status : notEnoughVotes +--------------------------------------------------------------------------------------------- +Agree Voters: +0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +--------------------------------------------------------------------------------------------- +Against Voters: + +[group0]: /> getDeployAuth +There is no deploy strategy, everyone can deploy contracts. +``` + +切换到另外一个委员会账户中,对提案6进行投票,可以看到投票成功,提案状态变更到结束。部署策略也变为白名单模式。 + +```shell +[group0]: /> loadAccount 0xba0cd3e729cfe3ebdf1f74a10ec237bfd3954e1e +Load account 0xba0cd3e729cfe3ebdf1f74a10ec237bfd3954e1e success! + +[group0]: /> voteProposal 6 +Vote proposal success. +--------------------------------------------------------------------------------------------- +Proposer: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +Proposal Type : setDeployAuthType +Proposal Status : finished +--------------------------------------------------------------------------------------------- +Agree Voters: +0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +0xba0cd3e729cfe3ebdf1f74a10ec237bfd3954e1e +--------------------------------------------------------------------------------------------- +Against Voters: + +[group0]: /> getDeployAuth +Deploy strategy is White List Access. +``` + +### 3.2 部署权限 + +接上文,当前链的部署权限为白名单模式。 + +治理委员也没有权限部署,但是治理委员可以发起开启某个账户的部署权限。 + +也可以通过命令`closeDeployAuthProposal` 发起关闭部署权限的提案 + +```shell +[group0]: /> deploy HelloWorld +deploy contract for HelloWorld failed! +return message: Permission denied +return code:18 +Return values:null + +[group0]: /> openDeployAuthProposal 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +Open deploy auth proposal created, ID is: 7 +--------------------------------------------------------------------------------------------- +Proposer: 0xba0cd3e729cfe3ebdf1f74a10ec237bfd3954e1e +Proposal Type : modifyDeployAuth +Proposal Status : notEnoughVotes +--------------------------------------------------------------------------------------------- +Agree Voters: +0xba0cd3e729cfe3ebdf1f74a10ec237bfd3954e1e +--------------------------------------------------------------------------------------------- +Against Voters: + +[group0]: /> loadAccount 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +Load account 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 success! + +[group0]: /> voteProposal 7 +Vote proposal success. +--------------------------------------------------------------------------------------------- +Proposer: 0xba0cd3e729cfe3ebdf1f74a10ec237bfd3954e1e +Proposal Type : modifyDeployAuth +Proposal Status : finished +--------------------------------------------------------------------------------------------- +Agree Voters: +0xba0cd3e729cfe3ebdf1f74a10ec237bfd3954e1e +0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +--------------------------------------------------------------------------------------------- +Against Voters: + +[group0]: /> checkDeployAuth +Deploy : ACCESS +Account: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 + +[group0]: /> deploy HelloWorld +transaction hash: 0xe38ca3d69efee66aaf7de5600d3bdada8fd7c658d52bc0401ce65dd7e6437d97 +contract address: 0x33E56a083e135936C1144960a708c43A661706C0 +currentAccount: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 + +[group0]: /> getContractAdmin 0x33E56a083e135936C1144960a708c43A661706C0 +Admin for contract 0x33E56a083e135936C1144960a708c43A661706C0 is: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +``` + +可以看到,通过投票,`0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642` 账户已经有权限部署了。 + +此时,HelloWorld合约 0x33E56a083e135936C1144960a708c43A661706C0 地址的合约管理员是 `0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642` 账户 + +### 3.3 合约管理员使用 + +接上文,当前HelloWorld合约 0x33E56a083e135936C1144960a708c43A661706C0 地址的合约管理员是 `0xab835e87a86f94af10c81278bb9a82ea13d82d39` 账户 + +合约管理员可以设置当前合约的接口策略: + +合约管理员对HelloWorld合约的 “set(string)” 合约设置白名单模式,设置成功之后,管理员也没有权限调用set(string)接口 + +```shell +[group0]: /> getContractAdmin 0x33E56a083e135936C1144960a708c43A661706C0 +Admin for contract 0x33E56a083e135936C1144960a708c43A661706C0 is: 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 + +[group0]: /> setMethodAuth 0x33E56a083e135936C1144960a708c43A661706C0 "set(string)" white_list +{ + "code":0, + "msg":"Success" +} + +[group0]: /> checkMethodAuth 0x33E56a083e135936C1144960a708c43A661706C0 "set(string)" +Method : PERMISSION DENIED +Account : 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +Interface: set(string) +Contract : 0x33E56a083e135936C1144960a708c43A661706C0 + +[group0]: /> call HelloWorld 0x33E56a083e135936C1144960a708c43A661706C0 set oops +transaction hash: 0xf9fcac9a0d4503e366c582c72fccf4e571b081ba44d46f58ff0b17fb7ab4361b +--------------------------------------------------------------------------------------------- +transaction status: 18 +--------------------------------------------------------------------------------------------- +Receipt message: Permission denied +Return message: Permission denied +--------------------------------------------------------------------------------------------- + +# 还是可以使用set接口 +[group0]: /> call HelloWorld 0x33E56a083e135936C1144960a708c43A661706C0 get +--------------------------------------------------------------------------------------------- +Return code: 0 +description: transaction executed successfully +Return message: Success +--------------------------------------------------------------------------------------------- +Return value size:1 +Return types: (string) +Return values:(Hello, World!) +--------------------------------------------------------------------------------------------- +``` + +管理员可以使用命令开启某个账户对set(string)接口的使用权限 + +```shell +[group0]: /> openMethodAuth 0x33E56a083e135936C1144960a708c43A661706C0 "set(string)" 0x1cc06388cd8a12dcf7fb8967378c0aea4e6cf642 +{ + "code":0, + "msg":"Success" +} + +[group0]: /> call HelloWorld 0x33E56a083e135936C1144960a708c43A661706C0 set "May the flame guide thee." +transaction hash: 0x3986a27e3075d703bc6828984bbfa8115fad612eaecaf7749e835edb495f38d6 +--------------------------------------------------------------------------------------------- +transaction status: 0 +description: transaction executed successfully +--------------------------------------------------------------------------------------------- +Receipt message: Success +Return message: Success +Return value size:0 +Return types: () +Return values:() +--------------------------------------------------------------------------------------------- +Event logs +Event: {} + +[group0]: /> call HelloWorld 0x33E56a083e135936C1144960a708c43A661706C0 get +--------------------------------------------------------------------------------------------- +Return code: 0 +description: transaction executed successfully +Return message: Success +--------------------------------------------------------------------------------------------- +Return value size:1 +Return types: (string) +Return values:(May the flame guide thee.) +--------------------------------------------------------------------------------------------- +``` + +### 3.4 升级权限投票权重计算逻辑 + +发起升级投票计算逻辑的提案。升级提案投票计算逻辑分为以下几步: + +1. 基于接口编写合约; +2. 将写好的合约部署在链上,并得到合约的地址; +3. 发起升级投票计算逻辑的提案,将合约的地址作为参数输入,并在治理委员会中进行投票表决; +4. 投票通过后(此时投票计算逻辑还是原有逻辑),则升级投票计算逻辑;否则就不升级。 + +投票计算逻辑合约是按照一定的接口实现方可使用。合约实现可以参考下面的接口合约`VoteComputerTemplate.sol`进行实现: + +```solidity +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.6.10 <0.8.20; + +import "./Committee.sol"; +import "./BasicAuth.sol"; + +abstract contract VoteComputerTemplate is BasicAuth { + // Governors and threshold + Committee public _committee; + + constructor(address committeeMgrAddress, address committeeAddress) { + setOwner(committeeMgrAddress); + _committee = Committee(committeeAddress); + // first, test committee exist; second, test committee is helthy + require( + _committee.getWeights() >= 1, + "committee is error, please check address!" + ); + } + // 此为投票权重计算逻辑唯一入口,必须实现该接口,且规定: + // 投票数不够,返回 1;投票通过,返回 2;投票不通过,返回 3; + function determineVoteResult( + address[] memory agreeVoters, + address[] memory againstVoters + ) public view virtual returns (uint8); + + // 此为计算逻辑的检验接口,用于其他治理委员验证该合约有效性 + function voteResultCalc( + uint32 agreeVotes, + uint32 doneVotes, + uint32 allVotes, + uint8 participatesRate, + uint8 winRate + ) public pure virtual returns (uint8); +} +``` + +现已有基于上面的`VoteComputerTemplate.sol`接口实现的合约如下: + +```solidity +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.6.10 <0.8.20; + +import "./Committee.sol"; +import "./VoteComputerTemplate.sol"; + +contract VoteComputer is VoteComputerTemplate { + constructor(address committeeMgrAddress, address committeeAddress) + public + VoteComputerTemplate(committeeMgrAddress, committeeAddress) + {} + // 投票权重计算逻辑实现 + function determineVoteResult( + address[] memory agreeVoters, + address[] memory againstVoters + ) public view override returns (uint8) { + uint32 agreeVotes = _committee.getWeights(agreeVoters); + uint32 doneVotes = agreeVotes + _committee.getWeights(againstVoters); + uint32 allVotes = _committee.getWeights(); + return + voteResultCalc( + agreeVotes, + doneVotes, + allVotes, + _committee._participatesRate(), + _committee._winRate() + ); + } + // 计算逻辑的检验接口实现 + function voteResultCalc( + uint32 agreeVotes, + uint32 doneVotes, + uint32 allVotes, + uint8 participatesRate, + uint8 winRate + ) public pure override returns (uint8) { + //1. Checks enough voters: totalVotes/totalVotesPower >= p_rate/100 + if (doneVotes * 100 < allVotes * participatesRate) { + //not enough voters, need more votes + return 1; + } + //2. Checks whether for votes wins: agreeVotes/totalVotes >= win_rate/100 + if (agreeVotes * 100 >= winRate * doneVotes) { + return 2; + } else { + return 3; + } + } +} +``` + +合约编写完成之后就可以将合约在链上进行部署,并更新到治理委员会中: + +```shell +# 首先通过getCommitteeInfo命令 确认Committee合约的地址为0xa0974646d4462913a36c986ea260567cf471db1f +[group0]: /apps> getCommitteeInfo +--------------------------------------------------------------------------------------------- +Committee address : 0xa0974646d4462913a36c986ea260567cf471db1f +ProposalMgr address : 0x2568bd207f50455f1b933220d0aef11be8d096b2 +--------------------------------------------------------------------------------------------- +ParticipatesRate: 0% , WinRate: 0% +--------------------------------------------------------------------------------------------- +Governor Address | Weight +index0 : 0x4a37eba43c66df4b8394abdf8b239e3381ea4221 | 2 + +# 部署VoteComputer合约,第一个参数0x10001为固定地址,第二个参数为当前治理委员Committee的地址 +[group0]: /apps> deploy VoteComputer 0x10001 0xa0974646d4462913a36c986ea260567cf471db1f +transaction hash: 0x429a7ceccefb3a4a1649599f18b60cac1af040cd86bb8283b9aab68f0ab35ae4 +contract address: 0x6EA6907F036Ff456d2F0f0A858Afa9807Ff4b788 +currentAccount: 0x4a37eba43c66df4b8394abdf8b239e3381ea4221 + +# 部署成功后,即可通过upgradeVoteProposal更新 +[group0]: /apps> upgradeVoteProposal 0x6EA6907F036Ff456d2F0f0A858Afa9807Ff4b788 +Upgrade vote computer proposal created, ID is: 10 +--------------------------------------------------------------------------------------------- +Proposer: 0x4a37eba43c66df4b8394abdf8b239e3381ea4221 +Proposal Type : upgradeVoteCalc +Proposal Status : finished +--------------------------------------------------------------------------------------------- +Agree Voters: +0x4a37eba43c66df4b8394abdf8b239e3381ea4221 +--------------------------------------------------------------------------------------------- +Against Voters: + +[group0]: /apps> +``` diff --git a/3.x/zh_CN/docs/develop/console/console_commands.md b/3.x/zh_CN/docs/operation_and_maintenance/console/console_commands.md similarity index 91% rename from 3.x/zh_CN/docs/develop/console/console_commands.md rename to 3.x/zh_CN/docs/operation_and_maintenance/console/console_commands.md index 9f48dbc87..26ab05dd0 100644 --- a/3.x/zh_CN/docs/develop/console/console_commands.md +++ b/3.x/zh_CN/docs/operation_and_maintenance/console/console_commands.md @@ -17,7 +17,7 @@ - **指令**: 指令是执行的操作命令,包括查询区块链相关信息,部署合约和调用合约的指令等,其中部分指令调用JSON-RPC接口,因此与JSON-RPC接口同名。 **使用提示: 指令可以使用tab键补全,并且支持按上下键显示历史输入指令。** -- **指令相关的参数**: 指令调用接口需要的参数,指令与参数以及参数与参数之间均用空格分隔,与JSON-RPC接口同名命令的输入参数和获取信息字段的详细解释参考[JSON-RPC API](../api.md)。 +- **指令相关的参数**: 指令调用接口需要的参数,指令与参数以及参数与参数之间均用空格分隔,与JSON-RPC接口同名命令的输入参数和获取信息字段的详细解释参考[JSON-RPC API](../../develop/api.md)。 ### 控制台常用命令 @@ -49,8 +49,8 @@ - **正确结果:** 命令返回正确的执行结果,以字符串或是json的形式返回。 - **错误结果:** 命令返回错误的执行结果,以字符串或是json的形式返回。 - - 控制台的命令调用JSON-RPC接口时,错误码[参考这里](../api.html#rpc)。 - - 控制台的命令调用Precompiled Service接口时,错误码[参考这里](../api.html#id5)。 + - 控制台的命令调用JSON-RPC接口时,错误码[参考这里](../../develop/api.html#rpc)。 + - 控制台的命令调用Precompiled Service接口时,错误码[参考这里](../../develop/api.html#id5)。 ## 控制台基础命令 @@ -126,6 +126,18 @@ * listAccount List the current saved account list * loadAccount Load account for the transaction signature * newAccount Create account +---------------------------Sharding Operation---------------------------- +* getContractShard Get a contract's belonging shard. +* linkShard Add a contract to a shard. +* makeShard Make a shard. +---------------------------Balance Precompiled Operation---------------------------- +* addBalance Add balance to account. Only balanceGovernor can use it. +* getBalance Get balance of the account +* listBalanceGovernor List all registered balanceGovernor +* registerBalanceGovernor Register an account as balanceGovernor. Only Governor accounts can use it. +* subBalance Sub balance from account. Only balanceGovernor can use it +* transferBalance Transfer balance from one account to another. Only balanceGovernor can use it +* unregisterBalanceGovernor Unregister an account from balanceGovernor. Only governor account can use it --------------------------------------------------------------------------------------------- ``` @@ -823,10 +835,14 @@ PeersInfo{ 运行setSystemConfigByKey,以键值对方式设置系统参数。目前设置的系统参数支持`tx_count_limit`,`consensus_leader_period`。这些系统参数的键名可以通过tab键补全: +**注意:** 当开启权限治理模式时,该命令将只允许治理委员会使用,不允许用户直接调用,请参考命令 `setSysConfigProposal` + - `tx_count_limit`: 区块最大打包交易数 +- `tx_gas_price`: 交易gas价格,默认单位为wei,支持kwei、mwei、gwei、szabo、finney、ether、kether、mether、gether +- `tx_gas_limit`: 交易执行的gas限制 - `consensus_leader_period`: 共识选主间隔 -- `gas_limit`: 交易执行的gas限制 - `compatibility_version`: 数据兼容版本号,当区块链所有二进制均升级到最新版本后,可通过`setSystemConfigByKey`升级数据兼容版本号到最新 +- `auth_check_status`: (3.3.0之后有效)权限检查状态,如果为0则关闭所有权限检查,非0则为开启所有检查 参数: @@ -839,6 +855,12 @@ PeersInfo{ "code":0, "msg":"success" } + +[group0]: /apps> setSystemConfigByKey tx_gas_price 1 kwei +{ + "code":0, + "msg":"success" +} ``` ### 12. getSystemConfigByKey @@ -851,6 +873,9 @@ PeersInfo{ ```shell [group0]: /apps> getSystemConfigByKey tx_count_limit 100 + +[group0]: /apps> getSystemConfigByKey tx_gas_price +1000 ``` ## 共识操作命令 @@ -945,6 +970,9 @@ ConsensusStatusInfo{ ### 5. addSealer 运行addSealer,将节点添加为共识节点。 + +**注意:** 当开启权限治理模式时,该命令将只允许治理委员会使用,不允许用户直接调用,请参考命令 `addSealerProposal` + 参数: - 节点nodeId @@ -961,6 +989,9 @@ ConsensusStatusInfo{ ### 6. addObserver 运行addObserver,将节点添加为观察节点。 + +**注意:** 当开启权限治理模式时,该命令将只允许治理委员会使用,不允许用户直接调用,请参考命令 `addObserverProposal` + 参数: - 节点nodeId @@ -976,6 +1007,9 @@ ConsensusStatusInfo{ ### 7. removeNode 运行removeNode,节点退出。通过addSealer命令可以将退出的节点添加为共识节点,通过addObserver命令将节点添加为观察节点。 + +**注意:** 当开启权限治理模式时,该命令将只允许治理委员会使用,不允许用户直接调用,请参考命令 `removeNodeProposal` + 参数: - 节点nodeId @@ -992,6 +1026,8 @@ ConsensusStatusInfo{ 运行setConsensusWeight,设置某一个特定节点的共识权重。 +**注意:** 当开启权限治理模式时,该命令将只允许治理委员会使用,不允许用户直接调用,请参考命令 `setConsensusNodeWeightProposal` + ```shell [group0]: /apps> setConsensusWeight 44c3c0d914d7a3818923f9f45927724bddeeb25df92b93f1242c32b63f726935d6742b51cd40d2c828b52ed6cde94f4d6fb4b3bfdc0689cfcddf7425eafdae85 2 { @@ -1742,7 +1778,7 @@ Available } [group0]: /apps> getContractStatus 0x31eD5233b81c79D5adDDeeF991f531A9BBc2aD01 -Freeze +Unavailable ``` ### 2. 治理委员专用命令 @@ -2553,7 +2589,7 @@ $ -rw-r--r-- 1 octopus staff 258 9 30 16:34 account/ecdsa/0x1cc06388cd8a12dc ### 2. loadAccount -加载`PEM`或者`P12`格式的私钥文件,加载的私钥可以用于发送交易签名。 +加载`PEM`或者`P12`格式的私钥文件,加载的私钥可以用于发送交易签名。但是,若控制台使用密码机的公私钥,因公私钥都放在密码机内部,所以使用不了该操作命令。 参数: - 私钥文件路径: 支持相对路径、绝对路径和默认路径三种方式。用户账户地址时,默认从`config.toml`的账户配置选项`keyStoreDir`加载账户,`keyStoreDir`配置项请参考[这里](./sdk/java_sdk/config.html#id9)。 @@ -2579,9 +2615,217 @@ Load account 0x6fad87071f790c3234108f41b76bb99874a6d813 success! ### 4. getCurrentAccount -获取当前账户地址。 +获取当前账户地址。若控制台使用的是密码机公私钥,则展示的是根据密码机内部公钥转换的账户地址。 ```shell [group0]: /apps> getCurrentAccount 0x6fad87071f790c3234108f41b76bb99874a6d813 ``` + + + +## 块内分片管理命令 + +该操作为“块内分片”的管理操作,请参考[此处](../../design/parallel/sharding.md)了解更多技术细节。 + +### 1. makeShard + +创建一个分片 + +参数: + +* 分片名:需要创建的用户名,不允许重复 + +``` +[group0]: /apps> makeShard hello_shard +make shard hello_shard Ok. You can use 'ls' to check +``` + +### 2. linkShard + +将某个合约绑定到某个分片中 + +参数 + +* 合约地址:需要绑定的合约地址 +* 分片名:需要绑定至的分片名,若不存在则创建一个 + +注意 + +* 已经绑定的合约不允许再次绑定 +* 未绑定的合约默认分配在一个名字为”“(空)的分片中 +* 分片内合约部署的合约属于同一个分片 + +``` +[group0]: /apps> linkShard 0xd24180cc0fef2f3e545de4f9aafc09345cd08903 hello_shard +Add 0xd24180cc0fef2f3e545de4f9aafc09345cd08903 to hello_shard Ok. You can use 'ls' to check +``` + +### 3. getContractShard + +根据合约地址,获取其属于哪个分片 + +参数 + +* 合约地址:需要查询的合约地址 + +``` +[group0]: /apps> getContractShard d24180cc0fef2f3e545de4f9aafc09345cd08903 +/shards/hello_shard +``` + +## 资产管理预编译命令 + +该操作为“资产管理”的管理操作,请参考[此处]()了解更多技术细节。 + +### 1. listBalanceGovernor + +查看具有资产操作权限的账户,任意账户可以查看。 + +```shell +[group0]: /apps> listBalanceGovernor +listBalanceGovernor: [0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e] +``` + +注意 + +* 在打开feature_balance_precompiled开关后,默认将链管理账户添加到资产管理权限账户中,可以通过`registerBalanceGovernor` + 接口添加其他账户。 +* 最多可展示500个账户,超过500个账户时将无法再注册。 + +### 2. registerBalanceGovernor + +注册账户资产管理权限,只有链管理员账户具有该权限。 + +参数 + +* 账户地址/合约地址:需要注册的账户地址或者合约地址 + +```shell +[group0]: /apps> registerBalanceGovernor 0x7ef1de472584a76dc5ff06f21ca899695ce5e730 +transaction hash:0xa200a7dc58e100d41c544b583cc74a0e6aa3b1aa82fb7b7e04c117b75b5df898 +register balanceGovernor 0x7ef1de472584a76dc5ff06f21ca899695ce5e730 success. + +[group0]: /apps> listBalanceGovernor +listBalanceGovernor: [0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e, 0x7ef1de472584a76dc5ff06f21ca899695ce5e730] +``` + +注意 + +* 此接口只有链管理员账户具有权限调用 +* 最多注册500个账户为balanceGovernor,超过500个账户将无法注册 + +### 3. unregisterBalanceGovernor + +注销已注册的账户资产管理权限,只有链管理员账户具有该权限。 + +参数 + +* 账户地址/合约地址:需要注销的账户地址或者合约地址 + +```shell +[group0]: /apps> unregisterBalanceGovernor 0x7ef1de472584a76dc5ff06f21ca899695ce5e730 +transaction hash:0x95bcb68caa65451785c23a0a370ec9e7cb6010c81dadf151461b4e270603dffb +unregister balanceGovernor 0x7ef1de472584a76dc5ff06f21ca899695ce5e730 success. + +[group0]: /apps> listBalanceGovernor +listBalanceGovernor: [0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e] +``` + +注意 + +* 当balanceGovernor只有一个账户时,无法再注销。 + +### 4. getBalance + +查询账户的资产余额,任意账户可以查看。 + +参数 + +* 账户地址:需要查询的账户地址 + +```shell +[group0]: /apps> getBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e +balance: 0 wei +``` + +### 5. addBalance + +增加账户的资产余额,只有资产管理权限账户具有调用该接口权限。 + +参数 + +* 账户地址:需要增加资产的账户地址 +* 增加的资产数量:需要增加的资产数量,默认单位为wei +* 资产数量单位:可选,资产数量的单位,默认为wei,支持wei、kwei、mwei、gwei、szabo、finney、ether、kether、mether、gether + +```shell +[group0]: /apps> addBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e 100 wei +transaction hash:0x42265ad297666f16b020d9619180716548a639d5018ed853125f7792b77d9d62 +add balance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e success. You can use 'getBalance' to check + +[group0]: /apps> getBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e +balance: 100 wei + +[group0]: /apps> addBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e 100 kwei +transaction hash:0x7b9491466dddabedaac8aed942a1e4eb819ea5d75d1a8986a889d59bd601dd19 +add balance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e success. You can use 'getBalance' to check + +[group0]: /apps> getBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e +balance: 100100 wei +``` + +### 6. subBalance + +减少指定账户的资产余额,只有资产管理权限账户具有调用该接口权限。 + +参数 + +* 账户地址:需要减少资产的账户地址 +* 减少的资产数量:需要减少的资产数量,默认单位为wei +* 资产数量单位:可选,资产数量的单位,默认为wei,支持wei、kwei、mwei、gwei、szabo、finney、ether、kether、mether、gether + +```shell +[group0]: /apps> subBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e 100 +transaction hash:0x4b723c968e4a1d058e1fbcb7f2babe7717d11f53c63b91c395c74a4d13cabdf5 +sub balance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e success. You can use 'getBalance' to check + +[group0]: /apps> getBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e +balance: 100000 wei + +[group0]: /apps> subBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e 1 kwei +transaction hash:0x2fc4fe40fdefee492b363f6f42d4f814194384e72c27fd46b9ffc644d63b2492 +sub balance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e success. You can use 'getBalance' to check + +[group0]: /apps> getBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e +balance: 99000 wei +``` + +### 7. transferBalance + +转账,从一个账户向另一个账户转账资产,只有资产管理权限账户具有调用该接口权限。 + +参数 + +* 转出账户地址:需要转出资产的账户地址 +* 转入账户地址:需要转入资产的账户地址 +* 转账资产数量:需要转账的资产数量,默认单位为wei +* 资产数量单位:可选,资产数量的单位,默认为wei,支持wei、kwei、mwei、gwei、szabo、finney、ether、kether、mether、gether + +```shell +[group0]: /apps> getBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e +balance: 99000 wei + +[group0]: /apps> getBalance 0x7ef1de472584a76dc5ff06f21ca899695ce5e730 +balance: 0 wei + +[group0]: /apps> transferBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e 0x7ef1de472584a76dc5ff06f21ca899695ce5e730 9 kwei +transaction hash:0xff7c7818a573da072b673c3ba2f4f50694948c12ae439371c7b13cc50f917bc1 +transfer 9kwei from 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e to 0x7ef1de472584a76dc5ff06f21ca899695ce5e730 success. You can use 'getBalance' to check + +[group0]: /apps> getBalance 0x77ed4ea0a43fb76a88ec81a466695a4a704bb30e +balance: 90000 wei + +[group0]: /apps> getBalance 0x7ef1de472584a76dc5ff06f21ca899695ce5e730 +balance: 9000 wei +``` \ No newline at end of file diff --git a/3.x/zh_CN/docs/develop/console/console_config.md b/3.x/zh_CN/docs/operation_and_maintenance/console/console_config.md similarity index 95% rename from 3.x/zh_CN/docs/develop/console/console_config.md rename to 3.x/zh_CN/docs/operation_and_maintenance/console/console_config.md index c3902b5e9..56a804cde 100644 --- a/3.x/zh_CN/docs/develop/console/console_config.md +++ b/3.x/zh_CN/docs/operation_and_maintenance/console/console_config.md @@ -10,7 +10,7 @@ - 可通过命令 ``./start.sh --version`` 查看当前控制台版本 ``` -[控制台](https://github.com/FISCO-BCOS/console)是FISCO BCOS 3.x重要的交互式客户端工具,它通过[Java SDK](../sdk/java_sdk/index.md)与区块链节点建立连接,实现对区块链节点数据的读写访问请求。控制台拥有丰富的命令,包括查询区块链状态、管理区块链节点、部署并调用合约等。此外,控制台提供一个合约编译工具,用户可以方便快捷的将Solidity和webankblockchain-liquid合约文件(以下简称wbc-liquid)编译后的WASM文件转换为Java合约文件。 +[控制台](https://github.com/FISCO-BCOS/console)是FISCO BCOS 3.x重要的交互式客户端工具,它通过[Java SDK](../../sdk/java_sdk/index.md)与区块链节点建立连接,实现对区块链节点数据的读写访问请求。控制台拥有丰富的命令,包括查询区块链状态、管理区块链节点、部署并调用合约等。此外,控制台提供一个合约编译工具,用户可以方便快捷的将Solidity和webankblockchain-liquid合约文件(以下简称wbc-liquid)编译后的WASM文件转换为Java合约文件。 wbc-liquid编译环境搭建请参考:[wbc-liquid的环境配置](https://liquid-doc.readthedocs.io/zh_CN/latest/docs/quickstart/prerequisite.html)。 @@ -29,7 +29,7 @@ wbc-liquid编译环境搭建请参考:[wbc-liquid的环境配置](https://liqu ```shell cd ~ && mkdir -p fisco && cd fisco # 获取控制台下载脚本 -curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v3.2.0/download_console.sh +curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v3.6.0/download_console.sh # 执行下载脚本 bash download_console.sh ``` @@ -181,7 +181,7 @@ console version: 3.0.0 ##### 4.2.1 控制台加载私钥 -控制台提供账户生成脚本get_account.sh(脚本用法请参考[账户管理文档](../account.md),生成的的账户文件在accounts目录下,控制台加载的账户文件必须放置在该目录下。 +控制台提供账户生成脚本get_account.sh(脚本用法请参考[账户管理文档](../../develop/account.md),生成的的账户文件在accounts目录下,控制台加载的账户文件必须放置在该目录下。 控制台启动方式有如下几种: ```shell diff --git a/3.x/zh_CN/docs/develop/console/console_error.md b/3.x/zh_CN/docs/operation_and_maintenance/console/console_error.md similarity index 98% rename from 3.x/zh_CN/docs/develop/console/console_error.md rename to 3.x/zh_CN/docs/operation_and_maintenance/console/console_error.md index 40d91c28d..c0d32cb89 100644 --- a/3.x/zh_CN/docs/develop/console/console_error.md +++ b/3.x/zh_CN/docs/operation_and_maintenance/console/console_error.md @@ -6,7 +6,7 @@ ```eval_rst .. important:: - - ``控制台`` 只支持FISCO BCOS 3.x版本,基于 `Java SDK <../sdk/java_sdk/index.html>`_ 实现。 + - ``控制台`` 只支持FISCO BCOS 3.x版本,基于 `Java SDK <../../sdk/java_sdk/index.html>`_ 实现。 - 可通过命令 ``./start.sh --version`` 查看当前控制台版本 ``` diff --git a/3.x/zh_CN/docs/operation_and_maintenance/console/index.md b/3.x/zh_CN/docs/operation_and_maintenance/console/index.md new file mode 100644 index 000000000..42946d157 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/console/index.md @@ -0,0 +1,38 @@ +# 3. 控制台工具 + +标签:``console`` ``控制台`` ``命令行交互工具`` + +--------- + +```eval_rst +.. important:: + - ``控制台`` 只支持FISCO BCOS 3.0+版本,基于 `Java SDK <../sdk/java_sdk/index.html>`_ 实现。 + - 可通过命令 ``./start.sh --version`` 查看当前控制台版本 +``` + +[控制台](https://github.com/FISCO-BCOS/console)是FISCO BCOS 3.0重要的交互式客户端工具,它通过[Java SDK](../../sdk/java_sdk/index.md)与区块链节点建立连接,实现对区块链节点数据的读写访问请求。控制台拥有丰富的命令,包括查询区块链状态、管理区块链节点、部署并调用合约等。此外,控制台提供一个合约编译工具,用户可以方便快捷的将Solidity和webankblockchain-liquid合约文件编译后的WASM文件转换为Java合约文件。 + +```eval_rst +.. important:: + 相关软件和环境版本说明!`请查看 `_ +``` + +命令行交互控制台是提供给开发者使用的节点查询与管理的工具。 + +控制台拥有丰富的命令,包括查询区块链状态、管理区块链节点、部署并调用合约等。 + +```eval_rst +.. important:: + 访问FISCO BCOS 3.x区块链须使用 ``>= v3.x`` 版本的控制台,不能使用 ``2.x`` 或 ``1.x`` 版本的控制台。 +``` + +使用手册: + +```eval_rst +.. toctree:: + :maxdepth: 2 + + console_config.md + console_commands.md + console_error.md +``` diff --git a/3.x/zh_CN/docs/develop/data_archive_tool.md b/3.x/zh_CN/docs/operation_and_maintenance/data_archive_tool.md similarity index 99% rename from 3.x/zh_CN/docs/develop/data_archive_tool.md rename to 3.x/zh_CN/docs/operation_and_maintenance/data_archive_tool.md index 7edf508d5..0aa1d7f8a 100644 --- a/3.x/zh_CN/docs/develop/data_archive_tool.md +++ b/3.x/zh_CN/docs/operation_and_maintenance/data_archive_tool.md @@ -1,4 +1,4 @@ -# 数据归档使用 +# 5. 数据归档与恢复 标签:``数据归档`` ``数据裁剪`` diff --git a/3.x/zh_CN/docs/operation_and_maintenance/data_index.md b/3.x/zh_CN/docs/operation_and_maintenance/data_index.md new file mode 100644 index 000000000..ab28120d5 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/data_index.md @@ -0,0 +1,121 @@ +# 11. 数据治理通用组件 + +标签:``WeBankBlockchain-Data`` ``数据治理`` ``通用组件`` ``数据导出`` ``数据仓库`` ``数据对账`` + +---- + +## 组件定位 + +数据治理通用组件的全名是WeBankBlockchain-Data数据治理通用组件,它是一套稳定、高效、安全的区块链数据治理组件解决方案,可无缝适配FISCO BCOS区块链底层平台。 +它由数据导出组件(Data-Export)、数据仓库组件(Data-Stash)、数据对账组件(Data-Reconcile)这三款相互独立、可插拔、可灵活组装的组件所组成,开箱即用,灵活便捷,易于二次开发。 + +这三个组件分别从底层数据存储层、智能合约数据解析层和应用层三个方面,提供了区块链数据挖掘、裁剪、扩容、可信存储、抽取、分析、审计、对账、监管等数据治理方面的关键能力。 +WeBankBlockchain-Data已在金融、公益、农牧产品溯源、司法存证、零售等多个行业落地和使用。 + +## 设计目标 + +在区块链底层和区块链应用之间,横亘着一条区块链技术、业务和产品的鸿沟,存在着区块链数据扩容难度大、链上数据难以查询和分析、典型场景缺乏通用化产品或组件支持等多种挑战。 + +社区也经常会有朋友问到: +区块链节点服务器的磁盘快满了,该怎么办? +如何批量查询智能合约里的数据? +我想查询某个账号发过的所有交易怎么查? +微众银行区块链对账方案是怎么做的,有没有通用的解决方案? +…… + +为什么强大的区块链还有这些问题呢? + +首先,随着区块链数据的“爆炸式”增长,链上已经积累了亿计的交易、几T的数据,节点服务器逐渐无法满足交易数据的存储需求,单纯对节点存储空间进行扩容不仅开发成本高、硬件成本高,而且在数据扩容过程中因技术要求较高,易引发系统性风险,且不能一劳永逸地解决问题。另一方面,大量交易冷数据不仅浪费空间,而且会影响区块链节点出块和执行交易的性能。 + +其次,区块链由于特定的链式存储结构,链上数据只能通过智能合约接口的方式获取和调用,不仅执行效率低下,且随着链上数据的增加,其查询和计算性能逐级衰减,无法满足大数据分析和复杂查询的诉求,比如需要检索已经部署在链上的所有合约。基于特定场景的数据导出解决方案,由于智能合约存在较大差异,需要针对智能合约做特定开发,成本很高,不能复用。 + +最后,基于区块链的可信数据缺乏通用的产品和可复用的组件,部分场景之间存在类似的需求,比如业务对账、区块链浏览器、业务分析、监管审计等。不同项目之间存在着大量重复的开发,费时费力,同时区块链应用的开发者完成工作目标需要经历陡峭的学习曲线,还可能在开发、测试中引入各类风险。 + +WeBankBlockchain-Data 从底层数据存储层、智能合约数据解析层和应用层等多个层次入手,提供区块链数据挖掘、裁剪、扩容、可信存储、抽取、分析、审计、对账、监管等数据治理方面的关键能力,满足数据治理全流程开发场景的需求,如下图所示: + +![](../../../../2.x/images/governance/data/data-comp-design.png) + +区块链数据经过区块链共识节点的多方共识,一旦生成就不会被修改。 + +在运维层,区块链的历史区块数据可被数据仓库组件完整或部分导出到本地。作为可信存储镜像,导出的数据仅在本地有效,被修改不会影响链上共识。我们建议使用方建立管理方法,限制对本地数据的修改。 + +在应用数据层,数据导出组件支持导出源数据、初步解析和基于合约解析的多维数据。所有参与者均可部署自己的导出服务,作为本地查询或分析的可信数据源。 + +在业务层,业务对账组件支持机构内外部对链上链下业务数据进行对账。 + + +## 组件简介 +目前,WeBankBlockchain-Data由数据仓库组件(Data-Stash)、数据导出组件(Data-Export)、数据对账组件(Data-Reconcile)三个相互独立、可插拔、可灵活组装的组件构成,后续会根据业务和场景诉求提供更多的功能和解决方案子组件。 + +![](../../../../2.x/images/governance/data/data-gov.png) + +### WeBankBlockchain-Data-Stash 数据仓库组件 +提供FISCO BCOS节点数据扩容、备份和裁剪的能力。 +可基于binlog协议同步区块链底层节点数据,支持断点续传,数据可信验证,并提供快速同步机制。 + +![](../../../../2.x/images/governance/data/Data-Stash.png) + +请参考 +- [Github地址](https://github.com/WeBankBlockchain/Data-Stash) +- [Gitee地址](https://gitee.com/WeBankBlockchain/Data-Stash) +- [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Stash/index.html) +- [快速开始](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Stash/quickstart.html) + +### WeBankBlockchain-Data-Export 数据导出组件 +支持将链上数据导出到MySQL等结构化存储中,解决区块链数据复杂查询、分析和处理的问题。 +只需简单配置、无需开发、即可实时导出个性化的业务数据,实现将裸数据转化为标准化、结构化、有序化、可视化的高价值数据。 + +![](../../../../2.x/images/governance/data/Data-Export.png) + +请参考 +- [Github地址](https://github.com/WeBankBlockchain/Data-Export) +- [Gitee地址](https://gitee.com/WeBankBlockchain/Data-Export) +- [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Export/index.html) +- [快速开始](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Export/install.html) + +### WeBankBlockchain-Data-Reconcile 数据对账组件 +提供区块链数据的对账解决方案。 +灵活配置、无需开发,支持自定义对账数据和对账格式,支持定时对账和触发对账,对账处理模块可插拔可扩展。 + +![](../../../../2.x/images/governance/data/Data-Reconcile.png) + +请参考 +- [Github地址](https://github.com/WeBankBlockchain/Data-Reconcile) +- [Gitee地址](https://gitee.com/WeBankBlockchain/Data-Reconcile) +- [文档](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Reconcile/index.html) +- [快速开始](https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Reconcile/install.html) + +## 使用场景 + +企业级区块链应用存在多元化角色参与,诸如业务角色、运营人员、开发角色、运维角色等。针对区块链数据,每一个特定的角色都有着不同的数据治理诉求。WeBankBlockchain-Data分别从区块链底层节点数据维护、应用数据处理和业务数据应用三个维度,抽象、设计了对应的组件来满足不同角色的对数据治理的需求。 + +### 场景1:节点数据维护 + +数据仓库组件Data-Stash是一款针对区块链节点数据处理的轻量化、高安全、高可用组件,主要面向运维人员和开发人员。 + +数据备份:Data-Stash可以通过Binlog协议对区块链节点数据进行准实时全量备份,区块链节点可以根据实际情况进行冷热数据裁剪和分离,在确保数据安全可信的基础上,解决节点扩容问题,降低开发和硬件成本。在解决节点扩容问题的同时,可以使得节点“轻装上阵”,不仅能够减少节点空间的开销,而且能够有效提升节点执行交易的性能。 + +数据同步:对于加入区块链网络的新节点,可以通过Data-Stash,在Fisco Sync工具的配合下,快速同步区块链网络的数据,确保节点以最快的速度参与到区块链网络的“工作”中,降低新节点因等待数据同步而造成的时间浪费。 + +### 场景2:应用数据处理 + +数据导出组件Data-Export 提供了导出的区块链标准数据、自动基于智能合约代码智能分析而生成的定制数据,存储到MySQL和ElasticSearch等存储介质中,主要面向开发人员。 + +复杂查询与分析:现有区块链对查询功能不太友好,且链上计算非常宝贵,Data-Export支持将链上存储的区块链数据导出到链下的分布式存储系统中。开发者可以基于已导出的区块链系统基础数据,智能合约部署合约账户、事件和函数等数据,进行二次开发,定制复杂查询和数据分析的逻辑,快速实现业务需求。例如,开发者可对交易明细根据业务逻辑进行统计和关联查询分析,开发各类反洗钱和审计监管报表等等。 + +区块链数据可视化:Data-Export会自动生成Grafana的配置文件,无需开发,即可实现区块链数据可视化。区块链数据可视化不仅能够作为区块链数据大盘、数据查看、运营分析的工具,同时也可以运用在应用开发、调试、测试阶段,以可见即可得的方式提升研发体验和效率。此外,Data-Export还提供了Restful API供外部系统集成。运维人员可以通过Grafana实时监控业务系统的状态,业务人员可以在集成后的业务后台系统上获得该业务的实时进展。 + +区块链中间件平台WeBASE的数据导出子系统已经整合了Data-Export,同时,Data-Export也可以独立与区块链底层集成,以灵活地支持业务需求,迄今已在数十个生产系统中稳定、安全运行。 + +如今,Data-Export作为区块链数据治理的关键组件,以开源形式发布,由社区伙伴通力完善,以适应更多的使用场景、打造更多的功能。 + +### 场景3:业务数据应用 + +在业务层,数据对账是区块链交易系统中最常见的场景之一。基于数个区块链DAPP应用的开发和实践经验,我们封装和开发了数据对账组件Data-Reconcile,提供基于区块链智能合约账本的通用化数据对账解决方案,并提供了一套可动态延展的对账框架,支持定制化开发,主要面向开发人员,为业务人员提供服务。 + +企业内部对账:Data-Reconcile支持企业内部系统之间的对账,例如区块链链上数据与链下业务系统之间的对账。开发人员可以利用Data-Reconcile快速进行二次开发,将业务系统数据和链上数据进行核算比对,保证了企业内部业务系统数据的可靠和运行安全。 + +企业间对账:Data-Reconcile可以帮助开发者快速构建跨机构间的对账应用系统。例如,在结算时,A企业定期将自身业务系统交易数据导出为对账文件,发送至与文件存储中心。B企业可借助Data-Reconcile定期拉取A企业对账文件,配合Data-Export,与企业内部的链上数据进行对账处理。Data-Reconcile在保证对账结果可信的同时提升了对账的效率,可实现准实时对账。 + +综上所述,WeBankBlockchain-Data 是一套稳定、高效、安全的立体化区块链数据治理解决方案,旨在通过提供一系列相互独立、可插拔、可灵活组装的组件,应对和处理区块链海量数据的问题,为用户带来更加便捷、简单、低成本和轻量化的用户体验,从而推动区块链数据治理的发展。 + diff --git a/3.x/zh_CN/docs/operation_and_maintenance/governance_index.md b/3.x/zh_CN/docs/operation_and_maintenance/governance_index.md new file mode 100644 index 000000000..31ff493f9 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/governance_index.md @@ -0,0 +1,183 @@ +# 12. 多方协作治理组件 + +标签:``WeBankBlockchain-Governance`` ``区块链多方协作治理`` ``通用组件`` ``账户治理`` ``权限治理`` ``私钥管理`` ``证书管理`` + +---- + +## 组件定位 +区块链历经10余年的发展,基础技术框架逐渐完善,链上承载的业务越来越丰富,参与方越来越多。多方协作能否顺畅进行、业务摩擦能否得到有效解决、既往治理策略和实践能否满足日后高速发展的需求……行业关注的重点逐步聚焦到这些更具挑战性的难题上。 + +2021年1月,微众银行区块链在多年技术研究和应用实践的基础上,重磅发布了[《面向区块链的多方协作治理框架》白皮书](https://mp.weixin.qq.com/s?__biz=MzU0MDY4MDMzOA==&mid=2247486381&idx=1&sn=caae41a2241e3b1c2cd58181ef73a1bc&chksm=fb34c250cc434b46b2c1b72299c2eb71e1bd6b7597c341423c5d262f18a6e0af1628e0ba4037&scene=21#wechat_redirect),即MCGF(Multilateral Collaborative Governance Framework)。 + +作为区块链治理的参考架构,MCGF全面覆盖区块链治理的设计规范、参与角色、核心系统架构、功能流程及应用场景等领域。 + +其开放式的框架可适配多种异构区块链底层网络,并结合管理和技术策略,统筹链上治理和链下治理。在系统层面,MCGF通过各类工具、组件和服务等方式支撑治理。最后,MCGF为各参与方设计可视化、交互式、多终端的感知和操作方式,提供优良的用户体验。 + +区块链本身追求多方协作,其体系和技术的发展落地都离不开社区的支持。我们秉持一贯的开源、开放的理念,诚邀各行业伙伴携手共建区块链治理体系,共同探索区块链治理之道。 + +我们将逐步把MCGF的内容一一开源,以飨社区。本次开源列表包含一套开箱即可用的区块链治理通用组件(WeBankBlockchain-Governance)。这些组件是MCGF框架的实做基础和原子性构件,可复用、可定制。 + +它们嵌入和运行在整个MCGF大框架的各部分,宛如高速行驶的汽车上的车轮、齿轮、传动组、传感器,协同助力构建治理框架和提升开发效率。欢迎社区一起建设和发展更多、更优的高可用组件。 + +## 设计目标 + +在基于分布式协作的联盟链中,各参与方以一种松散耦合、且彼此并不完全信任的形式参与协作。 + +联盟链中,设计了多种机制来帮助参与者之间建立信任且达成共识,私钥、证书、账户和权限管理都是其中关键的支撑技术。 + +但上述技术较为复杂,在应用效果看,还需要更多的可复用、易落地的工具或组件。 + +我们也常常会听到这样一些关于联盟链开发、使用和治理过程中的问题: + +私钥概念复杂,其算法类型、存储文件、生成方式众多,难以理解和掌握,有没有简单、好用的工具来提升使用的体验? + +区块链节点上的密钥是明文存储在硬盘上的,存在很大的操作风险,有没有安全存储的解决方案? + +现有的区块链网络是以私钥为控制中心进行设计的,万一泄露或丢失了私钥该怎么办? + +如何在同一区块链网络群组,针对不同的业务,以更细的粒度来控制智能合约的访问权限? + +如何解决区块链应用角色设置不当导致的系统性风险? + +现有的证书管理工具,尤其是国密相关的证书管理工具,相对不完善,有没有好用的工具推荐? + +证书管理不仅仅涉及证书的生成,还包括了证书托管、签发、重置,尤其是在证书有效期设置被要求不断缩短的大趋势下,更需要频繁地重置,有没有完整的、一站式的解决方案? + +…… + +分析、归纳以上问题,不难看出私钥、账户、权限和证书管理和使用等方面均存在较高门槛:开发者需要在不同场景重复且繁琐地解决同一个问题,用户在使用过程中容易出现困惑和不顺手,甚至可能因为治理方案不完善给系统带来安全隐患和风险。 + +为了解决上述问题,我们开发了区块链治理通用组件,旨在提供轻量解耦、开箱即用、简洁易用、一站式的区块链治理能力。 + +- **轻量解耦**。所有的治理组件与具体的业务解耦。可轻量化集成,在不侵入底层的前提下可插拔。通过类库、智能合约、SDK等多种方式提供。使用者甚至只需要使用链控制台,就可以部署和管控治理过程。 +- **通用场景**。所有治理组件所瞄准的都是所有联盟链治理中的“刚需”场景,例如首批开源的账户重置、合约权限、私钥和证书的生命周期管理,账户、合约、私钥和证书堪称联盟链技术及上层治理的基石。 +- **一站式**。链治理通用组件致力于提供一站式的使用体验。以私钥管理组件为例,支持多种私钥生成方式和格式、覆盖几乎所有主流场景,提供基于文件、多数据库等托管方式,并支持私钥派生、分片等加密方式。 +- **简洁易用**。致力于提供简洁的使用体验,让用户轻松上手。 +WeBankBlockchain-Governance 定位为区块链链治理组件,不仅希望在开发层面提供趁手的工具,更希望在实践层面为区块链参与者提供可参考落地的实践案例,从整体上助力区块链行业治理水平的提升。 + + +## 组件简介 +本次开源的区块链治理通用组件由私钥管理组件(Governance-Key)、账户治理组件(Governance-Account)、权限治理组件(Governance-Authority)、证书管理组件(Governance-Cert)等组件构成。 + +![](../../../../2.x/images/governance/MCGF/MCGF_overview.png) + +各治理组件提供了详细的使用文档。其中,账户治理组件和权限治理组件还提供了合约代码、Java语言的SDK、合约集成Demo和Java版SDK的使用Demo,以便于使用者基于自身业务的实际场景进行自由、灵活地使用和集成。 + +### WeBankBlockchain-Governance-Account 账户治理组件 +基于智能合约开发,提供区块链用户账户注册、私钥重置、冻结、解冻等账户全生命周期管理,支持管理员、阈值投票、多签制等多种治理策略。 + +在现有的区块链设计中,一旦私钥丢失,就无法对应身份进行再操作。于是,账户治理组件秉持以“账户为核心”的理念,提出双层账户体系,解决私钥和账户强绑定的痛点,从而实现账户私钥更换能力,意味着即使私钥丢失,账户也能找回。 + +在账户治理组件中,账户不再采用公钥地址,而是采用公钥账户加内部随机账户的双层账户体系。 + +账户治理组件提供了多种区块链账户治理规则、账户生命周期管理等整体解决方案,包括创建治理账户、选择多种治理规则,授权治理权限,创建账户、冻结账户、解冻账户、更换私钥、销户等账户生命周期的各类账户管理功能。 + +![](../../../../2.x/images/governance/MCGF/governance_account.png) + +请参考 +- [Github地址](https://github.com/WeBankBlockchain/Governance-Account) +- [Gitee地址](https://gitee.com/WeBankBlockchain/Governance-Account) +- [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Acct/index.html) +- [快速开始](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Acct/quickstart.html) + +### WeBankBlockchain-Governance-Authority 权限治理组件 +基于智能合约,提供区块链账户、合约、函数等粒度的权限控制的功能的通用组件。 + +随着基于智能合约的区块链应用开发案例的涌现,各应用开发场景对智能合约权限的控制和分组的需求也越来越迫切。权限治理组件提供基于智能合约的区块链账户、合约函数等粒度的权限控制。 + +权限治理组件支持拦截对合约函数的非法调用,还支持权限分组——通过配置函数与组的关联,可轻松实现分组的权限控制。只需在业务代码中引入权限合约地址,并在需要进行权限控制的函数中,访问权限合约的判断接口,就可以实现权限控制。 + +治理者只需操作权限治理合约,不需要调整业务合约,权限的修改即可实时生效。权限控制支持按需配置黑名单模式、白名单模式。 + +此外,权限治理组件还支持多种权限治理规则,例如一票通过、阈值投票等。 + +![](../../../../2.x/images/governance/MCGF/governance_authority.png) + +请参考 +- [Github地址](https://github.com/WeBankBlockchain/Governance-Authority) +- [Gitee地址](https://gitee.com/WeBankBlockchain/Governance-Authority) +- [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Auth/index.html) +- [快速开始](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Auth/quickstart.html) + +### WeBankBlockchain-Governance-Key 私钥管理组件 +提供私钥生成、存储、加解密、加签、验签等私钥全生命周期管理的通用解决方案。 + +私钥管理组件提供了私钥的生成、保存、托管、使用的能力,覆盖私钥使用全生命周期。 + +该组件支持多种标准协议,在私钥生成方面,支持随机数生成、助记词生成和派生生成等方式;就保存而言,支持门限分片还原,也支持按pkcs12(p12)、keystore、pem等格式导出;就托管而言,适配多种信任模型,可满足企业级用户的多样化需求;就使用而言,支持私钥签名、公钥加密等。 + +私钥管理组件还全面提供了国密支持。 + +![](../../../../2.x/images/governance/MCGF/governance_key.png) + +请参考 +- [Github地址](https://github.com/WeBankBlockchain/Governance-Key) +- [Gitee地址](https://gitee.com/WeBankBlockchain/Governance-Key) +- [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html) +- [快速开始](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/corequickstart.html) + +### WeBankBlockchain-Governance-Cert 证书管理组件 +提供证书生成、验证、子证书请求等证书全生命周期管理的通用解决方案。 + +证书管理组件提供了X509标准的多级证书的签发、验证、重置、撤销、导出及托管的能力,覆盖证书的全生命周期,并支持多种签名算法,如SHA256WITHRSA、SHA256WITHECDSA、SM3WITHSM2等签名算法,并提供国密支持。 + +组件包括了cert-toolkit和cert-mgr两个模块,cert-toolkit提供证书生成等基础能力,可作为独立工具包使用,cert-mgr基于cert-toolkit工具包,提供了证书的托管能力,并统一规范了签发的流程。 + +![](../../../../2.x/images/governance/MCGF/governance_cert.png) + +请参考 +- [Github地址](https://github.com/WeBankBlockchain/Governance-Cert) +- [Gitee地址](https://gitee.com/WeBankBlockchain/Governance-Cert) +- [文档](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html) +- [快速开始](https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/start.html) + +## 使用场景 + +###私钥管理场景 +私钥在区块链的设计体系中是不可或缺的。但是私钥本身难于理解,难于使用,更难于保管,管理成本巨大,严重削弱了区块链的使用体验。 + +现有区块链的实际场景中对私钥管理的有效工具依旧缺位。私钥管理普遍存在难度大、学习成本高、用户体验差等问题。 + +私钥管理组件提供了一系列丰富而独立的私钥管理手段,用户可根据自己的需求选择合适的方案。 + +**私钥生成**:用户可以使用助记词方式生成。一方面,助记词由单词构成,相对容易记忆,减少了记忆和表达的难度。另一方面,如果为不同的场景使用独立的私钥,会增加记忆的成本和丢失的风险,此时可采用私钥派生功能,用户只需保管根私钥即可,在不同的场景下根私钥会派生不同的子私钥。 + +**私钥托管**:得到私钥后,可选择经口令加密后导出为keystore或者pkcs12等格式,也可以交由企业级机构托管;还可以选择分片为若干个子片,分给不同的设备来存储。 + +**私钥使用**:用户得到私钥后,可使用该私钥签发交易、使用公钥加密私钥解密等。 + +### 账户治理场景 +私钥本身存在易于丢失、易泄露的问题。因私钥丢失造成的经济损失屡见不鲜。由于巨大的经济利益驱使,对于私钥的安全攻击和盗窃案例也层出不穷。如何重置用户私钥,保护用户的资产安全是区块链推广的底线。 + +账户治理组件旨在提供基于智能合约的自洽的账户治理机制,实现私钥变更而身份不变的效果。账户治理组件既支持联盟链治理委员会的元治理,也支持基于联盟链具体业务应用的治理场景。 + +联盟链治理委员会账户治理:在传统的中心化解决方案中,存在着一家独大的风险。在联盟链中,通常会采用多中心的治理委员会来规避单点风险。联盟链治理委员会成员可依托治理合约,来行使管理职能,对各项事务进行投票和表决。 + +但是,与委员会成员所关联的私钥仍然存在泄露或丢失的风险。账户治理组件可应用于联盟链治理委员会账户治理中,联盟链治理委员会成员的账户也依托账户治理组件进行管理。 + +区块链存证业务账户治理:用户可用当前私钥在账户治理组件中开户,以生成内部身份。业务系统可依赖该内部身份,例如在存证业务合约中,数据的记录是与该内部身份相绑定的。 + +当需要修改私钥时,可通过关联账户或治理委员会以投票形式修改私钥,用新的私钥申请绑定旧的身份,这样用新的私钥便可继续操作旧的身份,同时旧的私钥则作废。 + +### 权限治理场景 + +在应用开发中,若缺乏一套安全机制,必然会产生很严重的后果。一方面,区块链应用需要细化到合约函数粒度级别的安全访问控制;另一方面,针对不同用户进行权限分组,防范交易越权等漏洞,避免被黑客攻击,也是区块链应用安全的刚需。 + +权限治理组件提供了业务权限治理工具,包含了不同账户的分组信息,还有不同组的权限。权限配置满足各类需求,使得开发者可以快速地为自己的智能合约应用集成权限控制功能。典型的功能如下: +- **账户分组**:可以将账户地址分组,并设置该组的权限,实现组的复用。 +- **黑白名单模式**:支持黑白名单两种权限模式,管理员或治理委员会可以设置一个函数仅由一个组的成员来访问,或者仅允许该组以外的账户访问。 +- **跨合约**:允许跨合约配置权限,例如可设置一组成员同时被多个合约中的函数禁止。 +- **轻量接入**:业务方合约不需要知道这些复杂的权限配置,只需要在自己的函数中调用权限合约的拦截接口,当用户调用该函数的时候,业务方合约会自动将调用信息上下文交予权限系统进行判断、拦截。 + +### 证书管理场景 +在联盟链的企业级身份认证管理中,证书是网络安全的基石。证书操作和使用体验的劣势,会危及整个联盟链网络的参与者,影响彼此的信任和业务的安全。 + +例如FISCO BCOS网络采用面向CA的准入机制,使用x509协议的证书格式,支持任意多级的证书结构,保障信息保密性、认证性、完整性及不可抵赖性。 + +证书管理组件提供了证书生命周期管理的解决方案,规范证书签发流程,支持证书托管,支持多种签名算法,方便个人或企业使用。以证书管理和工具包使用为例: + +**链上节点准入证书管理**:链上节点证书的签发统一由证书管理组件来完成,证书管理组件可以集成或者独立部署,并由权威机构来管理服务。 + +在链初始化时,部署者可调用接口完成根证书的生成。新增机构或节点可以通过证书管理组件提供的查询接口,来查询根证书,并提交子证书请求。根证书管理者可从通过查询请求列表,选择签发子证书。通过证书管理组件对于证书的管理,可以规范签发流程,提升效率。 + +**证书工具包使用**:证书管理组件中cert-toolkit可作为独立JAVA工具包在项目中引用,代替命令行完成证书的生成和签发。企业或个人项目可集成证书管理组件作为证书签发工具包。 diff --git a/3.x/zh_CN/docs/operation_and_maintenance/light_monitor.md b/3.x/zh_CN/docs/operation_and_maintenance/light_monitor.md new file mode 100644 index 000000000..9aee3b979 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/light_monitor.md @@ -0,0 +1,207 @@ +# 2. 监控工具 + +标签:``监控`` ``monitor`` + +---- + +## light_monitor.sh + +`FISCO-BCOS 3.0`区块链轻量级监控工具,可以监控区块链是否正常工作,也提供简单的接入用户告警系统的方式. + +- 监控共识是否正常. +- 监控区块同步是否正常. +- 监控磁盘空间. +- 对接告警系统,发送告警信息. + +### 使用 + +帮助: +`bash light_monitor.sh -h` + +```shell +$ bash light_monitor.sh -h +Usage: +Optional: + -g [Require] group id + -i [Require] rpc server ip + -p [Require] rpc server port + -t [Optional] block number far behind warning threshold, default: 30 + -d [Optional] disk directory to be monitor + -T [Optional] disk capacity alarm threshold, default: 5% + -h Help. +Example: + bash light_monitor.sh -i 127.0.0.1 -p 20200 -g group0 + bash light_monitor.sh -i 127.0.0.1 -p 20200 -g group0 -d /data -T 10 +``` + +**参数:** + +- `-g`: 监控的群组id,`rpc`接入多个群组时,可以部署多个light_monitor.sh,分别监控不同群组 +- `-i`: rpc ip +- `-p`: rpc port +- `-t`: 区块同步告警的阈值,共识节点之间的区块高度差值超过该阈值,说明共识或者区块同步异常,默认值`30` +- `-d`: 磁盘容量需要监控的目录 +- `-T`: 磁盘告警阈值,监控的磁盘剩余空间百分比小于该值时,触发告警,默认值`5%` +- `-h`: 帮助信息 + +#### 状态描述 + +**参数:** + +- $config_ip: rpc ip +- $config_port:rpc port +- $group: 群组id +- $height: 区块高度 + +**```OK! $config_ip:$config_port $node:$group is working properly: height $height```** + +群组`${group}`正常工作, 共识模块/区块同步正常工作 + +**```ERROR! Cannot connect to $config_ip:$config_port ${group}, method: xxxx```** + +调用`rpc`接口`xxxx`失败,`rpc`服务宕机, 严重错误,此时需要重启`rpc`服务 + +**```ERROR! Consensus timeout $config_ip:$config_port ${group}:${node}```** + +**群组共识超时,连续出现时为严重错误**。 +排查网络连接是否正常。 + +**```ERROR! insufficient disk capacity, monitor disk directory: ${dir}, left disk space percent: ${disk_space_left_percent}%```** + +磁盘空间不足,剩余`${disk_space_left_percent}%`的空间 + +为了能够持续监控区块链节点的状态, 将`light_monitor.sh`配置到`crontab`定期执行. + +```shell +# 每分钟执行一次,查看节点是否正常启动, 正常共识, 有无关键错误打印 +*/1 * * * * /data/app/127.0.0.1/light_monitor.sh >> /data/app/127.0.0.1/light_monitor.log 2>&1 +``` + +`light_monitor.log`保存`light_monitor.sh`的输出 + +**用户需要根据实际部署修改示例中的路径.** + +### 对接告警系统 + +- 接口 +`light_monitor.sh`对接告警系统的接口`alarm`, 默认实现如下: + +```shell +alarm() { + echo "$1" + alert_msg="$1" + alert_ip=$(/sbin/ifconfig eth0 | grep inet | grep -v inet6 | awk '{print $2}') + alert_time=$(date "+%Y-%m-%d %H:%M:%S") + + # TODO: alarm the message, mail or phone + + # echo "[${alert_time}]:[${alert_ip}]:${alert_msg}"| mail -s "fisco-bcos alarm message" xxxxxx@qq.com +} +``` + + `light_monitor.sh`执行触发的关键错误处都会调用该函数, 并将错误信息作为入参, 用户可以调用监控平台的API将错误信息发送至告警平台. + +- 示例 + + 假设用户的告警系统 + +- API: + `http://127.0.0.1:1111/alarm/request` + POST参数: + ```{'title':'告警主题','alert_ip':'告警服务器IP', 'alert_info':'告警内容'}``` + + 修改`alarm`函数: + +```shell +alarm() { + echo "$1" + alert_msg="$1" + alert_ip=$(/sbin/ifconfig eth0 | grep inet | grep -v inet6 | awk '{print $2}') + alert_time=$(date "+%Y-%m-%d %H:%M:%S") + + # TODO: alarm the message, mail or phone + + curl -H "Content-Type: application/json" -X POST --data "{'title':'alarm','alert_ip':'${alert_ip}','alert_info':'${alert_msg}'}" http://127.0.0.1:1111/alarm/request +} +``` + + +## **节点监控** + +`FISCO-BCOS 3.0`区块链监控工具,可以监控区块链区块高度等一些指标,在图形化的界面显示. + +涉及的组件包括grafana(用于展示指标),prometheus(用于采集指标信息),mtail(用于分析区块链日志信息获取指标). + +### 安装搭建 + +监控工具可以在搭建区块链的时候选择是否随着搭建一起部署,相关参数如下(其他参数可以参考[build_chain.sh一键建链工具](./build_chain.md)): + +### **`m`节点监控选项[**Optional**]** + +可选参数,当区块链节点启用节点监控时,可通过`-m`选项来部署带监控的节点,若不选择该选项则只部署不带监控的节点。 + +部署开启监控的Air版本区块链示例如下: + +```shell +[root@172 air]# bash build_chain.sh -p 30300,20200 -l 127.0.0.1:4 -o nodes -e ./fisco-bcos -t ./mtail -m +[INFO] Use binary ./fisco-bcos +[INFO] Use binary ./mtail +[INFO] Generate ca cert successfully! +Processing IP:127.0.0.1 Total:4 +[INFO] Generate nodes/127.0.0.1/sdk cert successful! +[INFO] Generate nodes/127.0.0.1/node0/conf cert successful! +[INFO] Generate nodes/127.0.0.1/node1/conf cert successful! +[INFO] Generate nodes/127.0.0.1/node2/conf cert successful! +[INFO] Generate nodes/127.0.0.1/node3/conf cert successful! +[INFO] Begin generate uuid +[INFO] Generate uuid success: 1357cd37-6991-44c0-b14a-5ea81355c12c +[INFO] Begin generate uuid +[INFO] Generate uuid success: c68ebc3f-2258-4e34-93c9-ba5ab6d2f503 +[INFO] Begin generate uuid +[INFO] Generate uuid success: 5311259c-02a5-4556-9726-daa1ee8fbefc +[INFO] Begin generate uuid +[INFO] Generate uuid success: d4e5701b-bbce-4dcc-a94f-21160425cdb9 +============================================================== +[INFO] fisco-bcos Path : ./fisco-bcos +[INFO] Auth Mode : false +[INFO] Start Port : 30300 20200 +[INFO] Server IP : 127.0.0.1:4 +[INFO] SM Model : false +[INFO] output dir : nodes +[INFO] All completed. Files in nodes +``` +提示All completed. Files in nodes,说明生成完区块链节点文件. + +### 使用流程 + +#### 第一步. 启动FISCO BCOS链 + +- 启动所有节点 + +```shell +bash nodes/127.0.0.1/start_all.sh +``` +启动成功会输出如下信息。否则请使用`netstat -an |grep tcp`检查机器`30300~30303, 20200~20203`端口是否被占用。 + +```shell +try to start node0 +try to start node1 +try to start node2 +try to start node3 + node3 start successfully pid=36430 + node2 start successfully pid=36427 + node1 start successfully pid=36433 + node0 start successfully pid=36428 +``` + +#### 第二步. 启动监控脚本 + +启动节点监控 + +```shell +sh nodes/monitor/start_monitor.sh +``` + +#### 第三步.根据提示登录grafana,查看指标 + +url启动脚本会打印对应的地址,默认用户名密码为admin/admin登录页面后导入Dashboard([github源码](https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/tools/template/Dashboard.json)),配置prometheus源(http://ip:9090/),既可查看各个指标实时展示。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/operation_and_maintenance/log/index.md b/3.x/zh_CN/docs/operation_and_maintenance/log/index.md new file mode 100644 index 000000000..383e51508 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/log/index.md @@ -0,0 +1,16 @@ +# 13. 日志说明 +标签: ``日志说明`` ``日志审计`` +使用手册: + + +FISCO BCOS将区块链节点内关键步骤输出至于``nodeX/log/``目录下的`log_%YYYY%mm%dd%HH.%MM`的文件中,且定制了日志格式,方便用户通过日志查看链运行状态。 + +用户可以通过日志文件快速了解区块链节点的状态、交易执行错误的依据,可使用其他审计工具通过抓取日志从而获取区块链的实际状态。 + +```eval_rst +.. toctree:: + :maxdepth: 2 + + log_description.md + system_log_audit.md +``` \ No newline at end of file diff --git a/3.x/zh_CN/docs/operation_and_maintenance/log/log_description.md b/3.x/zh_CN/docs/operation_and_maintenance/log/log_description.md new file mode 100644 index 000000000..e3fcc3f67 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/log/log_description.md @@ -0,0 +1,151 @@ +# 查看日志 + +标签:``日志格式`` ``日志关键词`` ``问题排查`` ``查看日志`` + +---- + +FISCO BCOS的所有群组日志都输出到log目录下`log_%YYYY%mm%dd%HH.%MM`的文件中,且定制了日志格式,方便用户通过日志查看链运行状态。 + +## 日志格式 + +每一条日志记录格式如下: + +```bash +# 日志格式: +log_level|time|[module_name] content + +# 日志示例: + +info|2022-11-21 20:00:35.479505|[SCHEDULER][blk-1]BlockExecutive prepare: fillBlock end,txNum=1,cost=0,fetchNum=1 +``` + +各字段含义如下: + +- `log_level`: 日志级别,目前主要包括`trace`, `debug`, `info`, `warning`, `error`和`fatal`,其中在发生极其严重错误时会输出`fatal` + +- `time`: 日志输出时间,精确到纳秒 + +- `module_name`:模块关键字,如同步模块关键字为`SYNC`,共识模块关键字为`CONSENSUS` + +- `content`:日志记录内容 + + +## 常见日志说明 + +**共识打包日志** + +```eval_rst +.. note:: + + - 仅共识节点会周期性输出共识打包日志(节点目录下可通过命令 ``tail -f log/* | grep "${group_id}.*++"`` 查看指定群组共识打包日志) + + - 打包日志可检查指定群组的共识节点是否异常,**异常的共识节点不会输出打包日志** +``` + +下面是共识打包日志的示例: +```bash +info|2022-11-21 20:00:45.530293|[CONSENSUS][PBFT]addCheckPointMsg,reqHash=c2e031c8...,reqIndex=2,reqV=9,fromIdx=3,Idx=1,weight=4,minRequiredWeight=3 +``` +- `reqHash`:PBFT请求的哈希 +- `reqIndex`:PBFT请求对应的块高 +- `reqV`: PBFT请求对应的视图 +- `fromIdx`: 产生该PBFT请求的节点索引编号 +- `Idx`: 当前节点索引编号 +- `weight`: 该请求对应的proposal的共识总权重 +- `minRequiredWeight`: 该请求对应的proposal达成共识所需的最小投票权重 + + +**异常日志** + +网络抖动、网络断连或配置出错(如同一个群组的创世块文件不一致)均有可能导致节点共识异常,PBFT共识节点会输出`ViewChangeWarning`日志,示例如下: + +```bash +warning|2022-11-17 00:58:03.621465|[CONSENSUS][PBFT]onCheckPointTimeout: resend the checkpoint message package,index=176432,hash=d411d77d...,committedIndex=176431,consNum=176432,committedHash=ecac3705...,view=1713,toView=1713,changeCycle=0,expectedCheckPoint=176433,Idx=0,unsealedTxs=168,sealUntil=176432,waitResealUntil=176431,nodeId=0318568d... +``` +- `index`:共识索引号 +- `hash`: 共识区块哈希 +- `committedIndex`: 落盘区块块高 +- `consNum`: 下一个共识区块块高 +- `committedHash`: 落盘区块哈希 +- `view`: 当前视图 +- `toview`: 下一个视图 +- `changeCycle`: 当前的超时时钟周期 +- `expectedCheckPoint`: 下一个待执行的区块块高 +- `Idx`: 当前节点的索引编号 +- `sealUntil`: 可以打包产生下一个区块的区块高度,在有系统区块的场景下,当且仅当落盘高度超过sealUntil时才可以打包产生下一个区块 +- `waitResealUntil`: 同上,可以打包产生下一个区块的区块高度,在有视图切换 + 系统区块的场景下,当且仅当落盘高度超过waitResealUntil时才可以打包产生下一个区块 +- `unsealedTxs`: 交易池里未打包的交易数目 +- `nodeId`: 当前共识节点id + + +**区块落盘日志** + +区块共识成功或节点正在从其他节点同步区块,均会输出落盘日志。 + +```eval_rst +.. note:: + + 向节点发交易,若交易被处理,非游离节点均会输出落盘日志(节点目录下可通过命令 ``tail -f log/* | grep "Report"`` 查看节点出块情况),若没有输出该日志,说明节点已处于异常状态,请优先检查网络连接是否正常、节点证书是否有效 + +``` + +下面是区块落盘日志: +```bash +info|2022-11-21 20:00:45.531121|[CONSENSUS][PBFT][METRIC]^^^^^^^^Report,sealer=3,txs=1,committedIndex=2,consNum=3,committedHash=c2e031c8...,view=9,toView=9,changeCycle=0,expectedCheckPoint=3,Idx=1,unsealedTxs=0,sealUntil=0,waitResealUntil=0,nodeId=8f69046f... +``` + +日志中各字段说明如下: +- `sealer`: 产生该proposal的共识节点索引编号 +- `txs`: 块内包含的交易数 +- `committedIndex`: 落盘区块块高 +- `consNum`: 下一个共识区块块高 +- `committedHash`: 落盘区块哈希 +- `view`: 当前视图 +- `toview`: 下一个视图 +- `changeCycle`: 当前的超时时钟周期 +- `expectedCheckPoint`: 下一个待执行的区块块高 +- `Idx`: 当前节点的索引编号 +- `sealUntil`: 可以打包产生下一个区块的区块高度,在有系统区块的场景下,当且仅当落盘高度超过sealUntil时才可以打包产生下一个区块 +- `waitResealUntil`: 同上,可以打包产生下一个区块的区块高度,在有视图切换 + 系统区块的场景下,当且仅当落盘高度超过waitResealUntil时才可以打包产生下一个区块 +- `unsealedTxs`: 交易池里未打包的交易数目 +- `nodeId`: 当前共识节点id + + +**网络连接日志** + +```eval_rst +.. note:: + + 节点目录下可通过命令 ``tail -f log/* | grep "connected count"`` 检查网络状态,若日志输出的网络连接数目不符合预期,请通过 ``netstat -anp | grep fisco-bcos`` 命令检查节点连接 +``` + +日志示例如下: +```bash +info|2022-08-15 19:38:59.270112|[P2PService][Service][METRIC]heartBeat,connected count=3 +``` + +日志中各字段含义如下: +- `connected count`: 与当前节点建立P2P网络连接的节点数 + + +## 日志模块关键字 + +FISCO BCOS日志中核心模块关键字如下: + +| 模块 | 模块关键字 | +| :--- | :---- | +| 区块链初始化模块 | INITIALIZER | +| 网络基础模块 | NETWORK | +| P2P网络模块 | P2PService | +| 账本模块 |LEDGER| +| 共识区块打包模块 |CONSENSUS, SEALER| +| PBFT共识处理模块 | CONSENSUS, PBFT| +| 区块/交易同步模块 |SYNC| +| 交易池 |TXPOOL| +| Amop模块 | AMOP | +| 调度器 | SCHEDULER | +| 执行器 | EXECUTOR | +| 轻节点 |LIGHTNODE | +| 网关 |Gateway | +| 存储中间件模块 |STORAGE| +| 链工具 |TOOL| \ No newline at end of file diff --git a/3.x/zh_CN/docs/develop/system_log_audit.md b/3.x/zh_CN/docs/operation_and_maintenance/log/system_log_audit.md similarity index 100% rename from 3.x/zh_CN/docs/develop/system_log_audit.md rename to 3.x/zh_CN/docs/operation_and_maintenance/log/system_log_audit.md diff --git a/3.x/zh_CN/docs/operation_and_maintenance/node_management.md b/3.x/zh_CN/docs/operation_and_maintenance/node_management.md new file mode 100644 index 000000000..c43bc3625 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/node_management.md @@ -0,0 +1,256 @@ +# 组员节点管理 + +标签:``节点管理`` ``退出群组`` ``游离节点`` ``观察者节点`` ``共识节点`` + +---- +FISCO BCOS引入了[游离节点、观察者节点和共识节点](../design/security_control/node_management.html#id6),这三种节点类型可通过控制台相互转换。 + +* 组员 + * 共识节点:参与共识的节点,拥有群组的所有数据(搭链时默认都生成共识节点)。 + * 观察者节点:不参与共识,但能实时同步链上数据的节点。 +* 非组员 + * 游离节点:已启动,待等待加入群组的节点。处在一种暂时的节点状态,不能获取链上的数据。 + +## 操作命令 + +控制台提供了 **[addSealer](./console/console_commands.html#addsealer)** 、**[addObserver](./console/console_commands.html#addobserver)** 和 **[removeNode](./console/console_commands.html#removenode)** 三类命令将指定节点转换为共识节点、观察者节点和游离节点,并可使用 **[getSealerList](./console/console_commands.html#getsealerlist)**、**[getObserverList](./console/console_commands.html#getobserverlist)** 和 **[getNodeIDList](./console/console_commands.htmml#getnodeidlist)** 查看当前组的共识节点列表、观察者节点列表和组内所有节点列表。 + +- addSealer:根据节点NodeID设置对应节点为共识节点; +- addObserver:根据节点NodeID设置对应节点为观察节点; +- removeNode:根据节点NodeID设置对应节点为游离节点; +- getSealerList:查看群组中共识节点列表; +- getObserverList:查看群组中观察节点列表; +- getNodeIDList:查看节点已连接的所有其他节点的NodeID。 + +例: +将指定节点分别转换成共识节点、观察者节点、游离节点,主要操作命令如下: + +```eval_rst +.. important:: + + 节点准入操作前,请确保: + + - 操作节点Node ID存在,节点Node ID可在节点目录下执行 cat conf/node.nodeid获取 + - 节点加入的区块链所有节点共识正常:正常共识的节点会输出+++日志 +``` + +```bash +# 获取节点Node ID(设节点目录为~/nodes/192.168.0.1/node0/) +$ cat ~/fisco/nodes/192.168.0.1/node0/conf/node.nodeid +7a056eb611a43bae685efd86d4841bc65aefafbf20d8c8f6028031d67af27c36c5767c9c79cff201769ed80ff220b96953da63f92ae83554962dc2922aa0ef50 + +# 连接控制台(设控制台位于~/fisco/console目录) +$ cd ~/fisco/console + +$ bash start.sh + +# 将指定节点转换为共识节点 +[group0]> addSealer 7a056eb611a43bae685efd86d4841bc65aefafbf20d8c8f6028031d67af27c36c5767c9c79cff201769ed80ff220b96953da63f92ae83554962dc2922aa0ef50 +# 查询共识节点列表 +[group0]> getSealerList +[ + 7a056eb611a43bae685efd86d4841bc65aefafbf20d8c8f6028031d67af27c36c5767c9c79cff201769ed80ff220b96953da63f92ae83554962dc2922aa0ef50 +] + +# 将指定节点转换为观察者节点 +[group0]> addObserver 7a056eb611a43bae685efd86d4841bc65aefafbf20d8c8f6028031d67af27c36c5767c9c79cff201769ed80ff220b96953da63f92ae83554962dc2922aa0ef50 + +# 查询观察者节点列表 +[group0]> getObserverList +[ + 7a056eb611a43bae685efd86d4841bc65aefafbf20d8c8f6028031d67af27c36c5767c9c79cff201769ed80ff220b96953da63f92ae83554962dc2922aa0ef50 +] + +# 将指定节点转换为游离节点 +[group0]> removeNode 7a056eb611a43bae685efd86d4841bc65aefafbf20d8c8f6028031d67af27c36c5767c9c79cff201769ed80ff220b96953da63f92ae83554962dc2922aa0ef50 + +# 查询节点列表 +[group0]> getNodeIDList +[ + 7a056eb611a43bae685efd86d4841bc65aefafbf20d8c8f6028031d67af27c36c5767c9c79cff201769ed80ff220b96953da63f92ae83554962dc2922aa0ef50 +] +[group0]> getSealerList +[] +[group0]> getObserverList +[] + +``` + +## 操作案例 + +下面结合具体操作案例详细阐述群组扩容操作及节点退网操作。扩容操作分两个阶段, 分别为**将节点加入网络**、**将节点加入群组**。退网操作也分为两个阶段,为**将节点退出群组**、**将节点退出网络**。 + +### 操作方式 + +- 修改节点配置:节点修改自身配置后重启生效,涉及的操作项目包括**网络的加入/退出、CA黑名单的列入/移除**。 +- 交易共识上链:节点发送上链交易修改需群组共识的配置项,涉及的操作项目包括**节点类型的修改**。目前提供的发送交易途径为控制台、SDK提供的precompiled service接口。 +- RPC查询:使用curl命令查询链上信息,涉及的操作项目包括**群组节点的查询**。 + + +### 操作步骤 + +本节将以下图为例对上述扩容操作及退网操作进行描述。虚线表示节点间能进行网络通信,实线表示节点间在可通信的基础上具备群组关系,不同颜色区分不同的群组关系。下图有一个网络,包含三个群组,其中群组Group3有三个节点。Group3是否与其他群组存在交集节点,不影响以下操作过程的通用性。 + +![](../../images/node_management/multi_ledger_example.png) + +
群组例子
+Group3的相关节点信息举例为: + +节点1的目录名为`node0`,IP端口为127.0.0.1:30400,nodeID前四个字节为b231b309... + +节点2的目录名为`node1`,IP端口为127.0.0.1:30401,nodeID前四个字节为aab37e73... + +节点3的目录名为`node2`,IP端口为127.0.0.1:30402,nodeID前四个字节为d6b01a96... + +#### A节点加入网络 + +场景描述: + +节点3原先不在网络中,现在加入网络。 + +操作顺序: + +1 . 进入nodes同级目录,在该目录下拉取并执行`gen_node_cert.sh`生成节点目录,目录名以node2为例,node2内有`conf/`目录; + +``` +# 获取脚本 +$ curl -#LO https://raw.githubusercontent.com/FISCO-BCOS/FISCO-BCOS/master-2.0/tools/gen_node_cert.sh && chmod u+x gen_node_cert.sh +# 执行,-c为生成节点所提供的ca路径,agency为机构名,-o为将生成的节点目录名(如果是国密节点,使用 -g 参数) +$ ./gen_node_cert.sh -c nodes/cert/agency -o node2 +``` + +```eval_rst +.. note:: + - 如果因为网络问题导致长时间无法下载,请尝试 `curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master-2.0/tools/gen_node_cert.sh` +``` + +2 . 拷贝node2到`nodes/127.0.0.1/`下,与其他节点目录(`node0`、`node1`)同级; +``` +$ cp -r ./node2/ nodes/127.0.0.1/ +``` + +3 . 进入`nodes/127.0.0.1/`,拷贝`node0/config.ini`、`node0/start.sh`和`node0/stop.sh`到node2目录; + +``` +$ cd nodes/127.0.0.1/ +$ cp node0/config.ini node0/start.sh node0/stop.sh node2/ +``` + +4 . 修改`node2/config.ini`。对于`[rpc]`模块,修改`channel_listen_port`和`jsonrpc_listen_port`;对于`[p2p]`模块,修改`listen_port`并在`node.`中增加自身节点信息; + +``` +$ vim node2/config.ini +[rpc] + ;rpc listen ip + listen_ip=127.0.0.1 + ;channelserver listen port + channel_listen_port=20302 + ;jsonrpc listen port + jsonrpc_listen_port=8647 +[p2p] + ;p2p listen ip + listen_ip=0.0.0.0 + ;p2p listen port + listen_port=30402 + ;nodes to connect + node.0=127.0.0.1:30400 + node.1=127.0.0.1:30401 + node.2=127.0.0.1:30402 +``` + +5 . 节点3拷贝节点1的`node1/conf/group.3.genesis`(内含**群组节点初始列表**)和`node1/conf/group.3.ini`到`node2/conf`目录下,不需改动; +``` +$ cp node1/conf/group.3.genesis node2/conf/ +$ cp node1/conf/group.3.ini node2/conf/ +``` + +6 . 执行`node2/start.sh`启动节点3; +``` +$ ./node2/start.sh +``` + +7 . 确认节点3与节点1和节点2的连接已经建立,加入网络操作完成。 + +``` +# 在打开DEBUG级别日志前提下,查看自身节点(node2)连接的节点数及所连接的节点信息(nodeID) +# 以下日志表明节点node2与两个节点(节点的nodeID前4个字节为b231b309、aab37e73)建立了连接 +$ tail -f node2/log/log* | grep P2P +debug|2019-02-21 10:30:18.694258| [P2P][Service] heartBeat ignore connected,endpoint=127.0.0.1:30400,nodeID=b231b309... +debug|2019-02-21 10:30:18.694277| [P2P][Service] heartBeat ignore connected,endpoint=127.0.0.1:30401,nodeID=aab37e73... +info|2019-02-21 10:30:18.694294| [P2P][Service] heartBeat connected count,size=2 +``` + +```eval_rst +.. note:: + - 若启用了白名单,需确保所有节点的config.ini中的白名单都已配置了所有的节点,并正确的将白名单配置刷新入节点中。参考《CA黑白名单》; + - 从节点1拷贝过来的config.ini的其余配置可保持不变; + - 理论上,节点1和2不需修改自身的P2P节点连接列表,即可完成扩容节点3的操作; + - 步骤5中所选择的群组建议为节点3后续需加入的群组; + - 建议用户在节点1和2的config.ini的P2P节点连接列表中加入节点3的信息并重启节点1和2,保持全网节点的全互联状态。 +``` + +#### A节点退出网络 + +场景描述: + +节点3已在网络中,与节点1和节点2通信,现在退出网络。 + +操作顺序: + +1 . 对于节点3,将自身的**P2P节点连接列表**内容清空,重启节点3; + +``` +# 在node2目录下执行 +$ ./stop.sh +$ ./start.sh +nohup: appending output to ‘nohup.out’ +``` + +2 . 对于节点1和2,将节点3从自身的**P2P节点连接列表**中移除(如有),重启节点1和2; + +3 . 确认节点3与节点1(和2)的原有连接已经断开,退出网络操作完成。 + +```eval_rst +.. note:: + - **节点3需先退出群组再退出网络,退出顺序由用户保证,系统不再作校验**; + - 网络连接由节点主动发起,如缺少第2步,节点3仍可感知节点1和节点2发起的P2P连接请求,并建立连接,可使用CA黑名单避免这种情况。 + - 若启用了白名单,需将退出节点的从所有节点的config.ini的白名单配置中删除,并正确的将新的白名单配置刷入节点中。参考《CA黑白名单》。 +``` + +#### A节点加入群组 + +场景描述: + +群组Group3原有节点1和节点2,两节点轮流出块,现在将节点3加入群组。 + +操作顺序: + +1. 节点3加入网络; +2. 使用控制台addSealer根据节点3的nodeID设置节点3为**共识节点**; +3. 使用控制台getSealerList查询group3的共识节点中是否包含节点3的nodeID,如存在,加入群组操作完成。 + +```eval_rst +.. note:: + - 节点3的NodeID可以使用`cat nodes/127.0.0.1/node2/conf/node.nodeid`获取; + - 节点3首次启动会将配置的群组节点初始列表内容写入群组节点系统表,区块同步结束后,**群组各节点的群组节点系统表均一致**; + - **节点3需先完成网络准入后,再执行加入群组的操作,系统将校验操作顺序**; + - **节点3的群组固定配置文件需与节点1和2的一致**。 +``` + +#### A节点退出群组 + +场景描述: + +群组Group3原有节点1、节点2和节点3,三节点轮流出块,现在将节点3退出群组。 + +操作顺序: + +1. 使用控制台removeNode根据节点3的NodeID设置节点3为**游离节点**; +2. 使用控制台getSealerList查询group3的共识节点中是否包含节点3的nodeID,如已消失,退出群组操作完成。 + +补充说明: + +```eval_rst +.. note:: + - 节点3可以共识节点或观察节点的身份执行退出操作。 +``` diff --git a/3.x/zh_CN/docs/operation_and_maintenance/operation_and_maintenance.md b/3.x/zh_CN/docs/operation_and_maintenance/operation_and_maintenance.md new file mode 100644 index 000000000..9ef8cfc46 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/operation_and_maintenance.md @@ -0,0 +1,128 @@ +# 14. 运维手册 + +标签:``运维`` + +## 部署 + +联盟链是由多个节点组成的分布式网络和分布式系统,节点地理位置率属于某个分区,归属关系率属于某个机构。联盟链的部署需要考虑机构、分区、节点等多个因素。下面是一些部署的基本原则: + +||目的|内容 +|:--|:--|:-- +|1|共识有容错空间|节点数满足N=3F+1,链至少需要4个节点 +|2|分区容错|每个分区共识节点数量不应超过F +|3|机构内避免单点故障|每个机构至少有2个节点 +|4|节省资源、增加效率|机构内的部分节点为观察节点 +|5|机构权重调整|根据各方认同的权重,调整机构内节点数量与共识节点权重 + +## 日志说明 + +FISCO BCOS提供了规范的日志输出格式,可以根据日志进行系统运行状态的分析、问题定位、监控统计等。 + +```bash +# 日志格式: +log_level|time|[module_name] content + +# 日志示例: + +info|2022-11-21 20:00:35.479505|[SCHEDULER][blk-1]BlockExecutive prepare: fillBlock end,txNum=1,cost=0,fetchNum=1 +``` + +其中log_level为日志级别,从小到大包括trace、debug、info、warning、error、fatal,time表示日志打印时间,[module_name]表示模块名,包括共识、同步、交易池、存储等,content为具体日志内容。常规日志分析和问题定位,可查看[日志说明](./log/index.md)。 + +日志输出级别设定在config.ini文件配置,在测试环境中,建议设置为trace或debug级别,可以输出所有级别的日志,便于分析定位问题。在生产环境时,建议设置为info级别,减少日志输出量(trace和debug日志量较大),避免日志磁盘占用过多。 + +## 监控告警 + +FISCO BCOS的监控包括区块链监控和系统监控两部分。 + +【区块链监控】FISCO BCOS提供自身系统的监控工具monitor.sh,可以对节点存活、共识状态、账本情况等进行监控。monitor.sh工具可以将输出内容对接到机构自身的运维监控系统中去,使得区块链的监控可以接入机构运维监控平台。 + +【系统监控】除了监控FISCO BCOS节点自身,还需要从系统环境角度监控相关指标。建议运维要对节点运行的CPU、内存、带宽占用以及磁盘占用进行监控,及时发现系统环境异常。FISCO BCOS3.0 可以监控区块链是否正常工作,包括监控共识、同步是否异常、监控磁盘空间,也提供简单的接入用户告警系统的方式,可查看[light_monitor.sh监控工具](../operation_and_maintenance/light_monitor.md)。 + +## 数据备份与恢复 + +FISCO BCOS支持两种数据备份方式,可以根据需要选择合适的方式。 +【方式一】:停止节点,将节点的data目录整体打包压缩并备份到其他位置,待需要的时候从备份数据解压缩,恢复节点。这种方式相当于快照一个账本状态的数据,以便后续从这个状态进行恢复,具体操作可参考[节点监控配置](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/tutorial/air/build_chain.html?highlight=%E7%9B%91%E6%8E%A7#id4)。 + +【方式二】:可根据数据归档服务工具,将链上数据进行归档存储。待需要恢复或新增节点时,可以将归档存储的数据进行恢复,以此实现数据备份与恢复,具体数据归档操作可参考[数据归档使用](../operation_and_maintenance/data_archive_tool.md) + +方式一的优点是无需部署新的服务和操作,运维简单,缺点是备份的是某个历史状态,从这个状态恢复的数据不是最新数据,恢复之后需要从其他节点同步账本更新的数据。方法二则与方法一相反,需要部署服务,运维成本更高,但是可以随时恢复到最新账本状态。 + +## 扩容方法 + +FISCO BCOS扩容主要考虑两个方面,节点数量的扩容和数量盘的扩容。 + +【节点数量扩容】:FISCO BCOS支持动态增加和剔除节点,以及可改变节点的身份状态(共识、观察、游离)。剔除和更改状态直接通过控制台命令就可以完成。新增节点需要通过以下几个步骤: + +1. 为新节点准备证书,用机构证书签发节点证书; +2. 准备新节点的机器,分配好RPC和P2P的端口,确保端口可通,确保P2P端口能够其他节点互通; +3. 生成新节点的配置,主要是config.ini中的网络配置。配置时,建议从其他节点拷贝一份,在此基础上修改网络相关配置项; +4. 发布新节点到机器,启动该节点,验证新节点与其他节点的网络是否建立连接,排除证书问题、网络策略问题等异常; +5. 从控制台发送命令,将新节点添加为观察节点; +6. 此时节点不参与共识,会同步账本,并等待区块高度与其他节点达成一致; +7. 从控制台发送命令,将新节点状态更改为共识节点。 + FISCO BCOS不论是air、pro还是max都支持节点扩容,节点扩容步骤以上一致,具体内容可参考[Air节点扩容](../tutorial/air/expand_node.md)、[Pro节点扩容](../tutorial/pro/expand_node.md)、[Max节点扩容](../tutorial/max/max_builder.md). + +【数据盘扩容】:数据盘扩容包括Air链数据盘扩容与Max链数据盘扩容。 + +Air链数据盘扩容: FISCO BCOS默认采用rocksdb的存储引擎(性能比Mysql引擎高),rocksdb数据存储在本地磁盘。如果需要扩容本地磁盘,采用如下步骤: + +1. 从控制台剔除该节点,让该节点不参与共识,也不参与同步; +2. 停止节点; +3. 挂载新盘; +4. 将节点迁移至新盘; +5. 重启节点; +6. 从控制台发送命令,将节点加入共识。 + 有些云平台提供一键升级、扩容硬盘等功能,上述3-4步骤可以替代此功能。 + +Max链数据盘扩容:Max节点在生产环境建议使用TIKV的集群版,TiKV集群版作为节点的后端可以轻松简单的实现扩容缩容。具体的扩容缩容请参考[TIKV扩容](../tutorial/max/max_builder.md)。 + +## 升级方法 + +FISCO BCOS可以友好地支持节点、合约兼容升级。 + +【节点升级】:FISCO BCOS采用compatibility_version来控制区块链兼容版本,在建链须决定compatibility_version,后续升级节点时,此项配置不可更改。例如建链时compatibility_version为3.1.0,后续节点升级到3.2.0、3.3.0之后,compatibility_version配置必须保持为3.1.0。节点升级步骤如下: + +1. 停止节点; +2. 备份老版本节点的fisco-bcos二进制可执行程序,用新版本替换; +3. 重启节点; +4. 检查共识、同步情况,确保节点运行正常。 + 合约升级可参考文档[智能合约的升级](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/contract_life_cycle.html#id5)。 + +## 密钥管理 + +FISCO BCOS涉及链、机构、节点、SDK的私钥和证书管理,如果采用自签证书(FISCO BCOS建链默认提供),运维需要将所有这些私钥和证书管理起来,做好备份。具体管理方式,可以采用机构自身的管理系统,也可以采用FISCO BCOS提供的密钥托管服务(需要部署和运维该服务)。涉及的证书与私钥包括: + +1. 链的私钥和证书 +2. 机构的私钥和证书 +3. 节点的私钥和证书 +4. SDK的私钥和证书 + +密钥与证书所有均支持国密,生成的国密证书与私钥自带sm前缀,例如正常的密钥与证书为ca.key、ca.crt,国密私钥与证书为sm_ca.key、sm_ca.crt。 + +## TLS通信证书维护 + +FISCO BCOS为保证系统通信运维安全,会定期更新节点TLS通信密钥,防止攻击者在长时间内通过截获大量的密文来分析出密钥。 +而密钥更新分为更新节点所有证书与密钥以及仅节点TLS通信证书两种方式,更新根证书的步骤如下: + +1. 备份原 CA 证书与密钥; +2. 基于原 CA 证书的配置与证书签名请求,生成新的 CA 证书和密钥; +3. 备份新 CA 证书与密钥; +4. 节点重启,启用新的CA证书与密钥进行通信。 + +仅更新节点TLS通信证书步骤如下: + +1. 备份原节点TLS通信证书与密钥 +2. 基于CA证书的配置与证书签名请求,生成新的节点TLS通信证书; +3. 备份新节点TLS通信证书和密钥 +4. 节点通信重启,启用新的CA证书与密钥进行通信。 + +若证书泄露,那么证书使用越久,则损失越大。 因此对证书的使用,应设置有效期,当证书超过有效期或停止使用后,对证书进行销毁,具体销毁流程如下: + +1. 检查节点通信证书有效期,若证书过期,则将证书归档后销毁,若是密钥停止使用,用户亦可在证书归档后主动销毁证书; +2. 更新节点TLS通信密钥,产生新的通信证书; +3. 将新证书进行备份,重启节点,启用新证书。 + +## 异常恢复 + +当系统出现系统故障、网络异常的情况,如断电、节点失联、网络故障等等,只需将节点进行重启操作,系统即可恢复系统的正常运行。 diff --git a/3.x/zh_CN/docs/develop/storage_tool.md b/3.x/zh_CN/docs/operation_and_maintenance/storage_tool.md similarity index 99% rename from 3.x/zh_CN/docs/develop/storage_tool.md rename to 3.x/zh_CN/docs/operation_and_maintenance/storage_tool.md index 26d6481ac..a99ce858f 100644 --- a/3.x/zh_CN/docs/develop/storage_tool.md +++ b/3.x/zh_CN/docs/operation_and_maintenance/storage_tool.md @@ -1,4 +1,4 @@ -# 存储读写工具 +# 4. 存储读写工具 标签:``存储`` ``读写工具`` ``数据读取`` diff --git a/3.x/zh_CN/docs/develop/stress_testing.md b/3.x/zh_CN/docs/operation_and_maintenance/stress_testing.md similarity index 97% rename from 3.x/zh_CN/docs/develop/stress_testing.md rename to 3.x/zh_CN/docs/operation_and_maintenance/stress_testing.md index 3c494d1d0..9716716f2 100644 --- a/3.x/zh_CN/docs/develop/stress_testing.md +++ b/3.x/zh_CN/docs/operation_and_maintenance/stress_testing.md @@ -1,4 +1,4 @@ -# 压力测试指南 +# 9. 压力测试指南 标签:``压力测试`` ``Java SDK Demo`` @@ -149,14 +149,12 @@ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceCpuHeavy [ # KVTable合约压测 -# 压测KV set # count: 压测的交易总量 # tps: 压测QPS # groupId: 压测群组 -$ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceKVTable [set] [count] [tps] [groupId] -# 压测KV get -# (参数解释同上) -$ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceKVTable [get] [count] [tps] [groupId] +# useKVTable: 压测KV标志值,true为set方法,false为get方法 +# valueLength: 测试数据的长度,默认为256 +$ java -cp 'conf/:lib/:apps/' org.fisco.bcos.sdk.demo.perf.PerformanceKVTable [count] [tps] [groupId] [useKVTable] [valueLength] ``` **以下是WASM环境的压力测试** diff --git a/3.x/zh_CN/docs/operation_and_maintenance/upgrade.md b/3.x/zh_CN/docs/operation_and_maintenance/upgrade.md new file mode 100644 index 000000000..6853375a4 --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/upgrade.md @@ -0,0 +1,226 @@ +# 10. 版本升级指南 +---------- + +本文档主要从三个方面讨论FISCO BCOS的升级之路,以解答社区用户在FISCO BCOS实际应用过程中的升级需求。以由易至难、由近至远的思路分为以下三个部分: +- 第一部分,如何实现FISCO BCOS 3.x版本之间的升级; +- 第二部分,如何实现FISCO BCOS Air、Pro和Max之间升级; +- 第三部分,如何实现从FISCO BCOS 2.0至3.0的升级。 + + +## 1. FISCO BCOS 3.x版本之间的升级 + +FISOC BCOS每个版本都会在原有版本的基础上添加新的特性。包含两种升级方式,可根据升级需求选择: +1. 提升系统稳定性与性能:仅升级节点可执行程序 +2. 使用新特性:升级节点可执行程序、升级链数据版本 + +### 1.1 升级节点可执行程序 + +- 升级效果:修复bug,并带来稳定性、性能的提升 + +- 操作步骤:逐步停止节点服务,升级节点可执行程序为当前版本后,重启节点服务 + +- 注意事项:推荐逐步替换可执行程序进行灰度升级,升级前备份原节点的所有账本数据,若操作失误造成升级失败,可通过原数据回滚到升级前的状态 + +支持升级的版本:v3.0.0+ + +### 1.2 升级链数据版本 + +- 升级效果:可使用当前版本的最新特性 + +- 操作步骤:先完成升级所有节点可执行程序,再参考以下步骤,通过发送交易升级链数据版本至新版本v3.x.x + +- 注意事项:务必备份原节点的所有账本数据,若操作失误造成升级失败,可通过原数据回滚到升级前的状态 + + +升级数据兼容版本号详细步骤如下: + +#### a. 查询数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#getsystemconfigbykey)进行查询,如当前返回的版本为3.0.1 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.0.1 +``` + +#### b. 替换节点二进制 + +需将**所有节点**的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。 + +#### c. 开启新版本特性 + +从3.2.4、3.6.0版本开始,FISCO BCOS提供按需开启新特性、问题修复的能力,问题修复和新特性列表如下: + +| 特性名 | 类型 | 作用 | 最低版本 +| --- | --- | --- | --- | +| bugfix_revert | 问题修复 | 修复使用串行模式时(is_serial=true),智能合约回滚后没有撤销已写入状态数据的问题 | 3.2.4 3.6.0 | +| bugfix_statestorage_hash | 问题修复 | | | +| bugfix_evm_create2_delegatecall_staticcall_codecopy | 问题修复 | | | +| bugfix_event_log_order | 问题修复 | | | +| bugfix_call_noaddr_return | 问题修复 | | | +| bugfix_precompiled_codehash | 问题修复 | | | +| bugfix_dmc_revert | 问题修复 | 修复使用DMC模式时(is_serial=false,未启用feature_sharding),智能合约回滚后没有撤销已写入状态数据的问题 | | +| bugfix_keypage_system_entry_hash | 问题修复 | | | +| bugfix_internal_create_redundant_storage +| feature_dmc2serial | 新特性 | | 3.2.4 | +| feature_sharding | 新特性 | | | +| feature_rpbft | 新特性 | | | +| feature_paillier | 新特性 | | | +| feature_balance | 新特性 | | | +| feature_balance_precompiled | 新特性 | | | +| feature_balance_policy1 | 新特性 | | | +| feature_paillier_add_raw | 新特性 | | | +| feature_predeploy | 新特性 | | | + +启用问题修复或新特性,在控制台执行 + +``` +setSystemConfigByKey <特姓名> +``` + +#### d. 设置数据兼容版本号(compatibility_version) + +用[控制台](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/operation_and_maintenance/console/console_commands.html#setsystemconfigbykey)设置数据兼容版本号,如升级版本至3.1.0。 + +``` +[group0]: /apps> setSystemConfigByKey compatibility_version 3.1.0 +{ + "code":0, + "msg":"success" +} + +注:若开启权限治理功能,需要使用 setSysConfigProposal 命令 +``` + +设置成功,再次查询,得到当前版本已升级为3.1.0 + +``` +[group0]: /apps> getSystemConfigByKey compatibility_version +3.1.0 +``` + +当前链已经完成升级,至此,链开始以新的逻辑继续运行,并支持了新版本特性。 + +设置链版本号后,3.6.x版本及以上的链会自动启用所有最低版本及以上的bugfix。 + +## 2. FISCO BCOS Air、Pro和Max之间的升级 +通过深研不同场景用户的诉求,FISCO BCOS推出Air、Pro以Max三种不同的部署型态,用户可根据需求定制选择。但在实际应用过程中,随着业务与需求的变化,用户存在Air升级Pro、Pro升级Max此类的需求。本节基于此背景,探讨三种部署型态之间的升级操作。 + +**注意**:升级之前请务必备份好数据,保证链可回滚至升级前的状态。 +![](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/_images/fisco_bcos_version.png) + + +### 2.1 Air至Pro的升级 +要实现Air升级Pro,需要明白两者之间技术架构与部署形式的不同。 +- 相同点:Air与Pro之间底层存储数据库均是采用RocksDB +- 不同点:Air采用all-in-one的封装模式,Pro由群组层+接入层的架构提供服务 + +基于Air与Pro之间的异同,要实现Air至Pro的升级有以下两种方案: +- 基于现有的Air节点,扩容一个Pro节点 +- 基于当前的Air节点,将其重构升级为Pro节点 + +具体方案描述如下。 + +#### 方案一:Air区块链扩容Pro节点 +基于现有的Air节点,在其基础上扩容一个pro节点,这样既可以保存之前Air的链上数据,扩容出的Pro节点又满足了业务需求。此方案的优点是操作简单,不需要改变现有组织架构。详细步骤如下: + +1. 利用BcosBuilder部署工具,部署tar服务,具体步骤可以参考[《搭建pro版区块链网络》](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/tutorial/pro/installation.html)与[《Pro扩容节点》](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/tutorial/pro/expand_node.html); +2. 在部署pro节点之前,配置pro/conf目录下的config-node-expand-example.toml文件,配置Air创世块文件路径等信息; +3. 下载二进制,根据配置文件部署Pro节点,将扩容生成的Pro的ca文件替换为Air的根证书,具体扩容步骤可参考[《Pro节点扩容》](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/tutorial/pro/expand_node.html); +4. 启动Pro节点,通过控制台连接Pro节点,将Pro节点添加至Air区块链网络; +5. pro节点同步至最新区块后,用户可选择是否下线Air节点服务。 + +通过上述步骤,可在原有Air基础上扩容出Pro版节点,进而实现Air至Pro的升级,用户在业务使用过程中也可以再进一步扩容Pro网络。 + +#### 方案二:Air区块链重构升级 +Air与Pro的底层存储模式相同,Air的区块链数据升级至Pro版后仍然可用。因此,理论上只需将Air目录结构重构为Pro的目录结构,通过部署相关Pro的服务,然后将之前Air的数据复用至Pro相应目录即可。此方案详细步骤如下: + +1. 停止Air节点,保存链上数据与链配置信息:将Air的节点数据/data目录、创世块、config.ini配置文件、证书等数据备份; +2. 按照Pro版的目录结构,将Air链的目录文件结构重构为Pro的目录结构; +3. 即通过BcosBuilder部署工具,部署Pro版的RPC、getawat以及node等服务; +4. 通过BcosBuilder部署工具步骤部署Pro链,将创世块、config.ini、证书以及链数据data目录下的文件,替换为之前的Air的相关文件; +5. 导入Air数据,将之前备份的Air的data数据导入至pro节点的数据目录,启动节点。 + +通过上述操作,用户可以将原有Air网络替换为Pro网络,相对于方案一操作较复杂,需要用户对Air于Pro的组织结构较深的了解。 + + +### 2.2 Pro至Max版的升级 +因为Pro与Max采用不用的存储架构:Pro采用的单机性能突出的RocksDB,而Max版采用分布式存储架构tikvDB。所以在Pro升级至Max中,无法复用账本数据。在此情况下,只有扩容方案能实现Pro版升级Max。具体方案如下: + + +### 方案:Pro区块链扩容Max节点 +Pro区块链扩容Max节点具体步骤如下: +1. 利用BcosBuilder部署工具安装依赖,安装配置Tars服务; +2. 下载安装tiup,部署启动Tikv; +3. 下载Max搭链相关二进制,修改BcosBuilder/max/conf目录下的示例配置文件config-node-expand-example.toml,配置创世块路径(为Pro区块链创世块文件)等相关信息; +4. 部署Max节点服务,扩容出Max节点,扩容完成后将生成的max节点目录的ca文件替换为原有Pro链的根证书,具体步骤可参考[《搭建Max版区块链网络》](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/tutorial/max/installation.html); +5. 启动Max节点,通过控制台连接Max节点,将Max节点添加至原有的Pro区块链网络,查看链是否正常运行。Max节点同步至最新快后,可选择是否下线Pro节点。 + +通过上述步骤,实现Pro网络扩容Max,原有Pro网络服务升级,用户可以体验大容量Max版功能,同样支持在后续使用中继续增加扩容Max节点。 + + +## 3. FISCO BCOS 2.0升级至3.0指引 +FISCO BCOS 3.0版本在2.0基础上进行架构升级和优化,在可扩展性、性能、易用性等方面取得了重大突破,其中包括: +- Pipelined:区块流水线,连续且紧凑地生成区块; +- 全方位并行计算:块内分片、DMC、DAG等并行机制,实现强大处理性能; +- 区块链文件系统: 所见即所得的合约数据管理; +- 权限治理框架:内置权限治理框架,多方投票治理区块链; +- 分布式存储TiKV:分布式事务性提交,支撑海量存储; + +由于FISCO BCOS 3.0+版本相对于2.0进行了若干重大的重构,无法做到完美的向下兼容。而部分已上线2.x版本的用户,存在升级值3.0+的需求。为解决此问题,以下列举了几种可行升级方案,每个方案拥有不同的优缺点,适用于不同的业务场景。 + +**注意**:升级之前请务必备份好数据,保证数据可回滚。 +### 方案一:数据重放 + +数据重放是当前最为普遍的区块链数据迁移方法之一,因为简易、直观,相对而言副作用也比较小。 + +实施方法: +1. 使用最新版本的搭链脚本搭建一条3.0+新链; +2. 使用数据导出组件快速导出区块链上的数据,获得链上所有方法和合约的执行历史及详细数据; +3. 编写程序或脚本,将导出的数据按照块高进行数据重放。使得将生产环境的老链上的合约和交易,到新链上按原先的运行时序重新再执行一遍。 + +本方案的优点: +- 简易、直观,副作用小,即便升级失败不影响旧链运行 + +本方案的缺点是: +- 重放时间长:不适应长期运行的海量数据的场景,如果交易区块高度超过300万,则重放时间将超过1个月(假设共识和出块时间周期为1s); +- 无法保证同一区块执行的顺序:即使在重放时,按照区块的顺序提交和发送交易,但是同一区块内的交易执行的顺序仍然是随机的; +- 无法保证交易精准落在原有的块高:由于区块打包共识的周期和次序具有随机性质,重放时很难保证具体的块高下的交易数量和次序。 + +所以,本方案适用于对合约数据的一致性要求不严格,但对数据完整性有一定要求的场景;不适用于对数据的一致性非常严格、海量数据的场景。 + +### 方案二:应用层适配 + +本方案的核心设计无需改动历史链及数据,而在新老链之间提供一层数据适配层屏蔽链的细节处理,故而能减少对链的数据操作。而历史数据的完整性和精确性也是本方案最大的优势。 + +实施方法: +用户可以单独开发一个兼容新老链的数据适配应用,通过数据ID或日期等特征来作为路由区分的标志,对不同的数据进行路由。同时,新链上复制老链的智能合约。 + +本方案的优点: +- 具备良好的历史数据完整性和精确性 + +本方案的缺点是: +- 数据隔离:新链和老链之间的数据是物理隔离的,因此新老数据存在依赖关系的场景无法采纳本方案; +- 维护成本高:必须维护新老两条链,硬件等维护成本高; +- 开发成本高:必须开发一套独立的数据路由适配层,开发成本较高。 + +因此,本方案适用于部分数据之间无依赖关系的场景;而一些数据强依赖的场景,例如积分、支付结算等场景无法适用。此外,此方案需要额外开发数据适配程序,其难度视具体的合约和场景而定,但是后续的各项维护成本非常高。 + +### 方案三:跨链方案 + +本方案类似于方案二,将新链与旧链当作两条链,事务涉及旧链数据时利用跨链平台发起跨链事务请求,此方案也不需要改动历史链及数据,相比于方案二无需再开发一套独立的数据路由适配层。 + +实施方法: +首先,利用最新建链脚本搭建一条新链,通过跨链平台WeCross将两条链连接,新业务均由新链处理,事务涉及历史数据跨链平台发起跨链事务请求,路由至两条链上去处理,处理结果存储至两条链中。 + +本方案优点: +- 开发成本低,无需开发数据适配应用; +- 具有历史数据的完整性和精确性。 + + +本方案缺点: +- 事务执行慢:跨链事务处理慢,性能不高,前期的每一笔事务均是跨链事务; +- 维护成本高:必须维护新老两条链,硬件等维护成本高。 + +本方案新链构建前期性能低,频繁的跨链路由对网络要求较高,此外使用者也需要维护两条链,维护成本较高。 + diff --git a/3.x/zh_CN/docs/operation_and_maintenance/webase.md b/3.x/zh_CN/docs/operation_and_maintenance/webase.md new file mode 100644 index 000000000..0712b165a --- /dev/null +++ b/3.x/zh_CN/docs/operation_and_maintenance/webase.md @@ -0,0 +1,48 @@ +# 6. 区块链管理平台 + +标签:``WeBASE`` ``中间件平台`` ``节点管理`` ``系统监控`` ``系统管理`` + +---- + +```eval_rst +.. important:: + 相关软件和环境版本说明!`请查看 `_ +``` + +微众银行开源的自研区块链中间件平台——[WeBASE(WeBank Blockchain Application Software Extension)](https://webasedoc.readthedocs.io/zh_CN/latest/) 是区块链应用和FISCO BCOS节点之间搭建的中间件平台。WeBASE屏蔽了区块链底层的复杂度,降低区块链使用的门槛,大幅提高区块链应用的开发效率,包含节点前置、节点管理、交易链路,数据导出,Web管理平台等子系统。用户可以根据业务所需,选择子系统进行部署,可以进一步体验丰富交互的体验、可视化智能合约开发环境IDE。 + +WeBASE管理平台是由四个WeBASE子系统组成的一套管理FISCO-BCOS联盟链的工具集。详细了解可以参考[《WeBASE管理平台使用手册》](https://webasedoc.readthedocs.io/zh_CN/latest/) 。 + +## 主要功能 + +1. 区块链数据概览 +2. 节点管理 +3. 合约管理 +4. 私钥管理 +5. 系统管理 +6. 系统监控 +7. 交易审计 +8. 订阅事件 +9. 账号管理 +10. 群组管理 + +## WeBASE管理平台搭建 + +搭建可参考[《WeBASE一键部署文档》](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE/install.html)。 + +![](../../images/webase/webase-web.png) + +### [WeBASE快速入门](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Install/developer.html) + +开发者只需要搭建节点和节点前置服务(WeBASE-Front),就可通过WeBASE-Front的合约编辑器进行合约的编辑,编译,部署,调试。搭建可参考[《WeBASE快速入门文档》](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Install/developer.html)。 +![](../../images/webase/webase-front.png) + +### [WeBASE管理台](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE/install.html) + +通过WeBASE一键脚本,可以搭建一个WeBASE的基础环境,可以方便用户体验WeBASE核心功能如:区块浏览,节点查看,合约IDE,系统管理,节点监控,交易审计,私钥管理。搭建可参考[《WeBASE一键部署文档》](https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE/install.html)。![](../../images/webase/webase-web.png) + +### [WeBASE其他](https://webasedoc.readthedocs.io/zh_CN/latest) + +WeBASE其他组件可以参考[《WeBASE文档》](https://webasedoc.readthedocs.io/zh_CN/latest) + +[build_chain_code]:https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master-2.0/manual/build_chain.sh diff --git a/3.x/zh_CN/docs/quick_start/air_installation.md b/3.x/zh_CN/docs/quick_start/air_installation.md index 38aa7ac88..59639cb48 100644 --- a/3.x/zh_CN/docs/quick_start/air_installation.md +++ b/3.x/zh_CN/docs/quick_start/air_installation.md @@ -1,4 +1,4 @@ -# 搭建第一个区块链网络 +# 2. 搭建第一个区块链网络 标签:``搭建区块链网络`` ``区块链教程`` ``HelloWorld`` ``控制台调用合约`` @@ -49,7 +49,7 @@ sudo yum install -y curl openssl openssl-devel wget ```eval_rst .. note:: - 如果因为网络问题导致长时间无法下载build_chain.sh脚本,请尝试 curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v3.2.0/build_chain.sh && chmod u+x build_chain.sh + 如果因为网络问题导致长时间无法下载build_chain.sh脚本,请尝试 curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v3.6.0/build_chain.sh && chmod u+x build_chain.sh ``` ```shell @@ -57,17 +57,17 @@ sudo yum install -y curl openssl openssl-devel wget cd ~ && mkdir -p fisco && cd fisco # 下载建链脚本 -curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v3.2.0/build_chain.sh && chmod u+x build_chain.sh +curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v3.6.0/build_chain.sh && chmod u+x build_chain.sh # Note: 若访问git网速太慢,可尝试如下命令下载建链脚本: -curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v3.2.0/build_chain.sh && chmod u+x build_chain.sh +curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v3.6.0/build_chain.sh && chmod u+x build_chain.sh ``` ### 第三步. 搭建4节点非国密联盟链 ```eval_rst .. note:: - 请确保机器的30300~30303,20200~20203,8545~8548端口没有被占用。 + 请确保机器的30300~30303,20200~20203端口没有被占用。 ``` 在fisco目录下执行下面的指令,生成一条单群组4节点的FISCO链: @@ -87,22 +87,33 @@ bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200 ```shell [INFO] Generate ca cert successfully! Processing IP:127.0.0.1 Total:4 +writing RSA key [INFO] Generate ./nodes/127.0.0.1/sdk cert successful! +writing RSA key [INFO] Generate ./nodes/127.0.0.1/node0/conf cert successful! +writing RSA key [INFO] Generate ./nodes/127.0.0.1/node1/conf cert successful! +writing RSA key [INFO] Generate ./nodes/127.0.0.1/node2/conf cert successful! +writing RSA key [INFO] Generate ./nodes/127.0.0.1/node3/conf cert successful! -[INFO] Generate uuid success: e273464c-827d-47ce-921f-8c16d72234b0 -[INFO] Generate uuid success: b3a54d03-dadb-4cfb-9ae9-86d8ce507110 -[INFO] Generate uuid success: 1bf757a5-6649-4d35-9514-d7de95ea7306 -[INFO] Generate uuid success: 3c90d210-a202-4d46-a04b-89fcc8c47dd9 +[INFO] Downloading get_account.sh from https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/tools/get_account.sh... +############################################################################################################################################################### 100.0% +[INFO] Admin account: 0x4c7239cfef6d41b7322c1567f082bfc65c69acc5 +[INFO] Generate uuid success: 167A2233-5444-4CA4-8792-C8E68130D5FC +[INFO] Generate uuid success: CC117CAF-224C-4940-B548-6DED31D24B18 +[INFO] Generate uuid success: 16B5E4BD-51C1-416E-BF44-6D1BB05F7666 +[INFO] Generate uuid success: 60DD77F2-F3A5-49F2-8C7F-8151E8823C6D ============================================================== -[INFO] fisco-bcos Path : bin/fisco-bcos -[INFO] Auth Mode : false -[INFO] Start Port : 30300 20200 -[INFO] Server IP : 127.0.0.1:4 -[INFO] SM Model : false -[INFO] output dir : ./nodes +[INFO] GroupID : group0 +[INFO] ChainID : chain0 +[INFO] fisco-bcos path : bin/fisco-bcos +[INFO] Auth mode : false +[INFO] Start port : 30300 20200 +[INFO] Server IP : 127.0.0.1:4 +[INFO] SM model : false +[INFO] enable HSM : false +[INFO] Output dir : ./nodes [INFO] All completed. Files in ./nodes ``` @@ -181,12 +192,12 @@ sudo yum install -y java java-devel ### 第二步. 下载控制台 ```shell -cd ~/fisco && curl -LO https://github.com/FISCO-BCOS/console/releases/download/v3.2.0/download_console.sh && bash download_console.sh +cd ~/fisco && curl -LO https://github.com/FISCO-BCOS/console/releases/download/v3.6.0/download_console.sh && bash download_console.sh ``` ```eval_rst .. note:: - - 如果因为网络问题导致长时间无法下载,请尝试 cd ~/fisco && curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master/tools/download_console.sh + - 如果因为网络问题导致长时间无法下载,请尝试 cd ~/fisco && curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master/tools/download_console.sh && bash download_console.sh ``` ### 第三步. 配置控制台 @@ -214,8 +225,8 @@ cp -r nodes/127.0.0.1/sdk/* console/conf ```eval_rst .. note:: - - 请确保机器的30300~30303,20200~20203,8545~8548端口没有被占用。 - - 控制台的配置方法和命令请参考 `这里 <../develop/console/console_config.html>`_ + - 请确保机器的30300~30303,20200~20203端口没有被占用。 + - 控制台的配置方法和命令请参考 `这里 <../operation_and_maintenance/console/console_config.html>`_ ``` - 启动 @@ -228,7 +239,7 @@ cd ~/fisco/console && bash start.sh ```shell ============================================================================================= -Welcome to FISCO BCOS console(3.2.0)! +Welcome to FISCO BCOS console(3.4.0)! Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console. ________ ______ ______ ______ ______ _______ ______ ______ ______ | | \/ \ / \ / \ | \ / \ / \ / \ diff --git a/3.x/zh_CN/docs/quick_start/hardware_requirements.md b/3.x/zh_CN/docs/quick_start/hardware_requirements.md index 9160e3af7..77712732e 100644 --- a/3.x/zh_CN/docs/quick_start/hardware_requirements.md +++ b/3.x/zh_CN/docs/quick_start/hardware_requirements.md @@ -1,4 +1,4 @@ -# 硬件和系统要求 +# 1. 硬件和系统要求 标签:``硬件要求`` ``操作系统`` ``开发手册`` ``内存要求`` ``国产操作系统`` ``ARM`` ``麒麟`` ``APPLE M1`` @@ -19,17 +19,12 @@ 下表是单群组单节点推荐的配置,节点耗费资源与群组个数呈线性关系,您可根据实际的业务需求和机器资源,合理地配置节点数目。 -```eval_rst -+----------+---------+---------------------------------------------+ -| 配置 | 最低配置| 推荐配置 | -+==========+=========+=============================================+ -| 内存 | 8GB | 16GB | -+----------+---------+---------------------------------------------+ -| 核心 | 4核 | 8核 | -+----------+---------+---------------------------------------------+ -| 带宽 | 1Mb | 10Mb | -+----------+---------+---------------------------------------------+ -``` + +| **配置** | **最低配置** | **推荐配置** | +| :--------: | :--------: | :-------: | +| 内存 | 8GB | 32GB | +| 核心 | 4核 | 8核 | +| 带宽 | 1Mb | 10Mb | ## 操作系统 diff --git a/3.x/zh_CN/docs/quick_start/solidity_application.md b/3.x/zh_CN/docs/quick_start/solidity_application.md index 97d261fe6..00e74deab 100644 --- a/3.x/zh_CN/docs/quick_start/solidity_application.md +++ b/3.x/zh_CN/docs/quick_start/solidity_application.md @@ -1,4 +1,4 @@ -# 开发第一个Solidity区块链应用 +# 3. 开发第一个Solidity区块链应用 标签:``开发第一个应用`` ``Solidity`` ``合约开发`` ``区块链应用`` ``EVM`` @@ -65,7 +65,7 @@ function transfer(string memory from_account, string memory to_account, uint256 mkdir -p ~/fisco # 下载控制台 -cd ~/fisco && curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v3.2.0/download_console.sh && bash download_console.sh +cd ~/fisco && curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v3.6.0/download_console.sh && bash download_console.sh # 切换到fisco/console/目录 cd ~/fisco/console/ @@ -343,8 +343,8 @@ Asset.sol所引用的Table.sol已在``~/fisco/console/contracts/solidity``目录 # 切换到fisco/console/目录 cd ~/fisco/console/ -# 可通过bash contract2java.sh -h命令查看该脚本使用方法 -bash contract2java.sh solidity -p org.fisco.bcos.asset.contract +# 可通过bash contract2java.sh solidity -h命令查看该脚本solidity使用方法, -s指定sol文件 +bash contract2java.sh solidity -s contracts/solidity/Asset.sol -p org.fisco.bcos.asset.contract ``` 运行成功之后,将会在`console/contracts/sdk`目录生成java、abi和bin目录,如下所示。 @@ -353,10 +353,8 @@ bash contract2java.sh solidity -p org.fisco.bcos.asset.contract # 其它无关文件省略 |-- abi # 生成的abi目录,存放solidity合约编译生成的abi文件 | |-- Asset.abi -| |-- Table.abi |-- bin # 生成的bin目录,存放solidity合约编译生成的bin文件 | |-- Asset.bin -| |-- Table.bin |-- java # 存放编译的包路径及Java合约文件 | |-- org | |--fisco @@ -364,10 +362,9 @@ bash contract2java.sh solidity -p org.fisco.bcos.asset.contract | |--asset | |--contract | |--Asset.java # Asset.sol合约生成的Java文件 -| |--Table.java # Table.sol合约生成的Java文件 ``` -java目录下生成了`org/fisco/bcos/asset/contract/`包路径目录,该目录下包含`Asset.java`和`KVTable.java`两个文件,其中`Asset.java`是Java应用调用`Asset.sol`合约需要的文件。 +java目录下生成了`org/fisco/bcos/asset/contract/`包路径目录,该目录下包含`Asset.java`文件,`Asset.java`是Java应用调用`Asset.sol`合约需要的文件。 `Asset.java`的主要接口: @@ -380,7 +377,7 @@ public class Asset extends Contract { // Asset.sol合约 register接口生成 public TransactionReceipt register(String account, BigInteger asset_value); // Asset.sol合约 select接口生成 - public Tuple2 select(String account) throws ContractException; + public Tuple2 select(String account) throws ContractException; // 加载Asset合约地址,生成Asset对象 public static Asset load(String contractAddress, Client client, CryptoKeyPair credential); @@ -426,28 +423,20 @@ $ unzip asset-app-3.0-solidity.zip && mv asset-app-demo-main asset-app-3.0 ### 第三步. 引入FISCO BCOS Java SDK -在build.gradle文件中的``dependencies``下加入对FISCO BCOS Java SDK的引用。 +修改``build.gradle``文件中, ``repositories``设置maven源,引入Spring框架,在``dependencies``下加入对FISCO BCOS Java SDK的引用(注意java-sdk版本号)。 ```groovy repositories { mavenCentral() maven { - allowInsecureProtocol = true url "http://maven.aliyun.com/nexus/content/groups/public/" } maven { - allowInsecureProtocol = true url "https://oss.sonatype.org/content/repositories/snapshots" } } -``` - -### 第四步. 配置SDK证书 - -修改``build.gradle``文件,引入Spring框架。 -```groovy -def spring_version = "4.3.27.RELEASE" +def spring_version = "5.3.25" List spring = [ "org.springframework:spring-core:$spring_version", "org.springframework:spring-beans:$spring_version", @@ -458,11 +447,13 @@ List spring = [ dependencies { compile logger runtime logger - compile ("org.fisco-bcos.java-sdk:fisco-bcos-java-sdk:3.2.0") + compile ("org.fisco-bcos.java-sdk:fisco-bcos-java-sdk:3.3.0") compile spring } ``` +### 第四步. 配置SDK证书 + 在``asset-app-3.0/src/test/resources``目录下创建配置文件``applicationContext.xml``,写入配置内容。 applicationContext.xml的内容如下: @@ -557,10 +548,12 @@ applicationContext.xml的内容如下: $ cd ~/fisco # 创建放置证书的文件夹(默认解压项目即存在) $ mkdir -p asset-app-3.0/src/test/resources +# 创建conf目录 +$ mkdir asset-app-3.0/src/test/resources/conf # 拷贝节点证书到项目的资源目录 $ cp -r nodes/127.0.0.1/sdk/* asset-app-3.0/src/test/resources/conf # 若在IDE直接运行,拷贝证书到resources路径 -$ mkdir -p asset-app-3.0/src/main/resources +$ mkdir -p asset-app-3.0/src/main/resources asset-app-3.0/src/main/resources/conf $ cp -r nodes/127.0.0.1/sdk/* asset-app-3.0/src/main/resources/conf ``` @@ -578,7 +571,7 @@ cp console/contracts/sdk/java/org/fisco/bcos/asset/contract/Asset.java asset-app ### 第二步.开发业务逻辑 -在路径`/src/main/java/org/fisco/bcos/asset/client`目录下,创建`AssetClient.java`类,通过调用`Asset.java`实现对合约的部署与调用 +在路径`asset-app-3.0/src/main/java/org/fisco/bcos/asset/client`目录下,创建`AssetClient.java`类,通过调用`Asset.java`实现对合约的部署与调用 `AssetClient.java` 代码如下: @@ -818,7 +811,7 @@ Asset asset = Asset.load(contractAddress, client, cryptoKeyPair); ```java // select接口调用 - Tuple2 result = asset.select(assetAccount); +Tuple2 result = asset.select(assetAccount); // register接口调用 TransactionReceipt receipt = asset.register(assetAccount, amount); // transfer接口 @@ -923,6 +916,7 @@ log4j.appender.stdout.layout.ConversionPattern=[%p] [%-d{yyyy-MM-dd HH:mm:ss}] % | | |-- cert.cnf | | |-- sdk.crt | | |-- sdk.key +| | |-- sdk.nodeid | | |-- applicationContext.xml // 项目配置文件 | | |-- contract.properties // 存储部署合约地址的文件 | | |-- log4j.properties // 日志配置文件 @@ -936,12 +930,13 @@ log4j.appender.stdout.layout.ConversionPattern=[%p] [%-d{yyyy-MM-dd HH:mm:ss}] % | | |-- cert.cnf | | |-- sdk.crt | | |-- sdk.key +| | |-- sdk.nodeid | | |-- applicationContext.xml // 项目配置文件 | | |-- contract.properties // 存储部署合约地址的文件 | | |-- log4j.properties // 日志配置文件 | | |-- contract //存放solidity约文件 | | |-- Asset.sol -| | |-- Table.sol +| | |-- KVTable.sol | |-- tool |-- asset_run.sh // 项目运行脚本 @@ -968,16 +963,16 @@ $ ./gradlew build # 进入dist目录 $ cd dist $ bash asset_run.sh deploy -Deploy Asset successfully, contract address is 0xd09ad04220e40bb8666e885730c8c460091a4775 +deploy Asset success, contract address is 0xc8ead4b26b2c6ac14c9fd90d9684c9bc2cc40085 ``` - 注册资产 ```shell $ bash asset_run.sh register Alice 100000 -Register account successfully => account: Alice, value: 100000 +register asset account success => asset: Alice, value: 100000 $ bash asset_run.sh register Bob 100000 -Register account successfully => account: Bob, value: 100000 +register asset account success => asset: Bob, value: 100000 ``` - 查询资产 diff --git a/3.x/zh_CN/docs/quick_start/wbc_liquid_application.md b/3.x/zh_CN/docs/quick_start/wbc_liquid_application.md index d89e48701..2cf9b5c51 100644 --- a/3.x/zh_CN/docs/quick_start/wbc_liquid_application.md +++ b/3.x/zh_CN/docs/quick_start/wbc_liquid_application.md @@ -1,4 +1,4 @@ -# 开发第一个WBC-Liquid区块链应用 +# 4. 开发第一个WBC-Liquid区块链应用 标签:``开发第一个应用`` ``WBC-Liquid`` ``合约开发`` ``区块链应用`` ``WASM`` @@ -13,7 +13,21 @@ 本教程要求用户熟悉Linux操作环境,具备Java开发的基本技能,能够使用Gradle工具,熟悉webankblockchain-liquid语法(以下简称WBC-Liquid),并且进行了[WBC-Liquid的环境配置](https://liquid-doc.readthedocs.io/zh_CN/latest/docs/quickstart/prerequisite.html)。 -如果您还未搭建区块链网络,或未下载控制台,请先走完教程[搭建第一个区块链网络](./air_installation.md),再回到本教程。 +开发WBC-Liquid应用,需要搭建**WASM**配置的区块链网络。步骤如下: +1. 如果您还未搭建区块链网络,或未下载控制台,请先走完教程[搭建第一个区块链网络](./air_installation.md),再回到本教程。(若已搭建则忽略本步骤); +2. 开启节点wasm配置项:修改节点创世块的配置文件 `config.genesis` 的 `[executor]` 为`is_wasm=true`; +3. 删除data数据、重启节点; +```shell +# 到节点的目录 +cd ~/fisco/nodes/127.0.0.1 +# 停掉节点 +bash stop_all.sh +# 删除节点旧数据 +rm -rf node*/data +# 重启节点 +bash start_all.sh +``` +至此,区块链网络就开启了WASM配置。 ## 1. 了解应用需求 @@ -65,14 +79,14 @@ pub fn transfer(&mut self, from: String, to: String, value: u128) -> i16 根据我们第一步的存储和接口设计,创建一个Asset的智能合约项目。 在终端中执行以下命令创建 WBC-Liquid 智能合约项目: -**特别注意:** 为了用户方便使用,控制台已经在 `console/contracts/liquid`路径下准备好了`Asset`示例,下面的流程为创建一个全新WBC-Liquid合约的流程。 +**特别注意:** 为了用户方便使用,控制台已经在 `console/contracts/liquid`路径下准备好了`asset`示例,下面的流程为创建一个全新WBC-Liquid合约的流程。 ```shell # 创建工作目录~/fisco mkdir -p ~/fisco # 下载控制台 -cd ~/fisco && curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v3.2.0/download_console.sh && bash download_console.sh +cd ~/fisco && curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v3.6.0/download_console.sh && bash download_console.sh # 切换到fisco/console/目录 cd ~/fisco/console/ @@ -80,7 +94,7 @@ cd ~/fisco/console/ # 进入console/contracts目录 cd ~/fisco/console/contracts/liquid -# 创建新的合约 +# 创建新的合约 (控制台已经准备好asset目录,如果是下载控制台的话可跳过该步骤) cargo liquid new contract asset ``` @@ -223,7 +237,7 @@ mod asset { pub fn transfer(&mut self, from: String, to: String, value: u128) -> i16 { let mut ret_code: i16 = 0; let (ok, from_value) = self.select(from.clone()); - if ok == true.into() { + if ok != true.into() { ret_code = -1; self.env().emit(TransferEvent { ret_code, @@ -341,7 +355,7 @@ cargo liquid build ``Liquid``的智能合约需要编译成ABI和WASM文件才能部署至区块链网络上,有了这两个文件即可凭借Java SDK进行合约部署和调用。Liquid项目的环境构建与编译请参考:[部署Liquid编译环境](https://liquid-doc.readthedocs.io/zh_CN/latest/docs/quickstart/prerequisite.html) 、[Liquid开发指南](https://liquid-doc.readthedocs.io/zh_CN/latest/docs/dev_testing/development.html)。 -控制台提供的Java生成工具可以将`cargo liquid build`编译出ABI和BIN文件自动生成一个与编译的智能合约同名的合约Java类。这个Java类是根据ABI生成的,帮助用户解析好了参数,提供同名的方法。当应用需要部署和调用合约时,可以调用该合约类的对应方法,传入指定参数即可。使用这个合约Java类来开发应用,可以极大简化用户的代码。我们利用console控制台的脚本 `contract2java.sh` 生成Java 文件。 +控制台提供的Java生成工具可以将`cargo liquid build`编译出ABI和WASM文件自动生成一个与编译的智能合约同名的合约Java类。这个Java类是根据ABI生成的,帮助用户解析好了参数,提供同名的方法。当应用需要部署和调用合约时,可以调用该合约类的对应方法,传入指定参数即可。使用这个合约Java类来开发应用,可以极大简化用户的代码。我们利用console控制台的脚本 `contract2java.sh` 生成Java 文件。 ```shell # 假设你已经完成控制台的下载操作,若还没有请查看本文第二节的开发源码步骤 @@ -350,7 +364,7 @@ cargo liquid build cd ~/fisco/console/ # 编译合约(后面指定BINARY、abi 文件路径,可以根据实际项目路径指定路径)如下: -bash contract2java.sh liquid -a ~/fisco/console/contracts/liquid/asset/target/asset.abi -b ~/fisco/console/contracts/liquid/asset/target/asset.wasm -s ~/fisco/console/contracts/liquid/asset/target/asset_gm.wasm +bash contract2java.sh liquid -a ~/fisco/console/contracts/liquid/asset/target/asset.abi -b ~/fisco/console/contracts/liquid/asset/target/asset.wasm -s ~/fisco/console/contracts/liquid/asset/target/asset_gm.wasm -p org.fisco.bcos.asset.liquid.contract # 脚本用法: $ bash contract2java.sh liquid -h @@ -367,7 +381,7 @@ usage: contract2java.sh [OPTIONS...] contract. ``` -运行成功之后,将会在`console/dist/contracts/sdk/java/com`目录生成Asset.java文件。 +运行成功之后,将会在`console/contracts/sdk/java/com`目录生成Asset.java文件。 `Asset.java`的主要接口: @@ -376,17 +390,17 @@ package org.fisco.bcos.asset.contract; public class Asset extends Contract { // Asset合约 transfer接口生成 - public TransactionReceipt transfer(String from_account, String to_account, BigInteger amount); + public TransactionReceipt transfer(String from, String to, BigInteger value); // Asset合约 register接口生成 public TransactionReceipt register(String account, BigInteger asset_value); // Asset合约 select接口生成 - public Tuple2 select(String account) throws ContractException; + public Tuple2 select(String account) throws ContractException; // 加载Asset合约地址,生成Asset对象 public static Asset load(String contractAddress, Client client, CryptoKeyPair credential); // 部署Asset合约,生成Asset对象 - public static Asset deploy(Client client, CryptoKeyPair credential) throws ContractException; + public static Asset deploy(Client client, CryptoKeyPair credential, String contractPath) throws ContractException; } ``` @@ -428,7 +442,7 @@ $ unzip asset-app-3.0-liquid.zip && mv asset-app-demo-main-liquid asset-app-liq ### 第三步. 引入FISCO BCOS Java SDK -在build.gradle文件中的``dependencies``下加入对FISCO BCOS Java SDK的引用。 +修改``build.gradle``文件,引入Spring框架,在的``dependencies``下加入对FISCO BCOS Java SDK的引用(注意java-sdk版本号)。 ```groovy repositories { @@ -437,14 +451,8 @@ repositories { maven { url "https://oss.sonatype.org/service/local/staging/deploy/maven2" } maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } -``` - -### 第四步. 配置SDK证书 - -修改``build.gradle``文件,引入Spring框架。 -```java -def spring_version = "4.3.27.RELEASE" +def spring_version = "5.3.25" List spring = [ "org.springframework:spring-core:$spring_version", "org.springframework:spring-beans:$spring_version", @@ -455,11 +463,12 @@ List spring = [ dependencies { compile logger runtime logger - compile ("org.fisco-bcos.java-sdk:fisco-bcos-java-sdk:3.2.0") + compile ("org.fisco-bcos.java-sdk:fisco-bcos-java-sdk:3.3.0") compile spring } ``` +### 第四步. 配置SDK证书 在``asset-app-liquid/src/test/resources``目录下创建配置文件``applicationContext.xml``,写入配置内容。 applicationContext.xml的内容如下: @@ -545,7 +554,7 @@ applicationContext.xml的内容如下: ``` -**注意:** 如果搭链时设置的 rpc listen_ip 为127.0.0.1或者0.0.0.0,listen_port 为20200,则`applicationContext.xml`配置不用修改。若区块链节点配置有改动,需要同样修改配置`applicationContext.xml`的`network`属性下的`peers`配置选项,配置所连接节点的 `[rpc]`配置的`listen_ip:listen_port`。 +**注意:** liquid合约,节点需要开启**wasm**选项。如果搭链时设置的 rpc listen_ip 为127.0.0.1或者0.0.0.0,listen_port 为20200,则`applicationContext.xml`配置不用修改。若区块链节点配置有改动,需要同样修改配置`applicationContext.xml`的`network`属性下的`peers`配置选项,配置所连接节点的 `[rpc]`配置的`listen_ip:listen_port`。 在以上配置文件中,我们指定了证书存放的位``certPath``的值为``conf``。接下来我们需要把SDK用于连接节点的证书放到指定的``conf``目录下。 @@ -553,12 +562,12 @@ applicationContext.xml的内容如下: # 假设我们将asset-app-liquid放在~/fisco目录下 进入~/fisco目录 $ cd ~/fisco # 创建放置证书的文件夹 -$ mkdir -p asset-app-liquid/src/test/resources +$ mkdir -p asset-app-liquid/src/test/resources/conf # 拷贝节点证书到项目的资源目录 -$ cp -r nodes/127.0.0.1/sdk/* asset-app-liquid/src/test/resources +$ cp -r nodes/127.0.0.1/sdk/* asset-app-liquid/src/test/resources/conf # 若在IDE直接运行,拷贝证书到resources路径 -$ mkdir -p asset-app-liquid/src/main/resources -$ cp -r nodes/127.0.0.1/sdk/* asset-app-liquid/src/main/resources +$ mkdir -p asset-app-liquid/src/main/resources/conf +$ cp -r nodes/127.0.0.1/sdk/* asset-app-liquid/src/main/resources/conf ``` ## 5. 业务逻辑开发 @@ -570,12 +579,12 @@ $ cp -r nodes/127.0.0.1/sdk/* asset-app-liquid/src/main/resources ```shell cd ~/fisco # 将编译好的合约Java类引入项目中。 -cp console/contracts/sdk/java/org/fisco/bcos/asset/contract/Asset.java asset-app-liquid/src/main/java/org/fisco/bcos/asset/contract/Asset.java +cp console/contracts/sdk/java/org/fisco/bcos/asset/liquid/contract/Asset.java asset-app-liquid/src/main/java/org/fisco/bcos/asset/liquid/contract/Asset.java ``` ### 第二步 开发业务逻辑 -在路径`/src/main/java/org/fisco/bcos/asset/client`目录下,创建`AssetClient.java`类,通过调用`Asset.java`实现对合约的部署与调用 +在路径`/src/main/java/org/fisco/bcos/asset/liquid/client`目录下,创建`AssetClient.java`类,通过调用`Asset.java`实现对合约的部署与调用 `AssetClient.java` 代码如下: @@ -826,7 +835,7 @@ Asset asset = Asset.load(contractAddress, client, cryptoKeyPair); ```java // select接口调用 -Tuple2 result = asset.select(assetAccount); +Tuple2 result = asset.select(assetAccount); // register接口调用 TransactionReceipt receipt = asset.register(assetAccount, amount); // transfer接口 @@ -919,39 +928,40 @@ log4j.appender.stdout.layout.ConversionPattern=[%p] [%-d{yyyy-MM-dd HH:mm:ss}] % | | | |-- fisco | | | |-- bcos | | | |-- asset -| | | |-- client // 放置客户端调用类 +| | | |-- liquid +| | | |-- client // 放置客户端调用类 | | | |-- AssetClient.java -| | | |-- contract // 放置Java合约类 +| | | |-- contract // 放置Java合约类 | | | |-- Asset.java | | |-- resources | | |-- conf | | |-- ca.crt -| | |-- node.crt -| | |-- node.key +| | |-- cert.cnf | | |-- sdk.crt | | |-- sdk.key +| | |-- sdk.nodeid | | |-- applicationContext.xml // 项目配置文件 | | |-- contract.properties // 存储部署合约地址的文件 | | |-- log4j.properties // 日志配置文件 | | |-- contract //存放 WBC-Liquid 合约文件 -| | |-- asset-test +| | |-- asset | | |-- src | | |-- lib.rs WBC-Liquid文件 | |-- test | |-- resources // 存放代码资源文件 | |-- conf -| |-- ca.crt -| |-- node.crt -| |-- node.key -| |-- sdk.crt -| |-- sdk.key -| |-- sdk.publickey +| |-- ca.crt +| |-- cert.cnf +| |-- sdk.crt +| |-- sdk.key +| |-- sdk.nodeid | |-- applicationContext.xml // 项目配置文件 | |-- contract.properties // 存储部署合约地址的文件 | |-- log4j.properties // 日志配置文件 | |-- contract //存放 WBC-Liquid 合约文件 -| |-- asset-test -| |-- lib.rs WBC-Liquid文件 +| |-- asset +| |-- src +| |-- lib.rs WBC-Liquid文件 | |-- tool |-- asset_run.sh // 项目运行脚本 @@ -978,16 +988,16 @@ $ ./gradlew build # 进入dist目录 $ cd dist $ bash asset_run.sh deploy -Deploy Asset successfully, contract address is 0xd09ad04220e40bb8666e885730c8c460091a4775 +deploy Asset success, contract address is /asset/liquid180 ``` - 注册资产 ```shell $ bash asset_run.sh register Alice 100000 -Register account successfully => account: Alice, value: 100000 +register asset account success => asset: Alice, value: 100000 $ bash asset_run.sh register Bob 100000 -Register account successfully => account: Bob, value: 100000 +register asset account success => asset: Bob, value: 100000 ``` - 查询资产 diff --git a/3.x/zh_CN/docs/sdk/c_sdk/api.md b/3.x/zh_CN/docs/sdk/c_sdk/api.md new file mode 100644 index 000000000..73a5f8ba3 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/c_sdk/api.md @@ -0,0 +1,1398 @@ +# 接口列表 + +标签:``c-sdk`` ``API`` + +---------- + +本章节介绍`c-sdk`的`API`列表,模块列表: + +- [基础操作](../c_sdk/api.html#id2) +- [错误处理](../c_sdk/api.html#id3) +- [RPC](../c_sdk/api.html#rpc) +- [AMOP](../c_sdk/api.html#amop) +- [EventSub](../c_sdk/api.html#eventsub) +- [工具类](../c_sdk/api.html#id4) + - [KeyPair](../c_sdk/api.html#keypair) + - [ABI编解码](../c_sdk/api.html#abi) + - [交易构造(不带类型)](../c_sdk/api.html#id5) + - [交易构造(带类型)](../c_sdk/api.html#id6) + +## 1. 基础操作 + +本小节介绍`c-sdk`的基础操作,包括`sdk`对象的创建、启动、停止、释放。 + +### `bcos_sdk_version` + +- 原型: + - `const char* bcos_sdk_version()` +- 功能: + - 获取c-sdk的版本以及构建信息 +- 参数: + - 无 +- 返回: + - 字符串类型,包括c-sdk的版本以及构建信息,示例: + + ```shell + FISCO BCOS C SDK Version : 3.1.0 + Build Time : 20220915 11:11:11 + Build Type : Darwin/appleclang/Release + Git Branch : main + Git Commit : dbc82415510a0e59339faebcd72e540fe408d2d0 + ``` + +- 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +### `bcos_sdk_create` + +- 原型: + - `void* bcos_sdk_create(struct bcos_sdk_c_config* config)` +- 功能: + - 创建`sdk`对象指针 +- 参数: + - config: 配置对象, 参考[配置对象](./config.html#id2) +- 返回: + - 返回`sdk`指针 + - 失败返回`NULL`,可以调用`bcos_sdk_get_last_error`获取错误信息, 参考`bcos_sdk_get_last_error`接口介绍 +- 注意: + - 创建的`sdk`对象,需要由`bcos_sdk_destroy`接口释放,以免内存泄露 + +### `bcos_sdk_create_by_config_file` + +- 原型: + - `void* bcos_sdk_create_by_config_file(const char *config_file)` +- 功能: + - 创建`sdk`对象指针 +- 参数: + - config_file: 配置文件, 参考[配置文件](./config.html#id3) +- 返回: + - 返回`sdk`指针 + - 失败返回`NULL`,可以调用`bcos_sdk_get_last_error`获取错误信息, 参考`bcos_sdk_get_last_error`接口介绍 +- 注意: + - 创建的`sdk`对象,需要由`bcos_sdk_destroy`接口释放,以免内存泄露 + +### `bcos_sdk_start` + +- 原型: + - `void bcos_sdk_start(void* sdk)` +- 功能: + - 启动`sdk` +- 参数: + - sdk: `sdk`指针 +- 返回: + - 无, 可以使用`bcos_sdk_get_last_error`确认是否启动成功, 参考`bcos_sdk_get_last_error`介绍 + +### `bcos_sdk_stop` + +- 原型: + - `void bcos_sdk_stop(void* sdk)` +- 功能: + - 停止`sdk` +- 参数: + - sdk: `sdk`指针 +- 返回: + - 无 + +### `bcos_sdk_destroy` + +- 原型: + - `void bcos_sdk_destroy(void* sdk)` +- 功能: + - 停止并且释放`sdk` +- 参数: + - sdk: `sdk`指针 +- 返回: 无 + +### `bcos_sdk_c_free` + +- 原型: + - `void bcos_sdk_c_free(void* p)` +- 功能: + - 释放内存 +- 参数: + - p: 指针 +- 返回: 无 + +## 2. 错误处理 + +本小节介绍`c-sdk`的错误处理接口。 + +**注意: 这些接口仅仅对同步调用接口有效,异步接口的错误信息在回调中返回**。 + +### `bcos_sdk_is_last_opr_success` + +- 原型: + - `int bcos_sdk_is_last_opr_success()` +- 功能: + - 最近一次操作是否成功,等价于`bcos_sdk_get_last_error`返回结果不为0。 +- 参数: + - 无 +- 返回: + - 0: 操作失败 + - 1: 操作成功 + +### `bcos_sdk_get_last_error` + +- 原型: + - `int bcos_sdk_get_last_error()` +- 功能: + - 获取上一次操作的返回状态, 失败时可以调用`bcos_sdk_get_last_error_msg`获取错误描述信息 +- 参数: + - 无 +- 返回: + - 0: 成功, 其他表示错误码, 可以使用`bcos_sdk_get_last_error_msg`获取错误描述信息 + +### `bcos_sdk_get_last_error_msg` + +- 原型: + - `const char* bcos_sdk_get_last_error_msg()` +- 功能: + - 获取上一次操作的错误信息描述, 与`bcos_sdk_get_last_error`配合使用 +- 参数: + - 无 +- 返回: 错误描述信息 + +## 3. RPC接口 + +本小节介绍如何在`c-sdk`中调用`FISCO-BCOS 3.0`的`rpc`接口,与节点交互。 + +### `bcos_rpc_call` + +- 原型: + - `void bcos_rpc_call(void* sdk, const char* group, const char* node, const char* to, const char* data, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 调用合约,查询操作,无需共识 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 请求发往的节点名称(节点名称可以通过`getGroupInfo`获取), 值为`NULL`或者空字符串时, 在群组中按最高块高的原则, 随机选择一个节点 + - `to`: 合约地址 + - `data`: 编码后的参数 + - 调用`solidity`合约时为`ABI`编码 + - 调用`liquid`合约时为`liquid`编码 + - `callback`: 回调函数, 函数原型: + + ```shell + typedef void (*bcos_sdk_c_struct_response_cb)(struct bcos_sdk_c_struct_response* resp) + ``` + + `bcos_sdk_c_struct_response`定义及字段含义: + + ```c + struct bcos_sdk_c_struct_response + { + int error; // 返回状态, 0成功, 其他失败 + char* desc; // 失败时描述错误信息 + + void* data; // 返回数据, error=0 时有效 + size_t size; // 返回数据大小, error=0 时有效 + + void* context; // 回调上下文,调用接口时传入的`context`参数 + }; + ``` + + **!!!注意: 回调的数据`data`仅在回调线程有效,多线程场景下,用户需自行拷贝保证数据的线程安全** + - `context`: 回调上下文, 在回调`bcos_sdk_c_struct_response`中`context`字段返回 +- 返回: + - 无 + +### `bcos_rpc_send_transaction` + +- 原型: + - `void bcos_rpc_send_transaction(void* sdk, const char* group, const char* node, const char* data, int proof, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 发送交易,需要区块链共识 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `data`: 签名的交易,十六进制c风格字符串 + - `proof`: 是否返回交易回执证明, 0:不返回,1:返回 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_transaction` + +- 函数原型: `void bcos_rpc_get_transaction(void* sdk, const char* group, const char* node, const char* tx_hash,int proof, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 根据交易哈希获取交易 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `tx_hash`: 交易哈希 + - `proof`: 是否返回交易证明, 0:不返回, 1:返回 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_transaction_receipt` + +- 原型: + + ```shell + void bcos_rpc_get_transaction_receipt(void* sdk, const char* group, const char* node, const char* tx_hash, int proof, bcos_sdk_c_struct_response_cb callback, void* context) + ``` + +- 功能: + - 根据交易哈希获取交易回执 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `tx_hash`: 交易哈希 + - `proof`: 是否返回交易回执证明, 0: 不返回,1: 返回 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_block_by_hash` + +- 原型: + + ```shell + void bcos_rpc_get_block_by_hash(void* sdk, const char* group, const char* node,const char* block_hash, int only_header, int only_tx_hash, bcos_sdk_c_struct_response_cb callback, void* context) + ``` + +- 功能: + - 根据区块哈希获取区块 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `block_hash`: 区块哈希 + - `only_header`: 是否只获取区块头, 1: 是, 0: 否 + - `only_tx_hash`: 是否只获取区块的交易哈希, 1: 是, 0: 否 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_block_by_number` + +- 原型: + + ```shell + void bcos_rpc_get_block_by_number(void* sdk, const char* group, const char* node, int64_t block_number, int only_header, int only_tx_hash, bcos_sdk_c_struct_response_cb callback, void* context) + ``` + +- 功能: + - 根据块高获取区块 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `block_number`: 区块高度 + - `only_header`: 是否只获取区块头, 1: 是, 0: 否 + - `only_tx_hash`: 是否只获取区块的交易哈希, 1: 是, 0: 否 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_block_hash_by_number` + +- 原型: + - `void bcos_rpc_get_block_hash_by_number(void* sdk, const char* group, const char* node, int64_t block_number, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 根据块高获取区块哈希 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `block_number`: 区块高度 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: 无 + +### `bcos_rpc_get_block_limit` + +- 原型: + - `int64_t bcos_rpc_get_block_limit(void* sdk, const char* group)` +- 功能: + - 获取块高限制,创建签名交易时需要使用 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID +- 返回: + - `>0`时返回`block limit`值 + - `<=0`表示获取失败,此时表示查询不到该群组 + +### `bcos_rpc_get_block_number` + +- 原型: + - `void bcos_rpc_get_block_number(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取群组块高 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_code` + +- 原型: + - `void bcos_rpc_get_code(void* sdk, const char* group, const char* node, const char* address,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 根据合约地址,查询合约代码 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `address`: 合约地址 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: 无 + +### `bcos_rpc_get_sealer_list` + +- 原型: + - `void bcos_rpc_get_sealer_list(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取群组共识节点列表 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_observer_list` + +- 原型: + - `void bcos_rpc_get_observer_list(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取群组观察节点列表 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_pending_tx_size` + +- 原型: + - `void bcos_rpc_get_pending_tx_size(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取交易池待打包的交易数量 +- 参数; + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 空 + +### `bcos_rpc_get_sync_status` + +- 原型: + - `void bcos_rpc_get_sync_status(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取群组的区块同步状态 +- 参数; + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_consensus_status` + +- 原型: + - `void bcos_rpc_get_consensus_status(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取节点的共识状态 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_system_config_by_key` + +- 原型: + - `void bcos_rpc_get_system_config_by_key(void* sdk, const char* group, const char* node,const char* key,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取系统配置 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `key`: 配置`key` + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 空 + +### `bcos_rpc_get_total_transaction_count` + +- 原型: + - `void bcos_rpc_get_total_transaction_count(void* sdk, const char* group, const char* node, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取当前区块高度下的交易总量 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `node`: 节点名称, 参考`bcos_rpc_call`接口对`node`的说明 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_group_peers` + +- 原型: + - `void bcos_rpc_get_group_peers(void* sdk, const char* group, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取群组的网络连接信息 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_peers` + +- 原型: + - `void bcos_rpc_get_peers(void* sdk, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取网关的`p2p`网络连接信息 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_group_list` + +- 原型: + - `void bcos_rpc_get_group_list(void* sdk, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取群组列表 +- 参数: + - `sdk`: `sdk`指针 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_group_info` + +- 原型: + - `void bcos_rpc_get_group_info(void* sdk, const char* group, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取群组信息 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 群组ID + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_group_info_list` + +- 原型: + - `void bcos_rpc_get_group_info_list(void* sdk, bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取群组列表详情 +- 参数: + - sdk: `sdk`指针 + - `callback`: 参考`bcos_rpc_call`接口对`context`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +### `bcos_rpc_get_group_node_info` + +- 原型: + - `void bcos_rpc_get_group_node_info(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 获取群组的节点信息 +- 参数: + - sdk: `sdk`指针 + - group: 群组ID + - node: 节点名称 + - `callback`: 参考`bcos_rpc_call`接口对`callback`的说明 + - `context`: 参考`bcos_rpc_call`接口对`context`的说明 +- 返回: + - 无 + +## 4. AMOP接口 + +本小节介绍在`c-sdk`使用FISCO-BCOS 3.0`AMOP`功能的接口。 + +### `bcos_amop_subscribe_topic` + +- 原型: + - `void bcos_amop_subscribe_topic(void* sdk, char** topics, size_t count)` +- 功能: + - 订阅topic +- 参数: + - `sdk`: `sdk`指针 + - `topics`: topics内容 + - `count`: topics长度 +- 返回: + - 无 + +### `bcos_amop_subscribe_topic_with_cb` + +- 原型: + - `void bcos_amop_subscribe_topic_with_cb(void* sdk, const char* topic, bcos_sdk_c_amop_subscribe_cb cb, void* context)` +- 功能: + - 订阅`topic`,并设置接收`topic`消息的回调函数 +- 参数: + - `sdk`: `sdk`指针 + - `topic`: topic + - `cb`: 回调函数, 函数原型如下: + + ```shell + typedef void (*bcos_sdk_c_amop_subscribe_cb)( + const char* endpoint, const char* seq, struct bcos_sdk_c_struct_response* resp); + ``` + + 字段含义: + - endpoint: 接收消息的网络连接标记, 回复消息调用`bcos_amop_send_response`时需要使用 + - seq: 消息标记, 回复消息调用`bcos_amop_send_response`时需要使用 + - resp: 参考`bcos_rpc_call`接口`callback`对`bcos_sdk_c_struct_response`的说明 + + - `context`: 回调上下文, 参考`bcos_rpc_call`接口对`context`的说明 + +### `bcos_amop_set_subscribe_topic_cb` + +- 原型: + - `void bcos_amop_set_subscribe_topic_cb(void* sdk, bcos_sdk_c_amop_subscribe_cb cb, void* context)` +- 功能: + - 为`topic`设置回调函数,接收到的`topic`消息没有单独设置回调函数时,默认回调函数会被调用 +- 参数: + - `sdk`: `sdk`指针 + - `cb`: `topic`回调函数, 参考`bcos_amop_subscribe_topic_with_cb`接口对`cb`的说明 + - `context`: 回调上下文 + +### `bcos_amop_unsubscribe_topic` + +- 原型: + - `void bcos_amop_unsubscribe_topic(void* sdk, char** topics, size_t count)` +- 功能: + - 取消订阅 +- 参数: + - `sdk`: `sdk`指针 + - `topics`: topics内容 + - `count`: topics长度 + +### `bcos_amop_publish` + +- 原型: + - `void bcos_amop_publish(void* sdk, const char* topic, void* data, size_t size, uint32_t timeout,bcos_sdk_c_amop_publish_cb cb, void* context)` +- 功能: + - 发送`topic`消息 +- 参数: + - `sdk`: `sdk`指针 + - `topic`: topic + - `data`: 消息内容 + - `size`: 消息长度 + - `timeout`: 超时时间,单位ms + - `cb`: 回调函数, 函数原型如下: + + ```shell + typedef void (*bcos_sdk_c_amop_publish_cb)(struct bcos_sdk_c_struct_response* resp) + ``` + + - `context`: 回调上下文 + +### `bcos_amop_broadcast` + +- 原型: + - `void bcos_amop_broadcast(void* sdk, const char* topic, void* data, size_t size)` +- 功能: + - 发送`topic`广播消息 +- 参数: + - `sdk`: `sdk`指针 + - `topic`: topic + - `data`: 消息内容 + - `size`: 消息长度 + +### `bcos_amop_send_response` + +- 原型: + - `void bcos_amop_send_response(void* sdk, const char* peer, const char* seq, void* data, size_t size)` +- 功能: + - 发送回复消息 +- 参数: + - `sdk`: `sdk`指针 + - `peer`: 接收消息的网络连接标记, 参考`bcos_amop_subscribe_topic_with_cb`接口回调函数`cb`的字段`endpoint`说明 + - `seq`: 消息标记, 参考`bcos_amop_subscribe_topic_with_cb`接口回调函数`cb`的字段`seq`说明 + - `data`: 消息内容 + - `size`: 消息长度 + +## 5. EventSub接口 + +本小节介绍在`c-sdk`使用FISCO-BCOS 3.0`EventSub`事件订阅功能的接口。 + +### `bcos_event_sub_subscribe_event` + +- 原型: + - `const char* bcos_event_sub_subscribe_event(void* sdk, const char* group, const char* params,bcos_sdk_c_struct_response_cb callback, void* context)` +- 功能: + - 合约事件订阅 +- 参数: + - `sdk`: `sdk`指针 + - `group`: 请求群组ID + - `params`: 请求参数,c风格JSON字符串 + - addresses: 字符串数组,订阅Event的合约地址列表,为空时表示所有的合约 + - fromBlock: 整形,初始区块,-1表示从当前最高块开始 + - toBlock: 整形,结束区块,-1表示不限制区块高度,已经是最高块时也继续等待新的区块 + - topics: 字符串数组,订阅的topic列表,为空时表示所有的topic + + 示例: + + ```shell + { + "addresses": ["6849F21D1E455e9f0712b1e99Fa4FCD23758E8F1"], + "fromBlock": -1, + "toBlock": -1, + "topics": [] + } + ``` + + - `context`: 回调上下文 +- 返回: + - 合约事件订阅的任务id,c风格字符串 + +### `bcos_event_sub_unsubscribe_event` + +- 原型: + - `void bcos_event_sub_unsubscribe_event(void* sdk, const char* id)` +- 功能: + - 取消合约事件订阅 +- 参数: + - `sdk`: `sdk`指针 + - `id`: 合约事件订阅的任务id,`bcos_event_sub_subscribe_event`的返回值 + +## 6. 工具类 + +本小结介绍`c-sdk`的基础工具类的使用,包括`KeyPair`签名对象、`ABI`编解码、构造签名交易。 + +### 6.1 `KeyPair`签名对象 + +- `bcos_sdk_create_keypair` + - 原型: + - `void* bcos_sdk_create_keypair(int crypto_type)` + - 功能: + - 创建`KeyPair`对象 + - 参数: + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - `KeyPair`对象指针 + - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - `KeyPair`对象不再使用时需要调用`bcos_sdk_destroy_keypair`接口释放,以免造成内存泄露 +- `bcos_sdk_create_keypair_by_private_key` + - 原型: + - `void* bcos_sdk_create_keypair_by_private_key(int crypto_type, void* private_key, unsigned length)` + - 功能: + - 加载私钥创建`KeyPair`对象 + - 参数: + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - private_key: 私钥,字节数组格式 + - length: 数组长度 + - 返回: + - `KeyPair`对象指针 + - 失败返回`NULL`使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - `KeyPair`对象不再使用时需要调用`bcos_sdk_destroy_keypair`接口释放,以免造成内存泄露 +- `bcos_sdk_create_keypair_by_hex_private_key` + - 原型: + - `void* bcos_sdk_create_keypair_by_hex_private_key(int crypto_type, const char* private_key)` + - 功能: + - 加载私钥创建`KeyPair`对象 + - 参数: + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - private_key: 私钥,十六进制c风格字符串格式 + - 返回: + - `KeyPair`对象指针 + - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - `KeyPair`对象不再使用时需要调用`bcos_sdk_destroy_keypair`接口释放,以免造成内存泄露 +- `bcos_sdk_get_keypair_type` + - 原型: + - `int bcos_sdk_get_keypair_type(void* key_pair)` + - 功能: + - 获取`KeyPair`对象类型 + - 参数: + - key_pair: `KeyPair`对象指针 + - 返回: + - 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) +- `bcos_sdk_get_keypair_address` + - 原型: + - `const char* bcos_sdk_get_keypair_address(void* key_pair)` + - 功能: + - 获取`KeyPair`对象对应的账户地址 + - 参数: + - key_pair: `KeyPair`对象指针 + - 返回: + - 账户地址,十六进制c风格字符串 + - 注意: + - 返回的字符串不使用时使用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_get_keypair_public_key` + - 原型: + - `const char* bcos_sdk_get_keypair_public_key(void* key_pair)` + - 功能: + - 获取`KeyPair`对象的公钥字符串 + - 参数: + - key_pair: `KeyPair`对象指针 + - 返回: + - 公钥,十六进制c风格字符串 + - 注意: + - 返回的字符串不使用时使用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_get_keypair_private_key` + - 原型: + - `const char* bcos_sdk_get_keypair_private_key(void* key_pair)` + - 功能: + - 获取`KeyPair`对象的私钥字符串 + - 参数: + - key_pair: `KeyPair`对象指针 + - 返回: + - 私钥,十六进制c风格字符串 + - 注意: + - 返回的字符串不使用时使用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_destroy_keypair` + - 原型: + - `void bcos_sdk_destroy_keypair(void* key_pair)` + - 功能: + - 释放`KeyPair`对象 + - 参数: + - key_pair: `KeyPair`对象指针 + - 返回: + - 无 + +### 6.2 `ABI`编解码 + +- `bcos_sdk_abi_encode_constructor` + - 原型: + - `const char* bcos_sdk_abi_encode_constructor(const char* abi, const char* bin, const char* params, int crypto_type)` + - 功能: + - 编码构造函数参数 + - 参数: + - abi: 合约ABI,JSON字符串 + - bin: 合约BIN,十六进制c风格字符串 + - params: 构造函数参数,JSON字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 编码后的参数,十六进制c风格字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_abi_encode_method` + - 原型: + - `const char* bcos_sdk_abi_encode_method(const char* abi, const char* method_name, const char* params, int crypto_type)` + - 功能: + - 编码接口参数 + - 参数: + - abi: 合约ABI,JSON字符串 + - method_name: 接口名 + - params: 构造函数的参数,JSON字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 编码后的参数,十六进制c风格字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_abi_encode_method_by_method_id` + - 原型: + - `const char* bcos_sdk_abi_encode_method_by_method_id(const char* abi, const char* method_id, const char* params, int crypto_type)` + - 功能: + - 根据methodID编码参数 + - 参数: + - abi: 合约ABI,JSON字符串 + - method_id: methodID + - params: 构造函数的参数,JSON字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 编码后的参数,十六进制c风格字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_abi_encode_method_by_method_sig` + - 原型: + - `const char* bcos_sdk_abi_encode_method_by_method_sig(const char* method_sig, const char* params, int crypto_type)` + - 功能: + - 根据接口signature编码参数 + - 参数: + - method_sig: 接口signature + - params: 构造函数的参数,JSON字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 编码后的参数,十六进制c风格字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_abi_decode_method_input` + - 原型: + - `const char* bcos_sdk_abi_decode_method_input(const char* abi, const char* method_name, const char* data, int crypto_type)` + - 功能: + - 根据接口名解析输入参数 + - 参数: + - abi: 合约ABI,JSON字符串 + - method_name: 接口名 + - data: 编码的参数,十六进制c风格字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 解析后的参数,十六进制c风格JSON字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_abi_decode_method_input_by_method_id` + - 原型: + - `const char* bcos_sdk_abi_decode_method_input_by_method_id(const char* abi, const char* method_id, const char* data, int crypto_type)` + - 功能: + - 根据methodID解析输入参数 + - 参数: + - abi: 合约ABI + - method_id: methodID + - data: ABI编码的参数,十六进制c风格字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 解析后的参数,十六进制c风格JSON字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_abi_decode_method_input_by_method_sig` + - 原型: + - `const char* bcos_sdk_abi_decode_method_input_by_method_sig(const char* method_sig, const char* data, int crypto_type)` + - 功能: + - 根据接口signature解析输入参数 + - 参数: + - method_sig: 接口signature + - data: 编码的参数,十六进制c风格字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 解析后的参数,十六进制c风格JSON字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_abi_decode_method_output` + - 原型: + - `const char* bcos_sdk_abi_decode_method_output(const char* abi, const char* method_name, const char* data, int crypto_type)` + - 功能: + - 根据接口名解析返回参数 + - 参数: + - abi: 合约ABI + - method_name: 接口名 + - data: 编码的返回,十六进制c风格字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 解析后的返回,十六进制c风格JSON字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_abi_decode_method_output_by_method_id` + - 原型: + - `const char* bcos_sdk_abi_decode_method_output_by_method_id(const char* abi, const char* method_id, const char* data, int crypto_type)` + - 功能: + - 根据methodID解析返回参数 + - 参数: + - abi: 合约ABI + - method_id: methodID + - data: 编码的返回,十六进制c风格字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 解析后的返回,十六进制c风格JSON字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_abi_decode_event` + - 原型: + - `const char* bcos_sdk_abi_decode_event(const char* abi, const char* event_name, const char* data, int crypto_type)` + - 功能: + - 根据event名解析event参数 + - 参数: + - abi: 合约ABI + - event_name: event名 + - data: 编码的返回,十六进制c风格字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 解析后的event参数,十六进制c风格JSON字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 +- `bcos_sdk_abi_decode_event_by_topic` + - 原型: + - `const char* bcos_sdk_abi_decode_event_by_topic(const char* abi, const char* topic, const char* data, int crypto_type)` + - 功能: + - 根据topic解析event参数 + - 参数: + - abi: 合约ABI + - topic: event topic + - data: 编码的返回,十六进制c风格字符串 + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - 返回: + - 解析后的event参数,十六进制c风格JSON字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +### 6.3 交易构造(不带类型) +- `bcos_sdk_get_group_wasm_and_crypto` + - 原型: + - `void bcos_sdk_get_group_wasm_and_crypto(void* sdk, const char* group_id, int* wasm, int* crypto_type)` + - 功能: + - 获取群组的部分基础信息 1. 群组运行`wasm`合约,还是`solidity`合约 2. 群组为国密还是非国密环境 + - 参数: + - `sdk`: sdk对象,`bcos_sdk_create`或者`bcos_sdk_create_by_config_file`创建 + - `group_id`: 群组ID + - `wasm`: 返回值,该群组是否运行`wasm`合约 + - 0: 否,群组运行`solidity`合约, + - 1: 是,群组运行`wasm`合约 + - `crypto_type`: 返回值,该群组是否为国密类型,0: 否,1: 是 + - 返回: + - 无 + +- `bcos_sdk_get_group_chain_id` + - 原型: + - `const char* bcos_sdk_get_group_chain_id(void* sdk, const char* group_id)` + - 功能: + - 获取群组的链ID,构造交易时需使用该参数 + - 参数: + - `sdk`: sdk对象,`bcos_sdk_create`或者`bcos_sdk_create_by_config_file`创建 + - `group_id`: 群组ID + - 返回: + - 群组的链ID + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_create_transaction_data` + - 原型: + ```cpp + void* bcos_sdk_create_transaction_data(const char* group_id, const char* chain_id, const char* to, const char* data, const char* abi, int64_t block_limit) + ``` + - 功能: + - 创建`TransactionData`对象,该对象是未签名的交易对象 + - 参数: + - `group_id`: 群组ID + - `chain_id`: 链ID,可以调用`bcos_sdk_get_group_chain_id`接口获取群组的链ID + - `to`: 调用的合约地址,部署合约时设置为空字符串"" + - `data`: ABI编码后的参数,十六进制c风格字符串,参考[ABI编解码](../c_sdk/api.html#abi) + - `abi`: 合约的ABI,JSON字符串,可选参数,部署合约时可以将合约的ABI传入,默认传入空字符串"" + - `block_limit`: 区块限制,可以调用`bcos_rpc_get_block_limit`接口获取 + - 返回: + - `TransactionData`对象指针 + - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - `TransactionData`对象需要调用`bcos_sdk_destroy_transaction_data`接口释放,以免造成内存泄露 + +- `bcos_sdk_calc_transaction_data_hash` + - 原型: + - `const char* bcos_sdk_calc_transaction_data_hash(int crypto_type, void* transaction_data)` + - 功能: + - 计算`TransactionData`对象哈希 + - 参数: + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - `transaction_data`: `TransactionData`对象指针 + - 返回: + - `TransactionData`对象哈希 + - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - **`TransactionData`对象的哈希,也是交易的哈希** + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_sign_transaction_data_hash` + - 原型: + - `const char* bcos_sdk_sign_transaction_data_hash(void* keypair, const char* transcation_hash)` + - 功能: + - 交易哈希签名 + - 参数: + - keypair:`KeyPair`对象,参考[`KeyPair`签名对象](../c_sdk/api.html#keypair) + - transcation_hash: 交易哈希,由`bcos_sdk_calc_transaction_data_hash`接口生成 + - 返回: + - 交易签名,字符串类型 + - 失败返回`NULL`,调用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_create_signed_transaction_with_signed_data` + - 原型: + + ```cpp + const char* bcos_sdk_create_signed_transaction_with_signed_data(void* transaction_data, const char* signed_transaction_data, const char* transaction_data_hash, int32_t attribute) + ``` + + - 功能: + - 创建签名的交易 + - 参数: + - transaction_data: `TransactionData`对象 + - signed_transaction_data: 交易哈希的签名,十六进制c风格字符串,`bcos_sdk_sign_transaction_data_hash`接口生成 + - transaction_data_hash: 交易哈希,十六进制c风格字符串,`bcos_sdk_calc_transaction_data_hash`接口生成 + - attribute: 交易额外属性,待拓展,默认填0即可 + - 返回: + - 签名的交易,十六进制c风格字符串 + - 失败返回`NULL`,调用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_create_signed_transaction` + - 原型: + + ```cpp + void bcos_sdk_create_signed_transaction(void* key_pair, const char* group_id, const char* chain_id, const char* to, const char* data, const char* abi, int64_t block_limit, int32_t attribute, char** tx_hash, char** signed_tx) + ``` + + - 功能: + - 创建签名的交易 + - 参数: + - key_pair: `KeyPair`对象,参考[`KeyPair`签名对象](../c_sdk/api.html#keypair) + - group_id: 群组ID + - chain_id: 链ID,可以调用`bcos_sdk_get_group_chain_id`接口获取群组的链ID + - to: 调用的合约地址,部署合约时设置为空字符串"" + - data: ABI编码后的参数,参考[ABI编解码](../c_sdk/api.html#abi) + - abi: 合约的ABI,可选参数,部署合约时可以将合约的ABI传入,默认空字符串"" + - block_limit: 区块限制,可以调用`bcos_rpc_get_block_limit`接口获取 + - attribute: 交易额外属性,待拓展,默认填0即可 + - tx_hash: 返回值,交易哈希,十六进制c风格字符串 + - signed_tx: 返回值,签名的交易,十六进制c风格字符串 + - 返回: + - 调用`bcos_sdk_get_last_error`接口判断是否成功,0表示成功,其他值表示错误码 + - 注意: + - 返回的`tx_hash`、`signed_tx`需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + - **说明**: + - `bcos_sdk_create_signed_transaction`相当于下面几个接口功能的组合,创建交易、交易哈希、交易签名流程需要分开处理时,使用下面几个接口: + - `bcos_sdk_create_transaction_data`: 创建`TransactionData` + - `bcos_sdk_calc_transaction_data_hash`: 计算交易哈希 + - `bcos_sdk_sign_transaction_data_hash`: 交易哈希签名 + - `bcos_sdk_create_signed_transaction_with_signed_data`: 创建签名的交易 + +- `bcos_sdk_destroy_transaction_data` + - 原型: + - `void bcos_sdk_destroy_transaction_data(void* transaction_data)` + - 功能: + - 释放`TransactionData`对象 + - 参数: + - `transaction_data`: `TransactionData`对象指针 + - 返回: + - 无 + +- `bcos_sdk_create_transaction_builder_service` + - 原型: + - `void* bcos_sdk_create_transaction_builder_service(void* sdk, const char* group_id)` + - 功能: + - 创建`TransactionBuilderService`对象,简化构造签名交易的姿势,可以对比`bcos_sdk_create_transaction_data_with_tx_builder_service`与`bcos_sdk_create_transaction_data`接口的差异 + - 参数: + - sdk: sdk对象指针 + - group_id: 群组ID + - 返回: + - `TransactionBuilderService`对象指针 + - 失败返回`NULL`,调用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - `TransactionBuilderService`对象需要使用`bcos_sdk_destroy_transaction_builder_service`销毁,以免造成内存泄露 + +- `bcos_sdk_destroy_transaction_builder_service` + - 原型: + - `bcos_sdk_destroy_transaction_builder_service(void* service)` + - 功能: + - 销毁`TransactionBuilderService`对象 + - 参数: + - `TransactionBuilderService`对象指针 + - 返回: + - 无 +- `bcos_sdk_create_transaction_data_with_tx_builder_service` + - 原型: + - `void* bcos_sdk_create_transaction_data_with_tx_builder_service(void* tx_builder_service, const char* to, const char* data, const char* abi)` + - 功能: + - 创建`TransactionData`对象 + - 参数: + - tx_builder_service: `TransactionBuilderService`对象指针 + - to: 调用的合约地址,部署合约时设置为空字符串"" + - data: ABI编码后的参数,参考[ABI编解码](../c_sdk/api.html#abi) + - abi: 合约的ABI,可选参数,部署合约时可以将合约的ABI传入,默认空字符串"" + - 返回: + - `TransactionData`对象指针 + - 失败返回`NULL`使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - 创建的`TransactionData`对象需要由`bcos_sdk_destroy_transaction_data`接口释放,以免造成内存泄露 + +- `bcos_sdk_create_signed_transaction_with_tx_builder_service` + - 原型: + + ```cpp + void bcos_sdk_create_signed_transaction_with_tx_builder_service(void*tx_builder_service, void* key_pair, const char*to, const char* data, const char* abi, int32_t attribute, char** tx_hash, char** signed_tx) + ``` + + - 功能: + - 创建签名的交易 + - 参数: + - tx_builder_service: `TransactionBuilderService`对象指针 + - key_pair: `KeyPair`对象,参考[`KeyPair`签名对象](../c_sdk/api.html#keypair) + - to: 调用的合约地址,部署合约时设置为空字符串"" + - data: ABI编码后的参数,参考[ABI编解码](../c_sdk/api.html#abi) + - abi: 合约的ABI,可选参数,部署合约时可以将合约的ABI传入,默认空字符串"" + - attribute: 交易额外属性,待拓展,默认填0即可 + - tx_hash: 返回值,交易哈希,十六进制c风格字符串 + - signed_tx: 返回值,签名的交易,十六进制c风格字符串 + - 注意: + - 返回的`tx_hash`、`signed_tx`需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +### 6.4 交易构造(带类型) +- **c-sdk `3.3.0-tx-struct` 特性分支,增加了对交易结构体的支持**。 +即返回值、入参支持交易结构体,结构体如下: +```c +// transaction bytes +struct bcos_sdk_c_bytes +{ + uint8_t* buffer; + uint32_t length; +}; + +// transaction data +struct bcos_sdk_c_transaction_data +{ + int32_t version; + int64_t block_limit; + char* chain_id; + char* group_id; + char* nonce; + char* to; + char* abi; + struct bcos_sdk_c_bytes* input; +}; + +// transaction +struct bcos_sdk_c_transaction +{ + struct bcos_sdk_c_transaction_data* transaction_data; + struct bcos_sdk_c_bytes* data_hash; + struct bcos_sdk_c_bytes* signature; + struct bcos_sdk_c_bytes* sender; + int64_t import_time; + int32_t attribute; + char* extra_data; +}; +``` + +- `bcos_sdk_create_transaction_data_struct_with_hex_input` + - 原型: + ```cpp + struct bcos_sdk_c_transaction_data* bcos_sdk_create_transaction_data_struct_with_hex_input(const char* group_id, const char* chain_id, const char* to, const char* input, const char* abi, int64_t block_limit) + ``` + - 功能: + - 创建`bcos_sdk_c_transaction_data`交易结构体,该对象结构体是未签名的交易对象 + - 参数: + - `group_id`: 群组ID + - `chain_id`: 链ID,可以调用`bcos_sdk_get_group_chain_id`接口获取群组的链ID + - `to`: 调用的合约地址,部署合约时设置为空字符串"" + - `input`: ABI编码后的参数,十六进制c风格字符串,是hex字符串 + - `abi`: 合约的ABI,JSON字符串,可选参数,部署合约时可以将合约的ABI传入,默认传入空字符串"" + - `block_limit`: 区块限制,可以调用`bcos_rpc_get_block_limit`接口获取 + - 返回: + - `bcos_sdk_c_transaction_data`交易结构体指针 + - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - `bcos_sdk_c_transaction_data`交易结构体,需要调用`bcos_sdk_destroy_transaction_data_struct`接口释放,以免造成内存泄露 + +- `bcos_sdk_create_transaction_data_struct_with_bytes` + - 原型: + ```cpp + struct bcos_sdk_c_transaction_data* bcos_sdk_create_transaction_data_struct_with_bytes(const char* group_id, const char* chain_id, const char* to, const unsigned char* bytes_input, uint32_t bytes_input_length, const char* abi, int64_t block_limit) + ``` + - 功能: + - 创建`bcos_sdk_c_transaction_data`交易结构体,该对象结构体是未签名的交易对象 + - 参数: + - `group_id`: 群组ID + - `chain_id`: 链ID,可以调用`bcos_sdk_get_group_chain_id`接口获取群组的链ID + - `to`: 调用的合约地址,部署合约时设置为空字符串"" + - `bytes_input`: ABI编码后的参数,byte的字节数组 + - `bytes_input_length`: byte字节数组的长度 + - `abi`: 合约的ABI,JSON字符串,可选参数,部署合约时可以将合约的ABI传入,默认传入空字符串"" + - `block_limit`: 区块限制,可以调用`bcos_rpc_get_block_limit`接口获取 + - 返回: + - `bcos_sdk_c_transaction_data`交易结构体指针 + - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - `bcos_sdk_c_transaction_data`交易结构体,需要调用`bcos_sdk_destroy_transaction_data_struct`接口释放,以免造成内存泄露 + +- `bcos_sdk_calc_transaction_data_struct_hash` + - 原型: + - `const char* bcos_sdk_calc_transaction_data_struct_hash(int crypto_type, struct bcos_sdk_c_transaction_data* transaction_data)` + - 功能: + - 计算`bcos_sdk_c_transaction_data`交易结构体哈希 + - 参数: + - crypto_type: 类型, ECDSA: BCOS_C_SDK_ECDSA_TYPE(0), SM: BCOS_C_SDK_SM_TYPE(1) + - `transaction_data`: `bcos_sdk_c_transaction_data`交易结构体指针 + - 返回: + - `bcos_sdk_c_transaction_data`交易结构体哈希 + - 失败返回`NULL`,使用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - **`bcos_sdk_c_transaction_data`交易结构体的哈希,也是交易的哈希** + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_create_transaction_struct` + - 原型: + + ```cpp + struct bcos_sdk_c_transaction* bcos_sdk_create_transaction_struct(struct bcos_sdk_c_transaction_data* transaction_data, const char* signature, const char* transaction_data_hash, int32_t attribute, const char* extra_data) + ``` + + - 功能: + - 创建签名的交易结构体 + - 参数: + - transaction_data: `bcos_sdk_c_transaction_data`交易结构体 + - signature: 交易结构体哈希的签名,十六进制c风格字符串,`bcos_sdk_sign_transaction_data_hash`接口生成 + - transaction_data_hash: 交易结构体哈希,十六进制c风格字符串,`bcos_sdk_calc_transaction_data_struct_hash`接口生成 + - attribute: 交易额外属性,待拓展,默认填0即可 + - extra_data: 交易额外数据,填""空字符串即可 + - 返回: + - `bcos_sdk_c_transaction`签名的交易结构体指针 + - 失败返回`NULL`,调用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - `bcos_sdk_c_transaction`签名的交易结构体,需要调用`bcos_sdk_destroy_transaction_struct`接口释放,以免造成内存泄露 + +- `bcos_sdk_create_encoded_transaction` + - 原型: + + ```cpp + const char* bcos_sdk_create_encoded_transaction( + struct bcos_sdk_c_transaction_data* transaction_data, const char* signature, + const char* transaction_data_hash, int32_t attribute, const char* extra_data) + ``` + + - 功能: + - 创建签名的交易字符串 + - 参数: + - transaction_data: `bcos_sdk_c_transaction_data`交易结构体 + - signature: 交易结构体哈希的签名,十六进制c风格字符串,`bcos_sdk_sign_transaction_data_hash`接口生成 + - transaction_data_hash: 交易结构体哈希,十六进制c风格字符串,`bcos_sdk_calc_transaction_data_struct_hash`接口生成 + - attribute: 交易额外属性,待拓展,默认填0即可 + - extra_data: 交易额外数据,填""空字符串即可 + - 返回: + - 签名的交易字符串 + - 失败返回`NULL`,调用`bcos_sdk_get_last_error`、 `bcos_sdk_get_last_error_msg`获取错误码和错误描述信息 + - 注意: + - 返回的签名交易字符串,需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_encode_transaction_data_struct` + - 原型: + - `const char* bcos_sdk_encode_transaction_data_struct(struct bcos_sdk_c_transaction_data* transaction_data)` + - 功能: + - 将`bcos_sdk_c_transaction_data`交易结构体编码为hex字符串 + - 参数: + - `transaction_data`: `bcos_sdk_c_transaction_data`交易结构体指针 + - 返回: + - `transaction_data`交易结构体编码后的hex字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_encode_transaction_data_struct_to_json` + - 原型: + - `const char* bcos_sdk_encode_transaction_data_struct_to_json(struct bcos_sdk_c_transaction_data* transaction_data)` + - 功能: + - 将`bcos_sdk_c_transaction_data`交易结构体编码为json字符串 + - 参数: + - `transaction_data`: `bcos_sdk_c_transaction_data`交易结构体指针 + - 返回: + - `transaction_data`交易结构体编码后的json字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_decode_transaction_data_struct` + - 原型: + - `struct bcos_sdk_c_transaction_data* bcos_sdk_decode_transaction_data_struct(const char* transaction_data_hex_str)` + - 功能: + - 将编码后的hex字符串解码为`bcos_sdk_c_transaction_data`交易结构体 + - 参数: + - `transaction_data_hex_str`: 编码后的hex字符串 + - 返回: + - `bcos_sdk_c_transaction_data`交易结构体指针 + - 注意: + - `bcos_sdk_c_transaction_data`交易结构体,需要调用`bcos_sdk_destroy_transaction_data_struct`接口释放,以免造成内存泄露 + +- `bcos_sdk_decode_transaction_data_struct_with_json` + - 原型: + - `struct bcos_sdk_c_transaction_data* bcos_sdk_decode_transaction_data_struct_with_json(const char* transaction_data_json_str)` + - 功能: + - 将编码后的json字符串解码为`bcos_sdk_c_transaction_data`交易结构体 + - 参数: + - `transaction_data_json_str`: 编码后的json字符串 + - 返回: + - `bcos_sdk_c_transaction_data`交易结构体指针 + - 注意: + - `bcos_sdk_c_transaction_data`交易结构体,需要调用`bcos_sdk_destroy_transaction_data_struct`接口释放,以免造成内存泄露 + +- `bcos_sdk_destroy_transaction_data_struct` + - 原型: + - `void bcos_sdk_destroy_transaction_data_struct(struct bcos_sdk_c_transaction_data* transaction_data)` + - 功能: + - 释放`bcos_sdk_c_transaction_data`交易结构体 + - 参数: + - `transaction_data`: `bcos_sdk_c_transaction_data`交易结构体指针 + - 返回: + - 无 + +- `bcos_sdk_encode_transaction_struct` + - 原型: + - `const char* bcos_sdk_encode_transaction_struct(struct bcos_sdk_c_transaction* transaction)` + - 功能: + - 将`bcos_sdk_c_transaction`签名的交易结构体编码为hex字符串 + - 参数: + - `transaction`: `bcos_sdk_c_transaction`签名的交易结构体指针 + - 返回: + - `transaction`签名的交易结构体编码后的hex字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_encode_transaction_struct_to_json` + - 原型: + - `const char* bcos_sdk_encode_transaction_struct_to_json(struct bcos_sdk_c_transaction* transaction)` + - 功能: + - 将`bcos_sdk_c_transaction`签名的交易结构体编码为json字符串 + - 参数: + - `transaction`: `bcos_sdk_c_transaction`签名的交易结构体指针 + - 返回: + - `transaction`签名的交易结构体编码后的json字符串 + - 注意: + - 返回的字符串需要调用`bcos_sdk_c_free`释放,以免造成内存泄露 + +- `bcos_sdk_decode_transaction_struct` + - 原型: + - `struct bcos_sdk_c_transaction* bcos_sdk_decode_transaction_struct(const char* transaction_hex_str)` + - 功能: + - 将编码后的hex字符串解码为`bcos_sdk_c_transaction`签名的交易结构体 + - 参数: + - `transaction_hex_str`: 编码后的hex字符串 + - 返回: + - `bcos_sdk_c_transaction`签名的交易结构体指针 + - 注意: + - `bcos_sdk_c_transaction`签名的交易结构体,需要调用`bcos_sdk_destroy_transaction_struct`接口释放,以免造成内存泄露 + +- `bcos_sdk_decode_transaction_struct_with_json` + - 原型: + - `struct bcos_sdk_c_transaction* bcos_sdk_decode_transaction_struct_with_json(const char* transaction_json_str)` + - 功能: + - 将编码后的json字符串解码为`bcos_sdk_c_transaction`签名的交易结构体 + - 参数: + - `transaction_json_str`: 编码后的json字符串 + - 返回: + - `bcos_sdk_c_transaction`签名的交易结构体指针 + - 注意: + - `bcos_sdk_c_transaction`签名的交易结构体,需要调用`bcos_sdk_destroy_transaction_struct`接口释放,以免造成内存泄露 + +- `bcos_sdk_destroy_transaction_struct` + - 原型: + - `void bcos_sdk_destroy_transaction_struct(struct bcos_sdk_c_transaction* transaction)` + - 功能: + - 释放`bcos_sdk_c_transaction`签名的交易结构体 + - 参数: + - `transaction_data`: `bcos_sdk_c_transaction`签名的交易结构体指针 + - 返回: + - 无 \ No newline at end of file diff --git a/3.x/zh_CN/docs/develop/sdk/c_sdk/appendix.md b/3.x/zh_CN/docs/sdk/c_sdk/appendix.md similarity index 100% rename from 3.x/zh_CN/docs/develop/sdk/c_sdk/appendix.md rename to 3.x/zh_CN/docs/sdk/c_sdk/appendix.md diff --git a/3.x/zh_CN/docs/develop/sdk/c_sdk/compile.md b/3.x/zh_CN/docs/sdk/c_sdk/compile.md similarity index 100% rename from 3.x/zh_CN/docs/develop/sdk/c_sdk/compile.md rename to 3.x/zh_CN/docs/sdk/c_sdk/compile.md diff --git a/3.x/zh_CN/docs/develop/sdk/c_sdk/config.md b/3.x/zh_CN/docs/sdk/c_sdk/config.md similarity index 100% rename from 3.x/zh_CN/docs/develop/sdk/c_sdk/config.md rename to 3.x/zh_CN/docs/sdk/c_sdk/config.md diff --git a/3.x/zh_CN/docs/develop/sdk/c_sdk/dev.md b/3.x/zh_CN/docs/sdk/c_sdk/dev.md similarity index 100% rename from 3.x/zh_CN/docs/develop/sdk/c_sdk/dev.md rename to 3.x/zh_CN/docs/sdk/c_sdk/dev.md diff --git a/3.x/zh_CN/docs/sdk/c_sdk/dylibs.md b/3.x/zh_CN/docs/sdk/c_sdk/dylibs.md new file mode 100644 index 000000000..35e52dc70 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/c_sdk/dylibs.md @@ -0,0 +1,74 @@ +# 动态库下载 + +标签:``c-sdk`` ``dynamic library`` + +---------- + + `bcos-c-sdk`已经提供了各个平台的动态库, 用户可以直接下载使用: + +## v3.4.0 + +- bcos-c-sdk.dll # windows dll + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.4.0/bcos-c-sdk.dll) +- bcos-c-sdk.lib # windows dll symbol + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.4.0/bcos-c-sdk.lib) +- libbcos-c-sdk-aarch64.so # linux arm64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.4.0/libbcos-c-sdk-aarch64.so) +- libbcos-c-sdk.so # linux x64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.4.0/libbcos-c-sdk.so) +- libbcos-c-sdk-aarch64.dylib # mac m1 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.4.0/libbcos-c-sdk-aarch64.dylib) +- libbcos-c-sdk.dylib # mac x64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.4.0/libbcos-c-sdk.dylib) + + +## v3.3.0 + +- bcos-c-sdk.dll # windows dll + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.3.0/bcos-c-sdk.dll) +- bcos-c-sdk.lib # windows dll symbol + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.3.0/bcos-c-sdk.lib) +- libbcos-c-sdk-aarch64.so # linux arm64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.3.0/libbcos-c-sdk-aarch64.so) +- libbcos-c-sdk.so # linux x64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.3.0/libbcos-c-sdk.so) +- libbcos-c-sdk-aarch64.dylib # mac m1 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.3.0/libbcos-c-sdk-aarch64.dylib) +- libbcos-c-sdk.dylib # mac x64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.3.0/libbcos-c-sdk.dylib) + +## v3.2.0 + +- bcos-c-sdk.dll # windows dll + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.2.0/bcos-c-sdk.dll) +- bcos-c-sdk.lib # windows dll symbol + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.2.0/bcos-c-sdk.lib) +- libbcos-c-sdk-aarch64.so # linux arm64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.2.0/libbcos-c-sdk-aarch64.so) +- libbcos-c-sdk.so # linux x64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.2.0/libbcos-c-sdk.so) +- libbcos-c-sdk-aarch64.dylib # mac m1 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.2.0/libbcos-c-sdk-aarch64.dylib) +- libbcos-c-sdk.dylib # mac x64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.2.0/libbcos-c-sdk.dylib) + +## v3.0.1 + +- bcos-c-sdk.dll # windows dll + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/bcos-c-sdk.dll) + - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/bcos-c-sdk.dll) +- bcos-c-sdk.lib # windows dll symbol + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/bcos-c-sdk.lib) + - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/bcos-c-sdk.lib) +- libbcos-c-sdk-aarch64.so # linux arm64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/libbcos-c-sdk-aarch64.so) + - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/libbcos-c-sdk-aarch64.so) +- libbcos-c-sdk.so # linux x64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/libbcos-c-sdk.so) + - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/libbcos-c-sdk.so) +- libbcos-c-sdk-aarch64.dylib # mac m1 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/libbcos-c-sdk-aarch64.dylib) + - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/libbcos-c-sdk-aarch64.dylib) +- libbcos-c-sdk.dylib # mac x64 + - [github下载](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/download/v3.0.1/libbcos-c-sdk.dylib) + - [CDN下载](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/c-sdk/releases/v3.0.1/libbcos-c-sdk.dylib) diff --git a/3.x/zh_CN/docs/develop/sdk/c_sdk/env.md b/3.x/zh_CN/docs/sdk/c_sdk/env.md similarity index 100% rename from 3.x/zh_CN/docs/develop/sdk/c_sdk/env.md rename to 3.x/zh_CN/docs/sdk/c_sdk/env.md diff --git a/3.x/zh_CN/docs/develop/sdk/c_sdk/faq.md b/3.x/zh_CN/docs/sdk/c_sdk/faq.md similarity index 100% rename from 3.x/zh_CN/docs/develop/sdk/c_sdk/faq.md rename to 3.x/zh_CN/docs/sdk/c_sdk/faq.md diff --git a/3.x/zh_CN/docs/sdk/c_sdk/index.md b/3.x/zh_CN/docs/sdk/c_sdk/index.md new file mode 100644 index 000000000..cb7163263 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/c_sdk/index.md @@ -0,0 +1,21 @@ +# 3. C SDK + +标签:``c-sdk`` ``区块链应用`` + +---------- + +`c-sdk`是FISCO-BCOS 3.0实现的c版本的sdk, 提供c风格的访问区块链的接口,支持rpc、amop和合约事件订阅等基础功能。用户可以用于开发c语言的区块链应用,也可以方便其他开发人员在c sdk基础上进行封装,快速开发其他语言版本的sdk。 + +```eval_rst +.. toctree:: + :maxdepth: 1 + + env.md + compile.md + dylibs.md + config.md + api.md + dev.md + appendix.md + faq.md +``` diff --git a/3.x/zh_CN/docs/develop/sdk/cert_config.md b/3.x/zh_CN/docs/sdk/cert_config.md similarity index 83% rename from 3.x/zh_CN/docs/develop/sdk/cert_config.md rename to 3.x/zh_CN/docs/sdk/cert_config.md index 223fec250..b63f86782 100644 --- a/3.x/zh_CN/docs/develop/sdk/cert_config.md +++ b/3.x/zh_CN/docs/sdk/cert_config.md @@ -1,4 +1,4 @@ -# SDK连接证书配置 +# 10. SDK连接证书配置 标签: ``SDK``、``证书配置`` @@ -8,9 +8,9 @@ ## 单群组区块链(Air版本)部署模式 -[单群组区块链(Air版本)](../../tutorial/air/index.md) 采用all-in-one的封装模式,将所有模块编译成一个二进制(进程),一个进程即为一个区块链节点。 +[单群组区块链(Air版本)](../tutorial/air/index.md) 采用all-in-one的封装模式,将所有模块编译成一个二进制(进程),一个进程即为一个区块链节点。 -Air版本的安装部署请参考:[链接](../../tutorial/air/build_chain.md) 。 +Air版本的安装部署请参考:[链接](../tutorial/air/build_chain.md) 。 `build_chain.sh`生成的节点配置中与SDK连接相关的配置主要为: @@ -76,11 +76,11 @@ cp -r ~/fisco/nodes/127.0.0.1/sdk/* ~/fisco/java-sdk-demo/dist/conf ## 多群组区块链(Pro版本)部署模式 -[多群组区块链(Pro版本)](../../tutorial/pro/index.md) 包括RPC、Gateway接入层的服务和多个区块链节点Node服务组成,其中一个Node服务代表一个群组,存储采用本地RocksDB,所有Node共用接入层服务。 +[多群组区块链(Pro版本)](../tutorial/pro/index.md) 包括RPC、Gateway接入层的服务和多个区块链节点Node服务组成,其中一个Node服务代表一个群组,存储采用本地RocksDB,所有Node共用接入层服务。 -Pro版本的安装部署请参考:[链接](../../tutorial/pro/installation.md) 。 +Pro版本的安装部署请参考:[链接](../tutorial/pro/installation.md) 。 -在完成[部署RPC服务](../../tutorial/pro/installation.html#rpc)之后,在`generated/rpc/chain`下将会生成所有需要用到的配置文件。其中,与SDK SSL连接的配置如下(已忽略与本文介绍无关的文件): +在完成[部署RPC服务](../tutorial/pro/installation.html#rpc)之后,在`generated/rpc/chain`下将会生成所有需要用到的配置文件。其中,与SDK SSL连接的配置如下(已忽略与本文介绍无关的文件): ```shell tree generated/rpc/chain @@ -152,7 +152,7 @@ cp -r ~/fisco/BcosBuilder/generated/rpc/chain0/agencyABcosRpcService/172.25.0.3/ sm_ssl=false ``` -Air版本的RPC配置详情请参考链接:[配置RPC](../../tutorial/air/config.html#rpc) +Air版本的RPC配置详情请参考链接:[配置RPC](../tutorial/air/config.html#rpc) -Pro版本的RPC配置详情请参考链接:[rpc服务](../..//tutorial/pro/config.html#id9) +Pro版本的RPC配置详情请参考链接:[rpc服务](../tutorial/pro/config.html#id9) diff --git a/3.x/zh_CN/docs/sdk/cpp_sdk/index.md b/3.x/zh_CN/docs/sdk/cpp_sdk/index.md new file mode 100644 index 000000000..6096d25a6 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/cpp_sdk/index.md @@ -0,0 +1,11 @@ +# 8. CPP SDK + +标签:``cpp-sdk`` ``区块链应用`` + +---- + +cpp-sdk是FISCO BCOS 实现的c++版SDK,提供RPC、AMOP、合约事件订阅等基础功能的接入接口。用户可以通过使用它开发c++版本的区块链应用。 + +- 本项目支持FISCO BCOS 3.0.0及其以上版本 + +使用CPP-SDK进行应用开发请参见[【github链接】](https://github.com/FISCO-BCOS/bcos-cpp-sdk) diff --git a/3.x/zh_CN/docs/sdk/csharp_sdk/index.md b/3.x/zh_CN/docs/sdk/csharp_sdk/index.md new file mode 100644 index 000000000..6db045b4f --- /dev/null +++ b/3.x/zh_CN/docs/sdk/csharp_sdk/index.md @@ -0,0 +1,31 @@ +# 9. C# SDK + +标签:``FISCOBCOS CSharp SDK`` ``C# sdk`` + +---- + +FISCOBCOS 区块链 C# Sdk,目前是采用Json RPC API 接口和区块链底层(标准版本)进行适配,暂时支持2.x版本,3.x版本正在适配中。 + +安装配置环境,使用c# SDK进行应用开发请参见[【github链接】](https://github.com/FISCO-BCOS/csharp-sdk) + + +作者:林宣名 + +B站教学视频: + +FISCO BCOS C#Sdk之交易解析(上): + +FISCO BCOS C#Sdk之交易解析(中): + +FISCO BCOS C#Sdk之交易解析(下): + +国密版本使用介绍和代码解析: + +有好的建议,请联系我! 我的邮箱:2594771947@qq.com + +```eval_rst +.. toctree:: + :maxdepth: 1 + + quick_start.md +``` diff --git a/3.x/zh_CN/docs/sdk/csharp_sdk/quick_start.md b/3.x/zh_CN/docs/sdk/csharp_sdk/quick_start.md new file mode 100644 index 000000000..9a5e033f5 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/csharp_sdk/quick_start.md @@ -0,0 +1,111 @@ +# C# SDK 介绍 + +标签:``FISCOBCOS CSharp SDK`` ``C# sdk`` + +---- + +## 软件架构 + +软件架构说明 + +FISCOBCOS C# Sdk 采用 net core 3.1,配套开发工具是vs Code 和 Visual Studio 2019。 + +## 功能介绍 + +1. 实现 RPC 同步/异步请求 +2. 实现FISCO BCOS公私钥、账户生成,拓展生成Webase Front导入用户json,可以直接导入Webase中间件。 +3. 实现合约操作封装,如:合约部署、请求参数构建、交易签名、RLP编码转换等。 +4. 实现合约部署、合约交易、合约Call操作、合约交易回执获取等。 +5. 实现合约input、output、event等解析。 +6. 所有操作配置对应的单元测试Demo。可以参考复制。 +7. 实现国密支持,创建国密账户、国密下合约部署、交易等。 + +备注:发送交易并同步返回交易回执测试,有一定几率为空,那是因为底层交易在打包,还没完成共识。目前最新代码新增轮询获取,优化交易回执方法,提高用户体验。 + +## 安装教程 + +备注:也可以使用webase-front 区块链中间件导出合约获得abi和bin文件。 + +1. 下载源码,vs2019 nuget包还原; 或使用 nuget包安装,安装命令如下: Install-Package FISCOBCOS.CSharpSdk -Version 1.0.0.6 +2. vs code 安装solidity 插件,在vs code创建一个文件夹存放原始sol合约。 +3. vs code 按 F5 执行编译命令 “compile current Solidity contract”,会生成合约对应的abi和bin。 +4. 将上面编译得到abi和bin 放到你的项目中,进行相关操作。 + +参考: +![vs Code 编译合约说明](https://github.com/FISCO-BCOS/csharp-sdk/blob/master/Img/how-to-use-console-generator1.gif) + +## 使用说明 + +1. 在 FISCOBCOS.CSharpSdk 类库配置 BaseConfig 文件,配置好对应的底层请求DefaultUrl,如: 。 +2. 使用ContractService 和QueryApiService进行相关业务操作。 +3. ContractService 主要是合约调用等操作封装,详细看对应的单元测试中的ContractTest.cs。 +4. QueryApiService是底层非交易的Json RPC API 封装,可参考单元测试ApiServiceTest.cs。 +5. 如果使用redis 发布订阅,请参考ConsoleTest 项目中的RedisThreadWorkTest,开启多个RedisSubClient 项目进行订阅。 +(该功能可以根据实际情况拓展指定的合约、指定事件等获取解析操作)。 + +备注:通用的Json RPC API 相对简单,没有封装对应的DTO 实体,操作时候可以通过在线json 生成实体进行业务结合。 + +## **国密使用说明** + +1. 在BaseConfig.cs 文件中配置IsSMCrypt = true;采用国密签名及配套通信。 + +2. 在BaseConfig.cs 文件中配置DefaultPrivateKeyPemPath 为默认用户私钥pem 文件【可选】。 + +3. 生成国密用户账户等信息,可导入webase-front,查看单元测试。 + + /// + /// 国密生成一对公私钥,生成的json可以copy 到txt文件,直接导入webase front 等组件中 + /// + [Fact] + public void GMGeneratorAccountJsonTest() + { + var account = AccountUtils.GMGeneratorAccount("adminUser" + new Random().Next(100000, 1000000).ToString()); + var accountString = account.ToJson(); + // Debug.WriteLine(accountString); + _testOutput.WriteLine(accountString); + Assert.True(accountString.ToObject().PublicKey.Length > 0); + } + +4. 进行合约部署、交易等,查看单元测试GMContractTest.cs。 + + ​ + + /// + /// 异步调用合约方法,本测试调用合约set方法,可以解析input和event + /// 遇到交易hash为空,生产环境采用定时服务/队列形式,先获取交易哈希,之后再去获取对应的数据 + /// + /// + [Fact] + public async Task SendTranscationWithReceiptDecodeAsyncTest() + { + var contractService = new ContractService(BaseConfig.DefaultUrl, BaseConfig.DefaultRpcId, BaseConfig.DefaultChainId, BaseConfig.DefaultGroupId, privateKey); + string contractAddress = "0x26cf8fcb783bbcc7b320a46b0d1dfff5fbb27feb";//上面测试部署合约得到合约地址 + var inputsParameters = new[] { BuildParams.CreateParam("string", "n") }; + var paramsValue = new object[] { "123" }; + string functionName = "set";//调用合约方法 + ReceiptResultDto receiptResultDto = await contractService.SendTranscationWithReceiptAsync(abi, contractAddress, functionName, inputsParameters, paramsValue); + + Assert.NotEmpty(receiptResultDto.Output); + Assert.NotEmpty(receiptResultDto.Input); + Assert.NotEmpty(receiptResultDto.Logs); + var solidityAbi = new SolidityABI(abi); + var inputList = solidityAbi.InputDecode(functionName, receiptResultDto.Input); + Assert.True(inputList[0].Parameter.Name == "n" && inputList[0].Result.ToString() == "123"); + + string eventName = "SetEvent"; + var eventList = solidityAbi.EventDecode(eventName, receiptResultDto.Logs); + var eventpramas1 = eventList[0].Event.Find(x => x.Parameter.Name == "paramsStr"); + var eventpramas2 = eventList[0].Event.Find(x => x.Parameter.Name == "operationTimeStamp"); + Assert.True(eventpramas1.Result.ToString() == "123"); + Assert.NotNull(eventpramas2.Result); + } + + 5. 关于国密账户生成、签名、加密、发送交易等细节查看相关源码,以及配套B站视频。 + +## 新增特性 + +1. 新增助记词、钱包模块 +2. 新增BIP 32、新增EIP 55 等特性 +3. 优化获取交易回执 +4. 新增线程池拉取指定区块交易,新增Redis订阅发布 +4. 国密支持 diff --git a/3.x/zh_CN/docs/sdk/go_sdk/amopExamples.md b/3.x/zh_CN/docs/sdk/go_sdk/amopExamples.md new file mode 100644 index 000000000..ab25c43c2 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/go_sdk/amopExamples.md @@ -0,0 +1,72 @@ +# AMOP 使用案例 + +标签:``go-sdk`` ``AMOP`` + +---- + +AMOP(Advanced Messages Onchain Protocol)即链上信使协议,旨在为联盟链提供一个安全高效的消息信道,联盟链中的各个机构,只要部署了区块链节点,无论是共识节点还是观察节点,均可使用AMOP进行通讯,AMOP有如下优势: + +- 实时:AMOP消息不依赖区块链交易和共识,消息在节点间实时传输,延时在毫秒级。 +- 可靠:AMOP消息传输时,自动寻找区块链网络中所有可行的链路进行通讯,只要收发双方至少有一个链路可用,消息就保证可达。 +- 高效:AMOP消息结构简洁、处理逻辑高效,仅需少量cpu占用,能充分利用网络带宽。 +- 易用:使用AMOP时,无需在SDK做任何额外配置。 + +进一步了解 AMOP,请参考:[链上信使协议](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/amop_protocol.html)。案例源码,请参考:[go-sdk](https://github.com/FISCO-BCOS/go-sdk) + +## 单播案例 + +**单播** 指的是节点从监听相同 Topic 的多个订阅者中随机抽取一个订阅者转发消息,流程详细可参考 [单播时序图](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/p2p/p2p.html#id11) + +- 启动 AMOP 消息订阅者: + + ```shell + # go run examples/amop/sub/subscriber.go [endpoint] [topic] + > go run examples/amop/sub/subscriber.go 127.0.0.1:20201 hello + + Subscriber success + 2020/08/11 21:21:50 received: hello, FISCO BCOS, I am unique broadcast publisher! 0 + 2020/08/11 21:21:52 received: hello, FISCO BCOS, I am unique broadcast publisher! 1 + 2020/08/11 21:21:54 received: hello, FISCO BCOS, I am unique broadcast publisher! 2 + 2020/08/11 21:21:56 received: hello, FISCO BCOS, I am unique broadcast publisher! 3 + ``` + +- 运行 AMOP 消息发布者: + + ```shell + # go run examples/amop/unicast_pub/publisher.go [endpoint] [topic] + > go run examples/amop/unicast_pub/publisher.go 127.0.0.1:20200 hello + + 2020/08/11 21:21:50 publish message: hello, FISCO BCOS, I am unique broadcast publisher! 0 + 2020/08/11 21:21:52 publish message: hello, FISCO BCOS, I am unique broadcast publisher! 1 + 2020/08/11 21:21:54 publish message: hello, FISCO BCOS, I am unique broadcast publisher! 2 + 2020/08/11 21:21:56 publish message: hello, FISCO BCOS, I am unique broadcast publisher! 3 + ``` + +## 多播案例 + +**多播** 指的是节点向监听相同 Topic 的所有订阅者转发消息。只要网络正常,即使没有监听 Topic 的订阅者,消息发布者也会收到节点消息推送成功的响应包,流程详细可参考 [多播时序图](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/p2p/p2p.html#id12) + +- 启动 AMOP 消息订阅者: + + ```shell + # go run examples/amop/sub/subscriber.go [endpoint] [topic] + > go run examples/amop/sub/subscriber.go 127.0.0.1:20201 hello + + Subscriber success + 2020/08/11 21:23:54 received: hello, FISCO BCOS, I am multi broadcast publisher! 0 + 2020/08/11 21:23:56 received: hello, FISCO BCOS, I am multi broadcast publisher! 1 + 2020/08/11 21:23:58 received: hello, FISCO BCOS, I am multi broadcast publisher! 2 + 2020/08/11 21:24:00 received: hello, FISCO BCOS, I am multi broadcast publisher! 3 + ``` + +- 运行 AMOP 消息发布者: + + ```shell + # go run examples/amop/multicast_pub/publisher.go [endpoint] [topic] + > go run examples/amop/multicast_pub/publisher.go 127.0.0.1:20200 hello + + 2020/08/11 21:23:54 publish message: hello, FISCO BCOS, I am multi broadcast publisher! 0 + 2020/08/11 21:23:56 publish message: hello, FISCO BCOS, I am multi broadcast publisher! 1 + 2020/08/11 21:23:58 publish message: hello, FISCO BCOS, I am multi broadcast publisher! 2 + 2020/08/11 21:24:00 publish message: hello, FISCO BCOS, I am multi broadcast publisher! 3 + ``` diff --git a/3.x/zh_CN/docs/sdk/go_sdk/api.md b/3.x/zh_CN/docs/sdk/go_sdk/api.md new file mode 100644 index 000000000..87f5d91a9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/go_sdk/api.md @@ -0,0 +1,46 @@ +# Go API + +标签:``go-sdk`` ``AMOP`` + +---- + +Go SDK为区块链应用开发者提供了Go API接口,以服务的形式供外部调用。 + +- **client**:提供访问FISCO BCOS节点[JSON-RPC](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/api.html)接口支持、提供部署及调用合约的支持; + +## Client + +**位置**:go-sdk/client/go_client.go + +| 接口名 | 描述 | 参数 | +| ----------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------ | +| AsyncSendTransaction | 异步发送一个经过签名的交易,该交易随后会被链上节点执行并共识 |已签名交易以及回调 | +| Call | 调用只读合约 | 合约地址
调用接口*
参数列表 | +| GetBlockNumber | 获取最新块高 | 无 | +| GetBlockByHash | 根据区块哈希获取区块信息 | 区块哈希 & bool | +| GetBlockByNumber | 根据区块高度获取区块信息 | 区块高度 & bool | +| GetBlockHashByNumber | 根据区块高度获取区块哈希 | 区块高度 | +| GetCode | 根据合约地址查询合约数据 | 合约地址 | +| GetConsensusStatus | 获取区块链节点共识状态 | 无 | +| GetContractAddress | 根据部署合约时产生的交易地址获取合约地址 | 交易哈希 | +| GetGroupPeers | 获取指定群组的共识节点和观察节点列表 | 无 | +| GetGroupList | 获取节点所属群组的群组ID列表 | 无 | +| GetNodeIDList | 获取节点及其连接节点的列表 | 无 | +| GetObserverList | 获取观察者节点列表 | 无 | +| GetPbftView | 获取PBFT视图 | 无 | +| GetPeers | 获取区块链节点的连接信息 | 无 | +| GetSealerList | 获取共识节点列表 | 无 | +| GetSystemConfigByKey | 根据关键字获取区块链系统配置 | 系统配置关键字,目前支持:
\- tx_count_limit
\- tx_gas_limit
\- rpbft_epoch_sealer_num
\- rpbft_epoch_block_num | +| GetSyncStatus | 获取区块链节点同步状态 | 无 | +| GetTransactionByHash | 根据交易哈希获取交易信息 | 交易哈希 | +| GetTransactionReceipt | 根据交易哈希获取交易回执 | 交易哈希 | +| GetPendingTxSize | 获取交易池内未上链的交易数目 | 无 | +| GetTotalTransactionCount | 获取指定群组的上链交易数目 | 无 | +| SendRawTransaction | 发送一个经过签名的交易,该交易随后会被链上节点执行并共识 |已签名交易 | +| SubscribeEventLogs | 监听合约事件eventlog | event参数与收到后处理的回调函数 | +| SubscribeTopic | 监听链上信使协议AMOP的topic |topic与收到后处理的回调函数 | +| SendAMOPMsg | 发送链上信使协议AMOP的消息,随机发送到某个监听此topic的SDK |topic与消息 | +| BroadcastAMOPMsg | 广播发送链上信使协议AMOP的消息,发送到所有监听此topic的SDK |topic与消息 | +| UnsubscribeTopic | 取消监听链上信使协议AMOP的topic |topic | +| SubscribeBlockNumberNotify | 取消块高通知 |收到块高通知的回调函数 | +| UnsubscribeBlockNumberNotify | 取消监听块高通知 | | diff --git a/3.x/zh_CN/docs/sdk/go_sdk/console.md b/3.x/zh_CN/docs/sdk/go_sdk/console.md new file mode 100644 index 000000000..14550e5a9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/go_sdk/console.md @@ -0,0 +1,648 @@ +# 控制台 + +标签:``go-sdk`` ``Go SDK控制台`` + +---- + + [Go SDK](https://github.com/FISCO-BCOS/go-sdk) 通过 `console.go` 实现了一个简单的控制台,支持区块链和节点信息查询。 + +## 使用 + +- 拉取代码并编译 + +```shell +# 拉取代码 +git clone https://github.com/FISCO-BCOS/go-sdk.git + +# 若因为网络问题导致长时间无法执行上面的命令,请尝试以下命令: +git clone https://gitee.com/FISCO-BCOS/go-sdk.git + +# 切换目录 +cd go-sdk +# 编译 cmd/console.go +go build cmd/console.go +``` + +- 请拷贝对应的 ca.crt、sdk.crt 和 sdk.key 证书至console可执行文件工作目录 + +## getBlockByHash + +根据区块哈希获取区块信息: + +```shell +./console getBlockByHash [blockHash] [true/false] +``` + +参数包括: + +- blockHash:区块 hash 值; +- true/false:true 会返回区块中所有交易的详细内容,false 只会返回区块中所有交易的 hash 值,默认为 true。 + +```shell +> ./console getBlockByHash 0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848 true + +Block: +{ + "extraData": [], + "gasLimit": "0x0", + "gasUsed": "0x0", + "hash": "0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "number": "0x3", + "parentHash": "0x57016509418eb81c0353b1252a364383fcfc5c71035c8a01d24e785ac6e2ce4a", + "receiptsRoot": "0x4e430ca6474d7013a819a7c602497b7bfdfa14a1197a1edc35444b756cf7e6fc", + "sealer": "0x1", + "sealerList": [ + "42ae2ae3950a2933b6f576dc946b90b242b7f9a2a8d45aae53c1a1664cd582bd759fa69e4b52f7a453dce702878b9ef11fd34fce1bd15c9bdcabcbbee43e1302", + "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7", + "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0" + ], + "stateRoot": "0x2d23b1248fe53a1769db06af5c0e99261678643f405f058cfa89193592d13fa7", + "timestamp": "0x172fe19b855", + "transactions": [ + { + "blockHash": "0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "blockNumber": "0x3", + "from": "0x4ca29e9e8cb79c863c04f83827ab540315f25e67", + "gas": "0x11e1a300", + "gasPrice": "0x11e1a300", + "hash": "0x5518df7c2063efeb6481c35c4c58f378fac5f476c023c2019b9b01d221478434", + "input": "0x2800efc0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000803432616532616533393530613239333362366635373664633934366239306232343262376639613261386434356161653533633161313636346364353832626437353966613639653462353266376134353364636537303238373862396566313166643334666365316264313563396264636162636262656534336531333032", + "nonce": "0x359fbc4677e4f4ca87a96a31372b1194f03ba200db94a18ad0b30f2e858ac32", + "to": "0x0000000000000000000000000000000000001003", + "transactionIndex": "0x0", + "value": "0x0" + } + ], + "transactionsRoot": "0xcf057dc481d7a97700e93a1ea65f331c3cfee2fee80e3bb80c30748e4988fe9d" +} + +> ./console getBlockByHash 0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848 false + +Block: +{ + "extraData": [], + "gasLimit": "0x0", + "gasUsed": "0x0", + "hash": "0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "number": "0x3", + "parentHash": "0x57016509418eb81c0353b1252a364383fcfc5c71035c8a01d24e785ac6e2ce4a", + "receiptsRoot": "0x4e430ca6474d7013a819a7c602497b7bfdfa14a1197a1edc35444b756cf7e6fc", + "sealer": "0x1", + "sealerList": [ + "42ae2ae3950a2933b6f576dc946b90b242b7f9a2a8d45aae53c1a1664cd582bd759fa69e4b52f7a453dce702878b9ef11fd34fce1bd15c9bdcabcbbee43e1302", + "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7", + "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0" + ], + "stateRoot": "0x2d23b1248fe53a1769db06af5c0e99261678643f405f058cfa89193592d13fa7", + "timestamp": "0x172fe19b855", + "transactions": [ + "0x5518df7c2063efeb6481c35c4c58f378fac5f476c023c2019b9b01d221478434" + ], + "transactionsRoot": "0xcf057dc481d7a97700e93a1ea65f331c3cfee2fee80e3bb80c30748e4988fe9d" +} +``` + +## getBlockByNumber + +根据区块高度获取区块信息: + +```shell +./console getBlockByNumber [blockNumber] [true/false] +``` + +参数包括: + +- blockNumber:区块高度; +- true/false:true 会返回区块中所有交易的详细内容,false 只会返回区块中所有交易的 hash 值,默认为 true。 + +```shell +> ./console getBlockByNumber 3 true + +Block: +{ + "dbHash": "0x2d23b1248fe53a1769db06af5c0e99261678643f405f058cfa89193592d13fa7", + "extraData": [], + "gasLimit": "0x0", + "gasUsed": "0x0", + "hash": "0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "number": "0x3", + "parentHash": "0x57016509418eb81c0353b1252a364383fcfc5c71035c8a01d24e785ac6e2ce4a", + "receiptsRoot": "0x4e430ca6474d7013a819a7c602497b7bfdfa14a1197a1edc35444b756cf7e6fc", + "sealer": "0x1", + "sealerList": [ + "42ae2ae3950a2933b6f576dc946b90b242b7f9a2a8d45aae53c1a1664cd582bd759fa69e4b52f7a453dce702878b9ef11fd34fce1bd15c9bdcabcbbee43e1302", + "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7", + "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0" + ], + "stateRoot": "0x2d23b1248fe53a1769db06af5c0e99261678643f405f058cfa89193592d13fa7", + "timestamp": "0x172fe19b855", + "transactions": [ + { + "blockHash": "0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "blockNumber": "0x3", + "from": "0x4ca29e9e8cb79c863c04f83827ab540315f25e67", + "gas": "0x11e1a300", + "gasPrice": "0x11e1a300", + "hash": "0x5518df7c2063efeb6481c35c4c58f378fac5f476c023c2019b9b01d221478434", + "input": "0x2800efc0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000803432616532616533393530613239333362366635373664633934366239306232343262376639613261386434356161653533633161313636346364353832626437353966613639653462353266376134353364636537303238373862396566313166643334666365316264313563396264636162636262656534336531333032", + "nonce": "0x359fbc4677e4f4ca87a96a31372b1194f03ba200db94a18ad0b30f2e858ac32", + "to": "0x0000000000000000000000000000000000001003", + "transactionIndex": "0x0", + "value": "0x0" + } + ], + "transactionsRoot": "0xcf057dc481d7a97700e93a1ea65f331c3cfee2fee80e3bb80c30748e4988fe9d" +} + +> ./console getBlockByNumber 3 false + +Block: +{ + "dbHash": "0x2d23b1248fe53a1769db06af5c0e99261678643f405f058cfa89193592d13fa7", + "extraData": [], + "gasLimit": "0x0", + "gasUsed": "0x0", + "hash": "0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "number": "0x3", + "parentHash": "0x57016509418eb81c0353b1252a364383fcfc5c71035c8a01d24e785ac6e2ce4a", + "receiptsRoot": "0x4e430ca6474d7013a819a7c602497b7bfdfa14a1197a1edc35444b756cf7e6fc", + "sealer": "0x1", + "sealerList": [ + "42ae2ae3950a2933b6f576dc946b90b242b7f9a2a8d45aae53c1a1664cd582bd759fa69e4b52f7a453dce702878b9ef11fd34fce1bd15c9bdcabcbbee43e1302", + "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7", + "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0" + ], + "stateRoot": "0x2d23b1248fe53a1769db06af5c0e99261678643f405f058cfa89193592d13fa7", + "timestamp": "0x172fe19b855", + "transactions": [ + "0x5518df7c2063efeb6481c35c4c58f378fac5f476c023c2019b9b01d221478434" + ], + "transactionsRoot": "0xcf057dc481d7a97700e93a1ea65f331c3cfee2fee80e3bb80c30748e4988fe9d" +} +``` + +## getBlockHashByNumber + +根据区块高度获取区块哈希: + +```shell +./console getBlockHashByNumber [blockNumber] +``` + +参数包括: + +- blockNumber:区块高度。 + +```shell +> ./console getBlockHashByNumber 3 + +Block Hash: +"0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848" +``` + +## getBlockNumber + +获取最新块高: + +```shell +> ./console getBlockNumber + +blocknumber: + hex: "0x3" +decimal: 3 +``` + +## getCode + +根据合约地址查询合约数据: + +```shell +./console getCode [contract address] +``` + +参数包括: + +- contract address:合约地址。 + +```shell +> ./console getCode 0x65474dbd4f08170bc2dc30f9ae32f8e2206b15a6 + +Contract Code: +"0x60806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634ed3885e146100515780636d4ce63c146100ba575b600080fd5b34801561005d57600080fd5b506100b8600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061014a565b005b3480156100c657600080fd5b506100cf610164565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010f5780820151818401526020810190506100f4565b50505050905090810190601f16801561013c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b8060009080519060200190610160929190610206565b5050565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101fc5780601f106101d1576101008083540402835291602001916101fc565b820191906000526020600020905b8154815290600101906020018083116101df57829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024757805160ff1916838001178555610275565b82800160010185558215610275579182015b82811115610274578251825591602001919060010190610259565b5b5090506102829190610286565b5090565b6102a891905b808211156102a457600081600090555060010161028c565b5090565b905600a165627a7a72305820d0c58adfbd1215902f16e710a4e52b14e5c9ad7f0f3363c86d2b3156894bd0610029" +``` + +## getConsensusStatus + +获取区块链节点共识状态 + +```shell +> ./console getConsensusStatus + +Consensus Status: +[ + { + "accountType": 1, + "allowFutureBlocks": true, + "cfgErr": false, + "connectedNodes": 3, + "consensusedBlockNumber": 4, + "currentView": 80, + "groupId": 1, + "highestblockHash": "0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "highestblockNumber": 3, + "leaderFailed": false, + "max_faulty_leader": 0, + "nodeId": "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0", + "nodeNum": 3, + "node_index": 2, + "omitEmptyBlock": true, + "protocolId": 65544, + "sealer.0": "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "sealer.1": "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7", + "sealer.2": "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0", + "toView": 80 + }, + [ + { + "nodeId": "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "view": 78 + }, + { + "nodeId": "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7", + "view": 79 + }, + { + "nodeId": "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0", + "view": 80 + } + ] +] +``` + +## getGroupID + +获取配置文件中指定的连接节点群组ID: + +```shell +> ./console getGroupID + +Group ID: +1 +``` + +## getGroupList + +获取节点所属群组的群组ID列表: + +```shell +> ./console getGroupList + +Group ID List: +[ + 1 +] +``` + +## getGroupPeers + +获取指定群组的共识节点和观察节点列表: + +```shell +> ./console getGroupPeers + +Peers: +[ + "42ae2ae3950a2933b6f576dc946b90b242b7f9a2a8d45aae53c1a1664cd582bd759fa69e4b52f7a453dce702878b9ef11fd34fce1bd15c9bdcabcbbee43e1302", + "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7", + "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0" +] +``` + +## getNodeIDList + +获取节点及其连接节点的列表: + +```shell +> ./console getNodeIDList + +Node ID list: +[ + "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0", + "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "42ae2ae3950a2933b6f576dc946b90b242b7f9a2a8d45aae53c1a1664cd582bd759fa69e4b52f7a453dce702878b9ef11fd34fce1bd15c9bdcabcbbee43e1302", + "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7" +] +``` + +## getObserverList + + 获取观察者节点列表: + +```shell +> ./console getObserverList + +Observer List: +[ + "42ae2ae3950a2933b6f576dc946b90b242b7f9a2a8d45aae53c1a1664cd582bd759fa69e4b52f7a453dce702878b9ef11fd34fce1bd15c9bdcabcbbee43e1302" +] +``` + +## getPbftView + +获取PBFT视图: + +```shell +> ./console getPbftView + +PBFT view: +"0x30" +``` + +## getPeers + +获取区块链节点的连接信息: + +```shell +> ./console getPeers + +Peers: +[ + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:51808", + "Node": "node3", + "NodeID": "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "Topic": [] + }, + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:30302", + "Node": "node2", + "NodeID": "42ae2ae3950a2933b6f576dc946b90b242b7f9a2a8d45aae53c1a1664cd582bd759fa69e4b52f7a453dce702878b9ef11fd34fce1bd15c9bdcabcbbee43e1302", + "Topic": [] + }, + { + "Agency": "agency", + "IPAndPort": "127.0.0.1:30301", + "Node": "node1", + "NodeID": "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7", + "Topic": [] + } +] +``` + +## getPendingTxSize + +获取交易池内未上链的交易数目: + +```shell +> ./console getPendingTxSize + +Pending Transactions Count: + hex: "0x0" +decimal: 0 +``` + +## getSealerList + +获取共识节点列表: + +```shell +> ./console getSealerList + +Sealer List: +[ + "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14", + "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7", + "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0" +] +``` + +## getSyncStatus + +获取区块链节点同步状态: + +```shell +> ./console getSyncStatus + +Synchronization Status: +{ + "blockNumber": 3, + "genesisHash": "65e9c13da61b1f47564ccc6498260d739ce3dfd3366accc539a64412c1ef8e88", + "isSyncing": false, + "knownHighestNumber": 3, + "knownLatestHash": "ce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "latestHash": "ce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "nodeId": "955ab783c6adc7a5f817773a5fbe32ecd9310f9392406eb1f9fa3d2b21539577a70c933158c1bd3a0bf183d5498bf57202b88401e1cb20e8972aab43ba3354f0", + "peers": [ + { + "blockNumber": 3, + "genesisHash": "65e9c13da61b1f47564ccc6498260d739ce3dfd3366accc539a64412c1ef8e88", + "latestHash": "ce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "nodeId": "42ae2ae3950a2933b6f576dc946b90b242b7f9a2a8d45aae53c1a1664cd582bd759fa69e4b52f7a453dce702878b9ef11fd34fce1bd15c9bdcabcbbee43e1302" + }, + { + "blockNumber": 3, + "genesisHash": "65e9c13da61b1f47564ccc6498260d739ce3dfd3366accc539a64412c1ef8e88", + "latestHash": "ce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "nodeId": "8b5e90815966004e807803aba5f003bc271d0b0aa82805c85764b21187bd504f79ec46eaf1e60752956af174a927d7b16c072c0bca1601968b29342521639c14" + }, + { + "blockNumber": 3, + "genesisHash": "65e9c13da61b1f47564ccc6498260d739ce3dfd3366accc539a64412c1ef8e88", + "latestHash": "ce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "nodeId": "95381c1d22d10ad73171f0d34ec1f2e5809f47ee76264aeed4bb0daaf594bfb5da89f6a65ff4a056952f66a6a99fc927320d002191cecc7a48905edd61ad84b7" + } + ], + "protocolId": 65545, + "txPoolSize": "0" +} +``` + +## getSystemConfigByKey + +根据关键字获取区块链系统配置: + +```shell +./console getSystemConfigByKey [tx_count_limit/tx_gas_limit] +``` + +参数包括: + +- tx_count_limit/tx_gas_limit:单个区块中交易数量限制/单笔交易中可消耗的 gas 限制 + +```shell +> ./console getSystemConfigByKey tx_count_limit +Result: +"1000" + +> ./console getSystemConfigByKey tx_gas_limit +Result: +"300000000" +``` + +## getTotalTransactionCount + +获取指定群组的上链交易数目: + +```shell +> ./console getTotalTransactionCount + +Latest Statistics on Transaction and Block Height: +{ + "blockNumber": "0x5", + "failedTxSum": "0x0", + "txSum": "0x5" +} +``` + +## getTransactionByHash + +根据交易哈希获取交易信息: + +```shell +./console getTransactionByHash [transactionHash] +``` + +参数包括: + +- transactionHash:交易 hash 值。 + +```shell +> ./console getTransactionByHash 0x5518df7c2063efeb6481c35c4c58f378fac5f476c023c2019b9b01d221478434 + +Transaction: +{ + "blockHash": "0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "blockNumber": "0x3", + "from": "0x4ca29e9e8cb79c863c04f83827ab540315f25e67", + "gas": "0x11e1a300", + "gasPrice": "0x11e1a300", + "hash": "0x5518df7c2063efeb6481c35c4c58f378fac5f476c023c2019b9b01d221478434", + "input": "0x2800efc0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000803432616532616533393530613239333362366635373664633934366239306232343262376639613261386434356161653533633161313636346364353832626437353966613639653462353266376134353364636537303238373862396566313166643334666365316264313563396264636162636262656534336531333032", + "nonce": "0x359fbc4677e4f4ca87a96a31372b1194f03ba200db94a18ad0b30f2e858ac32", + "to": "0x0000000000000000000000000000000000001003", + "transactionIndex": "0x0", + "value": "0x0" +} +``` + +## getTransactionReceipt + +根据交易哈希获取交易回执: + +```shell +./console getTransactionReceipt [transactionHash] +``` + +参数包括: + +- transactionHash:交易 hash 值。 + +```shell +> ./console getTransactionReceipt 0x5518df7c2063efeb6481c35c4c58f378fac5f476c023c2019b9b01d221478434 + +Transaction Receipt: +{ + "transactionHash": "0x5518df7c2063efeb6481c35c4c58f378fac5f476c023c2019b9b01d221478434", + "transactionIndex": "0x0", + "blockHash": "0xce28a18b54ee72450c403968f705253a59c87a22801a88cc642ae800bb8b4848", + "blockNumber": "0x3", + "gasUsed": "0x765b", + "contractAddress": "0x0000000000000000000000000000000000000000", + "root": "0x2d23b1248fe53a1769db06af5c0e99261678643f405f058cfa89193592d13fa7", + "status": "0x0", + "from": "0x4ca29e9e8cb79c863c04f83827ab540315f25e67", + "to": "0x0000000000000000000000000000000000001003", + "input": "0x2800efc0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000803432616532616533393530613239333362366635373664633934366239306232343262376639613261386434356161653533633161313636346364353832626437353966613639653462353266376134353364636537303238373862396566313166643334666365316264313563396264636162636262656534336531333032", + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +} +``` + +## setSystemConfigByKey + +根据关键字设置区块链系统配置: + +```shell +./console setSystemConfigByKey [tx_count_limit/tx_gas_limit/rpbft_epoch_sealer_num/rpbft_epoch_block_num] +``` + +参数包括: + +- tx_count_limit/tx_gas_limit/rpbft_epoch_sealer_num/rpbft_epoch_block_num:单个区块中交易数量限制/单笔交易中可消耗的 gas 限制 + +```shell +> ./console setSystemConfigByKey tx_count_limit 999 +success + +> ./console setSystemConfigByKey tx_gas_limit 30000000 +success + +> ./console setSystemConfigByKey rpbft_epoch_sealer_num 20 +success + +> ./console setSystemConfigByKey rpbft_epoch_block_num 30 +success +``` + +## addObserver + +根据节点NodeID设置对应节点为观察者节点 + +```shell +./console addObserver [Node ID] +``` + +参数包括: + +- Node ID:节点 ID。 + +```shell +> ./console addObserver 58108297d9b545dc6e9a7ee4fea539c7886ced0c4cfeb33acd16ad23158247901d7d45dfbacc2fe97e38afaf163a4608f2fc2338d3ca37245d44e983adbde202 +success +``` + +## addSealer + +根据节点NodeID设置对应节点为共识节点 + +```shell +./console addSealer [Node ID] +``` + +参数包括: + +- Node ID:节点 ID。 + +```shell +> ./console addSealer 58108297d9b545dc6e9a7ee4fea539c7886ced0c4cfeb33acd16ad23158247901d7d45dfbacc2fe97e38afaf163a4608f2fc2338d3ca37245d44e983adbde202 +success +``` + +## removeNode + + 根据节点NodeID设置对应节点为游离节点 + +```shell +./console removeNode [Node ID] +``` + +参数包括: + +- Node ID:节点 ID。 + +```shell +> ./console removeNode 58108297d9b545dc6e9a7ee4fea539c7886ced0c4cfeb33acd16ad23158247901d7d45dfbacc2fe97e38afaf163a4608f2fc2338d3ca37245d44e983adbde202 +success +``` diff --git a/3.x/zh_CN/docs/sdk/go_sdk/contractExamples.md b/3.x/zh_CN/docs/sdk/go_sdk/contractExamples.md new file mode 100644 index 000000000..2e6f6320a --- /dev/null +++ b/3.x/zh_CN/docs/sdk/go_sdk/contractExamples.md @@ -0,0 +1,359 @@ +# 合约开发样例 + +标签:``go-sdk`` ``合约开发`` + +---- + +## 非国密样例 + +本开发样例使用标准单群组四节点区块链网络结构,搭建请参考:[安装](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/quick_start/air_installation.html)。 + +在利用SDK进行项目开发时,对智能合约进行操作需要利用go-sdk的`abigen`工具将Solidity智能合约转换为`Go`文件代码,会自动生成合约中事件监听的接口。整体上主要包含六个流程: + +- 准备需要编译的智能合约 +- 配置好相应版本的solc编译器 +- 构建go-sdk的合约编译工具abigen +- 编译生成go文件 +- 准备建立ssl连接需要的证书 +- 使用生成的go文件进行合约部署、调用 + +### HelloWorld样例 + +#### 准备HelloWorld.sol合约文件 + +```bash +# 该指令在go-sdk目录中执行 +mkdir helloworld && cd helloworld +``` + +在 go-sdk 主目录中新建 helloworld 文件夹,在该文件夹中创建 HelloWorld.sol 合约。该合约提供两个接口,分别是get()和set(),用于获取/设置合约变量name。合约内容如下 + +```solidity +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.6.10 <0.8.20; + +contract HelloWorld { + string value; + event setValue(string v, address indexed from, address indexed to, int256 value); + int public version; + + constructor(string memory initValue) { + value = initValue; + version = 0; + } + + function get() public view returns (string memory) { + return value; + } + + function set(string calldata v) public returns (string memory) { + string memory old = value; + value = v; + version = version + 1; + emit setValue(v, tx.origin, msg.sender, version); + return old; + } +} + +``` + +#### 安装solc编译器 + +该编译器用于将 sol 合约文件编译成 abi 和 bin 文件,目前FISCO BCOS提供的`solc`编译器有0.8.11/0.6.10,每个版本有国密和非国密两种。 + +```bash +# 该指令在helloworld文件夹中执行 +bash ../tools/download_solc.sh -v 0.8.11 +``` + +#### 构建go-sdk的代码生成工具abigen + +该工具用于将 abi 和 bin 文件转换为 go 文件 + +```bash +# 该指令在helloworld文件夹中执行,编译生成abigen工具 +go build ../cmd/abigen +``` + +#### 编译生成go文件 + +先利用solc编译合约文件HelloWorld.sol,生成abi和bin文件 + +```bash +# 该指令在helloworld文件夹中执行 +./solc-0.8.11 --bin --abi -o ./ ./HelloWorld.sol +``` + +helloworld目录下会生成HelloWorld.bin和HelloWorld.abi。此时利用abigen工具将HelloWorld.bin和HelloWorld.abi转换成HelloWorld.go: + +```bash +# 该指令在helloworld文件夹中执行 +./abigen --bin ./HelloWorld.bin --abi ./HelloWorld.abi --pkg helloworld --type HelloWorld --out ./HelloWorld.go +``` + +最后helloworld文件夹下面存在以下6个文件: + +```bash +HelloWorld.abi、HelloWorld.bin、HelloWorld.go、HelloWorld.sol、solc-0.8.11、abigen +``` + +#### 准备建立ssl连接需要的证书 + +使用build_chain.sh脚本搭建区块链时会在./nodes/127.0.0.1/sdk文件夹中生成sdk证书、私钥以及ca证书,需要将这三个文件拷贝到参数指定的位置,例如下文中和可执行文件同一目录下。 + +#### 部署合约 + +在helloworld文件夹中创建cmd文件夹,在cmd文件夹中创建main.go文件,main.go的内容如下,在该文件中调用HelloWorld.go部署智能合约 + +```go +package main + +import ( + "context" + "encoding/hex" + "fmt" + "log" + + "github.com/FISCO-BCOS/go-sdk/client" + "github.com/FISCO-BCOS/go-sdk/core/types" + "github.com/FISCO-BCOS/go-sdk/hello" +) + +func main() { + privateKey, _ := hex.DecodeString("145e247e170ba3afd6ae97e88f00dbc976c2345d511b0f6713355d19d8b80b58") + config := &client.Config{IsSMCrypto: false, GroupID: "group0", + PrivateKey: privateKey, Host: "127.0.0.1", Port: 20200, TLSCaFile: "./ca.crt", TLSKeyFile: "./sdk.key", TLSCertFile: "./sdk.crt"} + client, err := client.DialContext(context.Background(), config) + if err != nil { + log.Fatal(err) + } + input := "HelloWorld deployment 1.0" + fmt.Println("=================DeployHelloWorld===============") + address, receipt, instance, err := helloworld.DeployHelloWorld(client.GetTransactOpts(), client, input) + if err != nil { + log.Fatal(err) + } + fmt.Println("contract address: ", address.Hex()) // the address should be saved, will use in next example + fmt.Println("transaction hash: ", receipt.TransactionHash) + + // load the contract + // contractAddress := common.HexToAddress("contract address in hex String") + // instance, err := helloworld.NewStore(contractAddress, client) + // if err != nil { + // log.Fatal(err) + // } + + fmt.Println("================================") + helloSession := &helloworld.HelloWorldSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()} + + version, err := helloSession.Version() + if err != nil { + log.Fatal(err) + } + + fmt.Println("version :", version) // "HelloWorld deployment 1.0" + + ret, err := helloSession.Get() //调用合约Get方法 + if err != nil { + fmt.Printf("helloworld.Get() failed: %v", err) + return + } + done := make(chan bool) + // 监听合约set事件 + _, err = helloSession.WatchAllSetValue(nil, func(ret int, logs []types.Log) { + fmt.Printf("WatchAllSetValue receive statud: %d, logs: %v\n", ret, logs) + setValue, err := helloSession.ParseSetValue(logs[0]) + if err != nil { + fmt.Printf("helloworld.WatchAllSetValue() failed: %v", err) + panic("WatchAllSetValue helloworld.WatchAllSetValue() failed") + } + fmt.Printf("receive setValue: %+v\n", *setValue) + done <- true + }) + if err != nil { + fmt.Printf("helloworld.WatchAllSetValue() failed: %v", err) + return + } + fmt.Printf("Get: %s\n", ret) + fmt.Println("================================") + + oldValue, _, receipt, err := helloSession.Set("hello fisco") + fmt.Println("old value is: ", oldValue) + if err != nil { + log.Fatal(err) + } + + fmt.Printf("transaction hash of receipt: %s\n", receipt.GetTransactionHash()) + + ret, err = helloSession.Get() + if err != nil { + fmt.Printf("helloworld.Get() failed: %v", err) + return + } + fmt.Printf("Get: %s\n", ret) + <-done +} + +``` + +构建并执行。 + +```bash +# 该指令在go-sdk目录中执行 +go run helloworld/cmd/main.go +``` + +```eval_rst +.. note:: + + - 合约地址需要手动保存,调用合约接口时使用 + - 如果c-sdk的动态库放在自定义目录,需要`go run -ldflags="-r 自定义目录的路径"` + +``` + +### 异步部署、调用HelloWorld合约 + +```golang +package main + +import ( + "fmt" + "log" + + "github.com/FISCO-BCOS/go-sdk/client" + "github.com/FISCO-BCOS/go-sdk/conf" + "github.com/FISCO-BCOS/go-sdk/helloworld" + "github.com/ethereum/go-ethereum/common" + "github.com/FISCO-BCOS/go-sdk/core/types" +) + +func main() { + configs, err := conf.ParseConfigFile("config.toml") + if err != nil { + log.Fatalf("ParseConfigFile failed, err: %v", err) + } + client, err := client.Dial(&configs[0]) + if err != nil { + fmt.Printf("Dial Client failed, err:%v", err) + return + } + var contractAddress common.Address + var channel = make(chan int, 0) + tx, err := helloworld.AsyncDeployHelloWorld(client.GetTransactOpts(), func(receipt *types.Receipt, err error) { + if err != nil { + fmt.Printf("%v\n", err) + return + } + fmt.Println("contract address: ", receipt.ContractAddress.Hex()) // the address should be saved + contractAddress = receipt.ContractAddress + channel <- 0 + }, client) + fmt.Println("transaction hash: ", tx.Hash().Hex()) + <-channel + instance, err := helloworld.NewHelloWorld(contractAddress, client) + if err != nil { + log.Fatal(err) + } + if err != nil { + fmt.Printf("Deploy failed, err:%v", err) + return + } + hello := &helloworld.HelloWorldSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()} + ret, err := helloworld.Get() + if err != nil { + fmt.Printf("helloworld.Get() failed: %v", err) + return + } + fmt.Printf("Get: %s\n", ret) + tx, err = helloworld.AsyncSet(func(receipt *types.Receipt, err error) { + if err != nil { + fmt.Printf("helloworld.AsyncSet failed: %v\n", err) + return + } + if receipt.Status != 0 { + fmt.Printf("helloworld.AsyncSet failed: %v\n", receipt.GetErrorMessage()) + } + channel <- 0 + }, "fisco") + <-channel + ret, err = helloworld.Get() + if err != nil { + fmt.Printf("helloworld.Get() failed: %v", err) + return + } + fmt.Printf("Get: %s\n", ret) +} + +``` + +## 国密样例 + +使用国密特性的开发流程和非国密大致相同,不同点在于以下几部分: + +- 搭建的 FISCO BCOS 区块链网络需要开启国密特性 +- 需要将非国密私钥替换为国密私钥 +- 需要准备国密的TLS证书和私钥 +- 安装 solc 编译器时需要添加 **-g** 选项,替换为国密版本 +- 使用 abigen 工具将 bin 和 abi 转换为 go 文件时,需要添加参数 **--smcrypto=true** + +### HelloWorld样例 + +#### 准备HelloWorld.sol合约文件 + +在 go-sdk 主目录中新建 helloworld 文件夹,在该文件夹中创建 HelloWorld.sol 合约。该合约提供两个接口,分别是get()和set(),用于获取/设置合约变量name。合约内容如下 + +```solidity +pragma solidity >=0.6.10 <0.8.20; + +contract HelloWorld { + string name; + + constructor() public { + name = "Hello, World!"; + } + + function get() public view returns (string memory) { + return name; + } + + function set(string memory n) public { + name = n; + } +} +``` + +#### 安装国密solc编译器 + +该编译器用于将 sol 合约文件编译成 abi 和 bin 文件 + +```bash +# 该指令在helloworld文件夹中执行 +bash ../tools/download_solc.sh -v 0.8.11 -g +``` + +#### 构建go-sdk的代码生成工具abigen + +该工具用于将 abi 和 bin 文件转换为 go 文件 + +```bash +# 该指令在helloworld文件夹中执行,编译生成abigen工具 +go build ../cmd/abigen +``` + +#### 编译生成go文件 + +先利用solc编译合约文件HelloWorld.sol,生成abi和bin文件 + +```bash +# 该指令在helloworld文件夹中执行 +./solc-0.8.11-gm --bin --abi -o ./ ./HelloWorld.sol +``` + +helloworld目录下会生成HelloWorld.bin和HelloWorld.abi。此时利用abigen工具将HelloWorld.bin和HelloWorld.abi转换成HelloWorld.go: + +```bash +# 该指令在helloworld文件夹中执行 +./abigen --bin ./HelloWorld.bin --abi ./HelloWorld.abi --pkg helloworld --type HelloWorld --out ./HelloWorld.go --smcrypto=true +``` + +- 接下来的步骤同非国密,不占用多余篇幅 diff --git a/3.x/zh_CN/docs/sdk/go_sdk/env_conf.md b/3.x/zh_CN/docs/sdk/go_sdk/env_conf.md new file mode 100644 index 000000000..ed77ceb68 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/go_sdk/env_conf.md @@ -0,0 +1,117 @@ +# 环境和配置文件 + +标签:``go-sdk`` ``环境配置`` + +---- + +## 开发环境 + +- Go开发环境 + + - Golang >= 1.17 + - 项目采用 go module 进行包管理,可参考 [Using Go Modules](https://blog.golang.org/using-go-modules) + - 如果您没有部署过Go环境,可参考 [官方文档](https://golang.org/doc/) + +- 基本开发组件 + + - Git(Windows、Linux及MacOS需要) + - Git bash(仅Windows需要) + +## bcos-c-sdk动态库准备 + +go-sdk v3依赖bcos-c-sdk动态库,需要先下载bcos-c-sdk动态库,然后将动态库放到指定目录下。 + +### 下载bcos-c-sdk动态库 + +从[这里](https://github.com/FISCO-BCOS/bcos-c-sdk/releases/tag/v3.4.0)下载对应平台的动态库。我们提供了一个脚本,默认下载到`/usr/local/lib`目录下,如果需要下载到其他目录,可以使用脚本的`-o`选项 + +```bash +./tools/download_csdk_lib.sh +``` + +请将动态库放在`/usr/local/lib`目录下,后续无特殊操作。如果本机编译后在其他机器使用时,动态库放置在自定义目录,例如`./lib`,则`go build`需要添加`ldflags`参数,例如`go build -v -ldflags="-r ${PWD}/lib" main.go`。也可以通过`export LD_LIBRARY_PATH=${PWD}/lib`设置动态库的搜索路径。 + +## 配置 + +Go SDK v3通过调用bcos-c-sdk的动态库实现,提供两种初始化方式,一种bcos-c-sdk的配置文件,另一种通过参数传入配置信息。 + +### 方式一:传入参数 + +```go +type Config struct { + TLSCaFile string // TLS 根证书文件路径 + TLSKeyFile string // TLS 私钥文件路径 + TLSCertFile string // TLS SDK证书文件路径 + TLSSmEnKeyFile string // 国密加密私钥文件路径 + TLSSmEnCertFile string // 国密加密证书文件路径 + IsSMCrypto bool // 链是否为国密 + PrivateKey []byte // 签名交易的私钥 + GroupID string // groupID + Host string // 节点IP或域名 + Port int // 节点port + DisableSsl bool // 是否禁用ssl +} + +func DialContext(ctx context.Context, config *Config) (*Client, error) +``` + +### 方式二:传入配置文件路径 + +```go +// configFile 制定配置文件路径,groupID 指定群组ID,privateKey 指定私钥 +func Dial(configFile, groupID string, privateKey []byte) (*Client, error) +``` + +bcos-c-sdk配置文件示例 + +```ini +[common] + ; if ssl connection is disabled, default: false + ; disable_ssl = true + ; thread pool size for network message sending recving handing + thread_pool_size = 8 + ; send message timeout(ms) + message_timeout_ms = 10000 + ; + send_rpc_request_to_highest_block_node = true + +; ssl cert config items, +[cert] + ; ssl_type: ssl or sm_ssl, default: ssl + ssl_type = ssl + ; directory the certificates located in, defaul: ./conf + ca_path=./conf + ; the ca certificate file + ca_cert=ca.crt + ; the node private key file + sdk_key=sdk.key + ; the node certificate file + sdk_cert=sdk.crt + +[peers] +# supported ipv4 and ipv6 + node.0=127.0.0.1:20200 + node.1=127.0.0.1:20201 +``` + +### bcos-c-sdk日志配置 + +bcos-c-sdk需要一个日志的配置文件,示例如下: + +```ini +[log] + enable=false + log_path=./log + ; network statistics interval, unit is second, default is 60s + stat_flush_interval=60 + ; info debug trace + level=info + ; MB + max_log_file_size=512 +``` + +### 私钥配置 + +`privateKey`是32字节的私钥,可以通过`crypto`或`smcrypto`包的`GenerateKey()`方法生成,也可以从pem文件或hex字符串中解析。从pem文件解析可以使用`client.LoadECPrivateKeyFromPEM`。 + +国密和非国密账户脚本可从[get_account.sh](https://github.com/FISCO-BCOS/console/blob/master-2.0/tools/get_account.sh)和[get_gm_account.sh](https://github.com/FISCO-BCOS/console/blob/master-2.0/tools/get_gm_account.sh)下载(若因为网络原因导致长时间无法下载`get_account.sh`脚本和`get_gm_account.sh`脚本,可尝试这两个链接:[get_account.sh](https://gitee.com/FISCO-BCOS/console/blob/master-2.0/tools/get_account.sh)和[get_gm_account.sh](https://gitee.com/FISCO-BCOS/console/blob/master-2.0/tools/get_gm_account.sh)),使用方式可参考[账户管理](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/account.html)。 diff --git a/3.x/zh_CN/docs/sdk/go_sdk/event_sub.md b/3.x/zh_CN/docs/sdk/go_sdk/event_sub.md new file mode 100644 index 000000000..adaa73f6e --- /dev/null +++ b/3.x/zh_CN/docs/sdk/go_sdk/event_sub.md @@ -0,0 +1,231 @@ +# 合约事件推送 + +标签:``go-sdk`` ``事件订阅`` ``Event`` + +---- + +## 1. 功能简介 + +合约事件推送功能提供了合约事件的异步推送机制,客户端向节点发送注册请求,在请求中携带客户端关注的合约事件的参数,节点根据请求参数对请求区块范围的`Event Log`进行过滤,将结果分次推送给客户端。建议用户使用生成的golang wapper进行合约事件订阅,会自动生成订阅接口以及解析。 + +## 2. 交互协议 + +客户端与节点的交互分为三个阶段:注册请求,节点回复,`Event Log`数据推送。 + +### 注册请求 + +客户端向节点发送事件推送的注册请求: + +```go +type EventLogParams struct { + FromBlock int64 `json:"fromBlock"` + ToBlock int64 `json:"toBlock"` + Addresses []string `json:"addresses"` + Topics []string `json:"topics"` +} + +// SubscribeEventLogs订阅合约事件,传入要订阅的合约事件参数,以及收到事件的处理函数,成功返回订阅任务的id,失败返回错误信息。订阅id可用于取消订阅 +func (c *Connection) SubscribeEventLogs(eventLogParams types.EventLogParams, handler func(int, []types.Log)) (string, error) +// UnsubscribeEventLogs取消订阅合约事件,传入订阅任务的id +func (c *Connection) UnsubscribeEventLogs(taskID string) +``` + +- FromBlock:起始区块(需大于0) +- ToBlock:-1表示最新块 +- Addresses:字符串数组,数组为多个合约地址,数组可以为空 +- Topics:数组类型,数组为多个topic,数组可以为空 + +### Event Log数据推送 + +节点验证客户端注册请求成功之后,根据客户端请求参数条件,向客户端推送`Event Log`数据,返回`[]types.Log`。 + +```go +type Log struct { + // Consensus fields: + // address of the contract that generated the event + Address common.Address `json:"address" gencodec:"required"` + // list of topics provided by the contract. + Topics []common.Hash `json:"topics" gencodec:"required"` + // supplied by the contract, usually ABI-encoded + Data []byte `json:"data" gencodec:"required"` + + // Derived fields. These fields are filled in by the node + // but not secured by consensus. + // block in which the transaction was included + BlockNumber uint64 `json:"blockNumber"` + // hash of the transaction + TxHash common.Hash `json:"transactionHash" gencodec:"required"` + // index of the transaction in the block + TxIndex uint `json:"transactionIndex" gencodec:"required"` + // index of the log in the block + Index uint `json:"logIndex" gencodec:"required"` +} +``` + +## 3. Go SDK教程 + +### 注册接口 + +在FISCO-BCOS Go SDK中`client.Client`类提供合约事件的注册接口,用户可以调用`SubscribeEventLogs`向节点发送注册请求,并设置回调函数。 + +```go +func (c *Client) SubscribeEventLogs(eventLogParams types.EventLogParams, handler func(int, []types.Log)) error { + return c.apiHandler.SubscribeEventLogs(eventLogParams, handler) +} +``` + +#### `types.EventLogParams`注册参数 + +事件回调请求注册的参数: + +```go +type EventLogParams struct { + FromBlock string `json:"fromBlock"` // 订阅起始区块 latest表示最新区块 + ToBlock string `json:"toBlock"` // 订阅结束区块 latest表示最新区块 + Addresses []string `json:"addresses"` // 订阅的合约地址 + Topics []string `json:"topics"` // 订阅的事件 + GroupID string `json:"groupID"` + FilterID string `json:"filterID"` +} +``` + +#### topic计算 + +Go语言可以使用`github.com/ethereum/go-ethereum/common`包根据合约中定义的事件进行Topic的计算: +需要注意的是uint及int为uint256及int256的别名,即使合约中使用的类型为uint及int,在topic的计算中仍需使用uint256与int256 + +```go +topic = common.BytesToHash(crypto.Keccak256([]byte("testEventLog(address,string,uint256)"))).Hex() +``` + +## 4. 示例 + +此处以一个进行数值更改并计算更改次数的`eventDemo.sol`合约进行事件订阅举例: + +```solidity +pragma solidity >=0.4.24; + +contract eventDemo { + + uint256 public count = 0; + uint256 public num = 0; + + event setNum(address caller,uint256 cnt,uint256 value); // Declare A Event + + function setNumber(uint256 v) public { + count += 1; + num = v; + emit setNum(msg.sender,count,num); + } + + function getNumber()public returns (uint){ + return num; + } +} +``` + +该合约提供了`setNumber`及`getNumber`方法,其中调用前者将获得一个抛出事件。 + +在Fisco Go SDK中有两种事件订阅方式,分别为使用`client`直接进行事件订阅与调用Abigen工具生成的代码中函数进行订阅两种,其中后者须建立`session`。 + +### 4.1 使用client进行事件订阅 + +#### 事件推送订阅 + +在Go SDK中给出了[subscriber.go](https://github.com/FISCO-BCOS/go-sdk/blob/master/examples/eventLog/sub/subscriber.go)合约事件订阅样例 + +*需要注意的是Topic及Address不可置空,置空将无法接收到相应事件。* + +```go +func main() { + ...... // 省略 + endpoint := "127.0.0.1:20200" // 部署的Fisco链的ip:channel_port + privateKey, _ := hex.DecodeString("145e247e170ba3afd6ae97e88f00dbc976c2345d511b0f6713355d19d8b80b58") //用户私钥 + config := &conf.Config{IsHTTP: false, ChainID: 1, CAFile: "ca.crt", Key: "sdk.key", Cert: "sdk.crt", + IsSMCrypto: false, GroupID: 1, PrivateKey: privateKey, NodeURL: endpoint} + var c *client.Client + var err error + ...... // 省略 + var eventLogParams types.EventLogParams + eventLogParams.FromBlock = 1 + eventLogParams.ToBlock = -1 + var topics = make([]string, 1) + topics[0] = common.BytesToHash(crypto.Keccak256([]byte("setNum(address,uint256,uint256)"))).Hex() // 事件的Topic计算,注意使用uint256及int256替代uint及int + eventLogParams.Topics = topics + var addresses = make([]string, 1) + addresses[0] = "0xd2cf82e18f3d2c5cae0de87d29994be622f3fdd3" // 所订阅事件对应的合约地址 + + eventLogParams.Addresses = addresses + timeout := 30 * time.Second + queryTicker := time.NewTicker(timeout) + defer queryTicker.Stop() + done := make(chan bool) + taskId, err = c.SubscribeEventLogs(eventLogParams, func(status int, logs []types.Log) { // 调用SubscribeEventLogs函数订阅事件 + ...... // 省略 + }) + ...... // 省略 +} +``` + +#### Log数据解析 + +在使用sdk提供的客户端订阅事件的方式中,获取到的数据需要`abi`进行解析, + +首先需要根据事件包含的变量类型构建一个用于解析的结构体: + +```go +type setNum struct { + Caller common.Address + Cnt *big.Int + Value *big.Int +} +``` + +此后可采用`abi`工具进行解析: + +```go + err = c.SubscribeEventLogs(eventLogParams, func(status int, logs []types.Log) { + fmt.Println(logs[0].Data) + for k, v := range logs { + var tempABI abi.ABI + var temp setNum + tempABI, err := abi.JSON(strings.NewReader(EventDemoABI)) + if err != nil { + logrus.Println(err.Error()) + } + err = tempABI.Unpack(&temp, "setNum", v.Data) + if err != nil { + logrus.Println(err.Error()) + } + fmt.Println("log number:", k, temp) + } + }) + +``` + +此处`abi.Json`所使用到的数据需要使用`abigen`工具生成对应的go文件后获得: + +```go +// EventDemoABI is the input ABI used to generate the binding from. +const EventDemoABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"count\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"v\",\"type\":\"uint256\"}],\"name\":\"setNumber\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"num\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"cnt\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"setNum\",\"type\":\"event\"}]" +``` + +### 4.2 使用Abigen工具生成后的函数进行事件订阅 + +该方式进行事件订阅需先构建与合约的`session`连接,后直接调用`abigen`生成的go文件中函数即可进行事件的订阅与解析: + +```go +// 根据配置文件构建eventDemoSession +err := eventDemoSession.WatchAllSetNum(from, func(status int, logs []types.Log) { + fmt.Println("Status Code:",status) + for k, v := range logs { + log, errs := eventDemoSession.ParseSetNum(v) // 解析数据 + if errs != nil { + fmt.Println(errs) + } + fmt.Println("Log id:", k, "Log Content:",log) + } + }) +``` + +关于Session的构建请参考[合约开发样例](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/go_sdk/contractExamples.html)部分中例程。 diff --git a/3.x/zh_CN/docs/sdk/go_sdk/index.rst b/3.x/zh_CN/docs/sdk/go_sdk/index.rst new file mode 100644 index 000000000..4d3c4920d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/go_sdk/index.rst @@ -0,0 +1,31 @@ +############################################################## +4. Go SDK +############################################################## + +标签:``go-sdk`` ``Go SDK`` + +---- + +`Go SDK `_ 提供了访问 `FISCO BCOS `_ 节点的Go API,支持节点状态查询、部署和调用合约等功能,基于Go SDK可快速开发区块链应用,目前支持FISCO BCOS v2.2.0+与v3.3.0+ + +.. admonition:: **主要特性** + + - 提供调用FISCO BCOS `JSON-RPC <../../develop/api.html>`_ 的Go API + - 提供合约编译,将Solidity合约文件编译成abi和bin文件,然后再转换成Go合约文件 + - 提供部署及调用go合约文件的GO API + - 提供调用预编译(Precompiled)合约的Go API,其中v2版本已完整支持,v3版本部分支持 + - 支持与节点建立TLS与国密TLS连接 + - 提供CLI(Command-Line Interface)工具,供用户在命令行中方便快捷地与区块链交互 + +安装配置环境,使用Go SDK进行应用开发请参见 `gitHub `_ 链接 + +.. toctree:: + :hidden: + :maxdepth: 3 + + env_conf.md + api.md + console.md + contractExamples.md + amopExamples.md + event_sub.md \ No newline at end of file diff --git a/3.x/zh_CN/docs/sdk/index.md b/3.x/zh_CN/docs/sdk/index.md new file mode 100644 index 000000000..9d78765a5 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/index.md @@ -0,0 +1,21 @@ +# 1. 多语言SDK + +标签: ``SDK`` + +---- + +```eval_rst +.. important:: + 相关软件和环境版本说明!`请查看 `_ +``` + +FISCO BCOS 3.x版本的多语言SDK设计采用**分层架构**实现,从下到上依次分为通用基础组件层、CPP- SDK层、C-SDK层、多语言、多终端接入层。核心功能由底层CPP-SDK实现,上层多语言简单适配接入,这种方式可快速适配接入多语言SDK。 + +- **通用基础组件**:封装加密算法、通信协议、网络协议、加密机协议; +- **CPP-SDK层**:基于通用基础组件,实现区块链连接相关的网络管理、群组管理、AMOP通信、事件机制、账本与RPC接口,采用C++方式封装实现CPP-SDK; +- **C-SDK层**:基于CPP-SDK再包装一层C接口调用方式的C-SDK; +- **多语言、多终端接入层**:通过C-SDK的接口可以快速适配到Java、golang、nodejs、python、rust以及 iOS、Android等多语言SDK,并且兼容适配Windows、Linux、macOS、KyLin多中操作系统以及X86、ARM(包括M1)等不同平台。 + +SDK分层架构图如下所示: + +![](../../images/sdk/sdk_layered_architecture.png) diff --git a/3.x/zh_CN/docs/sdk/java_sdk/amop.md b/3.x/zh_CN/docs/sdk/java_sdk/amop.md new file mode 100644 index 000000000..7644525b0 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/amop.md @@ -0,0 +1,334 @@ +# AMOP 功能 + +标签:``java-sdk`` ``AMOP`` ``链上信使协议`` + +---- +Java SDK支持链上信使协议AMOP(Advanced Messages Onchain Protocol),用户可以通过AMOP协议与其它机构互传消息。 + +## 1. 接口说明 + +AMOP支持任何一个订阅了某话题的订阅者都能收到该话题相关的推送消息 + +AMOP模块的接口类可参考文件java-sdk中的``sdk-amop/src/main/org/fisco/bcos/sdk/amop/Amop.java``文件,其中主要包含以下几个接口: + +### 1.1 subscribeTopic + +订阅一个话题 + +**参数:** + +* topic: 订阅话题名称。类型:``String``。 +* callback: 处理该话题消息的函数,当收到该话题相关消息时,会被调用。类型:``AmopRequestCallback``。 + +**例子:** + +```java +// 初始化java SDK, 获得Amop对象 +BcosSDK sdk = BcosSDK.build("config-example.toml"); +Amop amop = sdk.getAmop(); +// 启动amop +amop.start(); + +// 定义一个Callback,重写receiveAmopMsg方法,定义收到消息后的处理流程。 +AmopRequestCallback cb = new AmopRequestCallback() { + @Override + public void onRequest(String endpoint, String seq, byte[] data) { + // 你可以在这里写收到消息后的处理逻辑。 + System.out.println("Received msg, content:" + new String(data)); + } +}; + +// 订阅话题 +amop.subscribeTopic("MyTopic", cb); +``` + +### 1.2 sendAmopMsg + +以单播的方式发送AMOP消息 + +**参数:** + +* topic: 发送消息的topic。类型: ``String`` +* content: 消息内容。类型:``byte[]`` +* timeout: 超时时间。类型:``int`` +* callback: 回调函数。类型:``AmopResponseCallback`` + +**注意:** + +对于发送的单播AMOP消息,存在多个订阅topic的客户端时,其中随机的一个可以接收到单播消息。 + +**例子:** + +```java +// 初始化java SDK, 获得Amop对象 +BcosSDK bcosSDK = BcosSDK.build("config-example.toml"); +Amop amop = bcosSDK.getAmop(); +amop.start(); + +AmopResponseCallback cb = new AmopResponseCallback() { + @Override + public void onResponse(Response response) { + // 你可以在这里写收到回复的处理逻辑。 + System.out.println( + "Get response, { errorCode:" + + response.getErrorCode() + + " error:" + + response.getErrorMessage() + + " content:" + + new String(response.getData()) + + " }"); + } +}; + +String msg = "Send Message"; +// 发送消息 +amop.sendAmopMsg("MyTopic", msg.getBytes(), 0, cb); +``` + +### 1.3 broadcastAmopMsg + +以广播的方式发送AMOP消息 + +**参数:** + +* topic: 广播topic。类型:``String`` +* content: 消息内容。类型:``byte[]`` + +**例子:** + +```java +// 初始化java SDK, 获得Amop对象 +BcosSDK bcosSDK = BcosSDK.build("config-example.toml"); +Amop amop = bcosSDK.getAmop(); +amop.start(); + +// 发送消息 +String content = "Send Message"; + +// 发送消息 +amop.broadcastAmopMsg("MyTopic", content.getBytes()); +``` + +### 1.4 unsubscribeTopic + +取消订阅话题。 + +**参数:** + +* topic: 取消订阅的话题。类型:``String`` + + +**例子:** + +```java +// 发送消息 +amop.unsubscribeTopic("MyTopic"); +``` + +### 1.5 sendResponse + +回复消息。 + +**参数:** + +* endpoint: 接收消息的对端endpoint,`AmopRequestCallback`回调中返回。类型:``String`` +* seq: 消息seq,`AmopRequestCallback`回调中返回。类型:``String`` +* content: 回复消息内容。类型:``byte[]`` + +**例子:** + +```java +// 初始化java SDK, 获得Amop对象 +BcosSDK sdk = BcosSDK.build("config-example.toml"); +Amop amop = sdk.getAmop(); +// 启动amop +amop.start(); + +// 定义一个Callback,重写receiveAmopMsg方法,定义收到消息后的处理流程。 +AmopRequestCallback cb = new AmopRequestCallback() { + @Override + public void onRequest(String endpoint, String seq, byte[] data) { + // 这里将消息返回给发送端 + amop.sendResponse(endpoint, seq, data); + } +}; + +// 订阅话题 +amop.subscribeTopic("MyTopic", cb); +``` + +### 1.6 setCallback + +设置默认回调,`subscribeTopic`订阅topic指定的回调为空时,接收到消息时会调用设置的默认回调接口 + +**参数:** + +* cb: 回调。类型: ``AmopRequestCallback`` + +## 2. 示例 + +更多的示例请看[java-sdk-demo](https://github.com/FISCO-BCOS/java-sdk-demo)项目源码``java-sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/``下的代码示范,链接:[java-sdk-demo GitHub链接](https://github.com/FISCO-BCOS/java-sdk-demo),[java-sdk-demo Gitee链接](https://gitee.com/FISCO-BCOS/java-sdk-demo)。 + +* 示例: + + * Subscribe + * 功能: 订阅topic,并且将接收的消息直接返回给对端 + * 使用: + + ```shell + Usage: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Subscribe topic + Example: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Subscribe topic + ``` + + * Publish + * 功能: 发送AMOP单播消息 + * 使用: + + ```shell + Usage: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Publish topic msg + Example: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Publish topic HelloWorld + ``` + + * Broadcast + * 功能: 广播AMOP消息 + * 使用: + + ```shell + Usage: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Broadcast topic msg + Example: + java -cp "conf/:lib/*:apps/*" org.fisco.bcos.sdk.demo.amop.Broadcast topic HelloWorld + ``` +## 2. 快速试用AMOP + +### 第一步:下载项目 + +```shell +mkdir -p ~/fisco && cd ~/fisco +# 获取java-sdk代码 +git clone https://github.com/FISCO-BCOS/java-sdk-demo + +# 若因为网络问题导致长时间拉取失败,请尝试以下命令: +git clone https://gitee.com/FISCO-BCOS/java-sdk-demo + +cd java-sdk-demo +# 构建项目 +bash gradlew build +``` + +### 第二步:搭建FISCO BCOS区块链网络 + +根据[指引](../../../quick_start/air_installation.md)搭建FISCO BCOS区块链网络。 + +### 第三步:配置 + +* 复制证书:将你搭建FISCO BCOS网络节点``nodes/${ip}/sdk/`` 目录下的证书复制到``java-sdk-demo/dist/conf``目录下。 + +* 修改配置:`cp config-example.toml config.toml` + +### 第四步:运行Demo + +#### 公有话题Demo + +新打开一个终端,下载java-sdk-demo的代码,并build。 + +```shell +cd ~/fisco +# 获取java-sdk-demo代码 +git clone https://github.com/FISCO-BCOS/java-sdk-demo + +# 若因为网络问题导致长时间拉取失败,请尝试以下命令: +git clone https://gitee.com/FISCO-BCOS/java-sdk-demo + +cd java-sdk-demo + +# build项目 +bash gradlew build +``` + +**运行订阅者:** + +```shell +# 进入java-sdk-demo/dist目录 +cd dist +# 我们订阅名为”testTopic“的话题 +java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Subscribe testTopic +``` + +订阅方的终端输出 + +```shell +====== AMOP subscribe, topic: testTopic +``` + +然后,运行发送者Demo + +**单播消息**: + +```shell +# 调用Publish发送AMOP消息 +# 话题名:testTopic,内容:Tell you something +java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Publish testTopic "Tell you something" +``` + +终端输出: + +```shell +$ java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Publish testTopic "Tell you something" + + ====== AMOP publish, topic: testTopic ,msg: Tell you something + ====== AMOP publish send message + ==> receive response message from server + responseData: Tell you something + ====== AMOP publish send message + ==> receive response message from server + responseData: Tell you something +``` + +同时,返回到话题订阅者的终端,发现终端输出: + +```shell + ==> receive message from client + ==> endpoint: 127.0.0.1:20201 + ==> seq: 64f3f40832d6499f8a154c6205001081 + ==> data: Tell you something + ==> receive message from client + ==> endpoint: 127.0.0.1:20200 + ==> seq: c121fa99204346c0a87478117607a50b + ==> data: Tell you something +``` + +**广播消息**: + +```shell +# 调用Broadcast发送AMOP消息 +# 话题名:testTopic,内容:Tell you something= +java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Broadcast testTopic "Tell you something" +``` + +终端的输出 + +```shell +java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.amop.Broadcast testTopic "Tell you something" + ====== AMOP broadcast, topic: testTopic ,msg: Tell you something +``` + +同时,返回到话题订阅者的终端,发现终端输出: + +```java + ==> receive message from client + ==> endpoint: 127.0.0.1:20200 + ==> seq: 3d5e5bec03cf4693939912ed0236b611 + ==> receive message from client + ==> data: Tell you something +``` + +注意: + +1. 广播消息没有回包。 + +2. 接收方可能收到多条重复的广播信息。 \ No newline at end of file diff --git a/3.x/zh_CN/docs/sdk/java_sdk/assemble_service.md b/3.x/zh_CN/docs/sdk/java_sdk/assemble_service.md new file mode 100644 index 000000000..8b46c9279 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/assemble_service.md @@ -0,0 +1,207 @@ +# (New)构造新版本交易 + +标签:``java-sdk`` ``发送交易`` ``使用接口签名发送交易`` ``组装交易`` ``合约调用`` ``v1`` + +---- + +```eval_rst +.. important:: + FISCO BCOS 在3.6.0版本以后开始支持V1版本的交易,在3.7.0版本以后开始支持V2交易,在使用之前请确认发送的节点版本。3.6.0版本特性请参考:`v3.6.0 <../introduction/change_log/3_6_0.html>`_ +``` + +```eval_rst +.. note:: + 交易的数据结构以及拼装方式可以参考 `这里 <./transaction_data_struct.html>`_ +``` + +FISCO BCOS 在3.6.0版本以后开始支持V1版本的交易,在3.7.0版本以后开始支持V2交易,新增以下五个字段: + +```c++ +string value; // v1交易新增字段,原生转账金额 +string gasPrice; // v1交易新增字段,执行时gas的单价(gas/wei) +long gasLimit; // v1交易新增字段,交易执行时gas使用的上限 +string maxFeePerGas; // v1交易新增字段,EIP1559预留字段 +string maxPriorityFeePerGas; // v1交易新增字段,EIP1559预留字段 +vector extension; // v2交易新增字段,用于额外存储 +``` + +为了解决未来可能的增加交易字段的需求,Java SDK支持全新的能够支持灵活拼装的交易服务,方便用户开发者灵活使用。 + +## 1. TransactionManager + +灵感来自Web3J,抽象了发送交易/调用请求的接口,提供GasProvider以及NonceAndBlockLimitProvider的注入接口,供用户自定义交易。在TransactionManager中传入的data均为ABI编码过后的字节数组。 + +TransactionManager是一个抽象类,有以下实现: + +- `DefaultTransactionManager` :默认的TransactionManager,在签名交易时使用Client初始化时生成的密钥。 +- `ProxySignTransactionManager` :将签名外置的TransactionManager,用户可以自行实现`AsyncTransactionSignercInterface`的接口,设置进ProxySignTransactionManager对象,在签名时均使用所实现的AsyncTransactionSignercInterface对象进行签名。 + +### 1.1 接口列表 + +TableManager的抽象接口如下所示: + +```java +// 注入Gas Provider +public abstract void setGasProvider(ContractGasProvider gasProvider); +// 注入Nonce 和 BlockLimit Provider +public abstract void setNonceProvider(NonceAndBlockLimitProvidernonceProvider nonceProvider); +// 发送已经ABI编码调用参数过后的交易 +public abstract TransactionReceipt sendTransaction(AbiEncodedRequestrequest request) throws JniException; +// 异步发送已经ABI编码调用参数过后的交易 +public abstract String asyncSendTransaction(AbiEncodedRequest request, TransactionCallback callback) throws JniException; +// 构造已经ABI编码调用参数过后的交易,并进行签名,返回raw transaction +public abstract TxPair createSignedTransaction(AbiEncodedRequestrequest request) throws JniException; +// 发起合约调用 +public abstract Call sendCall(String to, byte[] data, Stringsignature sign); +// 异步发起合约调用 +public abstract void asyncSendCall(String to, byte[] data, RespCallback callback); +``` + +### 1.2 DefaultTransactionManager + +- DefaultTransactionManager是默认的TransactionManager,在签名交易时使用Client初始化时生成的密钥。 +- 使用默认的ContractGasProvider,默认返回的gaslimit为9000000,gas price为4100000000 +- 使用默认的NonceAndBlockLimitProvider,默认返回的block limit为Client接口getBlockLimit返回的值,默认返回的nonce为UUID。 + +### 1.3 ProxySignTransactionManager + +- 将签名外置的TransactionManager,用户可以自行实现`AsyncTransactionSignercInterface`的接口,设置进ProxySignTransactionManager对象,在签名时均使用所实现的AsyncTransactionSignercInterface对象进行签名。 +- 使用默认的ContractGasProvider,默认返回的gaslimit为9000000,gas price为4100000000 +- 使用默认的NonceAndBlockLimitProvider,默认返回的block limit为Client接口getBlockLimit返回的值,默认返回的nonce为UUID。 +- 使用默认的AsyncTransactionSignercInterface:TransactionJniSignerService,默认仍然还是使用Client初始化时生成的密钥。 + +用户可以调用`setAsyncTransactionSigner`接口替换自己实现AsyncTransactionSignercInterface接口的对象。 + +### 1.4 使用示例 + +```java +// 初始化SDK和Client +BcosSDK sdk = BcosSDK.build(CONFIG_FILE); +Client client = sdk.getClient("group0"); + +// 初始化ProxySignTransactionManager +ProxySignTransactionManager proxySignTransactionManager = new ProxySignTransactionManager(client); +// ProxySignTransactionManager可以接受AsyncTransactionSignercInterface的实现作为构造函数参数 +proxySignTransactionManager = new ProxySignTransactionManager(client, (hash, transactionSignCallback) -> { + SignatureResult sign = client.getCryptoSuite().sign(hash, client.getCryptoSuite().getCryptoKeyPair()); + transactionSignCallback.handleSignedTransaction(sign); +}); +// ProxySignTransactionManager.setAsyncTransactionSigner接口可以修改AsyncTransactionSignercInterface的实现 +proxySignTransactionManager.setAsyncTransactionSigner((hash, transactionSignCallback) -> { + SignatureResult sign = client.getCryptoSuite().sign(hash, client.getCryptoSuite().getCryptoKeyPair()); + transactionSignCallback.handleSignedTransaction(sign); +}); + +// 对合约参数进行编解码 +byte[] abiEncoded = contractCodec.encodeMethod(abi, method, params); + +// 采用链式构造AbiEncodedRequest,传入contractAddress、nonce、blockLimit等重要参数,最后使用buildAbiEncodedRequest结束构造。 +AbiEncodedRequest request = + new TransactionRequestBuilder() + .setTo(contractAddress) + .setAbi(abi) + .setNonce(nonce) + .setBlockLimit(blockLimit) + .setExtension("Hello World".getBytes()) + .setGasPrice(BigInteger.TEN) + .buildAbiEncodedRequest(abiEncoded); + +// 同步发送上链,获得回执 +TransactionReceipt receipt = proxySignTransactionManager.sendTransaction(request); +``` + +## 2. AssembleTransactionService + +AssembleTransactionService集成了TransactionManager、ContractCodec以及TransactionDecoderService,用户只需要传入调用合约的参数,返回的结果就包含已经解析完毕的合约返回值。 + +AssembleTransactionService可以切换依赖的TransactionManager,默认为DefaultTransactionManager,可切换为ProxySignTransactionManager。 + +### 2.1 接口列表 + +```java +// 设置TransactionManager +public void setTransactionManager(TransactionManager transactionManager); +// 发送调用合约交易 +public TransactionResponse sendTransaction(BasicRequest request); +// 发送部署合约交易 +public TransactionResponse deployContract(BasicDeployRequest request); +// 异步发送调用合约交易 +public String asyncSendTransaction(BasicRequest request, TransactionCallback callback); +// 异步发送部署合约交易 +public String asyncDeployContract(BasicDeployRequest request, TransactionCallback callback); +// 发送查询合约请求 +public CallResponse sendCall(BasicRequest request); +// 异步发送查询合约请求 +public void asyncSendCall(BasicRequest request, RespCallback callback); +``` + +### 2.2 使用示例 + +```java +// 初始化SDK和Client +BcosSDK sdk = BcosSDK.build(CONFIG_FILE); +Client client = sdk.getClient("group0"); + +// 初始化AssembleTransactionService +AssembleTransactionService transactionService = new AssembleTransactionService(client); +// 初始化ProxySignTransactionManager +ProxySignTransactionManager proxySignTransactionManager = new ProxySignTransactionManager(client, (hash, transactionSignCallback) -> { + SignatureResult sign = client.getCryptoSuite().sign(hash, client.getCryptoSuite().getCryptoKeyPair()); + transactionSignCallback.handleSignedTransaction(sign); +}); +// 手动切换TransactionManager +transactionService.setTransactionManager(proxySignTransactionManager); +// 构造HelloWorld set参数 +List params = new ArrayList<>(); +params.add("Hello AssembleTransactionService"); +// 构造调用HelloWorld set的请求,传入contractAddress、nonce、blockLimit等重要参数,最后使用buildRequest结束构造。 +TransactionRequest request = + new TransactionRequestBuilder(abi, "set", contractAddress) + .setNonce(nonce) + .setBlockLimit(blockLimit) + .setExtension("HelloWorld".getBytes()) + .setGasPrice(BigInteger.TEN) + .buildRequest(params); + +// 同步发送上链,获得返回 +TransactionResponse transactionResponse = transactionService.sendTransaction(request); + +// 也可以构造使用String类型的参数 +List params = new ArrayList<>(); +params.add("[[\"0xabcd\"],[\"0x1234\"]]"); +// 构造调用合约setBytesArrayArray接口的请求,参数为bytes二维数组,传入contractAddress、nonce、blockLimit等重要参数,最后使用buildStringParamsRequest结束构造。 +TransactionRequestWithStringParams requestWithStringParams = + new TransactionRequestBuilder(abi, "setBytesArrayArray", contractAddress) + .setNonce(nonce) + .setBlockLimit(blockLimit) + .setExtension("HelloWorld".getBytes()) + .setGasPrice(BigInteger.TEN) + .buildStringParamsRequest(params); +// 同步发送上链,获得返回 +TransactionResponse transactionResponse = transactionService.sendTransaction(requestWithStringParams); +``` + +## 3. Solidity生成Java文件使用新接口 + +生成智能合约的Java接口文件详细文档可见:[链接](./contracts_to_java.html) + +在3.6.0以后版本的控制台中,contract2java.sh脚本新增 `-t` 选项,当值为1就生成使用新接口的Java文件,使用姿势与之前无异。例如: + +```shell + bash contract2java.sh solidity -t 1 -n -s ./contracts/solidity/Incremental.sol +``` + +已有的Java文件改造方法: + +以Java-sdk-demo中 package org.fisco.bcos.sdk.demo.perf.PerformanceOk 为例: +在deploy构造好的合约对象后,设置TransactionManager,之后发送的请求就会按照新的交易接口进行。 + +```java +// build the client +Client client = sdk.getClient(groupId); +// deploy the HelloWorld +System.out.println("====== Deploy Ok ====== "); +Ok ok = Ok.deploy(client, client.getCryptoSuite().getCryptoKeyPair()); +// 设置TransactionManager +ok.setTransactionManager(new DefaultTransactionManager(client)); +``` diff --git a/3.x/zh_CN/docs/sdk/java_sdk/assemble_transaction.md b/3.x/zh_CN/docs/sdk/java_sdk/assemble_transaction.md new file mode 100644 index 000000000..8273bf8a1 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/assemble_transaction.md @@ -0,0 +1,322 @@ +# 构造交易与发送 + +标签:``java-sdk`` ``发送交易`` ``使用接口签名发送交易`` ``组装交易`` ``合约调用`` + +---- + +```eval_rst +.. note:: + Java SDK同时支持将 `solidity` 转换为 `java` 文件后,调用相应的 `java` 方法部署和调用合约,也支持构造交易的方式部署和调用合约,这里主要展示交易构造与发送,前者的使用方法请参考 `这里 <./contracts_to_java.html>`_ +``` + +```eval_rst +.. note:: + 交易的数据结构可以参考 `这里 <./transaction_data_struct.html>`_ +``` + +## 1. 概念解析:合约的部署与调用 + +合约的操作可分为合约部署和合约调用两大类。其中合约调用又可以被区分为『交易』和『查询』。 + +**合约部署**是指新创建和发布一个合约。交易创建传入的数据会被转换为 EVM 字节码并执行,执行的输出将作为合约代码被永久存储。 + +**合约调用**是指调用已部署的合约的函数。合约调用又可以被区分为『交易』和『查询』。 + +**“查询”**:被view/pure修饰符修饰的方法一般称为“查询”,“查询”无需被同步和发送给到其他节点全网共识。 + +**“交易”**:未被修饰的才会称为“交易”。,而“交易”需发送全网进行上链的共识。 + +以下是“交易”和“查询”更详细的区别。 + +| 内容 | 查询 | 交易 | +|------------------|-----------------|------------------| +| 合约表现 | view修饰 | 无view修饰符 | +| ABI表现 | "constant":true | "constant":false | +| 是否需要签名 | 否 | 是 | +| rpc类型 | call | sendTransaction | +| 执行节点 | 所有节点 | 所有共识节点 | +| 是否消耗gas | 否 | 是 | +| 是否变更存储状态 | 否 | 是 | + +## 2. 前提:准备合约的abi和binary文件 + +控制台提供一个专门的编译合约工具,方便开发者将Solidity/webankblockchain-liquid(以下简称WBC-Liquid)合约文件编译生成Java文件和abi、binary文件,具体使用方式[参考这里](./contracts_to_java.html)。 + +通过运行contract2java 脚本,生成的abi和binary文件分别位于contracts/sdk/abi、contracts/sdk/bin目录下(其中,国密版本编译产生的文件位于contracts/sdk/abi/sm和contracts/sdk/bin/sm文件夹下)。可将文件复制到项目的目录下,例如src/main/resources/abi和src/main/resources/bin。 + +为了便于演示,我们使用了以下HelloWorld的Solidity合约。 + +```solidity +pragma solidity ^0.6.0; + +contract HelloWorld{ + string public name; + constructor() public{ + name = "Hello, World!"; + } + + function set(string memory n) public{ + name = n; + } +} +``` + +**编译合约,生成abi和binary:** + +```shell +# 切换到控制台所在目录 +$ cd ~/fisco/console + +# 调用sol2java.sh脚本,编译contracts/solidity目录下的HelloWorld合约: +$ bash contract2java.sh solidity -p org.com.fisco -s contracts/solidity/HelloWorld.sol + +$ tree . -L1 +|-- abi # 编译生成的abi目录,存放solidity合约编译的abi文件 +| |-- HelloWorld.abi +|-- bin # 编译生成的bin目录,存放solidity合约编译的bin文件 +| |-- HelloWorld.bin +|-- java # 存放编译的包路径及Java合约文件 +| |-- org +| |-- com +| |-- fisco +| |-- HelloWorld.java # Solidity编译的HelloWorld Java文件 +``` + +至此`HelloWorld`合约的abi和binary文件均已生成 + +## 3. 初始化SDK + +基于配置文件,初始化SDK,如: + +```java +// 初始化BcosSDK对象 +BcosSDK sdk = BcosSDK.build(configFile); +// 获取Client对象,此处传入的群组名 group0 +Client client = sdk.getClient("group0"); +// 构造AssembleTransactionProcessor对象,需要传入client对象,CryptoKeyPair对象和abi、binary文件存放的路径。abi和binary文件需要在上一步复制到定义的文件夹中。 +CryptoKeyPair keyPair = client.getCryptoSuite().getCryptoKeyPair(); +``` + +## 4. 初始化AssembleTransactionProcessor对象 + +Java SDK提供了基于abi和binary文件来直接部署和调用合约的方式。本场景下适用于默认的情况,通过创建和使用`AssembleTransactionProcessor`对象来完成合约相关的部署、调用和查询等操作。 + +```java +AssembleTransactionProcessor transactionProcessor = TransactionProcessorFactory.createAssembleTransactionProcessor(client, keyPair, "src/main/resources/abi/", "src/main/resources/bin/"); +``` + +**特别的:** 假如只交易和查询,而不部署合约,那么就不需要复制binary文件,且在构造时无需传入binary文件的路径,例如构造方法的最后一个参数可传入空字符串。 + +```java +AssembleTransactionProcessor transactionProcessor = TransactionProcessorFactory.createAssembleTransactionProcessor(client, keyPair, "src/main/resources/abi/", ""); +``` + +**特别的:** 也可以不传入任何ABI文件目录,后续操作时手动传入abi字符串也可行。 + +```java +AssembleTransactionProcessor transactionProcessor = TransactionProcessorFactory.createAssembleTransactionProcessor(client, keyPair, "", ""); +``` + +## 5. 同步方式部署合约 + +部署合约调用了deployByContractLoader方法,传入合约名和构造函数的参数,上链部署合约,并获得`TransactionResponse`的结果。 + +```java +// 部署HelloWorld合约。第一个参数为合约名称,第二个参数为合约构造函数的列表,是List类型。 +TransactionResponse response = transactionProcessor.deployByContractLoader("HelloWorld", new ArrayList<>()); +// 也可以手动传入bin和abi +TransactionResponse response = transactionProcessor.deployAndGetResponse(abi, bin, new ArrayList<>(), null); +``` + +`TransactionResponse`的数据结构如下: + +- returnCode: 返回的响应码。其中0为成功。 +- returnMessages: 返回的错误信息。 +- TransactionReceipt:上链返回的交易回执。 +- ContractAddress: 部署或调用的合约地址。 +- events: 如果有触发日志记录,则返回解析后的日志返回值,返回Json格式的字符串。 +- returnObject: 返回值Java类型。 +- returnABIObject: 返回值ABI类型。 +- receiptMessages: 返回解析后的交易回执信息。 + +`returnCode`与`returnMessages`对应表汇总[参考这里](./retcode_retmsg.md) + +## 6. 同步方式发送交易 + +调用合约交易使用了`sendTransactionAndGetResponseByContractLoader`来调用合约交易,此处展示了如何调用`HelloWorld`中的`set`函数。 + +```java + // 创建调用交易函数的参数,此处为传入一个参数 + List params = new ArrayList<>(); + params.add("test"); + // 调用HelloWorld合约,合约地址为helloWorldAddress, 调用函数名为『set』,函数参数类型为params + TransactionResponse transactionResponse = transactionProcessor.sendTransactionAndGetResponseByContractLoader("HelloWorld", helloWorldAddrss, "set", params); + + // 也可以手动传入ABI文件调用 + TransactionResponse transactionResponse = transactionProcessor.sendTransactionAndGetResponse(helloWroldAddress, abi, "set", params); +``` + +## 7.调用合约查询接口 + +查询合约直接通过调用链上的节点查询函数即可返回结果,无需共识;因此所有的查询交易都是同步方式通讯的。查询合约使用了`sendCallByContractLoader`函数来查询合约,此处展示了如何调用`HelloWorld`中的`name`函数来进行查询。 + +```java +// 查询HelloWorld合约的『name』函数,合约地址为helloWorldAddress,参数为空 +CallResponse callResponse = transactionProcessor.sendCallByContractLoader("HelloWorld", helloWorldAddrss, "name", new ArrayList<>()); + +// 也可以手动传入ABI文件调用 +CallResponse callResponse = transactionProcessor.sendCall("", helloWorldAddrss, "name", new ArrayList<>()); +``` + +## 8. 拼接合约方法签名的方式发送交易 + +此外,对于特殊的场景,可以通过接口签名的方式DIY拼装交易和发送交易。 + +例如上述`HelloWorld`智能合约定义的set方法的签名为 `set(string)` + +```java +// 使用WBC-Liquid合约时_isWasm 为true,Solidity合约则为false +ContractCodec contractCodec = new ContractCodec(client.getCryptoSuite(), _isWasm); +String setMethodSignature = "set(string)"; +byte[] txData = contractCodec.encodeMethodByInterface(setMethodSignature, new Object[]{new String("Hello World")}); +``` + +由于通过构造接口签名的方式无需提供abi,故可以构造一个`TransactionProcessor`来操作。同样可使用`TransactionProcessorFactory`来构造。 + +```java +TransactionProcessor transactionProcessor = TransactionProcessorFactory.createTransactionProcessor(client, keyPair); +``` + +发送交易到FISCO BCOS节点并接收回执。 + +```java +// 如果使用WBC-Liquid,第三个参数应该使用 TransactionAttribute.LIQUID_SCALE_CODEC +TransactionReceipt transactionReceipt = transactionProcessor.sendTransactionAndGetReceipt(contractAddress, txData, TransactionAttribute.EVM_ABI_CODEC); +``` + +在执行成功后需要手动解析交易回执中的结果信息。更详细的使用方式可以参考:[交易回执解析](../transaction_decode.md) + +```java +TransactionDecoderService txDecoder = new TransactionDecoderService(client.getCryptoSuite(), client.isWASM()); +TransactionResponse transactionResponse = txDecoder.decodeReceiptWithValues(abi,"set",transactionReceipt); +``` + +## 9. 采用callback的方式异步操作合约 + +### 9.1 定义回调类 + +异步发送交易的时候,可以自定义回调类,实现和重写回调处理函数。 + +自定义的回调类需要继承抽象类`TransactionCallback`, 实现`onResponse`方法。同时,可按需决定是否需要重写`onError`、`onTimeout`等方法。 + +例如,我们定义一个简单的回调类。该回调类实现了一个基于可重入锁的异步调用效果,可减少线程的同步等待时间。 + +```java +public class TransactionCallbackMock extends TransactionCallback { + private TransactionReceipt transactionReceipt; + private ReentrantLock reentrantLock = new ReentrantLock(); + private Condition condition; + + public TransactionCallbackMock() { + condition = reentrantLock.newCondition(); + } + + public TransactionReceipt getResult() { + try { + reentrantLock.lock(); + while (transactionReceipt == null) { + condition.awaitUninterruptibly(); + } + return transactionReceipt; + } finally { + reentrantLock.unlock(); + } + } + + @Override + public void onResponse(TransactionReceipt transactionReceipt) { + try { + reentrantLock.lock(); + this.transactionReceipt = transactionReceipt; + condition.signal(); + } finally { + reentrantLock.unlock(); + } + } +} +``` + +### 9.2 采用callback的方式异步部署合约 + +首先,创建一个回调类的实例。然后使用`deployByContractLoaderAsync`方法,异步部署合约。 + +```java +// 创建回调类的实例 +TransactionCallbackMock callbackMock = new TransactionCallbackMock(); +AssembleTransactionProcessor transactionProcessor = TransactionProcessorFactory.createAssembleTransactionProcessor(client, keyPair, "src/main/resources/abi/", ""); +// 异步部署合约 +transactionProcessor.deployByContractLoaderAsync("HelloWorld", new ArrayList<>(), callbackMock); +// 异步等待获取回执 +TransactionReceipt transactionReceipt = callbackMock.getResult(); +``` + +### 9.3 采用callback的方式发送交易 + +参考部署合约交易,可采用异步的方式发送交易。 + +```java +// 创建回调类的实例 +TransactionCallbackMock callbackMock = new TransactionCallbackMock(); +// 定义构造参数 +List params = Lists.newArrayList("test"); +// 异步调用合约交易 +transactionProcessor.sendTransactionAsync(to, abi, "set", params, callbackMock); +// 异步等待获取回执 +TransactionReceipt transactionReceipt = callbackMock.getResult(); +``` + +## 10. 采用CompletableFuture的方式异步操作合约 + +SDK还支持使用`CompletableFuture`封装的方式异步部署合约。 + +```java +// 异步部署交易,并获得CompletableFuture 对象 +CompletableFuture future = transactionProcessor.deployAsync(abi, bin, new ArrayList<>(),""); +// 定义正常返回的业务逻辑 +future.thenAccept( + tr -> { + doSomething(tr); + }); +// 定义异常返回的业务逻辑 +future.exceptionally( + e -> { + doSomething(e); + return null; + }); +``` + +## 11. 详细API功能介绍 + +`AssembleTransactionProcessor`支持自定义参数发送交易,支持异步的方式来发送交易,也支持返回多种封装方式的结果。 + +可参考Java doc:[AssembleTransactionProcessor](./javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionProcessor.html) + +详细的API功能如下。 + +- **public void deployOnly(String abi, String bin, List\ params):** 传入合约abi、bin和构造函数参数来部署合约,不接收回执结果。 +- **public TransactionResponse deployAndGetResponse(String abi, String bin, List\ params) :** 传入合约abi、bin和构造函数参数来部署合约,接收回执结果 +- **TransactionResponse deployAndGetResponseWithStringParams(String abi, String bin, List\ params):** 传入合约abi和String类型的List作为构造函数参数来部署合约,接收TransactionResponse结果。 +- **void deployAsync(String abi, String bin, List\ params, TransactionCallback callback):** 传入合约abi、构造好的合约构造函数和callback来异步部署合约 +- **CompletableFuture\ deployAsync(String abi, String bin, List\ params):** 传入合约abi、bin和构造函数参数来部署合约,接收CompletableFuture封装的回执结果 +- **TransactionResponse deployByContractLoader(String contractName, List\ params):** 传入合约名和构造好的合约构造函数,接收TransactionResponse结果。 +- **void deployByContractLoaderAsync(String contractName, List\ args, TransactionCallback callback):** 传入合约名和合约构造函数参数以及callback,来异步部署合约 +- **TransactionReceipt sendTransactionAndGetReceiptByContractLoader(String contractName, String contractAddress, String functionName, List\ params):** 传入调用合约名称、合约地址、函数名和函数参数,接收交易回执 +- **TransactionResponse sendTransactionAndGetResponse(String to, String abi, String functionName, List\ params):** 传入调用合约地址、合约abi、函数名和函数参数,接收TransactionResponse结果 +- **TransactionResponse sendTransactionWithStringParamsAndGetResponse(String to, String abi, String functionName, List\ params):** 传入调用合约地址、合约abi、函数名和String类型List的函数参数,接收TransactionResponse结果 +- **void sendTransactionAsync(String to, String abi, String functionName, List\ params, TransactionCallback callback):** 传入调用合约地址、合约abi、函数名、函数参数、callback,异步发送交易。 +- **void sendTransactionAndGetReceiptByContractLoaderAsync(String contractName,String contractAddress, String functionName, List\ args, TransactionCallback callback):** 传入调用合约名、合约地址、函数名、函数参数、callback,异步发送交易。 +- **TransactionResponse sendTransactionAndGetResponseByContractLoader(String contractName, String contractAddress, String functionName, List\ funcParams):** 传入调用合约名、合约地址、函数名、函数参数,并接收TransactionResponse结果。 +- **CallResponse sendCallByContractLoader(String contractName, String contractAddress, String functionName, List\ params):** 传入调用合约名、合约地址、函数名、函数参数,并接收CallResponse结果。 +- **CallResponse sendCall(String from, String to, String abi, String functionName, List\ args):** 传入调用者地址、合约地址、合约abi、函数名、函数参数,并接收CallResponse结果。 +- **CallResponse sendCall(CallRequest callRequest):** 传入CallRequest,并接收CallResponse结果。 +- **CallResponse sendCallWithStringParams(String from, String to, String abi, String functionName, List\ paramsList):** 传入调用者地址、合约地址、合约abi、函数名、String类型List的函数参数,并接收CallResponse结果。 diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/config.md b/3.x/zh_CN/docs/sdk/java_sdk/config.md similarity index 93% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/config.md rename to 3.x/zh_CN/docs/sdk/java_sdk/config.md index 7808d4ffa..17b98b299 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/config.md +++ b/3.x/zh_CN/docs/sdk/java_sdk/config.md @@ -11,7 +11,7 @@ Java SDK主要包括五个配置选项,分别是 * AMOP配置(非必须) * 账户配置(非必须,不配置则使用默认配置值) * 线程池配置(非必须,不配置则使用默认配置值) -* Cpp SDK日志配置(必须) +* Cpp SDK日志配置(非必须,不配置默认不开) 支持的配置格式,包括 @@ -83,7 +83,7 @@ Java sdk主要包括五个配置选项,分别是 ### 证书配置 -基于安全考虑,Java SDK与节点间采用SSL加密通信,目前同时支持非国密SSL连接以及国密SSL连接,`[cryptoMaterial]`配置SSL连接的证书信息,具体包括如下配置项: +基于安全考虑,Java SDK与节点间采用SSL加密通信,目前同时支持非国密SSL连接以及国密SSL连接,java-sdk 3.3.0版本增加了对密码机的支持,交易签名验签可使用密码机里的密钥。`[cryptoMaterial]`配置SSL连接的证书信息,具体包括如下配置项: * `certPath`: 证书存放路径,默认是`conf`目录; @@ -97,11 +97,21 @@ Java sdk主要包括五个配置选项,分别是 * `enSslKey`: 国密SSL加密私钥路径,仅当SDK与节点间采用国密SSL连接时,需配置该配置项,默认从`${certPath}/sm_ensdk.key`加载国密SSL加密私钥;当卡其该配置项时,从配置项指定的路径加载国密SSL加密私钥。 +* `useSMCrypto`: 是否使用国密SSL连接,true为使用国密SSL; + +* `enableHsm`: 是否使用密码机,true为使用密码机; + +* `hsmLibPath`: 密码机动态库的文件路径; + +* `hsmKeyIndex`: 密码机密钥的索引; + +* `hsmPassword`: 密码机的密码; + ```eval_rst .. note:: - 大部分场景仅需要配置 `certPath` 配置项即可,其他配置项不需额外配置; - - SDK证书获取:参考 `SDK连接证书配置 <../cert_config.html>` - - SDK与节点RPC间SSL连接方式,可通过节点配置项 `sm_crypto` 判断,该配置项详细说明请参考 `FISCO BCOS配置文件与配置项说明 <../../../tutorial/air/config.html#rpc>`_ . + - SDK证书获取:参考 `SDK连接证书配置 <../cert_config.html>`_ . + - SDK与节点RPC间SSL连接方式,可通过节点配置项 `sm_crypto` 判断,该配置项详细说明请参考 `FISCO BCOS配置文件与配置项说明 <../../tutorial/air/config.html#rpc>`_ . ``` SDK证书配置示例如下: @@ -112,6 +122,11 @@ SDK证书配置示例如下: certPath = "conf" # The certification path useSMCrypto = "false" # RPC SM crypto type +# enableHsm = "false" +# hsmLibPath = "/usr/local/lib/libgmt0018.so" +# hsmKeyIndex = "1" +# hsmPassword = "12345678" + # The following configurations take the certPath by default if commented # caCert = "conf/ca.crt" # CA cert file path # sslCert = "conf/sdk.crt" # SSL cert file path @@ -135,7 +150,7 @@ SDK与FISCO BCOS节点通信,必须配置SDK连接的节点的`IP`和`Port`, ```eval_rst .. note:: 节点与网络之间的连接信息 - SDK与节点间通过 `RPC` 进行通信,SDK需要连接 `RPC` 的监听端口,该端口可通过节点 `config.ini` 的 `rpc.listen_port` 获取,具体请参考 `这里 <../../../tutorial/air/config.html#rpc>`_ + SDK与节点间通过 `RPC` 进行通信,SDK需要连接 `RPC` 的监听端口,该端口可通过节点 `config.ini` 的 `rpc.listen_port` 获取,具体请参考 `这里 <../../tutorial/air/config.html#rpc>`_ ``` SDK与节点间的网络配置示例如下: @@ -225,6 +240,11 @@ config-example.toml certPath = "conf" # The certification path useSMCrypto = "false" # RPC SM crypto type +# enableHsm = "false" +# hsmLibPath = "/usr/local/lib/libgmt0018.so" +# hsmKeyIndex = "1" +# hsmPassword = "12345678" + # The following configurations take the certPath by default if commented # caCert = "conf/ca.crt" # CA cert file path # sslCert = "conf/sdk.crt" # SSL cert file path @@ -275,6 +295,11 @@ Java SDK还支持`properties`、`yml`以及`xml`格式的配置文件。 cryptoMaterial.certPath=conf # The certification path cryptoMaterial.useSMCrypto=false +# cryptoMaterial.nableHsm=false +# cryptoMaterial.hsmLibPath=/usr/local/lib/libgmt0018.so +# cryptoMaterial.hsmKeyIndex=1 +# cryptoMaterial.hsmPassword=12345678 + # The following configurations take the certPath by default if commented # cryptoMaterial.caCert=conf/ca.crt # cryptoMaterial.sslCert=conf/sdk.crt @@ -385,6 +410,11 @@ cryptoMaterial: # enSslCert: "conf/sm_ensdk.crt" # enSslKey: "conf/sm_ensdk.key" +# enableHsm: false +# hsmLibPath: "/usr/local/lib/libgmt0018.so" +# hsmKeyIndex: "1" +# hsmPassword: "12345678" + network: defaultGroup: "group0" peers: diff --git a/3.x/zh_CN/docs/sdk/java_sdk/contract_parser.md b/3.x/zh_CN/docs/sdk/java_sdk/contract_parser.md new file mode 100644 index 000000000..b593c1957 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/contract_parser.md @@ -0,0 +1,226 @@ +# 合约编解码 + +标签:``java-sdk`` ``abi`` `scale` ``codec`` + +---- +在Java SDK 3.x版本使用`ABI`和`Scale`两种编解码格式,分别对**Solidity合约**和**WebankBlockchain-Liquid合约(简称WBC-Liquid)** 的函数签名、参数编码、返回结果进行编解码。 + +**注**:为了更加区别ABI和Scale的区分,3.0.0-rc3以后org.fisco.bcos.sdk.ABICodec改名为org.fisco.bcos.sdk.v3.codec.ContractCodec + +在Java SDK中,`org.fisco.bcos.sdk.v3.codec.ContractCodec`类提供了编码交易的输出(`data`的字段)、解析交易返回值及解析合约事件推送内容的功能。 + +这里以`Add.sol`合约为例,给出`ContractCodec`的使用参考。 + +```solidity +pragma solidity^0.6.0; + +contract Add { + + uint256 private _n; + event LogAdd(uint256 base, uint256 e); + + constructor() public { + _n = 100; + } + + function get() public view returns (uint256 n) { + return _n; + } + + function add(uint256 e) public returns (uint256 n) { + emit LogAdd(_n, e); + _n = _n + e; + return _n; + } +} +``` + +调用`add(uint256)`接口的交易回执内容如下,重点关注`input`、`output`和`logs`字段: + +```Java +{ + // 省略 ... + "input":"0x1003e2d2000000000000000000000000000000000000000000000000000000000000003c", + "output":"0x00000000000000000000000000000000000000000000000000000000000000a0", + "logs":[ + { + // 省略 ... + "data":"0x0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000003c", + // 省略 ... + } + ], + // 省略 ... +} +``` + +## 1. 初始化ContractCodec + +在使用`ContractCodec`的方法之前,需要先对密码学环境、编解码格式进行初始设定。ABICodec构造函数如下: + +```java +public ContractCodec(CryptoSuite cryptoSuite, boolean isWasm) { + // 省略 +} +``` + +CryptoSuite可以从初始化的Client类中进行获取,可参考链接:[初始化SDK](./assemble_transaction.html#sdk) + +isWasm是决定ContractCodec编码格式使用的重要参数: + +- 如果isWasm为true,那么将使用Scale编码格式对交易输入输出进行编解码,在节点中对应的是使用WBC-Liquid合约; +- 如果isWasm为false,那么将使用ABI编码格式对交易输入输出进行编解码,在节点中对应的是使用Solidity合约。 + +## 2. 构造部署合约构造函数input + +部署交易的input由两个部分组成,合约部署的二进制code以及构造函数所需参数的编码。其中二进制code为合约编译后的binary code。 + +```java +// bin + Object格式的参数列表, abi用于部署时插入到交易中 +byte[] encodeConstructor(String abi, String bin, List params); +// bin + String格式的参数列表, abi用于部署时插入到交易中 +byte[] encodeConstructorFromString(String abi, String bin, List params); +// bin + String格式的参数列表, abi需要额外插入到交易中 +byte[] encodeConstructorFromBytes(String bin, byte[] params); +``` + +## 3. 构造交易input + +交易的input由两部分组成,函数选择器及调用该函数所需参数的编码。其中input的前四个字节数据(如"0x1003e2d2")指定了要调用的函数选择器,函数选择器的计算方式为函数声明(去除空格,即`add(uint256)`)的哈希,取前4个字节。input的剩余部分为输入参数根据ABI编码之后的结果(如"000000000000000000000000000000000000000000000000000000000000003c"为参数"60"编码之后的结果)。 + +根据函数指定方式及参数输入格式的不同,`ContractCodec`分别提供了以下接口计算交易的`data`。 + +```Java +// 函数名 + Object格式的参数列表 +byte[] encodeMethod(String abi, String methodName, List params); +// 已有ABI定义 + Object格式的参数列表 +byte[] encodeMethodByAbiDefinition(ABIDefinition abiDefinition, List params); +// 函数声明 + Object格式的参数列表 +byte[] encodeMethodByInterface(String methodInterface, List params) +// 函数签名 + Object格式的参数列表 +byte[] encodeMethodById(String abi, byte[] methodId, List params); +// 函数名 + String格式的参数列表 +byte[] encodeMethodFromString(String abi, String methodName, List params); +// 函数声明 + String格式的参数列表 +byte[] encodeMethodByInterfaceFromString(String methodInterface, List params); +// 函数签名 + String格式的参数列表 +byte[] encodeMethodByIdFromString(String ABI, byte[] methodId, List params); +``` + +以下以`encodeMethod`为例举例说明使用方法,其他接口的使用方法类似。 + +```Java +// 初始化SDK +BcosSDK sdk = BcosSDK.build(configFile); +// 初始化group群组 +Client client = sdk.getClient("group0"); +// 使用Solidity合约 +boolean isWasm = false; +ContractCodec contractCodec = new ContractCodec(client.getCryptoSuite(), isWasm); +String abi = ""; // 合约ABI编码,省略 + +// 构造参数列表 +List argsObjects = new ArrayList(); +argsObjects.add(new BigInteger("60")); +try { + String encoded = contractCodec.encodeMethod(abi, "add", argsObjects)); + logger.info("encode method result, " + encoded); + // encoded = "0x1003e2d2000000000000000000000000000000000000000000000000000000000000003c" +} catch (ContractCodecException e) { + logger.info("encode method error, " + e.getMessage()); +} +``` + +## 4. 解析交易返回值 + +根据函数指定方式及返回值类型的不同,`ContractCodec`分别提供了以下接口解析函数返回值。 + +```Java +// ABI定义 + Object列表 + ABIObject返回列表 +Pair, List> decodeMethodAndGetOutputObject(ABIDefinition abiDefinition, String output) +// ABI定义 + ABIObject返回列表 +ABIObject decodeMethodAndGetOutAbiObjectByABIDefinition(ABIDefinition abiDefinition, String output) +// 函数名 + ABIObject返回列表 +ABIObject decodeMethodAndGetOutputAbiObject(String abi, String methodName, String output) +// 函数名 + Object格式的返回列表 +List decodeMethod(String abi, String methodName, String output) +// 函数声明 + Object格式的返回列表 +List decodeMethodByInterface(String abi, String methodInterface, byte[] output) +// 函数签名 + Object格式的返回列表 +List decodeMethodById(String abi, byte[] methodId, byte[] output) +// 函数名 + String格式的返回列表 +List decodeMethodToString(String abi, String methodName, byte[] output) +// 函数声明 + String格式的返回列表 +List decodeMethodByInterfaceToString(String abi, String methodInterface, byte[] output) +// 函数签名 + String格式的返回列表 +List decodeMethodByIdToString(String abi, byte[] methodId, byte[] output) +``` + +上述接口参数中的`output`为交易回执中的`output`字段("0x00000000000000000000000000000000000000000000000000000000000000a0")。接口的使用方法可参考构造交易input的接口用法。 + +## 5. 解析合约事件推送内容 + +根据事件指定方式及解析结果类型的不同,`ContractCodec`分别提供了以下接口解析事件内容。 + +```Java +// 事件名 + Object格式的解析结果列表 +List decodeEvent(String abi, String eventName, EventLog log) +// 事件声明 + Object格式的解析结果列表 +List decodeEventByInterface(String abi, String eventSignature, EventLog log) +// 事件签名/Topic + Object格式的解析结果列表 +List decodeEventByTopic(String abi, String eventTopic, EventLog log) +// 事件名 + String格式的解析结果列表 +List decodeEventToString(String abi, String eventName, EventLog log) +// 事件声明 + String格式的解析结果列表 +List decodeEventByInterfaceToString(String abi, String eventSignature, EventLog output) +// 事件签名/Topic + String格式的解析结果列表 +List decodeEventByTopicToString(String abi, String eventTopic, EventLog log) +``` + +对于事件推送,Java SDK需用户可以通过继承`EventCallback`类,重写`onReceiveLog`接口,实现自己对回调的处理逻辑。以下例子使用`decodeEvent`对推送的事件内容进行解析。其他接口的使用方法类似。 + +```Java +class SubscribeCallback implements EventSubCallback { + public void onReceiveLog(String eventSubId, int status, List logs) { + if (logs != null) { + String abi = ""; // 合约ABI编码,省略 + for (EventLog log : logs) { + // 使用Solidity + boolean isWasm = false; + ContractCodec contractCodec = new ContractCodec(client.getCryptoSuite(), isWasm); // client初始化,省略 + try { + List list = contractCodec.decodeEvent(abi, "LogAdd", log); + logger.debug("decode event log content, " + list); + // list.size() = 2 + } catch (ContractCodecException e) { + logger.error("decode event log error, " + e.getMessage()); + } + } + } + } +} +``` + +## 6. 解析交易输入值 + +与构造交易input相比,解析交易input是逆向操作,可以按照ABI解析出input参数。交易分为部署合约的交易与调用合约的交易,从上文可知,部署合约的交易input是由二进制code与编码后的构造函数参数拼接而成;调用合约的交易input是由函数选择器与与编码后的函数参数拼接而成。 + +```java +// ABI定义 + 去掉函数选择器之后的被编码过的参数 + Object,ABIObject返回列表 +Pair, List> decodeMethodAndGetInputObject(ABIDefinition abiDefinition, String params) +// ABI定义 + 交易input + ABIObject返回 +ABIObject decodeMethodAndGetInputObjectByABIDefinition(ABIDefinition abiDefinition, String input) +// ABI + 方法名 + 交易input + ABIObject返回 +ABIObject decodeMethodAndGetInputABIObject(String abi, String methodName, String input) +// ABI + 二进制code + 交易input + Object返回 +List decodeConstructorInput(String abi, String bin, String input) +// ABI + 二进制code + 交易input + String返回 +List decodeConstructorInputToString(String abi, String bin, String input) +// ABI定义 + 去掉函数选择器之后的被编码过的参数 + Object,ABIObject返回列表 +List decodeMethodInput(ABIDefinition abiDefinition, String input) +List decodeMethodInputById(String abi, byte[] methodId, byte[] input) +List decodeMethodInputByInterface(String abi, String methodInterface, byte[] input) +List decodeMethodInputToString(String abi, String methodName, byte[] input) +List decodeMethodInputByIdToString(String abi, byte[] methodId, byte[] input) +List decodeMethodInputByInterfaceToString(String abi, String methodInterface, byte[] input) +``` + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/contracts_to_java.md b/3.x/zh_CN/docs/sdk/java_sdk/contracts_to_java.md new file mode 100644 index 000000000..f699e1e3a --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/contracts_to_java.md @@ -0,0 +1,246 @@ +# 生成智能合约的Java接口文件 + +在控制台`console`和``java-sdk-demo``均提供了工具,可以将`solidity`合约生成出调用该合约`java`工具类。本例中使用``console``将Solidity合约生成出做调用该合约`java`工具类为例子。 + +> 体验 webankblockchain-liquid(以下简称WBC-Liquid),请参考第5小节。 +> +> 使用``java-sdk-demo``的例子请看第7小节。 + +## 1. 下载控制台 + +```shell +$ mkdir -p ~/fisco && cd ~/fisco +# 获取控制台 +$ curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v3.6.0/download_console.sh + +# 若因为网络问题导致长时间无法执行以上命令,请尝试以下命令: +$ curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master/tools/download_console.sh + +$ bash download_console.sh +$ cd ~/fisco/console +``` + +## 2. 将合约放置到控制台的合约目录 + +**然后,将您要用到的Solidity智能合约放入``~/fisco/console/contracts/solidity``的目录**。本次我们用console中的HelloWorld.sol作为例子。保证HelloWorld.sol在指定的目录下。 + +```shell +# 当前目录~/fisco/console +$ ls contracts/solidity +``` + +得到返回 + +```shell +HelloWorld.sol KVTableTest.sol ShaTest.sol KVTable.sol ... +``` + +## 3. 生成调用该智能合约的Java类 + +```shell +# 当前目录~/fisco/console +$ bash contract2java.sh solidity -p org.com.fisco -s ./contracts/solidity/HelloWorld.sol +# 以上命令中参数“org.com.fisco”是指定产生的java类所属的包名。 +# 通过命令./contract2java.sh -h可查看该脚本使用方法 +``` + +得到返回 + +```shell +*** Compile solidity HelloWorld.sol*** +INFO: Compile for solidity HelloWorld.sol success. +*** Convert solidity to java for HelloWorld.sol success *** +``` + +`contract2java.sh`使用方法将在附录2中详细介绍。 + +查看编译结果 + +```shell +$ ls contracts/sdk/java/org/com/fisco +# 得到返回 +# HelloWorld.java +``` + +运行成功之后,将会在`console/contracts/sdk`目录生成java、abi和bin目录,如下所示。 + +```shell +|-- abi # 编译生成的abi目录,存放solidity合约编译的abi文件 +| |-- HelloWorld.abi +|-- bin # 编译生成的bin目录,存放solidity合约编译的bin文件 +| |-- HelloWorld.bin +|-- java # 存放编译的包路径及Java合约文件 +| |-- org +| |-- com +| |-- fisco +| |-- HelloWorld.java # Solidity编译的HelloWorld Java文件 +``` + +Java目录下生成了`org/com/fisco/`包路径目录。包路径目录下将会生成Java合约文件`HelloWorld.java`。其中`HelloWorld.java`是Java应用所需要的Java合约文件。 + +## 4. 生成的Java文件代码结构 + +下面以生成的`HelloWorld.java`的接口列表为例,简要说明代码结构。 + +```java +public class HelloWorld extends Contract { + // 构造函数 + protected HelloWorld(String contractAddress, Client client, CryptoKeyPair credential); + // 根据CryptoSuite获取合约的code,若是国密就返回国密的code + public static String getBinary(CryptoSuite cryptoSuite); + // 获取合约的ABI json字符串 + public static String getABI(); + // HelloWorld合约get接口 + public String get() throws ContractException; + // HelloWorld合约get接口的Function类,记录了输入和返回的类型,可用于ABI解析 + public Function getMethodGetRawFunction() throws ContractException; + // HelloWorld合约set接口,输入String类型,返回交易回执 + public TransactionReceipt set(String n); + // HelloWorld合约set接口的Function类,记录了输入和返回的类型,可用于ABI解析 + public Function getMethodSetRawFunction(String n) throws ContractException; + // 获取已签名的调用set接口的交易,获取后可以直接发到链上 + public String getSignedTransactionForSet(String n); + // HelloWorld合约set异步接口,输入String类型,返回交易哈希 + public String set(String n, TransactionCallback callback); + // HelloWorld合约set的input解析 + public Tuple1 getSetInput(TransactionReceipt transactionReceipt); + // 若链上有已知的HelloWorld合约,可以用改接口直接加载出Java 的HelloWorld类。注意:ABI必须相同,否则会出现调用失败 + public static HelloWorld load(String contractAddress, Client client, CryptoKeyPair credential); + // 向链上发起部署合约操作,返回Java 的HelloWorld类。 + public static HelloWorld deploy(Client client, CryptoKeyPair credential) throws ContractException; +} +``` + +## 5. 生成WBC-Liquid合约的Java接口文件 + +与上文Solidity合约类似,如果你想体验 webankblockchain-liquid(以下简称WBC-Liquid)的部署操作,控制台也为你提供了例子。 + +在使用之前,请先保证cargo liquid的编译环境,使用搭建请参考:https://liquid-doc.readthedocs.io/。 + +### 5.1 WBC-Liquid合约的编译 + +可在控制台dist目录下contracts/liquid下查看,下面以hello_world为例子: + +```shell +$ ls contracts/liquid +asset_test hello_world kv_table_test + +$ cd contracts/liquid/hello_world + +# 使用cargo liquid 编译 +$ cargo liquid build +[1/4] 🔍 Collecting crate metadata +[2/4] 🚚 Building cargo project +[3/4] 🔗 Optimizing Wasm bytecode +[4/4] 📃 Generating ABI file + +✨ Done in 1 minute, your project is ready now: +Binary: ~/fisco/contracts/liquid/hello_world/target/hello_world.wasm + ABI: ~/fisco/console/dist/contracts/liquid/hello_world/target/hello_world.abi +``` + +生成`hello_world.wasm`和`hello_world.abi`两个文件 + +### 5.2 WBC-Liquid合约生成Java文件 + +```shell +# 当前目录~/fisco/console +$ bash contract2java.sh liquid -b ./contracts/liquid/hello_world/hello_world.wasm -a ./contracts/liquid/hello_world/hello_world.abi -s ./contracts/liquid/hello_world/hello_world_sm.wasm -p org.com.fisco +# 通过命令./contract2java.sh -h可查看该脚本使用方法 + +$ ls contracts/sdk/java/org/com/fisco +# 得到返回 +HelloWorld.java +``` + +## 6. contract2java.sh 脚本解析 + +控制台提供一个专门的生成Java合约工具,方便开发者将Solidity和WBC-Liquid合约文件编译为Java合约文件。 + +当前合约生成工具支持Solidity的自动编译并生成Java文件、支持指定WBC-Liquid编译后的WASM文件以及ABI文件生成Java文件。 + +### 6.1 Solidity合约使用 + +```shell +bash contract2java.sh solidity -h +usage: contract2java.sh [OPTIONS...] + -e,--enable-async-call [Optional] Enable generate async + interfaces for constant call, java file + only compilable when java-sdk >= 3.3.0. + -h,--help + -l,--libraries [Optional] Set library address + information built into the solidity + contract + eg: + --libraries lib1:lib1_address + lib2:lib2_address + -n,--no-analysis [Optional] NOT use evm static + parallel-able analysis. It will not + active DAG analysis, but will speedup + compile speed. + -o,--output [Optional] The file path of the + generated java code, default is + contracts/sdk/java/ + -p,--package [Optional] The package name of the + generated java code, default is com + -s,--sol [Optional] The solidity file path or the + solidity directory path, default is + contracts/solidity/ + -t,--transaction-version [Optional] Specify transaction version + interface, default is 0; If you want to + use the latest transaction interface, + please specify 1. +``` + +参数详细: + +- `package`: 生成`Java`文件的包名。 +- `sol`: (可选)`solidity`文件的路径,支持文件路径和目录路径两种方式,参数为目录时将目录下所有的`solidity`文件进行编译转换。默认目录为`contracts/solidity`。 +- `output`: (可选)生成`Java`文件的目录,默认生成在`contracts/sdk/java`目录。 +- `no-analysis`:(可选)跳过solidity编译的静态分析,可以有效缩减编译速度。静态分析可以分析合约的接口并行可行性,并将分析结果放到abi文件中。 +- `enable-async-call` :(可选)可生成具有异步call接口的Java文件,异步接口只有在Java-sdk版本>=3.3.0时使用。 +- `transaction-version`:(可选)指定生成Java文件发交易的版本号,默认是0,可以兼容所有版本的节点;当使用交易版本为1时,可以支持交易带有value、gasLimit、gasPrice、EIP1559等字段,只能发给3.6.0及以上的节点中。 + +### 6.2 WBC-Liquid合约使用 + +```shell +$ bash contract2java.sh liquid -h +usage: contract2java.sh [OPTIONS...] + -a,--abi [Required] The ABI file path of WBC-Liquid contract. + -b,--bin [Required] The binary file path of WBC-Liquid contract. + -h,--help + -o,--output [Optional] The file path of the generated java code, + default is contracts/sdk/java/ + -p,--package [Optional] The package name of the generated java + code, default is com + -s,--sm-bin [Required] The SM binary file path of WBC-Liquid + contract. +``` + +参数详细: + +- `abi`:(必选)WBC-Liquid合约`ABI`文件的路径,在使用`cargo liquid build`命令之后生成在target文件夹中。 +- `bin`:(必选)WBC-Liquid合约`wasm bin`文件的路径,在使用`cargo liquid build`命令之后生成在target文件夹中。 +- `package`:(可选)生成`Java`文件的包名,默认为`org`。 +- `sm-bin`:(必选)WBC-Liquid合约`wasm sm bin`文件的路径,在使用`cargo liquid build -g`命令之后生成在target文件夹中。 + +## 7. 使用``java-sdk-demo``给智能合约生成调用它的Java工具类 + +```shell +$ mkdir -p ~/fisco && cd ~/fisco +# 获取java-sdk代码 +$ git clone https://github.com/FISCO-BCOS/java-sdk-demo + +# 若因为网络问题导致长时间无法执行以上命令,请尝试以下命令: +$ git clone https://gitee.com/FISCO-BCOS/java-sdk-demo + +$ cd java-sdk-demo +# 编译 +$ ./gradlew clean build -x test +# 进入sdk-demo/dist目录,创建合约存放目录 +$ cd dist && mkdir -p contracts/solidity +# 将需要转换为java代码的sol文件拷贝到~/fisco/java-sdk/dist/contracts/solidity路径下 +# 转换sol, 其中${packageName}是生成的java代码包路径 +# 生成的java代码位于 ~/fisco/java-sdk/dist/contracts/sdk/java目录下 +java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.codegen.DemoSolcToJava ${packageName} +``` diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/crypto.md b/3.x/zh_CN/docs/sdk/java_sdk/crypto.md similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/crypto.md rename to 3.x/zh_CN/docs/sdk/java_sdk/crypto.md index de7a28234..2fc8f416f 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/crypto.md +++ b/3.x/zh_CN/docs/sdk/java_sdk/crypto.md @@ -1,4 +1,4 @@ -# 密码学模块 +# 签名与验签 标签:``java-sdk`` ``Crypto`` @@ -225,7 +225,7 @@ Java SDK目前支持创建非国密、国密类型的`CryptoSuite`。 ### 创建指定方法的签名验签对象调用签名验签接口 -**非国密签名/验签接口调用示例如下(签名密钥对的生成可参考[这里](./key_tool.html#id3)):** +**非国密签名/验签接口调用示例如下(签名密钥对的生成可参考[这里](./keytool.html#id3)):** ```java // 生成secp256k1签名 diff --git a/3.x/zh_CN/docs/sdk/java_sdk/event_sub.md b/3.x/zh_CN/docs/sdk/java_sdk/event_sub.md new file mode 100644 index 000000000..07aa865cb --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/event_sub.md @@ -0,0 +1,420 @@ +# 合约事件推送 + +标签:``java-sdk`` ``事件订阅`` ``Event`` + +---- + +## 1. 功能简介 + +合约事件推送功能提供了合约事件的异步推送机制,客户端向节点发送注册请求,在请求中携带客户端关注的合约事件的参数,节点根据请求参数对请求区块范围的`Event Log`进行过滤,将结果分次推送给客户端。 + +## 2. 交互协议 + +客户端与节点的交互基于WebSocket协议。交互分为三个阶段:注册请求,节点回复,`Event Log`数据推送。 + +### 2.1 注册请求 + +客户端向节点发送事件推送的注册请求: + +```Json +// request sample: +{ + "fromBlock": "latest", + "toBlock": "latest", + "addresses": [ + "0xca5ed56862869c25da0bdf186e634aac6c6361ee" + ], + "topics": [ + "0x91c95f04198617c60eaf2180fbca88fc192db379657df0e412a9f7dd4ebbe95d" + ], + "groupID": "group0", + "filterID": "bb31e4ec086c48e18f21cb994e2e5967" +} +``` + +- filerID:字符串类型,每次请求唯一,标记一次注册任务 +- groupID:字符串类型,群组ID +- fromBlock:整形字符串,初始区块。“latest” 当前块高 +- toBlock:整形字符串,最终区块。“latest” 处理至当前块高时,继续等待新区块 +- addresses:字符串或者字符串数组:字符串表示单个合约地址,数组为多个合约地址,数组可以为空 +- topics:字符串类型或者数组类型:字符串表示单个topic,数组为多个topic,数组可以为空 + +### 2.2 节点回复 + +节点接受客户端注册请求时,会对请求参数进行校验,将是否成功接受该注册请求结果回复给客户端。 + +```Json +// response sample: +{ + "filterID": "bb31e4ec086c48e18f21cb994e2e5967", + "result": 0 +} +``` + +- filterID:字符串类型,每次请求唯一,标记一次注册任务 +- result:整形,返回结果。0成功,其余为失败状态码 + +### 2.3 Event Log数据推送 + +节点验证客户端注册请求成功之后,根据客户端请求参数条件,向客户端推送`Event Log`数据。 + +```Json +// event log push sample: +{ + "filterID": "bb31e4ec086c48e18f21cb994e2e5967", + "result": 0, + "logs": [ + + ] +} +``` + +- filterID:字符串类型,每次请求唯一,标记一次注册任务 +- result:整形 0:`Event Log`数据推送 1:推送完成。客户端一次注册请求对应节点的数据推送会有多次(请求区块范围比较大或者等待新的区块),`result`字段为1时说明节点推送已经结束 +- logs:Log对象数组,result为0时有效 + +## 3. Java SDK 合约事件教程 + +### 注册接口 + +Java SDK中`org.fisco.bcos.sdk.v3.eventsub.EventSubscribe`类提供合约事件的注册接口,用户可以调用`subscribeEvent`向节点发送注册请求,并设置回调函数。 + +```Java + public String subscribeEvent(EventSubParams params, EventSubCallback callback); +``` + +#### `params`注册参数 + +事件回调请求注册的参数: + +```Java +public class EventSubParams { + private BigInteger fromBlock; + private BigInteger toBlock; + private List addresses; + private List> topics; +} +``` + +#### `callback`回调对象 + +```Java +public interface EventSubCallback { + void onReceiveLog(String eventSubId, int status, List logs); +} +``` + +- `status` 回调返回状态: + +```Java + 0 : 正常推送,此时logs为节点推送的事件日志 + 1 : 推送完成,执行区间的区块都已经处理 + 42000 : 其他错误 + -41000 : 参数无效,客户端验证参数错误返回 + -41001 : 参数错误,节点验证参数错误返回 + -41002 : 群组不存在 + -41003 : 请求错误的区块区间 + -41004 : 节点推送数据格式错误 + -41005 : 请求发送超时 + -41006 : 客户端无订阅权限 + -41007 : 事件尚未注册,取消订阅失败 +``` + +- `logs`表示回调的`Event Log`对象列表,status为0有效。默认值`null`,可以在子类中通过`org.fisco.bcos.sdk.v3.abi.ContractCodec`解析以下EventLog对象的`data`字段。 + +```Java + // EventLog 对象 + public class EventLog { + private String logIndex; + private String transactionIndex; + private String transactionHash; + private String blockNumber; + private String address; + private String data; + private List topics; + } +``` + +- 实现回调对象 + +Java SDK对回调类`EventSubCallback`无默认实现,用户可以通过继承`EventSubCallback`类,重写`onReceiveLog`接口,实现自己的回调逻辑处理。 + +```Java +class SubscribeCallback implements EventSubCallback { + public void onReceiveLog(String eventSubId, int status, List logs) { + // ADD CODE + } +} +``` + +**注意:`onReceiveLog`接口多次回调的`logs`有重复的可能性,可以根据`EventLog`对象中的`blockNumber,transactionIndex,logIndex`进行去重** + +#### topic工具 + +`org.fisco.bcos.sdk.v3.codec.abi.TopicTools`提供将各种类型参数转换为对应topic的工具,用户设置`EventSubParams`的`topics`参数可以使用。 + +```Java + class TopicTools { + // int1/uint1~uint1/uint256 + public static String integerToTopic(BigInteger i) + // bool + public static String boolToTopic(boolean b) + // address + public static String addressToTopic(String s) + // string + public static String stringToTopic(String s) + // bytes + public static String bytesToTopic(byte[] b) + // byte1~byte32 + public static String byteNToTopic(byte[] b) +} +``` + +## 4. 示例 + +这里以[`Asset`](https://github.com/FISCO-BCOS/LargeFiles/blob/master/tools/asset-app.tar.gz)合约的`TransferEvent`为例说明,给出合约事件推送的一些场景供用户参考。 + +```solidity +contract Asset { + event TransferEvent(int256 ret, string indexed from_account, string indexed to_account, uint256 indexed amount); + event TransferAccountEvent(string,string); + + function transfer(string from_account, string to_account, uint256 amount) public returns(int256) { + // 结果 + int result = 0; + + // 其他逻辑,省略 + + // TransferEvent 保存结果以及接口参数 + TransferEvent(result, from_account, to_account, amount); + + // TransferAccountEvent 保存账号 + TransferAccountEvent(from_account, to_account); + } +} +``` + +- 场景1:将链上所有/最新的事件回调至客户端 + +```Java + // 初始化EventSubscribe + EventSubscribe eventSubscribe = EventSubscribe.build(group, configOption); + eventSubscribe.start(); + + // 参数设置 + EventSubParams params = new EventSubParams(); + + // 全部Event fromBlock设置为 -1 + params.setFromBlock(-1); + + // toBlock设置为-1,处理至最新区块继续等待新的区块 + params.setToBlock(-1); + + // 注册事件 + eventSubscribe.subscribeEvent(params, + (eventSubId, status, logs) -> { + System.out.println("event sub id: " + eventSubId); + System.out.println(" \t status: " + status); + System.out.println(" \t logs: " + logs); + }); +``` + +- 场景2: 将`Asset`合约最新的`TransferEvent`事件回调至客户端 + +```Java + // 初始化EventSubscribe + EventSubscribe eventSubscribe = EventSubscribe.build(group, configOption); + eventSubscribe.start(); + + // 设置参数 + EventSubParams params = new EventSubParams(); + + // 从订阅时的最新区块区块开始,fromBlock设置为-1 + params.setFromBlock(-1); + // toBlock设置为-1,处理至最新区块继续等待新的区块 + params.setToBlock(-1); + + // topic0,TransferEvent(int256,string,string,uint256) + params.addTopic(0, TopicTools.stringToTopic("TransferEvent(int256,string,string,uint256)"); + + // 注册事件 + eventSubscribe.subscribeEvent(params, + (eventSubId, status, logs) -> { + System.out.println("event sub id: " + eventSubId); + System.out.println(" \t status: " + status); + System.out.println(" \t logs: " + logs); + }); +``` + +- 场景3: 将指定地址的`Asset`合约最新的`TransferEvent`事件回调至客户端 + +合约地址: `String addr = "0x06922a844c542df030a2a2be8f835892db99f324";` + +```Java + // 初始化EventSubscribe + EventSubscribe eventSubscribe = EventSubscribe.build(group, configOption); + eventSubscribe.start(); + + String addr = "0x06922a844c542df030a2a2be8f835892db99f324"; + + // 设置参数 + EventSubParams params = new EventSubParams(); + + // 从订阅时的最新区块区块开始,fromBlock设置为-1 + params.setFromBlock(-1); + // toBlock设置为-1,处理至最新区块继续等待新的区块 + params.setToBlock(-1); + + // addresses设置为asset地址,匹配该合约地址 + params.addAddress("0x06922a844c542df030a2a2be8f835892db99f324"); + + // topic0,TransferEvent(int256,string,string,uint256) + params.addTopic(0, TopicTools.stringToTopic("TransferEvent(int256,string,string,uint256)"); + + // 注册事件 + eventSubscribe.subscribeEvent(params, + (eventSubId, status, logs) -> { + System.out.println("event sub id: " + eventSubId); + System.out.println(" \t status: " + status); + System.out.println(" \t logs: " + logs); + }); +``` + +- 场景4: 将指定地址的`Asset`合约所有`TransferEvent`事件回调至客户端 + +合约地址: `String addr = "0x06922a844c542df030a2a2be8f835892db99f324";` + +```Java + // 其他初始化逻辑,省略 + + // 设置参数 + EventSubParams params = new EventSubParams(); + + // 从最初区块开始,fromBlock设置为1 + params.setFromBlock(1); + // toBlock设置为-1,处理至最新区块继续等待新的区块 + params.setToBlock(-1); + + // addresses设置为asset地址,匹配该合约地址 + params.addAddress("0x06922a844c542df030a2a2be8f835892db99f324"); + + // topic0,TransferEvent(int256,string,string,uint256) + params.addTopic(0, TopicTools.stringToTopic("TransferEvent(int256,string,string,uint256)"); + + // 注册事件 + eventSubscribe.subscribeEvent(params, + (eventSubId, status, logs) -> { + System.out.println("event sub id: " + eventSubId); + System.out.println(" \t status: " + status); + System.out.println(" \t logs: " + logs); + }); +``` + +## 4. 解析例子 + +以`Asset`合约为例,描述合约部署、调用、注册事件及解析节点推送事件内容的实现。注意:对增加了indexed属性的事件参数,均不进行解码,在相应位置上直接记录,其余非indexed属性的事件参数将进行解码。 + +```Java + String contractAddress = ""; + try { + AssembleTransactionProcessor manager = + TransactionProcessorFactory.createAssembleTransactionProcessor( + client, client.getCryptoSuite().createKeyPair(), abiFile, binFile); + // deploy + TransactionResponse response = manager.deployByContractLoader("Asset", Lists.newArrayList()); + if (!response.getTransactionReceipt().isStatusOK()) { + return; + } + contractAddress = response.getContractAddress(); + // call function with event + List paramsSetValues = new ArrayList(); + paramsSetValues.add("Alice"); + paramsSetValues.add("Bob"); + paramsSetValues.add(new BigInteger("100")); + TransactionResponse transactionResponse = + manager.sendTransactionAndGetResponse( + contractAddress, abi, "transfer", paramsSetValues); + logger.info("transaction response : " + JsonUtils.toJson(transactionResponse)); + } catch (Exception e) { + logger.error("exception:", e); + } + + // subscribe event + EventSubscribe eventSubscribe = EventSubscribe.build(group, configOption); + eventSubscribe.start(); + + EventSubParams eventLogParams = new EventSubParams(); + eventLogParams.setFromBlock(-1); + eventLogParams.setToBlock(-1); + eventLogParams.addAddress(contractAddress); + CryptoSuite invalidCryptoSuite = + new CryptoSuite(client.getCryptoSuite().getCryptoTypeConfig()); + TopicTools topicTools = new TopicTools(invalidCryptoSuite); + + eventLogParams.setTopics(topics); + eventLogParams.addTopic(0,topicTools.stringToTopic("TransferEvent(int256,string,string,uint256)")); + eventLogParams.addTopic(0,topicTools.stringToTopic("TransferAccountEvent(string,string)")); + + class SubscribeCallback implements EventSubCallback { + public transient Semaphore semaphore = new Semaphore(1, true); + + SubscribeCallback() { + try { + semaphore.acquire(1); + } catch (InterruptedException e) { + logger.error("error :", e); + Thread.currentThread().interrupt(); + } + } + + @Override + public void onReceiveLog(String eventId, int status, List logs) { + String str = "status in onReceiveLog : " + status; + logger.debug(str); + semaphore.release(); + + // decode event + if (logs != null) { + for (EventLog log : logs) { + logger.debug( + " blockNumber: {}, txIndex:{}, data: {}", + log.getBlockNumber(), + log.getTransactionIndex(), + log.getData()); + ContractCodec abiCodec = new ContractCodec(client.getCryptoSuite(), false); + try { + List list = abiCodec.decodeEvent(abi, "TransferEvent", log); + logger.debug("decode event log content, " + list); + // list = [0, + // 0x81376b9868b292a46a1c486d344e427a3088657fda629b5f4a647822d329cd6a, + // 0x28cac318a86c8a0a6a9156c2dba2c8c2363677ba0514ef616592d81557e679b6, + // 0x0000000000000000000000000000000000000000000000000000000000000064] + // 后三个事件参数均为indexed属性 + } catch (ContractCodecException e) { + logger.error("decode event log error, " + e.getMessage()); + } + try { + List list = + abiCodec.decodeEvent(abi, "TransferAccountEvent", log); + logger.debug("decode event log content, " + list); + // list = [Alice, Bob] + } catch (ContractCodecException e) { + logger.error("decode event log error, " + e.getMessage()); + } + } + } + } + } + + SubscribeCallback subscribeEventCallback1 = new SubscribeCallback(); + String registerId = + eventSubscribe.subscribeEvent(eventLogParams, subscribeEventCallback1); + try { + subscribeEventCallback1.semaphore.acquire(1); + subscribeEventCallback1.semaphore.release(); + logger.info("subscribe successful, registerId is " + registerId); + } catch (InterruptedException e) { + logger.error("system error:", e); + Thread.currentThread().interrupt(); + } +``` diff --git a/3.x/zh_CN/docs/sdk/java_sdk/index.md b/3.x/zh_CN/docs/sdk/java_sdk/index.md new file mode 100644 index 000000000..d326abde2 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/index.md @@ -0,0 +1,37 @@ +# 2. Java SDK + +标签:``java-sdk`` ``区块链应用`` + +---- + +```eval_rst +.. important:: + 相关软件和环境版本说明!`请查看 `_ +``` + +Java SDK 提供了访问 FISCO BCOS 节点的Java API,支持节点状态查询、部署和调用合约等功能. + +```eval_rst +.. toctree:: + :maxdepth: 1 + + quick_start.md + config.md + contracts_to_java.md + assemble_transaction.md + remote_sign_assemble_transaction.md + assemble_service.md + transaction_data_struct.md + rpc_api.md + precompiled_service_api.md + transaction_decode.md + contract_parser.md + retcode_retmsg.md + crypto.md + keytool.md + amop.md + event_sub.md + spring_boot_starter.md + spring_boot_crud.md + Java SDK JavaDoc +``` diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/allclasses-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/allclasses-frame.html similarity index 88% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/allclasses-frame.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/allclasses-frame.html index 41b3520a7..815a154a5 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/allclasses-frame.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/allclasses-frame.html @@ -4,7 +4,7 @@ -所有类 (java-sdk 3.0.0 API) +所有类 (java-sdk 3.6.0 API) @@ -18,6 +18,8 @@

所有类

  • ABIDefinition.NamedType
  • ABIDefinition.Type
  • ABIDefinitionFactory
  • +
  • AbiEncodedRequest
  • +
  • AbiEncodedRequestBuilder
  • AbiInfo
  • ABIObject
  • ABIObject.ListType
  • @@ -25,7 +27,9 @@

    所有类

  • ABIObject.ValueType
  • ABIObjectFactory
  • AbiTypes
  • +
  • AccessStatus
  • AccountConfig
  • +
  • AccountManager
  • Address
  • AddressUtils
  • Amop
  • @@ -33,13 +37,19 @@

    所有类

  • AmopImp
  • AmopTopic
  • Array
  • +
  • AssembleEIP1559TransactionService
  • AssembleTransactionProcessor
  • AssembleTransactionProcessorInterface
  • +
  • AssembleTransactionService
  • AssembleTransactionWithRemoteSignProcessor
  • AssembleTransactionWithRemoteSignProviderInterface
  • AsyncTransactionSignercInterface
  • AuthManager
  • AuthType
  • +
  • BalancePrecompiled
  • +
  • BalanceService
  • +
  • BasicDeployRequest
  • +
  • BasicRequest
  • BcosBlock
  • BcosBlock.Block
  • BcosBlock.BlockDeserializer
  • @@ -70,9 +80,11 @@

    所有类

  • BcosTransaction.ResponseDeserialiser
  • BcosTransactionReceipt
  • BcosTransactionReceipt.ResponseDeserialiser
  • +
  • BFSInfo
  • BFSPrecompiled
  • BFSPrecompiled.BfsInfo
  • BFSService
  • +
  • BFSUtils
  • BinInfo
  • BlockHash
  • BlockNumber
  • @@ -116,6 +128,7 @@

    所有类

  • ByteUtils
  • Call
  • Call.CallOutput
  • +
  • CallCallback
  • CallRequest
  • CallResponse
  • Client
  • @@ -129,6 +142,7 @@

    所有类

  • CommitteeManager
  • CommitteeManager.ExecResultEventResponse
  • Common
  • +
  • Common.TableKeyOrder
  • CommonConstant
  • CommonResponse
  • CompactBigIntWriter
  • @@ -137,7 +151,8 @@

    所有类

  • CompactUIntWriter
  • CompactULongWriter
  • Condition
  • -
  • Condition.ConditionOperator
  • +
  • ConditionOperator
  • +
  • ConditionV320
  • Config
  • ConfigException
  • ConfigOption
  • @@ -160,26 +175,37 @@

    所有类

  • ContractCodecJsonWrapper
  • ContractCodecTools
  • ContractException
  • +
  • ContractGasProvider
  • ContractLoader
  • +
  • Convert
  • +
  • Convert.Unit
  • CryptoKeyPair
  • CryptoMaterialConfig
  • CryptoSuite
  • CryptoType
  • Curve25519VRF
  • DecoderException
  • +
  • DefaultGasProvider
  • +
  • DefaultNonceAndBlockLimitProvider
  • +
  • DefaultTransactionManager
  • +
  • DeployTransactionRequest
  • +
  • DeployTransactionRequestWithStringParams
  • DynamicArray
  • DynamicBytes
  • DynamicStruct
  • ECDSAKeyPair
  • ECDSASignature
  • ECDSASignatureResult
  • +
  • EIP1559Struct
  • Encoder
  • EncoderException
  • Entry
  • EnumNodeVersion
  • +
  • EnumNodeVersion.Version
  • Event
  • EventEncoder
  • EventLog
  • +
  • EventLogAddrAndTopics
  • EventSubCallback
  • EventSubParams
  • EventSubResponse
  • @@ -210,6 +236,9 @@

    所有类

  • HashException
  • Hex
  • HexEncoder
  • +
  • HsmSM2KeyPair
  • +
  • HsmSM2Signature
  • +
  • InjectFetcher
  • Int
  • Int104
  • Int112
  • @@ -258,12 +287,16 @@

    所有类

  • KVTableService
  • LinuxSecureRandom
  • LoadKeyStoreException
  • +
  • MerkleCalculator
  • MerkleProofUnit
  • +
  • MerkleProofUtility
  • MessageDecodingException
  • MessageEncodingException
  • NetworkConfig
  • +
  • NodeType
  • NodeVersion
  • NodeVersion.ClientVersion
  • +
  • NonceAndBlockLimitProvider
  • NoSuchTransactionFileException
  • Numeric
  • NumericType
  • @@ -282,14 +315,18 @@

    所有类

  • PrecompiledCallback
  • PrecompiledConstant
  • PrecompiledRetCode
  • +
  • PrecompiledVersionCheck
  • ProposalInfo
  • ProposalManager
  • ProposalStatus
  • ProposalType
  • +
  • ProxySignTransactionManager
  • ReceiptParser
  • +
  • RemoteBlockLimitCallbackInterface
  • +
  • RemoteNonceCallbackInterface
  • RemoteSignCallbackInterface
  • RemoteSignProviderInterface
  • -
  • RespCallback
  • +
  • RespCallback
  • Response
  • ResponseCallback
  • ResultCodeEnum
  • @@ -303,6 +340,8 @@

    所有类

  • ScaleWriter
  • SealerList
  • SealerList.Sealer
  • +
  • ShardingPrecompiled
  • +
  • ShardingService
  • Signature
  • SignatureException
  • SignatureResult
  • @@ -344,6 +383,8 @@

    所有类

  • StaticArray7
  • StaticArray8
  • StaticArray9
  • +
  • StaticEIP1559GasProvider
  • +
  • StaticGasProvider
  • StaticStruct
  • StringUtils
  • StructType
  • @@ -353,6 +394,8 @@

    所有类

  • SyncStatus.SyncStatusInfoConvert
  • SystemConfig
  • SystemConfig.Config
  • +
  • SystemConfigFeature
  • +
  • SystemConfigFeature.Features
  • SystemConfigPrecompiled
  • SystemConfigService
  • SystemInformation
  • @@ -360,11 +403,15 @@

    所有类

  • TableCRUDService
  • TableManagerPrecompiled
  • TableManagerPrecompiled.TableInfo
  • +
  • TableManagerPrecompiled.TableInfoV320
  • TablePrecompiled
  • TablePrecompiled.Condition
  • +
  • TablePrecompiled.ConditionV320
  • TablePrecompiled.Entry
  • TablePrecompiled.Limit
  • TablePrecompiled.UpdateField
  • +
  • TarsClient
  • +
  • TarsTransactionProcessor
  • ThreadPoolConfig
  • ThreadPoolService
  • TopicTools
  • @@ -379,6 +426,8 @@

    所有类

  • TransactionEncoderInterface
  • TransactionEncoderService
  • TransactionException
  • +
  • TransactionJniSignerService
  • +
  • TransactionManager
  • TransactionProcessor
  • TransactionProcessorFactory
  • TransactionProcessorInterface
  • @@ -387,12 +436,16 @@

    所有类

  • TransactionReceipt
  • TransactionReceipt.Logs
  • TransactionReceiptStatus
  • +
  • TransactionRequest
  • +
  • TransactionRequestBuilder
  • +
  • TransactionRequestWithStringParams
  • TransactionResponse
  • TransactionRetCodeConstants
  • TransactionSignerFactory
  • TransactionSignerInterface
  • TransactionSignerService
  • TransactionSignerWithRemoteSignService
  • +
  • TransferTransactionService
  • Tuple
  • Tuple1
  • Tuple10
  • diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/allclasses-noframe.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/allclasses-noframe.html similarity index 87% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/allclasses-noframe.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/allclasses-noframe.html index 49235144c..587505b22 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/allclasses-noframe.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/allclasses-noframe.html @@ -4,7 +4,7 @@ -所有类 (java-sdk 3.0.0 API) +所有类 (java-sdk 3.6.0 API) @@ -18,6 +18,8 @@

    所有类

  • ABIDefinition.NamedType
  • ABIDefinition.Type
  • ABIDefinitionFactory
  • +
  • AbiEncodedRequest
  • +
  • AbiEncodedRequestBuilder
  • AbiInfo
  • ABIObject
  • ABIObject.ListType
  • @@ -25,7 +27,9 @@

    所有类

  • ABIObject.ValueType
  • ABIObjectFactory
  • AbiTypes
  • +
  • AccessStatus
  • AccountConfig
  • +
  • AccountManager
  • Address
  • AddressUtils
  • Amop
  • @@ -33,13 +37,19 @@

    所有类

  • AmopImp
  • AmopTopic
  • Array
  • +
  • AssembleEIP1559TransactionService
  • AssembleTransactionProcessor
  • AssembleTransactionProcessorInterface
  • +
  • AssembleTransactionService
  • AssembleTransactionWithRemoteSignProcessor
  • AssembleTransactionWithRemoteSignProviderInterface
  • AsyncTransactionSignercInterface
  • AuthManager
  • AuthType
  • +
  • BalancePrecompiled
  • +
  • BalanceService
  • +
  • BasicDeployRequest
  • +
  • BasicRequest
  • BcosBlock
  • BcosBlock.Block
  • BcosBlock.BlockDeserializer
  • @@ -70,9 +80,11 @@

    所有类

  • BcosTransaction.ResponseDeserialiser
  • BcosTransactionReceipt
  • BcosTransactionReceipt.ResponseDeserialiser
  • +
  • BFSInfo
  • BFSPrecompiled
  • BFSPrecompiled.BfsInfo
  • BFSService
  • +
  • BFSUtils
  • BinInfo
  • BlockHash
  • BlockNumber
  • @@ -116,6 +128,7 @@

    所有类

  • ByteUtils
  • Call
  • Call.CallOutput
  • +
  • CallCallback
  • CallRequest
  • CallResponse
  • Client
  • @@ -129,6 +142,7 @@

    所有类

  • CommitteeManager
  • CommitteeManager.ExecResultEventResponse
  • Common
  • +
  • Common.TableKeyOrder
  • CommonConstant
  • CommonResponse
  • CompactBigIntWriter
  • @@ -137,7 +151,8 @@

    所有类

  • CompactUIntWriter
  • CompactULongWriter
  • Condition
  • -
  • Condition.ConditionOperator
  • +
  • ConditionOperator
  • +
  • ConditionV320
  • Config
  • ConfigException
  • ConfigOption
  • @@ -160,26 +175,37 @@

    所有类

  • ContractCodecJsonWrapper
  • ContractCodecTools
  • ContractException
  • +
  • ContractGasProvider
  • ContractLoader
  • +
  • Convert
  • +
  • Convert.Unit
  • CryptoKeyPair
  • CryptoMaterialConfig
  • CryptoSuite
  • CryptoType
  • Curve25519VRF
  • DecoderException
  • +
  • DefaultGasProvider
  • +
  • DefaultNonceAndBlockLimitProvider
  • +
  • DefaultTransactionManager
  • +
  • DeployTransactionRequest
  • +
  • DeployTransactionRequestWithStringParams
  • DynamicArray
  • DynamicBytes
  • DynamicStruct
  • ECDSAKeyPair
  • ECDSASignature
  • ECDSASignatureResult
  • +
  • EIP1559Struct
  • Encoder
  • EncoderException
  • Entry
  • EnumNodeVersion
  • +
  • EnumNodeVersion.Version
  • Event
  • EventEncoder
  • EventLog
  • +
  • EventLogAddrAndTopics
  • EventSubCallback
  • EventSubParams
  • EventSubResponse
  • @@ -210,6 +236,9 @@

    所有类

  • HashException
  • Hex
  • HexEncoder
  • +
  • HsmSM2KeyPair
  • +
  • HsmSM2Signature
  • +
  • InjectFetcher
  • Int
  • Int104
  • Int112
  • @@ -258,12 +287,16 @@

    所有类

  • KVTableService
  • LinuxSecureRandom
  • LoadKeyStoreException
  • +
  • MerkleCalculator
  • MerkleProofUnit
  • +
  • MerkleProofUtility
  • MessageDecodingException
  • MessageEncodingException
  • NetworkConfig
  • +
  • NodeType
  • NodeVersion
  • NodeVersion.ClientVersion
  • +
  • NonceAndBlockLimitProvider
  • NoSuchTransactionFileException
  • Numeric
  • NumericType
  • @@ -282,14 +315,18 @@

    所有类

  • PrecompiledCallback
  • PrecompiledConstant
  • PrecompiledRetCode
  • +
  • PrecompiledVersionCheck
  • ProposalInfo
  • ProposalManager
  • ProposalStatus
  • ProposalType
  • +
  • ProxySignTransactionManager
  • ReceiptParser
  • +
  • RemoteBlockLimitCallbackInterface
  • +
  • RemoteNonceCallbackInterface
  • RemoteSignCallbackInterface
  • RemoteSignProviderInterface
  • -
  • RespCallback
  • +
  • RespCallback
  • Response
  • ResponseCallback
  • ResultCodeEnum
  • @@ -303,6 +340,8 @@

    所有类

  • ScaleWriter
  • SealerList
  • SealerList.Sealer
  • +
  • ShardingPrecompiled
  • +
  • ShardingService
  • Signature
  • SignatureException
  • SignatureResult
  • @@ -344,6 +383,8 @@

    所有类

  • StaticArray7
  • StaticArray8
  • StaticArray9
  • +
  • StaticEIP1559GasProvider
  • +
  • StaticGasProvider
  • StaticStruct
  • StringUtils
  • StructType
  • @@ -353,6 +394,8 @@

    所有类

  • SyncStatus.SyncStatusInfoConvert
  • SystemConfig
  • SystemConfig.Config
  • +
  • SystemConfigFeature
  • +
  • SystemConfigFeature.Features
  • SystemConfigPrecompiled
  • SystemConfigService
  • SystemInformation
  • @@ -360,11 +403,15 @@

    所有类

  • TableCRUDService
  • TableManagerPrecompiled
  • TableManagerPrecompiled.TableInfo
  • +
  • TableManagerPrecompiled.TableInfoV320
  • TablePrecompiled
  • TablePrecompiled.Condition
  • +
  • TablePrecompiled.ConditionV320
  • TablePrecompiled.Entry
  • TablePrecompiled.Limit
  • TablePrecompiled.UpdateField
  • +
  • TarsClient
  • +
  • TarsTransactionProcessor
  • ThreadPoolConfig
  • ThreadPoolService
  • TopicTools
  • @@ -379,6 +426,8 @@

    所有类

  • TransactionEncoderInterface
  • TransactionEncoderService
  • TransactionException
  • +
  • TransactionJniSignerService
  • +
  • TransactionManager
  • TransactionProcessor
  • TransactionProcessorFactory
  • TransactionProcessorInterface
  • @@ -387,12 +436,16 @@

    所有类

  • TransactionReceipt
  • TransactionReceipt.Logs
  • TransactionReceiptStatus
  • +
  • TransactionRequest
  • +
  • TransactionRequestBuilder
  • +
  • TransactionRequestWithStringParams
  • TransactionResponse
  • TransactionRetCodeConstants
  • TransactionSignerFactory
  • TransactionSignerInterface
  • TransactionSignerService
  • TransactionSignerWithRemoteSignService
  • +
  • TransferTransactionService
  • Tuple
  • Tuple1
  • Tuple10
  • diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/constant-values.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/constant-values.html similarity index 84% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/constant-values.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/constant-values.html index bd45650b6..f9c10118d 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/constant-values.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/constant-values.html @@ -4,7 +4,7 @@ -常量字段值 (java-sdk 3.0.0 API) +常量字段值 (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + +
    + + + + + + + +
    + + +
    +

    已过时的 API

    +

    目录

    + +
    +
    + + + + + + + +
    + +
    + + + + + + + +
    + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/help-doc.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/help-doc.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/help-doc.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/help-doc.html index e6f7fc548..53e93d6ff 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/help-doc.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/help-doc.html @@ -4,7 +4,7 @@ -API 帮助 (java-sdk 3.0.0 API) +API 帮助 (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.amop

    +
    +

    接口

    + +

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-summary.html new file mode 100644 index 000000000..4d5fbe344 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-summary.html @@ -0,0 +1,157 @@ + + + + + + +org.fisco.bcos.sdk.v3.amop (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.amop

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      接口概要 
      接口说明
      Amop +
      AMOP module interface.
      +
      +
    • +
    • + + + + + + + + + + + + +
      类概要 
      说明
      AmopImp 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-tree.html new file mode 100644 index 000000000..58b69bf79 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/amop/package-tree.html @@ -0,0 +1,139 @@ + + + + + + +org.fisco.bcos.sdk.v3.amop 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.amop的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.amop.AmopImp (implements org.fisco.bcos.sdk.v3.amop.Amop)
      • +
      +
    • +
    +

    接口分层结构

    +
      +
    • org.fisco.bcos.sdk.v3.amop.Amop
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/Client.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/Client.html new file mode 100644 index 000000000..81ca9d8b0 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/Client.html @@ -0,0 +1,2887 @@ + + + + + + +Client (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.client
    +

    接口 Client

    +
    +
    +
    +
      +
    • +
      +
      所有已知实现类:
      +
      ClientImpl, TarsClient
      +
      +
      +
      +
      public interface Client
      +
      This is the interface of client module.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          logger

          +
          static final org.slf4j.Logger logger
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          build

          +
          static Client build(ConfigOption configOption)
          +
          Build a client instance GroupId is identified, all interfaces are available
          +
          +
          参数:
          +
          configOption - the config
          +
          返回:
          +
          a client instance
          +
          +
        • +
        + + + +
          +
        • +

          build

          +
          static Client build(java.lang.String groupId,
          +                    ConfigOption configOption)
          +
          Build a client instance GroupId is identified, all interfaces are available
          +
          +
          参数:
          +
          groupId - the group info
          +
          configOption - the config
          +
          返回:
          +
          a client instance
          +
          +
        • +
        + + + +
          +
        • +

          build

          +
          static Client build(java.lang.String groupId,
          +                    ConfigOption configOption,
          +                    long nativePointer)
          +
          Build a client instance GroupId is identified, all interfaces are available, with specific + jniRPC
          +
          +
          参数:
          +
          groupId - the group info
          +
          configOption - the config
          +
          nativePointer - jni impl native handler
          +
          返回:
          +
          a client instance
          +
          +
        • +
        + + + +
          +
        • +

          getNativePointer

          +
          long getNativePointer()
          +
          +
          返回:
          +
          native pointer
          +
          +
        • +
        + + + +
          +
        • +

          getExtraData

          +
          java.lang.String getExtraData()
          +
        • +
        + + + +
          +
        • +

          setExtraData

          +
          void setExtraData(java.lang.String extraData)
          +
        • +
        + + + +
          +
        • +

          getCryptoSuite

          +
          CryptoSuite getCryptoSuite()
          +
          Get CryptoSuite
          +
          +
          返回:
          +
          the CryptoSuite
          +
          +
        • +
        + + + +
          +
        • +

          getCryptoType

          +
          java.lang.Integer getCryptoType()
          +
          Get crypto type
          +
          +
          返回:
          +
          the CryptoType, e.g. ECDSA_TYPE
          +
          +
        • +
        + + + +
          +
        • +

          isWASM

          +
          java.lang.Boolean isWASM()
          +
          Whether is wasm exec env
          +
          +
          返回:
          +
          true when wasm exec env
          +
          +
        • +
        + + + +
          +
        • +

          isAuthCheck

          +
          java.lang.Boolean isAuthCheck()
          +
          Whether is auth check in chain
          +
          +
          返回:
          +
          true when chain in auth mode
          +
          +
        • +
        + + + +
          +
        • +

          isEnableCommittee

          +
          java.lang.Boolean isEnableCommittee()
          +
          Whether is committee enable in chain
          +
          +
          返回:
          +
          true when chain can use committee
          +
          +
        • +
        + + + +
          +
        • +

          isSerialExecute

          +
          java.lang.Boolean isSerialExecute()
          +
        • +
        + + + +
          +
        • +

          getGroup

          +
          java.lang.String getGroup()
          +
          get groupId of the client
          +
          +
          返回:
          +
          the groupId
          +
          +
        • +
        + + + +
          +
        • +

          getChainId

          +
          java.lang.String getChainId()
          +
          get groupId of the client
          +
          +
          返回:
          +
          the groupId
          +
          +
        • +
        + + + +
          +
        • +

          getConfigOption

          +
          ConfigOption getConfigOption()
          +
          +
          返回:
          +
          return client config
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          BcosTransactionReceipt sendTransaction(java.lang.String signedTransactionData,
          +                                       boolean withProof)
          +
          Ledger operation: send transaction
          +
          +
          参数:
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          返回:
          +
          Transaction receipt
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          BcosTransactionReceipt sendTransaction(java.lang.String node,
          +                                       java.lang.String signedTransactionData,
          +                                       boolean withProof)
          +
          Ledger operation: send transaction
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          返回:
          +
          Transaction receipt
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAsync

          +
          void sendTransactionAsync(java.lang.String signedTransactionData,
          +                          boolean withProof,
          +                          TransactionCallback callback)
          +
          Ledger operation: async send transaction
          +
          +
          参数:
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAsync

          +
          void sendTransactionAsync(java.lang.String node,
          +                          java.lang.String signedTransactionData,
          +                          boolean withProof,
          +                          TransactionCallback callback)
          +
          Ledger operation: async send transaction
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          call

          +
          Call call(Transaction transaction)
          +
          Ledger operation: call contract functions without sending transaction
          +
          +
          参数:
          +
          transaction - transaction instance
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          call

          +
          Call call(java.lang.String node,
          +          Transaction transaction)
          +
          Ledger operation: call contract functions without sending transaction
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          transaction - transaction instance
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          call

          +
          Call call(Transaction transaction,
          +          java.lang.String sign)
          +
          Ledger operation: call contract functions without sending transaction
          +
          +
          参数:
          +
          transaction - transaction instance
          +
          sign - the sign of call data hash(to+data)
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          call

          +
          Call call(java.lang.String node,
          +          Transaction transaction,
          +          java.lang.String sign)
          +
          Ledger operation: call contract functions without sending transaction
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          transaction - transaction instance
          +
          sign - the sign of call data hash(to+data)
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          callAsync

          +
          void callAsync(Transaction transaction,
          +               RespCallback<Call> callback)
          +
          Ledger operation: async call contract functions without sending transaction
          +
          +
          参数:
          +
          transaction - transaction instance
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          callAsync

          +
          void callAsync(java.lang.String node,
          +               Transaction transaction,
          +               RespCallback<Call> callback)
          +
          Ledger operation: async call contract functions without sending transaction
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          transaction - transaction instance
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          callAsync

          +
          void callAsync(Transaction transaction,
          +               java.lang.String sign,
          +               RespCallback<Call> callback)
          +
          Ledger operation: async call contract functions without sending transaction
          +
          +
          参数:
          +
          transaction - transaction instance
          +
          sign - the sign of call data hash(to+data)
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          callAsync

          +
          void callAsync(java.lang.String node,
          +               Transaction transaction,
          +               java.lang.String sign,
          +               RespCallback<Call> callback)
          +
          Ledger operation: async call contract functions without sending transaction
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          transaction - transaction instance
          +
          sign - the sign of call data hash(to+data)
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockNumber

          +
          BlockNumber getBlockNumber()
          +
          Ledger operation: get block number
          +
          +
          返回:
          +
          block number
          +
          +
        • +
        + + + +
          +
        • +

          getBlockNumber

          +
          BlockNumber getBlockNumber(java.lang.String node)
          +
          Ledger operation: get block number
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          block number
          +
          +
        • +
        + + + +
          +
        • +

          getBlockNumberAsync

          +
          void getBlockNumberAsync(RespCallback<BlockNumber> callback)
          +
          Ledger operation: async get block number
          +
          +
          参数:
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockNumberAsync

          +
          void getBlockNumberAsync(java.lang.String node,
          +                         RespCallback<BlockNumber> callback)
          +
          Ledger operation: async get block number
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getCode

          +
          Code getCode(java.lang.String address)
          +
          Ledger operation: get code
          +
          +
          参数:
          +
          address - the address string
          +
          返回:
          +
          a code instance
          +
          +
        • +
        + + + +
          +
        • +

          getCode

          +
          Code getCode(java.lang.String node,
          +             java.lang.String address)
          +
          Ledger operation: get code
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          address - the address string
          +
          返回:
          +
          a code instance
          +
          +
        • +
        + + + +
          +
        • +

          getCodeAsync

          +
          void getCodeAsync(java.lang.String address,
          +                  RespCallback<Code> callback)
          +
          Ledger operation: async get code
          +
          +
          参数:
          +
          address - the address string
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getCodeAsync

          +
          void getCodeAsync(java.lang.String node,
          +                  java.lang.String address,
          +                  RespCallback<Code> callback)
          +
          Ledger operation: async get code
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          address - the address string
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getABI

          +
          Abi getABI(java.lang.String address)
          +
          Scheduler: get abi
          +
          +
          参数:
          +
          address - the address string
          +
          返回:
          +
          abi string
          +
          +
        • +
        + + + +
          +
        • +

          getABI

          +
          Abi getABI(java.lang.String node,
          +           java.lang.String address)
          +
          Ledger operation: get abi
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          address - the address string
          +
          返回:
          +
          a code instance
          +
          +
        • +
        + + + +
          +
        • +

          getABIAsync

          +
          void getABIAsync(java.lang.String address,
          +                 RespCallback<Abi> callback)
          +
          Ledger operation: async get abi
          +
          +
          参数:
          +
          address - the address string
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getABIAsync

          +
          void getABIAsync(java.lang.String node,
          +                 java.lang.String address,
          +                 RespCallback<Abi> callback)
          +
          Ledger operation: async get abi
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          address - the address string
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTotalTransactionCount

          +
          TotalTransactionCount getTotalTransactionCount()
          +
          Ledger operation: get total transaction coun
          +
          +
          返回:
          +
          TotalTransactionCount
          +
          +
        • +
        + + + +
          +
        • +

          getTotalTransactionCount

          +
          TotalTransactionCount getTotalTransactionCount(java.lang.String node)
          +
          Ledger operation: get total transaction coun
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          TotalTransactionCount
          +
          +
        • +
        + + + +
          +
        • +

          getTotalTransactionCountAsync

          +
          void getTotalTransactionCountAsync(RespCallback<TotalTransactionCount> callback)
          +
          Ledger operation: async get total transaction count
          +
          +
          参数:
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTotalTransactionCountAsync

          +
          void getTotalTransactionCountAsync(java.lang.String node,
          +                                   RespCallback<TotalTransactionCount> callback)
          +
          Ledger operation: async get total transaction count
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByHash

          +
          BcosBlock getBlockByHash(java.lang.String blockHash,
          +                         boolean onlyHeader,
          +                         boolean onlyTxHash)
          +
          Ledger operation: get block by hash
          +
          +
          参数:
          +
          blockHash - the hashcode of the block
          +
          onlyHeader - if true then only return block header
          +
          onlyTxHash - the boolean define the tx is full or not
          +
          返回:
          +
          a block
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByHash

          +
          BcosBlock getBlockByHash(java.lang.String node,
          +                         java.lang.String blockHash,
          +                         boolean onlyHeader,
          +                         boolean onlyTxHash)
          +
          Ledger operation: get block by hash
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockHash - the hashcode of the block
          +
          onlyHeader - if true then only return block header
          +
          onlyTxHash - the boolean define the tx is full or not
          +
          返回:
          +
          a block
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByHashAsync

          +
          void getBlockByHashAsync(java.lang.String blockHash,
          +                         boolean onlyHeader,
          +                         boolean onlyTxHash,
          +                         RespCallback<BcosBlock> callback)
          +
          Ledger operation: async get block by hash
          +
          +
          参数:
          +
          blockHash - the hashcode of the block
          +
          onlyHeader - if true then only return block header
          +
          onlyTxHash - the boolean define the tx is full or not
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByHashAsync

          +
          void getBlockByHashAsync(java.lang.String node,
          +                         java.lang.String blockHash,
          +                         boolean onlyHeader,
          +                         boolean onlyTxHash,
          +                         RespCallback<BcosBlock> callback)
          +
          Ledger operation: async get block by hash
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockHash - the hashcode of the block
          +
          onlyHeader - if true then only return block header
          +
          onlyTxHash - the boolean define the tx is full or not
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByNumber

          +
          BcosBlock getBlockByNumber(java.math.BigInteger blockNumber,
          +                           boolean onlyHeader,
          +                           boolean onlyTxHash)
          +
          Ledger operation: get block by block number
          +
          +
          参数:
          +
          blockNumber - the number of the block
          +
          onlyHeader - the boolean define if only return header
          +
          onlyTxHash - the boolean define if only return tx hash
          +
          返回:
          +
          block
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByNumber

          +
          BcosBlock getBlockByNumber(java.lang.String node,
          +                           java.math.BigInteger blockNumber,
          +                           boolean onlyHeader,
          +                           boolean onlyTxHash)
          +
          Ledger operation: get block by block number
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockNumber - the number of the block
          +
          onlyHeader - the boolean define if only return header
          +
          onlyTxHash - the boolean define if only return tx hash
          +
          返回:
          +
          block
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByNumberAsync

          +
          void getBlockByNumberAsync(java.math.BigInteger blockNumber,
          +                           boolean onlyHeader,
          +                           boolean onlyTxHash,
          +                           RespCallback<BcosBlock> callback)
          +
          Ledger operation: async get block by block number
          +
          +
          参数:
          +
          blockNumber - the number of the block
          +
          onlyHeader - the boolean if only need header
          +
          onlyTxHash - the boolean if you need all transactions
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByNumberAsync

          +
          void getBlockByNumberAsync(java.lang.String node,
          +                           java.math.BigInteger blockNumber,
          +                           boolean onlyHeader,
          +                           boolean onlyTxHash,
          +                           RespCallback<BcosBlock> callback)
          +
          Ledger operation: async get block by block number
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockNumber - the number of the block
          +
          onlyHeader - the boolean if only need header
          +
          onlyTxHash - the boolean if you need all transactions
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockHashByNumber

          +
          BlockHash getBlockHashByNumber(java.math.BigInteger blockNumber)
          +
          Ledger operation: async get block hash by block number
          +
          +
          参数:
          +
          blockNumber - the number of the block
          +
          返回:
          +
          BlockHash
          +
          +
        • +
        + + + +
          +
        • +

          getBlockHashByNumberAsync

          +
          void getBlockHashByNumberAsync(java.math.BigInteger blockNumber,
          +                               RespCallback<BlockHash> callback)
          +
          Ledger operation: async get block hash by block number
          +
          +
          参数:
          +
          blockNumber - the number of the block
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockHashByNumber

          +
          BlockHash getBlockHashByNumber(java.lang.String node,
          +                               java.math.BigInteger blockNumber)
          +
          Ledger operation: async get block hash by block number
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockNumber - the number of the block
          +
          返回:
          +
          BlockHash
          +
          +
        • +
        + + + +
          +
        • +

          getBlockHashByNumberAsync

          +
          void getBlockHashByNumberAsync(java.lang.String node,
          +                               java.math.BigInteger blockNumber,
          +                               RespCallback<BlockHash> callback)
          +
          Ledger operation: async get block hash by block number
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockNumber - the number of the block
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTransaction

          +
          BcosTransaction getTransaction(java.lang.String transactionHash,
          +                               java.lang.Boolean withProof)
          +
          Ledger operation: get transaction by hash
          +
          +
          参数:
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          返回:
          +
          transaction
          +
          +
        • +
        + + + +
          +
        • +

          getTransaction

          +
          BcosTransaction getTransaction(java.lang.String node,
          +                               java.lang.String transactionHash,
          +                               java.lang.Boolean withProof)
          +
          Ledger operation: get trnasaction by hash
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          返回:
          +
          transaction
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionAsync

          +
          void getTransactionAsync(java.lang.String transactionHash,
          +                         java.lang.Boolean withProof,
          +                         RespCallback<BcosTransaction> callback)
          +
          Ledger operation: async get trnasaction by hash
          +
          +
          参数:
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionAsync

          +
          void getTransactionAsync(java.lang.String node,
          +                         java.lang.String transactionHash,
          +                         java.lang.Boolean withProof,
          +                         RespCallback<BcosTransaction> callback)
          +
          Ledger operation: async get trnasaction by hash
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionReceipt

          +
          BcosTransactionReceipt getTransactionReceipt(java.lang.String transactionHash,
          +                                             java.lang.Boolean withProof)
          +
          Ledger operation: get transaction receipt by transaction hash
          +
          +
          参数:
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          返回:
          +
          transaction receipt
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionReceipt

          +
          BcosTransactionReceipt getTransactionReceipt(java.lang.String node,
          +                                             java.lang.String transactionHash,
          +                                             java.lang.Boolean withProof)
          +
          Ledger operation: get transaction receipt by transaction hash
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction receipt proof
          +
          返回:
          +
          transaction receipt
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionReceiptAsync

          +
          void getTransactionReceiptAsync(java.lang.String transactionHash,
          +                                java.lang.Boolean withProof,
          +                                RespCallback<BcosTransactionReceipt> callback)
          +
          Ledger operation: async get transaction receipt by transaction hash
          +
          +
          参数:
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction receipt proof
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionReceiptAsync

          +
          void getTransactionReceiptAsync(java.lang.String node,
          +                                java.lang.String transactionHash,
          +                                java.lang.Boolean withProof,
          +                                RespCallback<BcosTransactionReceipt> callback)
          +
          Ledger operation: async get transaction receipt by transaction hash
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction receipt proof
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getPendingTxSize

          +
          PendingTxSize getPendingTxSize(java.lang.String node)
          +
          Ledger operation: get pending transaction size
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          PendingTxSize
          +
          +
        • +
        + + + +
          +
        • +

          getPendingTxSizeAsync

          +
          void getPendingTxSizeAsync(java.lang.String node,
          +                           RespCallback<PendingTxSize> callback)
          +
          Ledger operation: async get pending transaction size
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getPendingTxSize

          +
          PendingTxSize getPendingTxSize()
          +
          Ledger operation: get pending transaction size
          +
          +
          返回:
          +
          PendingTxSize
          +
          +
        • +
        + + + +
          +
        • +

          getPendingTxSizeAsync

          +
          void getPendingTxSizeAsync(RespCallback<PendingTxSize> callback)
          +
          Ledger operation: async get pending transaction size
          +
          +
          参数:
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockLimit

          +
          java.math.BigInteger getBlockLimit()
          +
          Get cached block height
          +
          +
          返回:
          +
          block number
          +
          +
        • +
        + + + +
          +
        • +

          getPeers

          +
          Peers getPeers()
          +
          Peer operation: get connected peers
          +
          +
          返回:
          +
          peers
          +
          +
        • +
        + + + +
          +
        • +

          getGroupPeers

          +
          GroupPeers getGroupPeers()
          +
          get the group peers
          +
          +
          返回:
          +
          the groupPeers
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getPeersAsync

          +
          void getPeersAsync(RespCallback<Peers> callback)
          +
          Peer operation: async get connected peers
          +
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getObserverList

          +
          ObserverList getObserverList()
          +
          Peer operation: get observer node list
          +
          +
          返回:
          +
          observer node list
          +
          +
        • +
        + + + +
          +
        • +

          getObserverList

          +
          ObserverList getObserverList(java.lang.String node)
          +
          Peer operation: get observer node list
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          observer node list
          +
          +
        • +
        + + + +
          +
        • +

          getObserverList

          +
          void getObserverList(RespCallback<ObserverList> callback)
          +
          Peer operation: async get observer node list
          +
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getObserverList

          +
          void getObserverList(java.lang.String node,
          +                     RespCallback<ObserverList> callback)
          +
          Peer operation: async get observer node list
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSealerList

          +
          SealerList getSealerList()
          +
          Peer operation: get sealer node list
          +
          +
          返回:
          +
          sealer node list
          +
          +
        • +
        + + + +
          +
        • +

          getSealerList

          +
          SealerList getSealerList(java.lang.String node)
          +
          Peer operation: get sealer node list
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          sealer node list
          +
          +
        • +
        + + + +
          +
        • +

          getSealerListAsync

          +
          void getSealerListAsync(RespCallback<SealerList> callback)
          +
          Peer operation: async get sealer node list
          +
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSealerListAsync

          +
          void getSealerListAsync(java.lang.String node,
          +                        RespCallback<SealerList> callback)
          +
          Peer operation: async get sealer node list
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getNodeListByType

          +
          SealerList getNodeListByType(java.lang.String type)
          +
          get node list by type
          +
          +
          参数:
          +
          type - type of node, now support consensus_sealer, consensus_observer and + consensus_candidate_sealer
          +
          返回:
          +
          node list
          +
          +
        • +
        + + + +
          +
        • +

          getNodeListByType

          +
          SealerList getNodeListByType(java.lang.String node,
          +                             java.lang.String type)
          +
          get node list by type
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          type - type of node, now support consensus_sealer, consensus_observer and + consensus_candidate_sealer
          +
          返回:
          +
          node list
          +
          +
        • +
        + + + +
          +
        • +

          getNodeListByTypeAsync

          +
          void getNodeListByTypeAsync(java.lang.String type,
          +                            RespCallback<SealerList> callback)
          +
          async get node list by type
          +
          +
          参数:
          +
          type - type of node, now support consensus_sealer, consensus_observer and + consensus_candidate_sealer
          +
          callback - the callback
          +
          +
        • +
        + + + +
          +
        • +

          getNodeListByTypeAsync

          +
          void getNodeListByTypeAsync(java.lang.String node,
          +                            java.lang.String type,
          +                            RespCallback<SealerList> callback)
          +
          async get node list by type
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          type - type of node, now support consensus_sealer, consensus_observer and + consensus_candidate_sealer
          +
          callback - the callback
          +
          +
        • +
        + + + +
          +
        • +

          getPbftView

          +
          PbftView getPbftView()
          +
          Peer operation: get pbft view
          +
          +
          返回:
          +
          pbft view
          +
          +
        • +
        + + + +
          +
        • +

          getPbftView

          +
          PbftView getPbftView(java.lang.String node)
          +
          Peer operation: get pbft view
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          pbft view
          +
          +
        • +
        + + + +
          +
        • +

          getPbftViewAsync

          +
          void getPbftViewAsync(RespCallback<PbftView> callback)
          +
          Peer operation: async get pbft view
          +
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getPbftViewAsync

          +
          void getPbftViewAsync(java.lang.String node,
          +                      RespCallback<PbftView> callback)
          +
          Peer operation: async get pbft view
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSystemConfigByKey

          +
          SystemConfig getSystemConfigByKey(java.lang.String key)
          +
          Peer operation: get system config
          +
          +
          参数:
          +
          key - the string of key
          +
          返回:
          +
          system config
          +
          +
        • +
        + + + +
          +
        • +

          getSystemConfigByKey

          +
          SystemConfig getSystemConfigByKey(java.lang.String node,
          +                                  java.lang.String key)
          +
          Peer operation: get system config
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          key - the string of key
          +
          返回:
          +
          system config
          +
          +
        • +
        + + + +
          +
        • +

          getSystemConfigByKeyAsync

          +
          void getSystemConfigByKeyAsync(java.lang.String key,
          +                               RespCallback<SystemConfig> callback)
          +
          Peer operation: async get system config
          +
          +
          参数:
          +
          key - the string of key
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSystemConfigByKeyAsync

          +
          void getSystemConfigByKeyAsync(java.lang.String node,
          +                               java.lang.String key,
          +                               RespCallback<SystemConfig> callback)
          +
          Peer operation: async get system config
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          key - the string of key
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSyncStatus

          +
          SyncStatus getSyncStatus(java.lang.String node)
          +
          Peer operation: get sync status
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          sync status
          +
          +
        • +
        + + + +
          +
        • +

          getSyncStatusAsync

          +
          void getSyncStatusAsync(java.lang.String node,
          +                        RespCallback<SyncStatus> callback)
          +
          Peer operation: async get sync status
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSyncStatus

          +
          SyncStatus getSyncStatus()
          +
          Peer operation: get sync status
          +
          +
          返回:
          +
          sync status
          +
          +
        • +
        + + + +
          +
        • +

          getSyncStatusAsync

          +
          void getSyncStatusAsync(RespCallback<SyncStatus> callback)
          +
          Peer operation: async get sync status
          +
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getConsensusStatusAsync

          +
          void getConsensusStatusAsync(java.lang.String node,
          +                             RespCallback<ConsensusStatus> callback)
          +
          async get consensus status
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback
          +
          +
        • +
        + + + +
          +
        • +

          getConsensusStatusAsync

          +
          void getConsensusStatusAsync(RespCallback<ConsensusStatus> callback)
          +
          async get consensus status
          +
          +
          参数:
          +
          callback - callback when get consensus status
          +
          +
        • +
        + + + +
          +
        • +

          getConsensusStatus

          +
          ConsensusStatus getConsensusStatus(java.lang.String node)
          +
          sync get consensus status
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          consensus status info
          +
          +
        • +
        + + + +
          +
        • +

          getConsensusStatus

          +
          ConsensusStatus getConsensusStatus()
          +
          sync get consensus status
          +
          +
          返回:
          +
          consensus status info
          +
          +
        • +
        + + + +
          +
        • +

          getGroupList

          +
          BcosGroupList getGroupList()
          +
          get group list
          +
          +
          返回:
          +
          group list
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getGroupInfo

          +
          BcosGroupInfo getGroupInfo()
          +
          get group info
          +
          +
          返回:
          +
          group info
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getGroupInfoList

          +
          BcosGroupInfoList getGroupInfoList()
          +
          get group info list
          +
          +
          返回:
          +
          group info list
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getGroupNodeInfo

          +
          BcosGroupNodeInfo getGroupNodeInfo(java.lang.String node)
          +
          get group node info
          +
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          group node info
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getChainVersion

          +
          @Deprecated
          +EnumNodeVersion getChainVersion()
          +
          已过时。 use getChainCompatibilityVersion instead, because older version sdk did not + recognize newer chain node
          +
          get the chain compatibility version
          +
          +
          返回:
          +
          the chain compatibility version
          +
          +
        • +
        + + + +
          +
        • +

          getChainCompatibilityVersion

          +
          EnumNodeVersion.Version getChainCompatibilityVersion()
          +
          get the chain compatibility version
          +
          +
          返回:
          +
          the chain compatibility version
          +
          +
        • +
        + + + +
          +
        • +

          getChainCompatibilityVersionAsync

          +
          void getChainCompatibilityVersionAsync(RespCallback<EnumNodeVersion.Version> versionRespCallback)
          +
          async get the chain compatibility version
          +
          +
          参数:
          +
          versionRespCallback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          setNodeToSendRequest

          +
          void setNodeToSendRequest(java.lang.String nodeToSendRequest)
          +
          Set node name to send rpc request directly, if not set, will use random node in the + groupInfoList. Node name should choose from groupInfo.
          +
          +
          参数:
          +
          nodeToSendRequest - the node name
          +
          +
        • +
        + + + +
          +
        • +

          isSupportTransactionV1

          +
          boolean isSupportTransactionV1()
          +
          Check this client whether supporting sending transaction with v1 version or not.
          +
          +
          返回:
          +
          is this client support sending transaction with v1 version
          +
          +
        • +
        + + + +
          +
        • +

          getNodeToSendRequest

          +
          java.lang.String getNodeToSendRequest()
          +
          get node name to send rpc request directly
          +
          +
          返回:
          +
          the node name
          +
          +
        • +
        + + + +
          +
        • +

          getNegotiatedProtocol

          +
          int getNegotiatedProtocol()
          +
          Get the protocol version after SDK and Blockchain node negotiated. This method returns int + with max and min version bits combined, which is (max|min). Max protocol version is in first + 16 bit, and min protocol version in the second 16 bit.
          +
          +
          返回:
          +
          (max|min) bits combined.
          +
          +
        • +
        + + + +
          +
        • +

          start

          +
          void start()
          +
        • +
        + + + +
          +
        • +

          stop

          +
          void stop()
          +
        • +
        + + + +
          +
        • +

          destroy

          +
          void destroy()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/ClientImpl.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/ClientImpl.html new file mode 100644 index 000000000..502f155bb --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/ClientImpl.html @@ -0,0 +1,3333 @@ + + + + + + +ClientImpl (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.client
    +

    类 ClientImpl

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.client.ClientImpl
      • +
      +
    • +
    +
    +
      +
    • +
      +
      所有已实现的接口:
      +
      Client
      +
      +
      +
      直接已知子类:
      +
      TarsClient
      +
      +
      +
      +
      public class ClientImpl
      +extends java.lang.Object
      +implements Client
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          objectMapper

          +
          protected final com.fasterxml.jackson.databind.ObjectMapper objectMapper
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          ClientImpl

          +
          protected ClientImpl(java.lang.String groupID,
          +                     ConfigOption configOption,
          +                     long nativePointer)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          initGroupInfo

          +
          protected void initGroupInfo()
          +
        • +
        + + + +
          +
        • +

          getExtraData

          +
          public java.lang.String getExtraData()
          +
          +
          指定者:
          +
          getExtraData 在接口中 Client
          +
          +
        • +
        + + + +
          +
        • +

          setExtraData

          +
          public void setExtraData(java.lang.String extraData)
          +
          +
          指定者:
          +
          setExtraData 在接口中 Client
          +
          +
        • +
        + + + +
          +
        • +

          getNativePointer

          +
          public long getNativePointer()
          +
          +
          指定者:
          +
          getNativePointer 在接口中 Client
          +
          返回:
          +
          native pointer
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getGroup

          +
          public java.lang.String getGroup()
          +
          从接口复制的说明: Client
          +
          get groupId of the client
          +
          +
          指定者:
          +
          getGroup 在接口中 Client
          +
          返回:
          +
          the groupId
          +
          +
        • +
        + + + +
          +
        • +

          getChainId

          +
          public java.lang.String getChainId()
          +
          从接口复制的说明: Client
          +
          get groupId of the client
          +
          +
          指定者:
          +
          getChainId 在接口中 Client
          +
          返回:
          +
          the groupId
          +
          +
        • +
        + + + +
          +
        • +

          getSmCrypto

          +
          public java.lang.Boolean getSmCrypto()
          +
        • +
        + + + +
          +
        • +

          getCryptoSuite

          +
          public CryptoSuite getCryptoSuite()
          +
          从接口复制的说明: Client
          +
          Get CryptoSuite
          +
          +
          指定者:
          +
          getCryptoSuite 在接口中 Client
          +
          返回:
          +
          the CryptoSuite
          +
          +
        • +
        + + + +
          +
        • +

          getCryptoType

          +
          public java.lang.Integer getCryptoType()
          +
          从接口复制的说明: Client
          +
          Get crypto type
          +
          +
          指定者:
          +
          getCryptoType 在接口中 Client
          +
          返回:
          +
          the CryptoType, e.g. ECDSA_TYPE
          +
          +
        • +
        + + + +
          +
        • +

          isWASM

          +
          public java.lang.Boolean isWASM()
          +
          从接口复制的说明: Client
          +
          Whether is wasm exec env
          +
          +
          指定者:
          +
          isWASM 在接口中 Client
          +
          返回:
          +
          true when wasm exec env
          +
          +
        • +
        + + + +
          +
        • +

          isAuthCheck

          +
          public java.lang.Boolean isAuthCheck()
          +
          从接口复制的说明: Client
          +
          Whether is auth check in chain
          +
          +
          指定者:
          +
          isAuthCheck 在接口中 Client
          +
          返回:
          +
          true when chain in auth mode
          +
          +
        • +
        + + + +
          +
        • +

          isEnableCommittee

          +
          public java.lang.Boolean isEnableCommittee()
          +
          从接口复制的说明: Client
          +
          Whether is committee enable in chain
          +
          +
          指定者:
          +
          isEnableCommittee 在接口中 Client
          +
          返回:
          +
          true when chain can use committee
          +
          +
        • +
        + + + +
          +
        • +

          isSerialExecute

          +
          public java.lang.Boolean isSerialExecute()
          +
          +
          指定者:
          +
          isSerialExecute 在接口中 Client
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public BcosTransactionReceipt sendTransaction(java.lang.String signedTransactionData,
          +                                              boolean withProof)
          +
          从接口复制的说明: Client
          +
          Ledger operation: send transaction
          +
          +
          指定者:
          +
          sendTransaction 在接口中 Client
          +
          参数:
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          返回:
          +
          Transaction receipt
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public BcosTransactionReceipt sendTransaction(java.lang.String node,
          +                                              java.lang.String signedTransactionData,
          +                                              boolean withProof)
          +
          从接口复制的说明: Client
          +
          Ledger operation: send transaction
          +
          +
          指定者:
          +
          sendTransaction 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          返回:
          +
          Transaction receipt
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAsync

          +
          public void sendTransactionAsync(java.lang.String signedTransactionData,
          +                                 boolean withProof,
          +                                 TransactionCallback callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async send transaction
          +
          +
          指定者:
          +
          sendTransactionAsync 在接口中 Client
          +
          参数:
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAsync

          +
          public void sendTransactionAsync(java.lang.String node,
          +                                 java.lang.String signedTransactionData,
          +                                 boolean withProof,
          +                                 TransactionCallback callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async send transaction
          +
          +
          指定者:
          +
          sendTransactionAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          call

          +
          public Call call(Transaction transaction)
          +
          从接口复制的说明: Client
          +
          Ledger operation: call contract functions without sending transaction
          +
          +
          指定者:
          +
          call 在接口中 Client
          +
          参数:
          +
          transaction - transaction instance
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          call

          +
          public Call call(java.lang.String node,
          +                 Transaction transaction)
          +
          从接口复制的说明: Client
          +
          Ledger operation: call contract functions without sending transaction
          +
          +
          指定者:
          +
          call 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          transaction - transaction instance
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          call

          +
          public Call call(Transaction transaction,
          +                 java.lang.String sign)
          +
          从接口复制的说明: Client
          +
          Ledger operation: call contract functions without sending transaction
          +
          +
          指定者:
          +
          call 在接口中 Client
          +
          参数:
          +
          transaction - transaction instance
          +
          sign - the sign of call data hash(to+data)
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          call

          +
          public Call call(java.lang.String node,
          +                 Transaction transaction,
          +                 java.lang.String sign)
          +
          从接口复制的说明: Client
          +
          Ledger operation: call contract functions without sending transaction
          +
          +
          指定者:
          +
          call 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          transaction - transaction instance
          +
          sign - the sign of call data hash(to+data)
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          callAsync

          +
          public void callAsync(Transaction transaction,
          +                      RespCallback<Call> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async call contract functions without sending transaction
          +
          +
          指定者:
          +
          callAsync 在接口中 Client
          +
          参数:
          +
          transaction - transaction instance
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          callAsync

          +
          public void callAsync(java.lang.String node,
          +                      Transaction transaction,
          +                      RespCallback<Call> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async call contract functions without sending transaction
          +
          +
          指定者:
          +
          callAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          transaction - transaction instance
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          callAsync

          +
          public void callAsync(Transaction transaction,
          +                      java.lang.String sign,
          +                      RespCallback<Call> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async call contract functions without sending transaction
          +
          +
          指定者:
          +
          callAsync 在接口中 Client
          +
          参数:
          +
          transaction - transaction instance
          +
          sign - the sign of call data hash(to+data)
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          callAsync

          +
          public void callAsync(java.lang.String node,
          +                      Transaction transaction,
          +                      java.lang.String sign,
          +                      RespCallback<Call> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async call contract functions without sending transaction
          +
          +
          指定者:
          +
          callAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          transaction - transaction instance
          +
          sign - the sign of call data hash(to+data)
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockNumber

          +
          public BlockNumber getBlockNumber()
          +
          从接口复制的说明: Client
          +
          Ledger operation: get block number
          +
          +
          指定者:
          +
          getBlockNumber 在接口中 Client
          +
          返回:
          +
          block number
          +
          +
        • +
        + + + +
          +
        • +

          getBlockNumber

          +
          public BlockNumber getBlockNumber(java.lang.String node)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get block number
          +
          +
          指定者:
          +
          getBlockNumber 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          block number
          +
          +
        • +
        + + + +
          +
        • +

          getBlockNumberAsync

          +
          public void getBlockNumberAsync(RespCallback<BlockNumber> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block number
          +
          +
          指定者:
          +
          getBlockNumberAsync 在接口中 Client
          +
          参数:
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockNumberAsync

          +
          public void getBlockNumberAsync(java.lang.String node,
          +                                RespCallback<BlockNumber> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block number
          +
          +
          指定者:
          +
          getBlockNumberAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getCode

          +
          public Code getCode(java.lang.String address)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get code
          +
          +
          指定者:
          +
          getCode 在接口中 Client
          +
          参数:
          +
          address - the address string
          +
          返回:
          +
          a code instance
          +
          +
        • +
        + + + +
          +
        • +

          getCode

          +
          public Code getCode(java.lang.String node,
          +                    java.lang.String address)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get code
          +
          +
          指定者:
          +
          getCode 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          address - the address string
          +
          返回:
          +
          a code instance
          +
          +
        • +
        + + + +
          +
        • +

          getCodeAsync

          +
          public void getCodeAsync(java.lang.String address,
          +                         RespCallback<Code> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get code
          +
          +
          指定者:
          +
          getCodeAsync 在接口中 Client
          +
          参数:
          +
          address - the address string
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getCodeAsync

          +
          public void getCodeAsync(java.lang.String node,
          +                         java.lang.String address,
          +                         RespCallback<Code> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get code
          +
          +
          指定者:
          +
          getCodeAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          address - the address string
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getABI

          +
          public Abi getABI(java.lang.String address)
          +
          从接口复制的说明: Client
          +
          Scheduler: get abi
          +
          +
          指定者:
          +
          getABI 在接口中 Client
          +
          参数:
          +
          address - the address string
          +
          返回:
          +
          abi string
          +
          +
        • +
        + + + +
          +
        • +

          getABI

          +
          public Abi getABI(java.lang.String node,
          +                  java.lang.String address)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get abi
          +
          +
          指定者:
          +
          getABI 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          address - the address string
          +
          返回:
          +
          a code instance
          +
          +
        • +
        + + + +
          +
        • +

          getABIAsync

          +
          public void getABIAsync(java.lang.String address,
          +                        RespCallback<Abi> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get abi
          +
          +
          指定者:
          +
          getABIAsync 在接口中 Client
          +
          参数:
          +
          address - the address string
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getABIAsync

          +
          public void getABIAsync(java.lang.String node,
          +                        java.lang.String address,
          +                        RespCallback<Abi> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get abi
          +
          +
          指定者:
          +
          getABIAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          address - the address string
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getTotalTransactionCount

          +
          public TotalTransactionCount getTotalTransactionCount(java.lang.String node)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get total transaction coun
          +
          +
          指定者:
          +
          getTotalTransactionCount 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          TotalTransactionCount
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getTotalTransactionCountAsync

          +
          public void getTotalTransactionCountAsync(java.lang.String node,
          +                                          RespCallback<TotalTransactionCount> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get total transaction count
          +
          +
          指定者:
          +
          getTotalTransactionCountAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByHash

          +
          public BcosBlock getBlockByHash(java.lang.String blockHash,
          +                                boolean onlyHeader,
          +                                boolean onlyTxHash)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get block by hash
          +
          +
          指定者:
          +
          getBlockByHash 在接口中 Client
          +
          参数:
          +
          blockHash - the hashcode of the block
          +
          onlyHeader - if true then only return block header
          +
          onlyTxHash - the boolean define the tx is full or not
          +
          返回:
          +
          a block
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByHash

          +
          public BcosBlock getBlockByHash(java.lang.String node,
          +                                java.lang.String blockHash,
          +                                boolean onlyHeader,
          +                                boolean onlyTxHash)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get block by hash
          +
          +
          指定者:
          +
          getBlockByHash 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockHash - the hashcode of the block
          +
          onlyHeader - if true then only return block header
          +
          onlyTxHash - the boolean define the tx is full or not
          +
          返回:
          +
          a block
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByHashAsync

          +
          public void getBlockByHashAsync(java.lang.String blockHash,
          +                                boolean onlyHeader,
          +                                boolean onlyTxHash,
          +                                RespCallback<BcosBlock> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block by hash
          +
          +
          指定者:
          +
          getBlockByHashAsync 在接口中 Client
          +
          参数:
          +
          blockHash - the hashcode of the block
          +
          onlyHeader - if true then only return block header
          +
          onlyTxHash - the boolean define the tx is full or not
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByHashAsync

          +
          public void getBlockByHashAsync(java.lang.String node,
          +                                java.lang.String blockHash,
          +                                boolean onlyHeader,
          +                                boolean onlyTxHash,
          +                                RespCallback<BcosBlock> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block by hash
          +
          +
          指定者:
          +
          getBlockByHashAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockHash - the hashcode of the block
          +
          onlyHeader - if true then only return block header
          +
          onlyTxHash - the boolean define the tx is full or not
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByNumber

          +
          public BcosBlock getBlockByNumber(java.math.BigInteger blockNumber,
          +                                  boolean onlyHeader,
          +                                  boolean onlyTxHash)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get block by block number
          +
          +
          指定者:
          +
          getBlockByNumber 在接口中 Client
          +
          参数:
          +
          blockNumber - the number of the block
          +
          onlyHeader - the boolean define if only return header
          +
          onlyTxHash - the boolean define if only return tx hash
          +
          返回:
          +
          block
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByNumber

          +
          public BcosBlock getBlockByNumber(java.lang.String node,
          +                                  java.math.BigInteger blockNumber,
          +                                  boolean onlyHeader,
          +                                  boolean onlyTxHash)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get block by block number
          +
          +
          指定者:
          +
          getBlockByNumber 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockNumber - the number of the block
          +
          onlyHeader - the boolean define if only return header
          +
          onlyTxHash - the boolean define if only return tx hash
          +
          返回:
          +
          block
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByNumberAsync

          +
          public void getBlockByNumberAsync(java.math.BigInteger blockNumber,
          +                                  boolean onlyHeader,
          +                                  boolean onlyTxHash,
          +                                  RespCallback<BcosBlock> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block by block number
          +
          +
          指定者:
          +
          getBlockByNumberAsync 在接口中 Client
          +
          参数:
          +
          blockNumber - the number of the block
          +
          onlyHeader - the boolean if only need header
          +
          onlyTxHash - the boolean if you need all transactions
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockByNumberAsync

          +
          public void getBlockByNumberAsync(java.lang.String node,
          +                                  java.math.BigInteger blockNumber,
          +                                  boolean onlyHeader,
          +                                  boolean onlyTxHash,
          +                                  RespCallback<BcosBlock> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block by block number
          +
          +
          指定者:
          +
          getBlockByNumberAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockNumber - the number of the block
          +
          onlyHeader - the boolean if only need header
          +
          onlyTxHash - the boolean if you need all transactions
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockHashByNumber

          +
          public BlockHash getBlockHashByNumber(java.math.BigInteger blockNumber)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block hash by block number
          +
          +
          指定者:
          +
          getBlockHashByNumber 在接口中 Client
          +
          参数:
          +
          blockNumber - the number of the block
          +
          返回:
          +
          BlockHash
          +
          +
        • +
        + + + +
          +
        • +

          getBlockHashByNumber

          +
          public BlockHash getBlockHashByNumber(java.lang.String node,
          +                                      java.math.BigInteger blockNumber)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block hash by block number
          +
          +
          指定者:
          +
          getBlockHashByNumber 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockNumber - the number of the block
          +
          返回:
          +
          BlockHash
          +
          +
        • +
        + + + +
          +
        • +

          getBlockHashByNumberAsync

          +
          public void getBlockHashByNumberAsync(java.math.BigInteger blockNumber,
          +                                      RespCallback<BlockHash> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block hash by block number
          +
          +
          指定者:
          +
          getBlockHashByNumberAsync 在接口中 Client
          +
          参数:
          +
          blockNumber - the number of the block
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockHashByNumberAsync

          +
          public void getBlockHashByNumberAsync(java.lang.String node,
          +                                      java.math.BigInteger blockNumber,
          +                                      RespCallback<BlockHash> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get block hash by block number
          +
          +
          指定者:
          +
          getBlockHashByNumberAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          blockNumber - the number of the block
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTransaction

          +
          public BcosTransaction getTransaction(java.lang.String transactionHash,
          +                                      java.lang.Boolean withProof)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get transaction by hash
          +
          +
          指定者:
          +
          getTransaction 在接口中 Client
          +
          参数:
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          返回:
          +
          transaction
          +
          +
        • +
        + + + +
          +
        • +

          getTransaction

          +
          public BcosTransaction getTransaction(java.lang.String node,
          +                                      java.lang.String transactionHash,
          +                                      java.lang.Boolean withProof)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get trnasaction by hash
          +
          +
          指定者:
          +
          getTransaction 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          返回:
          +
          transaction
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionAsync

          +
          public void getTransactionAsync(java.lang.String transactionHash,
          +                                java.lang.Boolean withProof,
          +                                RespCallback<BcosTransaction> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get trnasaction by hash
          +
          +
          指定者:
          +
          getTransactionAsync 在接口中 Client
          +
          参数:
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionAsync

          +
          public void getTransactionAsync(java.lang.String node,
          +                                java.lang.String transactionHash,
          +                                java.lang.Boolean withProof,
          +                                RespCallback<BcosTransaction> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get trnasaction by hash
          +
          +
          指定者:
          +
          getTransactionAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionReceipt

          +
          public BcosTransactionReceipt getTransactionReceipt(java.lang.String transactionHash,
          +                                                    java.lang.Boolean withProof)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get transaction receipt by transaction hash
          +
          +
          指定者:
          +
          getTransactionReceipt 在接口中 Client
          +
          参数:
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction proof
          +
          返回:
          +
          transaction receipt
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionReceipt

          +
          public BcosTransactionReceipt getTransactionReceipt(java.lang.String node,
          +                                                    java.lang.String transactionHash,
          +                                                    java.lang.Boolean withProof)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get transaction receipt by transaction hash
          +
          +
          指定者:
          +
          getTransactionReceipt 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction receipt proof
          +
          返回:
          +
          transaction receipt
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionReceiptAsync

          +
          public void getTransactionReceiptAsync(java.lang.String transactionHash,
          +                                       java.lang.Boolean withProof,
          +                                       RespCallback<BcosTransactionReceipt> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get transaction receipt by transaction hash
          +
          +
          指定者:
          +
          getTransactionReceiptAsync 在接口中 Client
          +
          参数:
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction receipt proof
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getTransactionReceiptAsync

          +
          public void getTransactionReceiptAsync(java.lang.String node,
          +                                       java.lang.String transactionHash,
          +                                       java.lang.Boolean withProof,
          +                                       RespCallback<BcosTransactionReceipt> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get transaction receipt by transaction hash
          +
          +
          指定者:
          +
          getTransactionReceiptAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          transactionHash - the hashcode of transaction
          +
          withProof - with the transaction receipt proof
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getPendingTxSize

          +
          public PendingTxSize getPendingTxSize()
          +
          从接口复制的说明: Client
          +
          Ledger operation: get pending transaction size
          +
          +
          指定者:
          +
          getPendingTxSize 在接口中 Client
          +
          返回:
          +
          PendingTxSize
          +
          +
        • +
        + + + +
          +
        • +

          getPendingTxSize

          +
          public PendingTxSize getPendingTxSize(java.lang.String node)
          +
          从接口复制的说明: Client
          +
          Ledger operation: get pending transaction size
          +
          +
          指定者:
          +
          getPendingTxSize 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          PendingTxSize
          +
          +
        • +
        + + + +
          +
        • +

          getPendingTxSizeAsync

          +
          public void getPendingTxSizeAsync(RespCallback<PendingTxSize> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get pending transaction size
          +
          +
          指定者:
          +
          getPendingTxSizeAsync 在接口中 Client
          +
          参数:
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getPendingTxSizeAsync

          +
          public void getPendingTxSizeAsync(java.lang.String node,
          +                                  RespCallback<PendingTxSize> callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async get pending transaction size
          +
          +
          指定者:
          +
          getPendingTxSizeAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          getBlockLimit

          +
          public java.math.BigInteger getBlockLimit()
          +
          从接口复制的说明: Client
          +
          Get cached block height
          +
          +
          指定者:
          +
          getBlockLimit 在接口中 Client
          +
          返回:
          +
          block number
          +
          +
        • +
        + + + +
          +
        • +

          getGroupPeers

          +
          public GroupPeers getGroupPeers()
          +
          从接口复制的说明: Client
          +
          get the group peers
          +
          +
          指定者:
          +
          getGroupPeers 在接口中 Client
          +
          返回:
          +
          the groupPeers
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getPeers

          +
          public Peers getPeers()
          +
          从接口复制的说明: Client
          +
          Peer operation: get connected peers
          +
          +
          指定者:
          +
          getPeers 在接口中 Client
          +
          返回:
          +
          peers
          +
          +
        • +
        + + + +
          +
        • +

          getPeersAsync

          +
          public void getPeersAsync(RespCallback<Peers> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get connected peers
          +
          +
          指定者:
          +
          getPeersAsync 在接口中 Client
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getObserverList

          +
          public ObserverList getObserverList()
          +
          从接口复制的说明: Client
          +
          Peer operation: get observer node list
          +
          +
          指定者:
          +
          getObserverList 在接口中 Client
          +
          返回:
          +
          observer node list
          +
          +
        • +
        + + + +
          +
        • +

          getObserverList

          +
          public ObserverList getObserverList(java.lang.String node)
          +
          从接口复制的说明: Client
          +
          Peer operation: get observer node list
          +
          +
          指定者:
          +
          getObserverList 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          observer node list
          +
          +
        • +
        + + + +
          +
        • +

          getObserverList

          +
          public void getObserverList(RespCallback<ObserverList> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get observer node list
          +
          +
          指定者:
          +
          getObserverList 在接口中 Client
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getObserverList

          +
          public void getObserverList(java.lang.String node,
          +                            RespCallback<ObserverList> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get observer node list
          +
          +
          指定者:
          +
          getObserverList 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSealerList

          +
          public SealerList getSealerList()
          +
          从接口复制的说明: Client
          +
          Peer operation: get sealer node list
          +
          +
          指定者:
          +
          getSealerList 在接口中 Client
          +
          返回:
          +
          sealer node list
          +
          +
        • +
        + + + +
          +
        • +

          getSealerList

          +
          public SealerList getSealerList(java.lang.String node)
          +
          从接口复制的说明: Client
          +
          Peer operation: get sealer node list
          +
          +
          指定者:
          +
          getSealerList 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          sealer node list
          +
          +
        • +
        + + + +
          +
        • +

          getSealerListAsync

          +
          public void getSealerListAsync(RespCallback<SealerList> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get sealer node list
          +
          +
          指定者:
          +
          getSealerListAsync 在接口中 Client
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSealerListAsync

          +
          public void getSealerListAsync(java.lang.String node,
          +                               RespCallback<SealerList> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get sealer node list
          +
          +
          指定者:
          +
          getSealerListAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getNodeListByType

          +
          public SealerList getNodeListByType(java.lang.String type)
          +
          从接口复制的说明: Client
          +
          get node list by type
          +
          +
          指定者:
          +
          getNodeListByType 在接口中 Client
          +
          参数:
          +
          type - type of node, now support consensus_sealer, consensus_observer and + consensus_candidate_sealer
          +
          返回:
          +
          node list
          +
          +
        • +
        + + + +
          +
        • +

          getNodeListByType

          +
          public SealerList getNodeListByType(java.lang.String node,
          +                                    java.lang.String type)
          +
          从接口复制的说明: Client
          +
          get node list by type
          +
          +
          指定者:
          +
          getNodeListByType 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          type - type of node, now support consensus_sealer, consensus_observer and + consensus_candidate_sealer
          +
          返回:
          +
          node list
          +
          +
        • +
        + + + +
          +
        • +

          getNodeListByTypeAsync

          +
          public void getNodeListByTypeAsync(java.lang.String type,
          +                                   RespCallback<SealerList> callback)
          +
          从接口复制的说明: Client
          +
          async get node list by type
          +
          +
          指定者:
          +
          getNodeListByTypeAsync 在接口中 Client
          +
          参数:
          +
          type - type of node, now support consensus_sealer, consensus_observer and + consensus_candidate_sealer
          +
          callback - the callback
          +
          +
        • +
        + + + +
          +
        • +

          getNodeListByTypeAsync

          +
          public void getNodeListByTypeAsync(java.lang.String node,
          +                                   java.lang.String type,
          +                                   RespCallback<SealerList> callback)
          +
          从接口复制的说明: Client
          +
          async get node list by type
          +
          +
          指定者:
          +
          getNodeListByTypeAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          type - type of node, now support consensus_sealer, consensus_observer and + consensus_candidate_sealer
          +
          callback - the callback
          +
          +
        • +
        + + + +
          +
        • +

          getPbftView

          +
          public PbftView getPbftView()
          +
          从接口复制的说明: Client
          +
          Peer operation: get pbft view
          +
          +
          指定者:
          +
          getPbftView 在接口中 Client
          +
          返回:
          +
          pbft view
          +
          +
        • +
        + + + +
          +
        • +

          getPbftViewAsync

          +
          public void getPbftViewAsync(RespCallback<PbftView> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get pbft view
          +
          +
          指定者:
          +
          getPbftViewAsync 在接口中 Client
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getPbftView

          +
          public PbftView getPbftView(java.lang.String node)
          +
          从接口复制的说明: Client
          +
          Peer operation: get pbft view
          +
          +
          指定者:
          +
          getPbftView 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          pbft view
          +
          +
        • +
        + + + +
          +
        • +

          getPbftViewAsync

          +
          public void getPbftViewAsync(java.lang.String node,
          +                             RespCallback<PbftView> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get pbft view
          +
          +
          指定者:
          +
          getPbftViewAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSystemConfigByKey

          +
          public SystemConfig getSystemConfigByKey(java.lang.String key)
          +
          从接口复制的说明: Client
          +
          Peer operation: get system config
          +
          +
          指定者:
          +
          getSystemConfigByKey 在接口中 Client
          +
          参数:
          +
          key - the string of key
          +
          返回:
          +
          system config
          +
          +
        • +
        + + + +
          +
        • +

          getSystemConfigByKey

          +
          public SystemConfig getSystemConfigByKey(java.lang.String node,
          +                                         java.lang.String key)
          +
          从接口复制的说明: Client
          +
          Peer operation: get system config
          +
          +
          指定者:
          +
          getSystemConfigByKey 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          key - the string of key
          +
          返回:
          +
          system config
          +
          +
        • +
        + + + +
          +
        • +

          getSystemConfigByKeyAsync

          +
          public void getSystemConfigByKeyAsync(java.lang.String key,
          +                                      RespCallback<SystemConfig> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get system config
          +
          +
          指定者:
          +
          getSystemConfigByKeyAsync 在接口中 Client
          +
          参数:
          +
          key - the string of key
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSystemConfigByKeyAsync

          +
          public void getSystemConfigByKeyAsync(java.lang.String node,
          +                                      java.lang.String key,
          +                                      RespCallback<SystemConfig> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get system config
          +
          +
          指定者:
          +
          getSystemConfigByKeyAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          key - the string of key
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSyncStatus

          +
          public SyncStatus getSyncStatus(java.lang.String node)
          +
          从接口复制的说明: Client
          +
          Peer operation: get sync status
          +
          +
          指定者:
          +
          getSyncStatus 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          sync status
          +
          +
        • +
        + + + +
          +
        • +

          getSyncStatus

          +
          public SyncStatus getSyncStatus()
          +
          从接口复制的说明: Client
          +
          Peer operation: get sync status
          +
          +
          指定者:
          +
          getSyncStatus 在接口中 Client
          +
          返回:
          +
          sync status
          +
          +
        • +
        + + + +
          +
        • +

          getSyncStatusAsync

          +
          public void getSyncStatusAsync(RespCallback<SyncStatus> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get sync status
          +
          +
          指定者:
          +
          getSyncStatusAsync 在接口中 Client
          +
          参数:
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getSyncStatusAsync

          +
          public void getSyncStatusAsync(java.lang.String node,
          +                               RespCallback<SyncStatus> callback)
          +
          从接口复制的说明: Client
          +
          Peer operation: async get sync status
          +
          +
          指定者:
          +
          getSyncStatusAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback instance
          +
          +
        • +
        + + + +
          +
        • +

          getConsensusStatusAsync

          +
          public void getConsensusStatusAsync(java.lang.String node,
          +                                    RespCallback<ConsensusStatus> callback)
          +
          从接口复制的说明: Client
          +
          async get consensus status
          +
          +
          指定者:
          +
          getConsensusStatusAsync 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          callback - the callback
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getConsensusStatus

          +
          public ConsensusStatus getConsensusStatus(java.lang.String node)
          +
          从接口复制的说明: Client
          +
          sync get consensus status
          +
          +
          指定者:
          +
          getConsensusStatus 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          consensus status info
          +
          +
        • +
        + + + +
          +
        • +

          getConsensusStatus

          +
          public ConsensusStatus getConsensusStatus()
          +
          从接口复制的说明: Client
          +
          sync get consensus status
          +
          +
          指定者:
          +
          getConsensusStatus 在接口中 Client
          +
          返回:
          +
          consensus status info
          +
          +
        • +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
        • +

          getGroupNodeInfo

          +
          public BcosGroupNodeInfo getGroupNodeInfo(java.lang.String node)
          +
          从接口复制的说明: Client
          +
          get group node info
          +
          +
          指定者:
          +
          getGroupNodeInfo 在接口中 Client
          +
          参数:
          +
          node - the node rpc request send to
          +
          返回:
          +
          group node info
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getChainVersion

          +
          @Deprecated
          +public EnumNodeVersion getChainVersion()
          +
          已过时。 
          +
          从接口复制的说明: Client
          +
          get the chain compatibility version
          +
          +
          指定者:
          +
          getChainVersion 在接口中 Client
          +
          返回:
          +
          the chain compatibility version
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          setNodeToSendRequest

          +
          public void setNodeToSendRequest(java.lang.String nodeToSendRequest)
          +
          从接口复制的说明: Client
          +
          Set node name to send rpc request directly, if not set, will use random node in the + groupInfoList. Node name should choose from groupInfo.
          +
          +
          指定者:
          +
          setNodeToSendRequest 在接口中 Client
          +
          参数:
          +
          nodeToSendRequest - the node name
          +
          +
        • +
        + + + +
          +
        • +

          isSupportTransactionV1

          +
          public boolean isSupportTransactionV1()
          +
          从接口复制的说明: Client
          +
          Check this client whether supporting sending transaction with v1 version or not.
          +
          +
          指定者:
          +
          isSupportTransactionV1 在接口中 Client
          +
          返回:
          +
          is this client support sending transaction with v1 version
          +
          +
        • +
        + + + +
          +
        • +

          getNodeToSendRequest

          +
          public java.lang.String getNodeToSendRequest()
          +
          Get the protocol version after SDK and Blockchain node negotiated. This method returns int + with max and min version bits combined, which is (max|min). Max protocol version is in first + 16 bit, and min protocol version in the second 16 bit.
          +
          +
          指定者:
          +
          getNodeToSendRequest 在接口中 Client
          +
          返回:
          +
          (max|min) bits combined.
          +
          +
        • +
        + + + +
          +
        • +

          getNegotiatedProtocol

          +
          public int getNegotiatedProtocol()
          +
          从接口复制的说明: Client
          +
          Get the protocol version after SDK and Blockchain node negotiated. This method returns int + with max and min version bits combined, which is (max|min). Max protocol version is in first + 16 bit, and min protocol version in the second 16 bit.
          +
          +
          指定者:
          +
          getNegotiatedProtocol 在接口中 Client
          +
          返回:
          +
          (max|min) bits combined.
          +
          +
        • +
        + + + +
          +
        • +

          start

          +
          public void start()
          +
          +
          指定者:
          +
          start 在接口中 Client
          +
          +
        • +
        + + + +
          +
        • +

          stop

          +
          public void stop()
          +
          +
          指定者:
          +
          stop 在接口中 Client
          +
          +
        • +
        + + + +
          +
        • +

          destroy

          +
          public void destroy()
          +
          +
          指定者:
          +
          destroy 在接口中 Client
          +
          +
        • +
        + + + + + + + +
          +
        • +

          callRemoteMethod

          +
          public <T extends JsonRpcResponse<?>> T callRemoteMethod(java.lang.String groupID,
          +                                                         java.lang.String node,
          +                                                         JsonRpcRequest<?> request,
          +                                                         java.lang.Class<T> responseType)
          +
        • +
        + + + +
          +
        • +

          asyncCallRemoteMethod

          +
          public <T extends JsonRpcResponse<?>> void asyncCallRemoteMethod(java.lang.String groupID,
          +                                                                 java.lang.String node,
          +                                                                 JsonRpcRequest<?> request,
          +                                                                 java.lang.Class<T> responseType,
          +                                                                 RespCallback<T> callback)
          +
        • +
        + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/TarsClient.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/TarsClient.html new file mode 100644 index 000000000..1e9210f84 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/TarsClient.html @@ -0,0 +1,476 @@ + + + + + + +TarsClient (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.client
    +

    类 TarsClient

    +
    +
    + +
    +
      +
    • +
      +
      所有已实现的接口:
      +
      Client
      +
      +
      +
      +
      public class TarsClient
      +extends ClientImpl
      +implements Client
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TarsClient

          +
          protected TarsClient(java.lang.String groupID,
          +                     ConfigOption configOption,
          +                     long nativePointer)
          +              throws java.lang.Exception
          +
          +
          抛出:
          +
          java.lang.Exception
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getTarsRPCClient

          +
          public org.fisco.bcos.sdk.tars.RPCClient getTarsRPCClient()
          +
        • +
        + + + +
          +
        • +

          setTarsRPCClient

          +
          public void setTarsRPCClient(org.fisco.bcos.sdk.tars.RPCClient tarsRPCClient)
          +
        • +
        + + + +
          +
        • +

          getTransactionFactory

          +
          public org.fisco.bcos.sdk.tars.TransactionFactoryImpl getTransactionFactory()
          +
        • +
        + + + +
          +
        • +

          setTransactionFactory

          +
          public void setTransactionFactory(org.fisco.bcos.sdk.tars.TransactionFactoryImpl transactionFactory)
          +
        • +
        + + + +
          +
        • +

          build

          +
          public static TarsClient build(java.lang.String groupId,
          +                               ConfigOption configOption,
          +                               long nativePointer)
          +                        throws java.lang.Exception
          +
          从接口复制的说明: Client
          +
          Build a client instance GroupId is identified, all interfaces are available, with specific + jniRPC
          +
          +
          指定者:
          +
          build 在接口中 Client
          +
          参数:
          +
          groupId - the group info
          +
          configOption - the config
          +
          nativePointer - jni impl native handler
          +
          返回:
          +
          a client instance
          +
          抛出:
          +
          java.lang.Exception
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public BcosTransactionReceipt sendTransaction(java.lang.String node,
          +                                              java.lang.String signedTransactionData,
          +                                              boolean withProof)
          +
          从接口复制的说明: Client
          +
          Ledger operation: send transaction
          +
          +
          指定者:
          +
          sendTransaction 在接口中 Client
          +
          覆盖:
          +
          sendTransaction 在类中 ClientImpl
          +
          参数:
          +
          node - the node rpc request send to
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          返回:
          +
          Transaction receipt
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAsync

          +
          public void sendTransactionAsync(java.lang.String node,
          +                                 java.lang.String signedTransactionData,
          +                                 boolean withProof,
          +                                 TransactionCallback callback)
          +
          从接口复制的说明: Client
          +
          Ledger operation: async send transaction
          +
          +
          指定者:
          +
          sendTransactionAsync 在接口中 Client
          +
          覆盖:
          +
          sendTransactionAsync 在类中 ClientImpl
          +
          参数:
          +
          node - the node rpc request send to
          +
          signedTransactionData - transaction string
          +
          withProof - whether contains merkle proof or not
          +
          callback - the callback that will be called when receive the response
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAsync

          +
          public void sendTransactionAsync(org.fisco.bcos.sdk.tars.Transaction transaction,
          +                                 TransactionCallback callback)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/ClientException.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/ClientException.html similarity index 93% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/ClientException.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/ClientException.html index 3d508a75d..72bf46672 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/ClientException.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/ClientException.html @@ -4,7 +4,7 @@ -ClientException (java-sdk 3.0.0 API) +ClientException (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.client.exceptions

    +
    +

    异常错误

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-summary.html new file mode 100644 index 000000000..896f9534d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-summary.html @@ -0,0 +1,142 @@ + + + + + + +org.fisco.bcos.sdk.v3.client.exceptions (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.client.exceptions

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      异常错误概要 
      异常错误说明
      ClientException +
      Throw exception when calling.
      +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-tree.html new file mode 100644 index 000000000..a10bfcb19 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/exceptions/package-tree.html @@ -0,0 +1,147 @@ + + + + + + +org.fisco.bcos.sdk.v3.client.exceptions 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.client.exceptions的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Throwable (implements java.io.Serializable) +
          +
        • java.lang.Exception +
            +
          • java.lang.RuntimeException + +
          • +
          +
        • +
        +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-frame.html new file mode 100644 index 000000000..bfca55c3c --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-frame.html @@ -0,0 +1,25 @@ + + + + + + +org.fisco.bcos.sdk.v3.client (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.client

    +
    +

    接口

    + +

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-summary.html new file mode 100644 index 000000000..7c907dc9d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-summary.html @@ -0,0 +1,161 @@ + + + + + + +org.fisco.bcos.sdk.v3.client (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.client

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      接口概要 
      接口说明
      Client +
      This is the interface of client module.
      +
      +
    • +
    • + + + + + + + + + + + + + + + + +
      类概要 
      说明
      ClientImpl 
      TarsClient 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-tree.html new file mode 100644 index 000000000..5bccaca43 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/package-tree.html @@ -0,0 +1,143 @@ + + + + + + +org.fisco.bcos.sdk.v3.client 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.client的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.client.ClientImpl (implements org.fisco.bcos.sdk.v3.client.Client) +
          +
        • org.fisco.bcos.sdk.v3.client.TarsClient (implements org.fisco.bcos.sdk.v3.client.Client)
        • +
        +
      • +
      +
    • +
    +

    接口分层结构

    +
      +
    • org.fisco.bcos.sdk.v3.client.Client
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/GroupNodeGenesisInfo.Sealer.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/GroupNodeGenesisInfo.Sealer.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/GroupNodeGenesisInfo.Sealer.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/GroupNodeGenesisInfo.Sealer.html index e929f0ee6..806a0b1f2 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/GroupNodeGenesisInfo.Sealer.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/GroupNodeGenesisInfo.Sealer.html @@ -4,7 +4,7 @@ -GroupNodeGenesisInfo.Sealer (java-sdk 3.0.0 API) +GroupNodeGenesisInfo.Sealer (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.client.protocol.model
    +

    类 JsonTransactionResponse

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.client.protocol.model.JsonTransactionResponse
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          JsonTransactionResponse

          +
          public JsonTransactionResponse()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getAbi

          +
          public java.lang.String getAbi()
          +
        • +
        + + + +
          +
        • +

          setAbi

          +
          public void setAbi(java.lang.String abi)
          +
        • +
        + + + +
          +
        • +

          getTransactionProof

          +
          @Deprecated
          +public java.util.List<MerkleProofUnit> getTransactionProof()
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          setTransactionProof

          +
          @Deprecated
          +public void setTransactionProof(java.util.List<MerkleProofUnit> transactionProof)
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          getTxProof

          +
          public java.util.List<java.lang.String> getTxProof()
          +
        • +
        + + + +
          +
        • +

          setTxProof

          +
          public void setTxProof(java.util.List<java.lang.String> txProof)
          +
        • +
        + + + +
          +
        • +

          getVersion

          +
          public java.lang.Integer getVersion()
          +
        • +
        + + + +
          +
        • +

          setVersion

          +
          public void setVersion(java.lang.Integer version)
          +
        • +
        + + + +
          +
        • +

          getFrom

          +
          public java.lang.String getFrom()
          +
        • +
        + + + +
          +
        • +

          setFrom

          +
          public void setFrom(java.lang.String from)
          +
        • +
        + + + +
          +
        • +

          getHash

          +
          public java.lang.String getHash()
          +
        • +
        + + + +
          +
        • +

          setHash

          +
          public void setHash(java.lang.String hash)
          +
        • +
        + + + +
          +
        • +

          getInput

          +
          public java.lang.String getInput()
          +
        • +
        + + + +
          +
        • +

          setInput

          +
          public void setInput(java.lang.String input)
          +
        • +
        + + + +
          +
        • +

          getNonce

          +
          public java.lang.String getNonce()
          +
        • +
        + + + +
          +
        • +

          setNonce

          +
          public void setNonce(java.lang.String nonce)
          +
        • +
        + + + +
          +
        • +

          getTo

          +
          public java.lang.String getTo()
          +
        • +
        + + + +
          +
        • +

          setTo

          +
          public void setTo(java.lang.String to)
          +
        • +
        + + + +
          +
        • +

          getBlockLimit

          +
          public long getBlockLimit()
          +
        • +
        + + + +
          +
        • +

          setBlockLimit

          +
          public void setBlockLimit(long blockLimit)
          +
        • +
        + + + +
          +
        • +

          getChainID

          +
          public java.lang.String getChainID()
          +
        • +
        + + + +
          +
        • +

          setChainID

          +
          public void setChainID(java.lang.String chainId)
          +
        • +
        + + + +
          +
        • +

          getGroupID

          +
          public java.lang.String getGroupID()
          +
        • +
        + + + +
          +
        • +

          setGroupID

          +
          public void setGroupID(java.lang.String groupID)
          +
        • +
        + + + +
          +
        • +

          getSignature

          +
          public java.lang.String getSignature()
          +
        • +
        + + + +
          +
        • +

          setSignature

          +
          public void setSignature(java.lang.String signature)
          +
        • +
        + + + +
          +
        • +

          getExtraData

          +
          public java.lang.String getExtraData()
          +
        • +
        + + + +
          +
        • +

          setExtraData

          +
          public void setExtraData(java.lang.String extraData)
          +
        • +
        + + + +
          +
        • +

          getImportTime

          +
          public long getImportTime()
          +
        • +
        + + + +
          +
        • +

          setImportTime

          +
          public void setImportTime(long importTime)
          +
        • +
        + + + +
          +
        • +

          getValue

          +
          public java.lang.String getValue()
          +
        • +
        + + + +
          +
        • +

          setValue

          +
          public void setValue(java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          getGasPrice

          +
          public java.lang.String getGasPrice()
          +
        • +
        + + + +
          +
        • +

          setGasPrice

          +
          public void setGasPrice(java.lang.String gasPrice)
          +
        • +
        + + + +
          +
        • +

          getGasLimit

          +
          public long getGasLimit()
          +
        • +
        + + + +
          +
        • +

          setGasLimit

          +
          public void setGasLimit(long gasLimit)
          +
        • +
        + + + +
          +
        • +

          getMaxFeePerGas

          +
          public java.lang.String getMaxFeePerGas()
          +
        • +
        + + + +
          +
        • +

          setMaxFeePerGas

          +
          public void setMaxFeePerGas(java.lang.String maxFeePerGas)
          +
        • +
        + + + +
          +
        • +

          getMaxPriorityFeePerGas

          +
          public java.lang.String getMaxPriorityFeePerGas()
          +
        • +
        + + + +
          +
        • +

          setMaxPriorityFeePerGas

          +
          public void setMaxPriorityFeePerGas(java.lang.String maxPriorityFeePerGas)
          +
        • +
        + + + +
          +
        • +

          readFromHexString

          +
          @Deprecated
          +public static JsonTransactionResponse readFromHexString(java.lang.String hexString)
          +                                                             throws org.fisco.bcos.sdk.jni.common.JniException,
          +                                                                    java.io.IOException
          +
          已过时。 this method is deprecated, use decodeTransaction(String) instead
          +
          This method is not correct, only can decode from method writeToHexString(), which + not enable to send transaction to blockchain.
          +
          +
          参数:
          +
          hexString - the hex string
          +
          返回:
          +
          the transaction response
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException - the jni exception
          +
          java.io.IOException - the io exception
          +
          +
        • +
        + + + +
          +
        • +

          writeToHexString

          +
          @Deprecated
          +public java.lang.String writeToHexString()
          +                                              throws com.fasterxml.jackson.core.JsonProcessingException,
          +                                                     org.fisco.bcos.sdk.jni.common.JniException
          +
          已过时。 this method is deprecated, use encodeTransactionData() instead
          +
          This method only encode to transaction data hex string, use to sign transaction data.
          +
          +
          返回:
          +
          the hex string
          +
          抛出:
          +
          com.fasterxml.jackson.core.JsonProcessingException - the json processing exception
          +
          org.fisco.bcos.sdk.jni.common.JniException - the jni exception
          +
          +
        • +
        + + + +
          +
        • +

          calculateHash

          +
          public java.lang.String calculateHash(CryptoSuite cryptoSuite)
          +                               throws ClientException
          +
          Calculate the hash for the transaction, only correct when blockchain node version < 3.3.0,
          +
          +
          参数:
          +
          cryptoSuite - the crypto suite
          +
          返回:
          +
          tx hash hex string
          +
          抛出:
          +
          ClientException - exception when calculateHash() throws ClientException
          +
          +
        • +
        + + + +
          +
        • +

          calculateHash

          +
          public java.lang.String calculateHash(int cryptoSuiteType)
          +                               throws ClientException
          +
          Calculate the hash for the transaction, only correct when blockchain node version >= 3.3.0,
          +
          +
          参数:
          +
          cryptoSuiteType - the crypto suite type, use for distinguish hash impl, 0 for Keccak256, + 1
          +
          返回:
          +
          tx hash hex string
          +
          抛出:
          +
          ClientException - exception when calculateHash() throws ClientException
          +
          +
        • +
        + + + +
          +
        • +

          calculateTxHashInNative

          +
          public java.lang.String calculateTxHashInNative(Hash hashImpl)
          +                                         throws java.io.IOException
          +
          Calculate the hash for the transaction in java native, only correct when blockchain node + version >= 3.3.0, because the nonce output is changed in 3.3.0, you can calculateHex the + nonce to string
          +
          +
          参数:
          +
          hashImpl - the hash implementation
          +
          返回:
          +
          tx hash hex string
          +
          抛出:
          +
          java.io.IOException - exception when encodeTransactionData() throws IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeTransactionData

          +
          public byte[] encodeTransactionData()
          +                             throws java.io.IOException
          +
          Encode the transaction data to byte array, witch is used to calculate the hash of the + transaction
          +
          +
          返回:
          +
          the byte array of the transaction data
          +
          抛出:
          +
          java.io.IOException - exception when ByteArrayOutputStream throws IOException
          +
          +
        • +
        + + + +
          +
        • +

          decodeTransaction

          +
          public static JsonTransactionResponse decodeTransaction(java.lang.String hexString)
          +                                                 throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          equals

          +
          public boolean equals(java.lang.Object o)
          +
          +
          覆盖:
          +
          equals 在类中 java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          hashCode

          +
          public int hashCode()
          +
          +
          覆盖:
          +
          hashCode 在类中 java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/TransactionAttribute.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/TransactionAttribute.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/TransactionAttribute.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/TransactionAttribute.html index 75067634b..027a6404a 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/TransactionAttribute.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/TransactionAttribute.html @@ -4,7 +4,7 @@ -TransactionAttribute (java-sdk 3.0.0 API) +TransactionAttribute (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.client.protocol.model

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-summary.html new file mode 100644 index 000000000..7e292fdd9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-summary.html @@ -0,0 +1,176 @@ + + + + + + +org.fisco.bcos.sdk.v3.client.protocol.model (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.client.protocol.model

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-tree.html new file mode 100644 index 000000000..62cd03bb9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/model/package-tree.html @@ -0,0 +1,144 @@ + + + + + + +org.fisco.bcos.sdk.v3.client.protocol.model 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.client.protocol.model的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/JsonRpcMethods.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/JsonRpcMethods.html similarity index 96% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/JsonRpcMethods.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/JsonRpcMethods.html index 9e398f242..58f028d11 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/JsonRpcMethods.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/JsonRpcMethods.html @@ -4,7 +4,7 @@ -JsonRpcMethods (java-sdk 3.0.0 API) +JsonRpcMethods (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.client.protocol.request

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-summary.html new file mode 100644 index 000000000..6da68eb7a --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-summary.html @@ -0,0 +1,148 @@ + + + + + + +org.fisco.bcos.sdk.v3.client.protocol.request (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.client.protocol.request

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-tree.html new file mode 100644 index 000000000..4d3ea87e1 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/request/package-tree.html @@ -0,0 +1,137 @@ + + + + + + +org.fisco.bcos.sdk.v3.client.protocol.request 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.client.protocol.request的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object + +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/Abi.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/Abi.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/Abi.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/Abi.html index 952a4739d..578ae7bcb 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/Abi.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/Abi.html @@ -4,7 +4,7 @@ -Abi (java-sdk 3.0.0 API) +Abi (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.client.protocol.response
    +

    类 BcosBlock.TransactionObject

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/BcosBlock.TransactionResult.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/BcosBlock.TransactionResult.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/BcosBlock.TransactionResult.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/BcosBlock.TransactionResult.html index 2a4b359e6..7fe5c11ad 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/BcosBlock.TransactionResult.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/BcosBlock.TransactionResult.html @@ -4,7 +4,7 @@ -BcosBlock.TransactionResult (java-sdk 3.0.0 API) +BcosBlock.TransactionResult (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.client.protocol.response

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-summary.html new file mode 100644 index 000000000..d9f5b2f7f --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-summary.html @@ -0,0 +1,397 @@ + + + + + + +org.fisco.bcos.sdk.v3.client.protocol.response (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.client.protocol.response

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-tree.html new file mode 100644 index 000000000..f1cec4556 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/client/protocol/response/package-tree.html @@ -0,0 +1,213 @@ + + + + + + +org.fisco.bcos.sdk.v3.client.protocol.response 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.client.protocol.response的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodec.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodec.html new file mode 100644 index 000000000..49faa661b --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodec.html @@ -0,0 +1,1255 @@ + + + + + + +ContractCodec (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec
    +

    类 ContractCodec

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.codec.ContractCodec
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class ContractCodec
      +extends java.lang.Object
      +
      ABI encode and decode tool
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodecException.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodecException.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodecException.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodecException.html index 8b3d1633a..e139713c9 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodecException.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/ContractCodecException.html @@ -4,7 +4,7 @@ -ContractCodecException (java-sdk 3.0.0 API) +ContractCodecException (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec
    +

    类 Encoder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.codec.Encoder
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          Encoder

          +
          @Deprecated
          +public Encoder(CryptoSuite cryptoSuite)
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          Encoder

          +
          public Encoder(Hash hash)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getCryptoSuite

          +
          @Deprecated
          +public CryptoSuite getCryptoSuite()
          +
          已过时。 
          +
          +
          返回:
          +
          the cryptoSuite
          +
          +
        • +
        + + + +
          +
        • +

          setCryptoSuite

          +
          @Deprecated
          +public void setCryptoSuite(CryptoSuite cryptoSuite)
          +
          已过时。 
          +
          +
          参数:
          +
          cryptoSuite - the cryptoSuite to set
          +
          +
        • +
        + + + +
          +
        • +

          getHashImpl

          +
          public Hash getHashImpl()
          +
        • +
        + + + +
          +
        • +

          setHashImpl

          +
          public void setHashImpl(Hash hashImpl)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/EventEncoder.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/EventEncoder.html similarity index 90% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/EventEncoder.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/EventEncoder.html index aad9875b0..1230a47a1 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/EventEncoder.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/EventEncoder.html @@ -4,7 +4,7 @@ -EventEncoder (java-sdk 3.0.0 API) +EventEncoder (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec.abi
    +

    类 FunctionEncoder

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class FunctionEncoder
      +extends FunctionEncoderInterface
      +
      Ethereum Contract Application Binary Interface (ABI) encoding for functions. Further details are + available here.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          FunctionEncoder

          +
          @Deprecated
          +public FunctionEncoder(CryptoSuite cryptoSuite)
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          FunctionEncoder

          +
          public FunctionEncoder(Hash hash)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + + + + + +
          +
        • +

          encodeConstructor

          +
          public static byte[] encodeConstructor(java.util.List<Type> parameters)
          +
        • +
        + + + +
          +
        • +

          encodeParameters

          +
          public static byte[] encodeParameters(java.util.List<Type> parameters,
          +                                      byte[] methodID)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/FunctionReturnDecoder.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/FunctionReturnDecoder.html new file mode 100644 index 000000000..e1b075b29 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/FunctionReturnDecoder.html @@ -0,0 +1,355 @@ + + + + + + +FunctionReturnDecoder (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec.abi
    +

    类 FunctionReturnDecoder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.codec.abi.FunctionReturnDecoder
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + +
        所有方法 静态方法 实例方法 具体方法 
        限定符和类型方法和说明
        java.util.List<Type>decode(java.lang.String rawInput, + java.util.List<TypeReference<Type>> outputParameters) +
        Decode ABI encoded return values from smart contract function call.
        +
        <T extends Type>
        Type
        decodeIndexedValue(java.lang.String rawInput, + TypeReference<T> typeReference) +
        Decodes an indexed parameter associated with an event.
        +
        static <T extends Type>
        int
        getDataOffset(byte[] input, + int offset, + TypeReference<?> typeReference) 
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          FunctionReturnDecoder

          +
          public FunctionReturnDecoder()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          decode

          +
          public java.util.List<Type> decode(java.lang.String rawInput,
          +                                   java.util.List<TypeReference<Type>> outputParameters)
          +
          Decode ABI encoded return values from smart contract function call.
          +
          +
          指定者:
          +
          decode 在接口中 FunctionReturnDecoderInterface
          +
          参数:
          +
          rawInput - ABI encoded input
          +
          outputParameters - list of return types as TypeReference
          +
          返回:
          +
          List of values returned by function, Collections.emptyList() if + invalid response
          +
          +
        • +
        + + + +
          +
        • +

          decodeIndexedValue

          +
          public <T extends TypeType decodeIndexedValue(java.lang.String rawInput,
          +                                                TypeReference<T> typeReference)
          +
          Decodes an indexed parameter associated with an event. Indexed parameters are individually + encoded, unlike non-indexed parameters which are encoded as per ABI-encoded function + parameters and return values. + +

          If any of the following types are indexed, the Keccak-256 hashes of the values are + returned instead. These are returned as a bytes32 value. + +

            +
          • Arrays +
          • Strings +
          • Bytes +
          + +

          See the Solidity + documentation for further information.

          +
          +
          指定者:
          +
          decodeIndexedValue 在接口中 FunctionReturnDecoderInterface
          +
          类型参数:
          +
          T - type of TypeReference
          +
          参数:
          +
          rawInput - ABI encoded input
          +
          typeReference - of expected result type
          +
          返回:
          +
          the decode value
          +
          +
        • +
        + + + +
          +
        • +

          getDataOffset

          +
          public static <T extends Type> int getDataOffset(byte[] input,
          +                                                 int offset,
          +                                                 TypeReference<?> typeReference)
          +                                          throws java.lang.ClassNotFoundException
          +
          +
          抛出:
          +
          java.lang.ClassNotFoundException
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeDecoder.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeDecoder.html new file mode 100644 index 000000000..f4c0836e5 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeDecoder.html @@ -0,0 +1,469 @@ + + + + + + +TypeDecoder (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec.abi
    +

    类 TypeDecoder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.codec.abi.TypeDecoder
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TypeDecoder
      +extends java.lang.Object
      +
      Ethereum Contract Application Binary Interface (ABI) decoding for types. Decoding is not + documented, but is the reverse of the encoding details located here.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TypeDecoder

          +
          public TypeDecoder()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          decode

          +
          public static <T extends Type> T decode(byte[] input,
          +                                        int offset,
          +                                        TypeReference<T> type)
          +                                 throws java.lang.ClassNotFoundException
          +
          +
          抛出:
          +
          java.lang.ClassNotFoundException
          +
          +
        • +
        + + + +
          +
        • +

          decodeAddress

          +
          public static Address decodeAddress(byte[] input)
          +
        • +
        + + + +
          +
        • +

          decodeNumeric

          +
          public static <T extends NumericType> T decodeNumeric(byte[] inputByteArray,
          +                                                      java.lang.Class<T> type)
          +
        • +
        + + + +
          +
        • +

          decodeUintAsInt

          +
          public static int decodeUintAsInt(byte[] rawInput,
          +                                  int offset)
          +
        • +
        + + + +
          +
        • +

          decodeBool

          +
          public static Bool decodeBool(byte[] rawInput,
          +                              int offset)
          +
        • +
        + + + +
          +
        • +

          decodeBytes

          +
          public static <T extends Bytes> T decodeBytes(byte[] input,
          +                                              java.lang.Class<T> type)
          +
        • +
        + + + +
          +
        • +

          decodeBytes

          +
          public static <T extends Bytes> T decodeBytes(byte[] input,
          +                                              int offset,
          +                                              java.lang.Class<T> type)
          +
        • +
        + + + +
          +
        • +

          decodeDynamicBytes

          +
          public static DynamicBytes decodeDynamicBytes(byte[] input,
          +                                              int offset)
          +
        • +
        + + + +
          +
        • +

          decodeUtf8String

          +
          public static Utf8String decodeUtf8String(byte[] input,
          +                                          int offset)
          +
        • +
        + + + +
          +
        • +

          decodeStaticArray

          +
          public static <T extends Type> T decodeStaticArray(byte[] input,
          +                                                   int offset,
          +                                                   TypeReference<T> typeReference,
          +                                                   int length)
          +
        • +
        + + + +
          +
        • +

          instantiateStaticArray

          +
          public static <T extends Type> T instantiateStaticArray(java.util.List<T> elements,
          +                                                        int length)
          +
        • +
        + + + +
          +
        • +

          decodeDynamicArray

          +
          public static <T extends Type> T decodeDynamicArray(byte[] input,
          +                                                    int offset,
          +                                                    TypeReference<T> typeReference)
          +
        • +
        + + + +
          +
        • +

          decodeStaticStruct

          +
          public static <T extends Type> T decodeStaticStruct(byte[] input,
          +                                                    int offset,
          +                                                    TypeReference<T> typeReference)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeEncoder.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeEncoder.html new file mode 100644 index 000000000..dee4f1aca --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeEncoder.html @@ -0,0 +1,354 @@ + + + + + + +TypeEncoder (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec.abi
    +

    类 TypeEncoder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.codec.abi.TypeEncoder
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TypeEncoder
      +extends java.lang.Object
      +
      Ethereum Contract Application Binary Interface (ABI) encoding for types. Further details are + available here.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          encode

          +
          public static byte[] encode(Type parameter)
          +
        • +
        + + + +
          +
        • +

          encodeAddress

          +
          public static byte[] encodeAddress(Address address)
          +
        • +
        + + + +
          +
        • +

          encodeNumeric

          +
          public static byte[] encodeNumeric(NumericType numericType)
          +
        • +
        + + + +
          +
        • +

          encodeBool

          +
          public static byte[] encodeBool(Bool value)
          +
        • +
        + + + +
          +
        • +

          encodeBytes

          +
          public static byte[] encodeBytes(BytesType bytesType)
          +
        • +
        + + + +
          +
        • +

          encodeDynamicBytes

          +
          public static byte[] encodeDynamicBytes(DynamicBytes dynamicBytes)
          +
        • +
        + + + +
          +
        • +

          encodeString

          +
          public static byte[] encodeString(Utf8String string)
          +
        • +
        + + + +
          +
        • +

          encodeArrayValues

          +
          public static <T extends Type> byte[] encodeArrayValues(Array<T> value)
          +
        • +
        + + + +
          +
        • +

          encodeDynamicArray

          +
          public static <T extends Type> byte[] encodeDynamicArray(DynamicArray<T> value)
          +
        • +
        + + + +
          +
        • +

          encodeDynamicStruct

          +
          public static byte[] encodeDynamicStruct(DynamicStruct value)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeMappingException.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeMappingException.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeMappingException.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeMappingException.html index c984cb366..ba7d2066f 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeMappingException.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/TypeMappingException.html @@ -4,7 +4,7 @@ -TypeMappingException (java-sdk 3.0.0 API) +TypeMappingException (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.codec.abi

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-summary.html new file mode 100644 index 000000000..fabaacba4 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-summary.html @@ -0,0 +1,179 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.abi (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.abi

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      类概要 
      说明
      Constant 
      FunctionEncoder +
      Ethereum Contract Application Binary Interface (ABI) encoding for functions.
      +
      FunctionReturnDecoder +
      Decodes values returned by function or event calls.
      +
      TypeDecoder +
      Ethereum Contract Application Binary Interface (ABI) decoding for types.
      +
      TypeEncoder +
      Ethereum Contract Application Binary Interface (ABI) encoding for types.
      +
      +
    • +
    • + + + + + + + + + + + + +
      异常错误概要 
      异常错误说明
      TypeMappingException 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-tree.html new file mode 100644 index 000000000..9f8bb59c8 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/package-tree.html @@ -0,0 +1,160 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.abi 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.abi的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/ContractAbiUtil.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/ContractAbiUtil.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/ContractAbiUtil.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/ContractAbiUtil.html index b5ff9b8b3..6eb1142e6 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/ContractAbiUtil.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/ContractAbiUtil.html @@ -4,7 +4,7 @@ -ContractAbiUtil (java-sdk 3.0.0 API) +ContractAbiUtil (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.codec.abi.tools

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-summary.html new file mode 100644 index 000000000..f7c8ae3e5 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-summary.html @@ -0,0 +1,146 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.abi.tools (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.abi.tools

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-tree.html new file mode 100644 index 000000000..2c1ab1ae9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/abi/tools/package-tree.html @@ -0,0 +1,136 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.abi.tools 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.abi.tools的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object + +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/AbiTypes.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/AbiTypes.html similarity index 98% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/AbiTypes.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/AbiTypes.html index 5a623ca00..ca2de41f5 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/AbiTypes.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/AbiTypes.html @@ -4,7 +4,7 @@ -AbiTypes (java-sdk 3.0.0 API) +AbiTypes (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.codec.datatypes.generated

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-summary.html new file mode 100644 index 000000000..88d9c07bc --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-summary.html @@ -0,0 +1,910 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes.generated (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.datatypes.generated

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-tree.html new file mode 100644 index 000000000..c84a63336 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/package-tree.html @@ -0,0 +1,295 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes.generated 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.datatypes.generated的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.codec.datatypes.Array<T> (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) +
          +
        • org.fisco.bcos.sdk.v3.codec.datatypes.StaticArray<T> +
            +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray1<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray10<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray11<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray12<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray128<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray13<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray14<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray15<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray16<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray17<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray18<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray19<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray2<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray20<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray21<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray22<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray23<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray24<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray25<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray26<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray27<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray28<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray29<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray3<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray30<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray31<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray32<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray4<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray5<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray6<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray7<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray8<T>
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.StaticArray9<T>
          • +
          +
        • +
        +
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.BytesType (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) +
          +
        • org.fisco.bcos.sdk.v3.codec.datatypes.Bytes +
            +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes1
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes10
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes11
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes12
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes13
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes14
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes15
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes16
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes17
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes18
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes19
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes2
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes20
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes21
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes22
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes23
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes24
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes25
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes26
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes27
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes28
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes29
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes3
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes30
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes31
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes4
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes5
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes6
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes7
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes8
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes9
          • +
          +
        • +
        +
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.NumericType (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) +
          +
        • org.fisco.bcos.sdk.v3.codec.datatypes.IntType +
            +
          • org.fisco.bcos.sdk.v3.codec.datatypes.Int +
              +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int104
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int112
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int120
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int128
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int136
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int144
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int152
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int16
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int160
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int168
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int176
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int184
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int192
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int200
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int208
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int216
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int224
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int232
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int24
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int240
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int248
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int256
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int32
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int40
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int48
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int56
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int64
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int72
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int8
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int80
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int88
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Int96
            • +
            +
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.Uint +
              +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint104
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint112
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint120
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint128
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint136
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint144
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint152
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint16
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint160
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint168
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint176
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint184
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint192
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint200
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint208
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint216
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint224
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint232
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint24
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint240
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint248
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint40
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint48
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint56
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint72
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint80
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint88
            • +
            • org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint96
            • +
            +
          • +
          +
        • +
        +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/Tuple.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/Tuple.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/Tuple.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/Tuple.html index 20b565738..5f9359a2a 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/Tuple.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/Tuple.html @@ -4,7 +4,7 @@ -Tuple (java-sdk 3.0.0 API) +Tuple (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-summary.html new file mode 100644 index 000000000..d0613cc8d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-summary.html @@ -0,0 +1,256 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      类概要 
      说明
      Tuple1<T1> +
      Auto generated code.
      +
      Tuple10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> +
      Auto generated code.
      +
      Tuple11<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11> +
      Auto generated code.
      +
      Tuple12<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12> +
      Auto generated code.
      +
      Tuple13<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13> +
      Auto generated code.
      +
      Tuple14<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14> +
      Auto generated code.
      +
      Tuple15<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15> +
      Auto generated code.
      +
      Tuple16<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16> +
      Auto generated code.
      +
      Tuple17<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17> +
      Auto generated code.
      +
      Tuple18<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18> +
      Auto generated code.
      +
      Tuple19<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> +
      Auto generated code.
      +
      Tuple2<T1,T2> +
      Auto generated code.
      +
      Tuple20<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20> +
      Auto generated code.
      +
      Tuple3<T1,T2,T3> +
      Auto generated code.
      +
      Tuple4<T1,T2,T3,T4> +
      Auto generated code.
      +
      Tuple5<T1,T2,T3,T4,T5> +
      Auto generated code.
      +
      Tuple6<T1,T2,T3,T4,T5,T6> +
      Auto generated code.
      +
      Tuple7<T1,T2,T3,T4,T5,T6,T7> +
      Auto generated code.
      +
      Tuple8<T1,T2,T3,T4,T5,T6,T7,T8> +
      Auto generated code.
      +
      Tuple9<T1,T2,T3,T4,T5,T6,T7,T8,T9> +
      Auto generated code.
      +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-tree.html new file mode 100644 index 000000000..fd5f1308f --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/generated/package-tree.html @@ -0,0 +1,154 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple1<T1> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple11<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple12<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple13<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple14<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple15<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple16<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple17<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple18<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple19<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple2<T1,T2> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple20<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple3<T1,T2,T3> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple4<T1,T2,T3,T4> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple5<T1,T2,T3,T4,T5> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple6<T1,T2,T3,T4,T5,T6> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple7<T1,T2,T3,T4,T5,T6,T7> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple8<T1,T2,T3,T4,T5,T6,T7,T8> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple9<T1,T2,T3,T4,T5,T6,T7,T8,T9> (implements org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple)
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-frame.html new file mode 100644 index 000000000..6815bc638 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-frame.html @@ -0,0 +1,20 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples

    +
    +

    接口

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-summary.html new file mode 100644 index 000000000..73929000e --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-summary.html @@ -0,0 +1,142 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      接口概要 
      接口说明
      Tuple +
      Tuple abstraction.
      +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-tree.html new file mode 100644 index 000000000..67ea65587 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/generated/tuples/package-tree.html @@ -0,0 +1,131 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples的分层结构

    +程序包分层结构: + +
    +
    +

    接口分层结构

    +
      +
    • org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.Tuple
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-frame.html new file mode 100644 index 000000000..7f79036b3 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-frame.html @@ -0,0 +1,48 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.codec.datatypes

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-summary.html new file mode 100644 index 000000000..5630d0c53 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-summary.html @@ -0,0 +1,293 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.datatypes

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-tree.html new file mode 100644 index 000000000..f0bd8a318 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/datatypes/package-tree.html @@ -0,0 +1,191 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.datatypes 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.datatypes的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.codec.datatypes.AbiTypes
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.Address (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.Array<T> (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) +
          +
        • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicArray<T> +
            +
          • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicStruct (implements org.fisco.bcos.sdk.v3.codec.datatypes.StructType)
          • +
          +
        • +
        • org.fisco.bcos.sdk.v3.codec.datatypes.StaticArray<T> +
            +
          • org.fisco.bcos.sdk.v3.codec.datatypes.StaticStruct (implements org.fisco.bcos.sdk.v3.codec.datatypes.StructType)
          • +
          +
        • +
        +
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.Bool (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>)
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.BytesType (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) +
          +
        • org.fisco.bcos.sdk.v3.codec.datatypes.Bytes
        • +
        • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes
        • +
        +
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.Event
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.Function
      • +
      • com.fasterxml.jackson.databind.JsonSerializer<T> (implements com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable) + +
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.NumericType (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) +
          +
        • org.fisco.bcos.sdk.v3.codec.datatypes.FixedPointType +
            +
          • org.fisco.bcos.sdk.v3.codec.datatypes.Fixed
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.Ufixed
          • +
          +
        • +
        • org.fisco.bcos.sdk.v3.codec.datatypes.IntType +
            +
          • org.fisco.bcos.sdk.v3.codec.datatypes.Int
          • +
          • org.fisco.bcos.sdk.v3.codec.datatypes.Uint
          • +
          +
        • +
        +
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.TypeReference<T> (implements java.lang.Comparable<T>) + +
      • +
      • org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>)
      • +
      +
    • +
    +

    接口分层结构

    +
      +
    • org.fisco.bcos.sdk.v3.codec.datatypes.StructType
    • +
    • org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-frame.html new file mode 100644 index 000000000..f2e922e9e --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-frame.html @@ -0,0 +1,33 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.codec

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-summary.html new file mode 100644 index 000000000..98ca21212 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-summary.html @@ -0,0 +1,198 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-tree.html new file mode 100644 index 000000000..85b2c84ff --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/package-tree.html @@ -0,0 +1,156 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/CompactMode.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/CompactMode.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/CompactMode.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/CompactMode.html index 4bb83e12f..5ffc851df 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/CompactMode.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/CompactMode.html @@ -4,7 +4,7 @@ -CompactMode (java-sdk 3.0.0 API) +CompactMode (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec.scale
    +

    类 FunctionEncoder

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          FunctionEncoder

          +
          @Deprecated
          +public FunctionEncoder(CryptoSuite cryptoSuite)
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          FunctionEncoder

          +
          public FunctionEncoder(Hash hash)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + + + + + +
          +
        • +

          encodeConstructor

          +
          public static byte[] encodeConstructor(java.util.List<Type> parameters)
          +
        • +
        + + + +
          +
        • +

          encodeParameters

          +
          public static byte[] encodeParameters(java.util.List<Type> parameters,
          +                                      byte[] methodID)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/FunctionReturnDecoder.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/FunctionReturnDecoder.html new file mode 100644 index 000000000..16de66b94 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/FunctionReturnDecoder.html @@ -0,0 +1,332 @@ + + + + + + +FunctionReturnDecoder (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec.scale
    +

    类 FunctionReturnDecoder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.codec.scale.FunctionReturnDecoder
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + +
        所有方法 实例方法 具体方法 
        限定符和类型方法和说明
        java.util.List<Type>decode(java.lang.String rawInput, + java.util.List<TypeReference<Type>> outputParameters) +
        Decode SCALE encoded return values from smart contract function call.
        +
        <T extends Type>
        Type
        decodeIndexedValue(java.lang.String rawInput, + TypeReference<T> typeReference) +
        Decodes an indexed parameter associated with an event.
        +
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          FunctionReturnDecoder

          +
          public FunctionReturnDecoder()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          decodeIndexedValue

          +
          public <T extends TypeType decodeIndexedValue(java.lang.String rawInput,
          +                                                TypeReference<T> typeReference)
          +
          Decodes an indexed parameter associated with an event. Indexed parameters are individually + encoded, unlike non-indexed parameters which are encoded as per ABI-encoded function + parameters and return values. + +

          If any of the following types are indexed, the Keccak-256 hashes of the values are + returned instead. These are returned as a bytes32 value. + +

            +
          • Arrays +
          • Strings +
          • Bytes +
          + +

          See the Solidity + documentation for further information.

          +
          +
          指定者:
          +
          decodeIndexedValue 在接口中 FunctionReturnDecoderInterface
          +
          类型参数:
          +
          T - type of TypeReference
          +
          参数:
          +
          rawInput - ABI encoded input
          +
          typeReference - of expected result type
          +
          返回:
          +
          the decode value
          +
          +
        • +
        + + + +
          +
        • +

          decode

          +
          public java.util.List<Type> decode(java.lang.String rawInput,
          +                                   java.util.List<TypeReference<Type>> outputParameters)
          +
          Decode SCALE encoded return values from smart contract function call.
          +
          +
          指定者:
          +
          decode 在接口中 FunctionReturnDecoderInterface
          +
          参数:
          +
          rawInput - SCALE encoded input
          +
          outputParameters - list of return types as TypeReference
          +
          返回:
          +
          List of values returned by function, Collections.emptyList() if + invalid response
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/ScaleCodecReader.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/ScaleCodecReader.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/ScaleCodecReader.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/ScaleCodecReader.html index 0def3f5dd..7c45b896b 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/ScaleCodecReader.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/ScaleCodecReader.html @@ -4,7 +4,7 @@ -ScaleCodecReader (java-sdk 3.0.0 API) +ScaleCodecReader (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec.scale
    +

    类 TypeDecoder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.codec.scale.TypeDecoder
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TypeDecoder
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TypeDecoder

          +
          public TypeDecoder()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          decode

          +
          public static <T extends Type> T decode(ScaleCodecReader reader,
          +                                        TypeReference<T> typeReference)
          +                                 throws java.lang.ClassNotFoundException
          +
          +
          抛出:
          +
          java.lang.ClassNotFoundException
          +
          +
        • +
        + + + +
          +
        • +

          decode

          +
          public static <T extends Type> T decode(byte[] input,
          +                                        TypeReference<T> typeReference)
          +                                 throws java.lang.ClassNotFoundException
          +
          +
          抛出:
          +
          java.lang.ClassNotFoundException
          +
          +
        • +
        + + + +
          +
        • +

          decode

          +
          public static <T extends Type> T decode(java.lang.String input,
          +                                        TypeReference<T> typeReference)
          +                                 throws java.lang.ClassNotFoundException
          +
          +
          抛出:
          +
          java.lang.ClassNotFoundException
          +
          +
        • +
        + + + + + + + + + + + + + + + +
          +
        • +

          decodeBytes

          +
          public static <T extends BytesType> T decodeBytes(ScaleCodecReader reader,
          +                                                  java.lang.Class<T> type)
          +
        • +
        + + + +
          +
        • +

          decodeStaticBytes

          +
          public static <T extends BytesType> T decodeStaticBytes(ScaleCodecReader reader,
          +                                                        java.lang.Class<T> type)
          +
        • +
        + + + + + + + +
          +
        • +

          decodeArray

          +
          public static <T extends Type> T decodeArray(ScaleCodecReader reader,
          +                                             TypeReference<T> typeReference,
          +                                             java.util.function.BiFunction<java.util.List<T>,java.lang.String,T> consumer,
          +                                             java.lang.Integer length)
          +
        • +
        + + + + + + + + + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/TypeEncoder.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/TypeEncoder.html new file mode 100644 index 000000000..30b2d6e48 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/TypeEncoder.html @@ -0,0 +1,456 @@ + + + + + + +TypeEncoder (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.codec.scale
    +

    类 TypeEncoder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.codec.scale.TypeEncoder
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TypeEncoder
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TypeEncoder

          +
          public TypeEncoder()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          encode

          +
          public static void encode(Type parameter,
          +                          ScaleCodecWriter writer)
          +                   throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          encode

          +
          public static byte[] encode(Type parameter)
          +                     throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeAddress

          +
          public static void encodeAddress(Address address,
          +                                 ScaleCodecWriter writer)
          +                          throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeNumeric

          +
          public static void encodeNumeric(NumericType numericType,
          +                                 ScaleCodecWriter writer)
          +                          throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeBool

          +
          public static void encodeBool(Bool boolType,
          +                              ScaleCodecWriter writer)
          +                       throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeBytes

          +
          public static void encodeBytes(BytesType bytesType,
          +                               ScaleCodecWriter writer)
          +                        throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeStaticBytes

          +
          public static void encodeStaticBytes(Bytes bytesType,
          +                                     ScaleCodecWriter writer)
          +                              throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeString

          +
          public static void encodeString(Utf8String stringType,
          +                                ScaleCodecWriter writer)
          +                         throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeStruct

          +
          public static void encodeStruct(StructType structType,
          +                                ScaleCodecWriter writer)
          +                         throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeArray

          +
          public static void encodeArray(Array array,
          +                               ScaleCodecWriter writer,
          +                               boolean isDynamic)
          +                        throws java.io.IOException
          +
          +
          抛出:
          +
          java.io.IOException
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-frame.html new file mode 100644 index 000000000..495a9b363 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-frame.html @@ -0,0 +1,35 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.scale (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.codec.scale

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-summary.html new file mode 100644 index 000000000..fccf1a294 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-summary.html @@ -0,0 +1,198 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.scale (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.scale

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-tree.html new file mode 100644 index 000000000..e23f7550f --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/package-tree.html @@ -0,0 +1,166 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.scale 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.scale的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +

    枚举分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/BoolReader.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/BoolReader.html similarity index 98% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/BoolReader.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/BoolReader.html index 8f0b88086..8bac1a2e3 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/BoolReader.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/BoolReader.html @@ -4,7 +4,7 @@ -BoolReader (java-sdk 3.0.0 API) +BoolReader (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.codec.scale.reader

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-summary.html new file mode 100644 index 000000000..bf06407a5 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-summary.html @@ -0,0 +1,152 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.scale.reader (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.scale.reader

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-tree.html new file mode 100644 index 000000000..352bee93c --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/reader/package-tree.html @@ -0,0 +1,138 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.scale.reader 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.scale.reader的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object + +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/CompactBigIntWriter.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/CompactBigIntWriter.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/CompactBigIntWriter.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/CompactBigIntWriter.html index 95f863593..bbf95b0c9 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/CompactBigIntWriter.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/CompactBigIntWriter.html @@ -4,7 +4,7 @@ -CompactBigIntWriter (java-sdk 3.0.0 API) +CompactBigIntWriter (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.codec.scale.writer

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-summary.html new file mode 100644 index 000000000..91c620234 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-summary.html @@ -0,0 +1,148 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.scale.writer (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.scale.writer

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-tree.html new file mode 100644 index 000000000..a5d9abd6c --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/scale/writer/package-tree.html @@ -0,0 +1,137 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.scale.writer 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.scale.writer的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/ABIDefinition.ConflictField.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/ABIDefinition.ConflictField.html similarity index 93% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/ABIDefinition.ConflictField.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/ABIDefinition.ConflictField.html index aed84cc65..92cabdc8e 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/ABIDefinition.ConflictField.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/ABIDefinition.ConflictField.html @@ -4,7 +4,7 @@ -ABIDefinition.ConflictField (java-sdk 3.0.0 API) +ABIDefinition.ConflictField (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,14 +12,14 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ + + +

    org.fisco.bcos.sdk.v3.codec.wrapper

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-summary.html new file mode 100644 index 000000000..0df95b704 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-summary.html @@ -0,0 +1,208 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.wrapper (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.codec.wrapper

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-tree.html new file mode 100644 index 000000000..b34e69fc1 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/codec/wrapper/package-tree.html @@ -0,0 +1,158 @@ + + + + + + +org.fisco.bcos.sdk.v3.codec.wrapper 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.codec.wrapper的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    枚举分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/Config.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/Config.html similarity index 98% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/Config.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/Config.html index 1c4a5d524..f2ecb48be 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/Config.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/Config.html @@ -4,7 +4,7 @@ -Config (java-sdk 3.0.0 API) +Config (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.config.exceptions

    +
    +

    异常错误

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-summary.html new file mode 100644 index 000000000..55e0e09ec --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-summary.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.config.exceptions (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.config.exceptions

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      异常错误概要 
      异常错误说明
      ConfigException 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-tree.html new file mode 100644 index 000000000..737eb21a8 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/exceptions/package-tree.html @@ -0,0 +1,143 @@ + + + + + + +org.fisco.bcos.sdk.v3.config.exceptions 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.config.exceptions的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Throwable (implements java.io.Serializable) +
          +
        • java.lang.Exception + +
        • +
        +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/AccountConfig.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/AccountConfig.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/AccountConfig.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/AccountConfig.html index 67b8dd59d..30808b1df 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/AccountConfig.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/AccountConfig.html @@ -4,7 +4,7 @@ -AccountConfig (java-sdk 3.0.0 API) +AccountConfig (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,13 +12,13 @@ @@ -12,13 +12,13 @@ @@ -12,13 +12,13 @@ + + +

    org.fisco.bcos.sdk.v3.config.model

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-summary.html new file mode 100644 index 000000000..0b4ee5d58 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-summary.html @@ -0,0 +1,176 @@ + + + + + + +org.fisco.bcos.sdk.v3.config.model (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.config.model

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-tree.html new file mode 100644 index 000000000..bb5968802 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/model/package-tree.html @@ -0,0 +1,141 @@ + + + + + + +org.fisco.bcos.sdk.v3.config.model 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.config.model的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-frame.html new file mode 100644 index 000000000..7bab4496e --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-frame.html @@ -0,0 +1,21 @@ + + + + + + +org.fisco.bcos.sdk.v3.config (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.config

    +
    +

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-summary.html new file mode 100644 index 000000000..155ad60e0 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-summary.html @@ -0,0 +1,148 @@ + + + + + + +org.fisco.bcos.sdk.v3.config (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.config

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + +
      类概要 
      说明
      Config +
      Config is to load config file and verify.
      +
      ConfigOption +
      ConfigOption is the java object of the config file.
      +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-tree.html new file mode 100644 index 000000000..592a8ec6b --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/config/package-tree.html @@ -0,0 +1,136 @@ + + + + + + +org.fisco.bcos.sdk.v3.config 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.config的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object + +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/Contract.EventValuesWithLog.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/Contract.EventValuesWithLog.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/Contract.EventValuesWithLog.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/Contract.EventValuesWithLog.html index 37dc668bf..8c6254486 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/Contract.EventValuesWithLog.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/Contract.EventValuesWithLog.html @@ -4,7 +4,7 @@ -Contract.EventValuesWithLog (java-sdk 3.0.0 API) +Contract.EventValuesWithLog (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract
    +

    类 Contract

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.Contract
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          Contract

          +
          protected Contract(java.lang.String contractBinary,
          +                   java.lang.String contractAddress,
          +                   Client client,
          +                   CryptoKeyPair credential,
          +                   TransactionProcessor transactionProcessor)
          +
          Constructor
          +
          +
          参数:
          +
          contractBinary - the contract binary code hex string
          +
          contractAddress - the contract address
          +
          client - a Client object
          +
          credential - key pair to use when sign transaction
          +
          transactionProcessor - TransactionProcessor object
          +
          +
        • +
        + + + +
          +
        • +

          Contract

          +
          protected Contract(java.lang.String contractBinary,
          +                   java.lang.String contractAddress,
          +                   Client client,
          +                   CryptoKeyPair credential)
          +
          Constructor, auto create a TransactionProcessor object
          +
          +
          参数:
          +
          contractBinary - the contract binary code hex string
          +
          contractAddress - the contract address
          +
          client - a Client object to send requests
          +
          credential - key pair to use when sign transaction
          +
          +
        • +
        + + + +
          +
        • +

          Contract

          +
          protected Contract(java.lang.String contractBinary,
          +                   java.lang.String contractAddress,
          +                   Client client,
          +                   TransactionManager transactionManager)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getContractAddress

          +
          public java.lang.String getContractAddress()
          +
        • +
        + + + +
          +
        • +

          setContractAddress

          +
          public void setContractAddress(java.lang.String contractAddress)
          +
        • +
        + + + + + + + +
          +
        • +

          setDeployReceipt

          +
          public void setDeployReceipt(TransactionReceipt deployReceipt)
          +
        • +
        + + + + + + + +
          +
        • +

          setTransactionProcessor

          +
          public void setTransactionProcessor(TransactionProcessor transactionProcessor)
          +
        • +
        + + + +
          +
        • +

          getCurrentExternalAccountAddress

          +
          public java.lang.String getCurrentExternalAccountAddress()
          +
        • +
        + + + +
          +
        • +

          isEnableDAG

          +
          public boolean isEnableDAG()
          +
        • +
        + + + +
          +
        • +

          setEnableDAG

          +
          public void setEnableDAG(boolean enableDAG)
          +
        • +
        + + + +
          +
        • +

          setTransactionManager

          +
          public void setTransactionManager(TransactionManager transactionManager)
          +
        • +
        + + + +
          +
        • +

          deploy

          +
          protected static <T extends Contract> T deploy(java.lang.Class<T> type,
          +                                               Client client,
          +                                               CryptoKeyPair credential,
          +                                               java.lang.String binary,
          +                                               java.lang.String abi,
          +                                               byte[] encodedConstructor,
          +                                               java.lang.String path)
          +                                        throws ContractException
          +
          Deploy contract
          +
          +
          类型参数:
          +
          T - a smart contract object extends Contract
          +
          参数:
          +
          type - class type
          +
          client - a Client object to send requests
          +
          credential - key pair to use when sign transaction
          +
          abi - ABI json string
          +
          binary - the contract binary code hex string
          +
          encodedConstructor - constructor params
          +
          path - bfs path, this param only use in wasm vm
          +
          返回:
          +
          T type smart contract
          +
          抛出:
          +
          ContractException - throws when deploy failed
          +
          +
        • +
        + + + +
          +
        • +

          deploy

          +
          protected static <T extends Contract> T deploy(java.lang.Class<T> type,
          +                                               Client client,
          +                                               CryptoKeyPair credential,
          +                                               java.lang.String binary,
          +                                               java.lang.String abi,
          +                                               byte[] encodedConstructor,
          +                                               java.lang.String path,
          +                                               java.math.BigInteger value)
          +                                        throws ContractException
          +
          +
          抛出:
          +
          ContractException
          +
          +
        • +
        + + + +
          +
        • +

          asyncExecuteCall

          +
          protected void asyncExecuteCall(Function function,
          +                                CallCallback callback)
          +
        • +
        + + + +
          +
        • +

          asyncExecuteCallByTransactionManager

          +
          protected void asyncExecuteCallByTransactionManager(Function function,
          +                                                    CallCallback callback)
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          generateTxAttributeWithDagFlag

          +
          protected int generateTxAttributeWithDagFlag(java.lang.String functionName,
          +                                             int dagAttribute)
          +
        • +
        + + + +
          +
        • +

          asyncExecuteTransaction

          +
          protected java.lang.String asyncExecuteTransaction(byte[] data,
          +                                                   java.lang.String funName,
          +                                                   TransactionCallback callback,
          +                                                   int dagAttribute)
          +
        • +
        + + + +
          +
        • +

          asyncExecuteTransaction

          +
          protected java.lang.String asyncExecuteTransaction(byte[] data,
          +                                                   java.lang.String funName,
          +                                                   TransactionCallback callback,
          +                                                   int dagAttribute,
          +                                                   java.math.BigInteger value)
          +
        • +
        + + + +
          +
        • +

          asyncExecuteTransaction

          +
          protected java.lang.String asyncExecuteTransaction(Function function,
          +                                                   TransactionCallback callback)
          +
        • +
        + + + + + + + +
          +
        • +

          executeDeployTransaction

          +
          protected TransactionReceipt executeDeployTransaction(byte[] data,
          +                                                      java.lang.String abi)
          +
        • +
        + + + +
          +
        • +

          executeDeployTransaction

          +
          protected TransactionReceipt executeDeployTransaction(byte[] data,
          +                                                      java.lang.String abi,
          +                                                      java.math.BigInteger value)
          +
        • +
        + + + +
          +
        • +

          createSignedTransaction

          +
          protected java.lang.String createSignedTransaction(Function function)
          +
        • +
        + + + + + + + +
          +
        • +

          subscribeEvent

          +
          public void subscribeEvent(java.lang.String topic0,
          +                           EventSubCallback callback)
          +
        • +
        + + + +
          +
        • +

          subscribeEvent

          +
          public void subscribeEvent(java.lang.String topic0,
          +                           java.math.BigInteger fromBlock,
          +                           java.math.BigInteger toBlock,
          +                           EventSubCallback callback)
          +
        • +
        + + + +
          +
        • +

          subscribeEvent

          +
          public void subscribeEvent(java.lang.String topic0,
          +                           java.util.List<java.lang.String> otherTopics,
          +                           java.math.BigInteger fromBlock,
          +                           java.math.BigInteger toBlock,
          +                           EventSubCallback callback)
          +
        • +
        + + + +
          +
        • +

          subscribeEvent

          +
          public void subscribeEvent(java.math.BigInteger fromBlock,
          +                           java.math.BigInteger toBlock,
          +                           java.util.List<java.util.List<java.lang.String>> topics,
          +                           EventSubCallback callback)
          +
        • +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
        • +

          convertToNative

          +
          public static <S extends Type,T> java.util.List<T> convertToNative(java.util.List<S> arr)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/AccountManager.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/AccountManager.html new file mode 100644 index 000000000..aa50f9d59 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/AccountManager.html @@ -0,0 +1,496 @@ + + + + + + +AccountManager (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.auth.contracts
    +

    类 AccountManager

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class AccountManager
      +extends Contract
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          ABI_ARRAY

          +
          public static final java.lang.String[] ABI_ARRAY
          +
        • +
        + + + +
          +
        • +

          ABI

          +
          public static final java.lang.String ABI
          +
        • +
        + + + +
          +
        • +

          FUNC_GETACCOUNTSTATUS

          +
          public static final java.lang.String FUNC_GETACCOUNTSTATUS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_SETACCOUNTSTATUS

          +
          public static final java.lang.String FUNC_SETACCOUNTSTATUS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + + +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getABI

          +
          public static java.lang.String getABI()
          +
        • +
        + + + + + + + +
          +
        • +

          setAccountStatus

          +
          public TransactionReceipt setAccountStatus(java.lang.String addr,
          +                                           java.math.BigInteger status)
          +
        • +
        + + + +
          +
        • +

          setAccountStatus

          +
          public java.lang.String setAccountStatus(java.lang.String addr,
          +                                         java.math.BigInteger status,
          +                                         TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForSetAccountStatus

          +
          public java.lang.String getSignedTransactionForSetAccountStatus(java.lang.String addr,
          +                                                                java.math.BigInteger status)
          +
        • +
        + + + +
          +
        • +

          getSetAccountStatusInput

          +
          public Tuple2<java.lang.String,java.math.BigInteger> getSetAccountStatusInput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + +
          +
        • +

          getSetAccountStatusOutput

          +
          public Tuple1<java.math.BigInteger> getSetAccountStatusOutput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/Committee.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/Committee.html similarity index 86% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/Committee.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/Committee.html index 1519e986e..22f5c9167 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/Committee.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/Committee.html @@ -4,7 +4,7 @@ -Committee (java-sdk 3.0.0 API) +Committee (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.contract.auth.contracts

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-summary.html new file mode 100644 index 000000000..5d9a0e78f --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-summary.html @@ -0,0 +1,160 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.auth.contracts (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.auth.contracts

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-tree.html new file mode 100644 index 000000000..d50d8c207 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/contracts/package-tree.html @@ -0,0 +1,144 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.auth.contracts 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.auth.contracts的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/AuthManager.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/AuthManager.html similarity index 80% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/AuthManager.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/AuthManager.html index f6cd154e5..567f971b6 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/AuthManager.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/AuthManager.html @@ -4,7 +4,7 @@ -AuthManager (java-sdk 3.0.0 API) +AuthManager (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ + + +

    org.fisco.bcos.sdk.v3.contract.auth.manager

    +
    +

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-summary.html new file mode 100644 index 000000000..9476f8096 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-summary.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.auth.manager (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.auth.manager

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      类概要 
      说明
      AuthManager 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-tree.html new file mode 100644 index 000000000..438136b19 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/manager/package-tree.html @@ -0,0 +1,135 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.auth.manager 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.auth.manager的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.contract.auth.manager.AuthManager
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/AccessStatus.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/AccessStatus.html new file mode 100644 index 000000000..79faa9dc3 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/AccessStatus.html @@ -0,0 +1,402 @@ + + + + + + +AccessStatus (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.auth.po
    +

    枚举 AccessStatus

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<AccessStatus>
      • +
      • +
          +
        • org.fisco.bcos.sdk.v3.contract.auth.po.AccessStatus
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      所有已实现的接口:
      +
      java.io.Serializable, java.lang.Comparable<AccessStatus>
      +
      +
      +
      +
      public enum AccessStatus
      +extends java.lang.Enum<AccessStatus>
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 静态方法 实例方法 具体方法 
        限定符和类型方法和说明
        static AccessStatusgetAccessStatus(int status) 
        java.math.BigIntegergetBigIntStatus() 
        intgetStatus() 
        static AccessStatusvalueOf(java.lang.String name) +
        返回带有指定名称的该类型的枚举常量。
        +
        static AccessStatus[]values() +
        按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。
        +
        +
          +
        • + + +

          从类继承的方法 java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
        • +
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          values

          +
          public static AccessStatus[] values()
          +
          按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。该方法可用于迭代 +常量, 如下所示: +
          +for (AccessStatus c : AccessStatus.values())
          +    System.out.println(c);
          +
          +
          +
          返回:
          +
          按照声明该枚举类型的常量的顺序返回的包含这些常量的数组
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static AccessStatus valueOf(java.lang.String name)
          +
          返回带有指定名称的该类型的枚举常量。 +字符串必须与用于声明该类型的枚举常量的 +标识符完全匹配。(不允许有多余 +的空格字符。)
          +
          +
          参数:
          +
          name - 要返回的枚举常量的名称。
          +
          返回:
          +
          返回带有指定名称的枚举常量
          +
          抛出:
          +
          java.lang.IllegalArgumentException - 如果该枚举类型没有带有指定名称的常量
          +
          java.lang.NullPointerException - 如果参数为空值
          +
          +
        • +
        + + + +
          +
        • +

          getStatus

          +
          public int getStatus()
          +
        • +
        + + + +
          +
        • +

          getBigIntStatus

          +
          public java.math.BigInteger getBigIntStatus()
          +
        • +
        + + + +
          +
        • +

          getAccessStatus

          +
          public static AccessStatus getAccessStatus(int status)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/AuthType.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/AuthType.html similarity index 96% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/AuthType.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/AuthType.html index f25400202..459b47edd 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/AuthType.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/AuthType.html @@ -4,7 +4,7 @@ -AuthType (java-sdk 3.0.0 API) +AuthType (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.contract.auth.po

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-summary.html new file mode 100644 index 000000000..4458c847b --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-summary.html @@ -0,0 +1,175 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.auth.po (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.auth.po

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-tree.html new file mode 100644 index 000000000..9b49f3d68 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/auth/po/package-tree.html @@ -0,0 +1,164 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.auth.po 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.auth.po的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.codec.datatypes.Array<T> (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) +
          +
        • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicArray<T> +
            +
          • org.fisco.bcos.sdk.v3.codec.datatypes.DynamicStruct (implements org.fisco.bcos.sdk.v3.codec.datatypes.StructType) + +
          • +
          +
        • +
        +
      • +
      • org.fisco.bcos.sdk.v3.contract.auth.po.CommitteeInfo
      • +
      • org.fisco.bcos.sdk.v3.contract.auth.po.GovernorInfo
      • +
      +
    • +
    +

    枚举分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-frame.html new file mode 100644 index 000000000..d32e996c5 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-frame.html @@ -0,0 +1,21 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.contract

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-summary.html new file mode 100644 index 000000000..7c0d92439 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-summary.html @@ -0,0 +1,149 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + +
      类概要 
      说明
      Contract +
      Contract help manage all operations including deploy, send transaction, call contract, and + subscribe event of one specific contract.
      +
      Contract.EventValuesWithLog +
      Adds a log field to EventValues.
      +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-tree.html new file mode 100644 index 000000000..c13901058 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/package-tree.html @@ -0,0 +1,136 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/BalancePrecompiled.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/BalancePrecompiled.html new file mode 100644 index 000000000..473536778 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/BalancePrecompiled.html @@ -0,0 +1,909 @@ + + + + + + +BalancePrecompiled (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.balance
    +

    类 BalancePrecompiled

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class BalancePrecompiled
      +extends Contract
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          BINARY_ARRAY

          +
          public static final java.lang.String[] BINARY_ARRAY
          +
        • +
        + + + +
          +
        • +

          BINARY

          +
          public static final java.lang.String BINARY
          +
        • +
        + + + +
          +
        • +

          SM_BINARY_ARRAY

          +
          public static final java.lang.String[] SM_BINARY_ARRAY
          +
        • +
        + + + +
          +
        • +

          SM_BINARY

          +
          public static final java.lang.String SM_BINARY
          +
        • +
        + + + +
          +
        • +

          ABI_ARRAY

          +
          public static final java.lang.String[] ABI_ARRAY
          +
        • +
        + + + +
          +
        • +

          ABI

          +
          public static final java.lang.String ABI
          +
        • +
        + + + +
          +
        • +

          FUNC_ADDBALANCE

          +
          public static final java.lang.String FUNC_ADDBALANCE
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_GETBALANCE

          +
          public static final java.lang.String FUNC_GETBALANCE
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_LISTCALLER

          +
          public static final java.lang.String FUNC_LISTCALLER
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_REGISTERCALLER

          +
          public static final java.lang.String FUNC_REGISTERCALLER
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_SUBBALANCE

          +
          public static final java.lang.String FUNC_SUBBALANCE
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_TRANSFER

          +
          public static final java.lang.String FUNC_TRANSFER
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_UNREGISTERCALLER

          +
          public static final java.lang.String FUNC_UNREGISTERCALLER
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          BalancePrecompiled

          +
          protected BalancePrecompiled(java.lang.String contractAddress,
          +                             Client client,
          +                             CryptoKeyPair credential)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getBinary

          +
          public static java.lang.String getBinary(CryptoSuite cryptoSuite)
          +
        • +
        + + + +
          +
        • +

          getABI

          +
          public static java.lang.String getABI()
          +
        • +
        + + + +
          +
        • +

          addBalance

          +
          public TransactionReceipt addBalance(java.lang.String account,
          +                                     java.math.BigInteger amount)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForAddBalance

          +
          public java.lang.String getSignedTransactionForAddBalance(java.lang.String account,
          +                                                          java.math.BigInteger amount)
          +
        • +
        + + + +
          +
        • +

          addBalance

          +
          public java.lang.String addBalance(java.lang.String account,
          +                                   java.math.BigInteger amount,
          +                                   TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getAddBalanceInput

          +
          public Tuple2<java.lang.String,java.math.BigInteger> getAddBalanceInput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          registerCaller

          +
          public TransactionReceipt registerCaller(java.lang.String account)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForRegisterCaller

          +
          public java.lang.String getSignedTransactionForRegisterCaller(java.lang.String account)
          +
        • +
        + + + +
          +
        • +

          registerCaller

          +
          public java.lang.String registerCaller(java.lang.String account,
          +                                       TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getRegisterCallerInput

          +
          public Tuple1<java.lang.String> getRegisterCallerInput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + +
          +
        • +

          subBalance

          +
          public TransactionReceipt subBalance(java.lang.String account,
          +                                     java.math.BigInteger amount)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForSubBalance

          +
          public java.lang.String getSignedTransactionForSubBalance(java.lang.String account,
          +                                                          java.math.BigInteger amount)
          +
        • +
        + + + +
          +
        • +

          subBalance

          +
          public java.lang.String subBalance(java.lang.String account,
          +                                   java.math.BigInteger amount,
          +                                   TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getSubBalanceInput

          +
          public Tuple2<java.lang.String,java.math.BigInteger> getSubBalanceInput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + +
          +
        • +

          transfer

          +
          public TransactionReceipt transfer(java.lang.String from,
          +                                   java.lang.String to,
          +                                   java.math.BigInteger amount)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForTransfer

          +
          public java.lang.String getSignedTransactionForTransfer(java.lang.String from,
          +                                                        java.lang.String to,
          +                                                        java.math.BigInteger amount)
          +
        • +
        + + + +
          +
        • +

          transfer

          +
          public java.lang.String transfer(java.lang.String from,
          +                                 java.lang.String to,
          +                                 java.math.BigInteger amount,
          +                                 TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getTransferInput

          +
          public Tuple3<java.lang.String,java.lang.String,java.math.BigInteger> getTransferInput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + +
          +
        • +

          unregisterCaller

          +
          public TransactionReceipt unregisterCaller(java.lang.String account)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForUnregisterCaller

          +
          public java.lang.String getSignedTransactionForUnregisterCaller(java.lang.String account)
          +
        • +
        + + + +
          +
        • +

          unregisterCaller

          +
          public java.lang.String unregisterCaller(java.lang.String account,
          +                                         TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getUnregisterCallerInput

          +
          public Tuple1<java.lang.String> getUnregisterCallerInput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + + + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/BalanceService.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/BalanceService.html new file mode 100644 index 000000000..a088e1f6d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/BalanceService.html @@ -0,0 +1,538 @@ + + + + + + +BalanceService (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.balance
    +

    类 BalanceService

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.balance.BalanceService
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class BalanceService
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/package-frame.html new file mode 100644 index 000000000..f1e0f9731 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/package-frame.html @@ -0,0 +1,21 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.balance (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.contract.precompiled.balance

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/package-summary.html new file mode 100644 index 000000000..0248fc606 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/package-summary.html @@ -0,0 +1,144 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.balance (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.precompiled.balance

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/package-tree.html new file mode 100644 index 000000000..ab6e0cb1c --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/balance/package-tree.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.balance 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.precompiled.balance的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object + +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSInfo.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSInfo.html new file mode 100644 index 000000000..d61baf7d1 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSInfo.html @@ -0,0 +1,426 @@ + + + + + + +BFSInfo (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.bfs
    +

    类 BFSInfo

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.bfs.BFSInfo
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class BFSInfo
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          BFSInfo

          +
          public BFSInfo(java.lang.String fileName,
          +               java.lang.String fileType)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getFileName

          +
          public java.lang.String getFileName()
          +
        • +
        + + + +
          +
        • +

          setFileName

          +
          public void setFileName(java.lang.String fileName)
          +
        • +
        + + + +
          +
        • +

          getFileType

          +
          public java.lang.String getFileType()
          +
        • +
        + + + +
          +
        • +

          setFileType

          +
          public void setFileType(java.lang.String fileType)
          +
        • +
        + + + +
          +
        • +

          getAddress

          +
          public java.lang.String getAddress()
          +
        • +
        + + + +
          +
        • +

          setAddress

          +
          public void setAddress(java.lang.String address)
          +
        • +
        + + + +
          +
        • +

          getAbi

          +
          public java.lang.String getAbi()
          +
        • +
        + + + +
          +
        • +

          setAbi

          +
          public void setAbi(java.lang.String abi)
          +
        • +
        + + + + + + + +
          +
        • +

          equals

          +
          public boolean equals(java.lang.Object o)
          +
          +
          覆盖:
          +
          equals 在类中 java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          hashCode

          +
          public int hashCode()
          +
          +
          覆盖:
          +
          hashCode 在类中 java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSPrecompiled.BfsInfo.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSPrecompiled.BfsInfo.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSPrecompiled.BfsInfo.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSPrecompiled.BfsInfo.html index eeb1ff659..c7beb5dec 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSPrecompiled.BfsInfo.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSPrecompiled.BfsInfo.html @@ -4,7 +4,7 @@ -BFSPrecompiled.BfsInfo (java-sdk 3.0.0 API) +BFSPrecompiled.BfsInfo (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.bfs
    +

    类 BFSPrecompiled

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class BFSPrecompiled
      +extends Contract
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          ABI_ARRAY

          +
          public static final java.lang.String[] ABI_ARRAY
          +
        • +
        + + + +
          +
        • +

          ABI

          +
          public static final java.lang.String ABI
          +
        • +
        + + + +
          +
        • +

          FUNC_FIXBFS

          +
          public static final java.lang.String FUNC_FIXBFS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_LINK

          +
          public static final java.lang.String FUNC_LINK
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_LIST

          +
          public static final java.lang.String FUNC_LIST
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_MKDIR

          +
          public static final java.lang.String FUNC_MKDIR
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_READLINK

          +
          public static final java.lang.String FUNC_READLINK
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          BFSPrecompiled

          +
          protected BFSPrecompiled(java.lang.String contractAddress,
          +                         Client client,
          +                         CryptoKeyPair credential)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getABI

          +
          public static java.lang.String getABI()
          +
        • +
        + + + + + + + +
          +
        • +

          getSignedTransactionForFixBfs

          +
          public java.lang.String getSignedTransactionForFixBfs(java.math.BigInteger param0)
          +
        • +
        + + + +
          +
        • +

          fixBfs

          +
          public java.lang.String fixBfs(java.math.BigInteger param0,
          +                               TransactionCallback callback)
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          link

          +
          public TransactionReceipt link(java.lang.String absolutePath,
          +                               java.lang.String _address,
          +                               java.lang.String _abi)
          +
        • +
        + + + +
          +
        • +

          link

          +
          public java.lang.String link(java.lang.String absolutePath,
          +                             java.lang.String _address,
          +                             java.lang.String _abi,
          +                             TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForLink

          +
          public java.lang.String getSignedTransactionForLink(java.lang.String absolutePath,
          +                                                    java.lang.String _address,
          +                                                    java.lang.String _abi)
          +
        • +
        + + + +
          +
        • +

          getLinkInput

          +
          public Tuple3<java.lang.String,java.lang.String,java.lang.String> getLinkInput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + + + + + +
          +
        • +

          link

          +
          public TransactionReceipt link(java.lang.String name,
          +                               java.lang.String version,
          +                               java.lang.String address,
          +                               java.lang.String abi)
          +
        • +
        + + + +
          +
        • +

          link

          +
          public java.lang.String link(java.lang.String name,
          +                             java.lang.String version,
          +                             java.lang.String address,
          +                             java.lang.String abi,
          +                             TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForLink

          +
          public java.lang.String getSignedTransactionForLink(java.lang.String name,
          +                                                    java.lang.String version,
          +                                                    java.lang.String address,
          +                                                    java.lang.String abi)
          +
        • +
        + + + +
          +
        • +

          getLinkStringStringStringStringInput

          +
          public Tuple4<java.lang.String,java.lang.String,java.lang.String,java.lang.String> getLinkStringStringStringStringInput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + +
          +
        • +

          getLinkWithVersionOutput

          +
          public Tuple1<java.math.BigInteger> getLinkWithVersionOutput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          list

          +
          public void list(java.lang.String absolutePath,
          +                 CallCallback callback)
          +
        • +
        + + + + + + + +
          +
        • +

          mkdir

          +
          public java.lang.String mkdir(java.lang.String absolutePath,
          +                              TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForMkdir

          +
          public java.lang.String getSignedTransactionForMkdir(java.lang.String absolutePath)
          +
        • +
        + + + + + + + + + + + + + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSService.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSService.html new file mode 100644 index 000000000..ac6795719 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSService.html @@ -0,0 +1,529 @@ + + + + + + +BFSService (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.bfs
    +

    类 BFSService

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.bfs.BFSService
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class BFSService
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSUtils.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSUtils.html new file mode 100644 index 000000000..c0b9099bf --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/BFSUtils.html @@ -0,0 +1,420 @@ + + + + + + +BFSUtils (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.bfs
    +

    类 BFSUtils

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.bfs.BFSUtils
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class BFSUtils
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        字段概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        字段 
        限定符和类型字段和说明
        static java.lang.StringBFS_APPS 
        static java.lang.StringBFS_ROOT 
        static java.lang.StringBFS_SYS 
        static java.util.Set<java.lang.String>BFS_SYSTEM_PATH 
        static java.lang.StringBFS_TABLES 
        static java.lang.StringBFS_TYPE_CON 
        static java.lang.StringBFS_TYPE_DIR 
        static java.lang.StringBFS_TYPE_LNK 
        static java.lang.StringBFS_USER 
        +
      • +
      + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + +
        所有方法 静态方法 具体方法 
        限定符和类型方法和说明
        static Tuple2<java.lang.String,java.lang.String>getParentPathAndBaseName(java.lang.String path) 
        static java.util.List<java.lang.String>path2Level(java.lang.String absolutePath) 
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          BFS_TYPE_DIR

          +
          public static final java.lang.String BFS_TYPE_DIR
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_TYPE_CON

          +
          public static final java.lang.String BFS_TYPE_CON
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_TYPE_LNK

          +
          public static final java.lang.String BFS_TYPE_LNK
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_ROOT

          +
          public static final java.lang.String BFS_ROOT
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_APPS

          +
          public static final java.lang.String BFS_APPS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_SYS

          +
          public static final java.lang.String BFS_SYS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_TABLES

          +
          public static final java.lang.String BFS_TABLES
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_USER

          +
          public static final java.lang.String BFS_USER
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_SYSTEM_PATH

          +
          public static final java.util.Set<java.lang.String> BFS_SYSTEM_PATH
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getParentPathAndBaseName

          +
          public static Tuple2<java.lang.String,java.lang.String> getParentPathAndBaseName(java.lang.String path)
          +
        • +
        + + + +
          +
        • +

          path2Level

          +
          public static java.util.List<java.lang.String> path2Level(java.lang.String absolutePath)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-frame.html new file mode 100644 index 000000000..067547b2d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-frame.html @@ -0,0 +1,24 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.bfs (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.contract.precompiled.bfs

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-summary.html new file mode 100644 index 000000000..93cf60fc9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-summary.html @@ -0,0 +1,156 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.bfs (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.precompiled.bfs

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-tree.html new file mode 100644 index 000000000..c6b90e31c --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/bfs/package-tree.html @@ -0,0 +1,155 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.bfs 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.precompiled.bfs的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.codec.datatypes.Array<T> (implements org.fisco.bcos.sdk.v3.codec.datatypes.Type<T>) + +
      • +
      • org.fisco.bcos.sdk.v3.contract.precompiled.bfs.BFSInfo
      • +
      • org.fisco.bcos.sdk.v3.contract.precompiled.bfs.BFSService
      • +
      • org.fisco.bcos.sdk.v3.contract.precompiled.bfs.BFSUtils
      • +
      • org.fisco.bcos.sdk.v3.contract.Contract + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/PrecompiledCallback.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/PrecompiledCallback.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/PrecompiledCallback.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/PrecompiledCallback.html index 270c362c9..148153aa7 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/PrecompiledCallback.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/PrecompiledCallback.html @@ -4,7 +4,7 @@ -PrecompiledCallback (java-sdk 3.0.0 API) +PrecompiledCallback (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.contract.precompiled.callback

    +
    +

    接口

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-summary.html new file mode 100644 index 000000000..f22d92e75 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-summary.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.callback (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.precompiled.callback

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-tree.html new file mode 100644 index 000000000..f688fa08e --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/callback/package-tree.html @@ -0,0 +1,131 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.callback 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.precompiled.callback的分层结构

    +程序包分层结构: + +
    +
    +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/ConsensusPrecompiled.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/ConsensusPrecompiled.html similarity index 86% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/ConsensusPrecompiled.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/ConsensusPrecompiled.html index 3ed5c09fb..2c5fe1475 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/ConsensusPrecompiled.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/ConsensusPrecompiled.html @@ -4,7 +4,7 @@ -ConsensusPrecompiled (java-sdk 3.0.0 API) +ConsensusPrecompiled (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.contract.precompiled.consensus

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-summary.html new file mode 100644 index 000000000..cae26dc0f --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-summary.html @@ -0,0 +1,144 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.consensus (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.precompiled.consensus

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-tree.html new file mode 100644 index 000000000..66ab3dbb4 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/consensus/package-tree.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.consensus 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.precompiled.consensus的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/KVTablePrecompiled.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/KVTablePrecompiled.html similarity index 80% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/KVTablePrecompiled.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/KVTablePrecompiled.html index bf5394a67..0f4cef428 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/KVTablePrecompiled.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/KVTablePrecompiled.html @@ -4,7 +4,7 @@ -KVTablePrecompiled (java-sdk 3.0.0 API) +KVTablePrecompiled (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.crud
    +

    类 TableCRUDService

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.crud.TableCRUDService
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TableCRUDService
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 实例方法 具体方法 
        限定符和类型方法和说明
        RetCodeappendColumns(java.lang.String tableName, + java.util.List<java.lang.String> newColumns) +
        append new columns to a specific table with table name, new value field names
        +
        voidasyncAppendColumns(java.lang.String tableName, + java.util.List<java.lang.String> newColumns, + PrecompiledCallback callback) +
        async append new columns to a specific table with table name, new value field names
        +
        voidasyncCreateTable(java.lang.String tableName, + Common.TableKeyOrder keyOrder, + java.lang.String keyFieldName, + java.util.List<java.lang.String> valueFields, + PrecompiledCallback callback) +
        async create a table with table name, key name, value field names
        +
        voidasyncCreateTable(java.lang.String tableName, + java.lang.String keyFieldName, + java.util.List<java.lang.String> valueFields, + PrecompiledCallback callback) +
        async create a table with table name, key name, value field names
        +
        voidasyncInsert(java.lang.String tableName, + Entry entry, + PrecompiledCallback callback) +
        async insert data to a specific table with table name, data entry
        +
        voidasyncRemove(java.lang.String tableName, + Condition condition, + PrecompiledCallback callback) +
        async remove data in a specific table with table name, key condition
        +
        voidasyncRemove(java.lang.String tableName, + ConditionV320 condition, + PrecompiledCallback callback) +
        async remove data in a specific table with table name, key condition
        +
        voidasyncRemove(java.lang.String tableName, + java.lang.String key, + PrecompiledCallback callback) +
        async remove data in a specific table with table name, single key
        +
        voidasyncUpdate(java.lang.String tableName, + Condition condition, + UpdateFields updateFields, + PrecompiledCallback callback) +
        async update data to a specific table with table name, condition, updateFields
        +
        voidasyncUpdate(java.lang.String tableName, + ConditionV320 condition, + UpdateFields updateFields, + PrecompiledCallback callback) +
        async update data to a specific table with table name, condition, updateFields
        +
        voidasyncUpdate(java.lang.String tableName, + java.lang.String key, + UpdateFields updateFields, + PrecompiledCallback callback) +
        async update data to a specific table with table name, single key, updateFields
        +
        RetCodecreateTable(java.lang.String tableName, + Common.TableKeyOrder keyOrder, + java.lang.String keyFieldName, + java.util.List<java.lang.String> valueFields) +
        create a table with table name, key name, value field names
        +
        RetCodecreateTable(java.lang.String tableName, + java.lang.String keyFieldName, + java.util.List<java.lang.String> valueFields) +
        create a table with table name, key name, value field names
        +
        java.util.Map<java.lang.String,java.util.List<java.lang.String>>desc(java.lang.String tableName) +
        get a specific table key and value fields with table name
        +
        java.util.Map<java.lang.String,java.util.List<java.lang.String>>descWithKeyOrder(java.lang.String tableName) +
        get a specific table key and value fields with table name
        +
        longgetCurrentVersion() 
        RetCodeinsert(java.lang.String tableName, + Entry entry) +
        insert data to a specific table with table name, data entry.
        +
        RetCodeinsert(TablePrecompiled tablePrecompiled, + Entry entry) +
        insert data to a specific table with table precompiled, data entry. this method will reduce + tableManager.openTable() overhead
        +
        RetCoderemove(java.lang.String tableName, + Condition condition) +
        remove data in a specific table with table name, key condition
        +
        RetCoderemove(java.lang.String tableName, + ConditionV320 condition) +
        remove data in a specific table with table name, key condition
        +
        RetCoderemove(java.lang.String tableName, + java.lang.String key) +
        remove data in a specific table with table name, single key
        +
        RetCoderemove(TablePrecompiled tablePrecompiled, + Condition condition) +
        remove data in a specific table with table name, key condition this method will reduce + tableManager.openTable() overhead
        +
        RetCoderemove(TablePrecompiled tablePrecompiled, + ConditionV320 condition) +
        remove data in a specific table with table name, key condition this method will reduce + tableManager.openTable() overhead
        +
        RetCoderemove(TablePrecompiled tablePrecompiled, + java.lang.String key) +
        remove data in a specific table with tablePrecompiled, single key this method will reduce + tableManager.openTable() overhead
        +
        java.util.List<java.util.Map<java.lang.String,java.lang.String>>select(java.lang.String tableName, + Condition condition) +
        select data in a specific table with table name, condition
        +
        java.util.List<java.util.Map<java.lang.String,java.lang.String>>select(java.lang.String tableName, + ConditionV320 condition) +
        select data in a specific table with table name, condition
        +
        java.util.List<java.util.Map<java.lang.String,java.lang.String>>select(java.lang.String tableName, + java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc, + Condition condition) +
        select data in a specific table with table name, table desc info, condition. this method will + reduce table.desc() overhead
        +
        java.util.List<java.util.Map<java.lang.String,java.lang.String>>select(java.lang.String tableName, + java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc, + ConditionV320 condition) +
        select data in a specific table with table name, table desc info, condition. this method will + reduce table.desc() overhead
        +
        java.util.Map<java.lang.String,java.lang.String>select(java.lang.String tableName, + java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc, + java.lang.String key) +
        select data in a specific table with table name, table desc info, single key this method will + reduce table.desc() overhead
        +
        java.util.Map<java.lang.String,java.lang.String>select(java.lang.String tableName, + java.lang.String key) +
        select data in a specific table with table name, single key
        +
        RetCodeupdate(java.lang.String tableName, + Condition condition, + UpdateFields updateFields) +
        update data to a specific table with table name, condition, updateFields
        +
        RetCodeupdate(java.lang.String tableName, + ConditionV320 condition, + UpdateFields updateFields) +
        update data to a specific table with table name, condition, updateFields
        +
        RetCodeupdate(java.lang.String tableName, + java.lang.String key, + UpdateFields updateFields) +
        update data to a specific table with table name, single key, updateFields
        +
        RetCodeupdate(TablePrecompiled tablePrecompiled, + Condition condition, + UpdateFields updateFields) +
        update data to a specific table with tablePrecompiled, key condition, updateFields this + method will reduce tableManager.openTable() overhead
        +
        RetCodeupdate(TablePrecompiled tablePrecompiled, + ConditionV320 condition, + UpdateFields updateFields) +
        update data to a specific table with tablePrecompiled, key condition, updateFields this + method will reduce tableManager.openTable() overhead
        +
        RetCodeupdate(TablePrecompiled tablePrecompiled, + java.lang.String key, + UpdateFields updateFields) +
        update data to a specific table with tablePrecompiled, single key, updateFields this method + will reduce tableManager.openTable() overhead
        +
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TableCRUDService

          +
          public TableCRUDService(Client client,
          +                        CryptoKeyPair credential)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getCurrentVersion

          +
          public long getCurrentVersion()
          +
        • +
        + + + +
          +
        • +

          createTable

          +
          public RetCode createTable(java.lang.String tableName,
          +                           java.lang.String keyFieldName,
          +                           java.util.List<java.lang.String> valueFields)
          +                    throws ContractException
          +
          create a table with table name, key name, value field names
          +
          +
          参数:
          +
          tableName - table name, will add prefix /tables/ in blockchain, tableName length not + longer than 50 with prefix
          +
          keyFieldName - key field name, which length should not be longer than 64
          +
          valueFields - value field names, which length in total should not be longer than 1024
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncCreateTable

          +
          public void asyncCreateTable(java.lang.String tableName,
          +                             java.lang.String keyFieldName,
          +                             java.util.List<java.lang.String> valueFields,
          +                             PrecompiledCallback callback)
          +
          async create a table with table name, key name, value field names
          +
          +
          参数:
          +
          tableName - table name, will add prefix /tables/ in blockchain, tableName length not + longer than 50 with prefix
          +
          keyFieldName - key field name, which length should not be longer than 64
          +
          valueFields - value field names, which length in total should not be longer than 1024
          +
          callback - callback when get receipt
          +
          +
        • +
        + + + +
          +
        • +

          createTable

          +
          public RetCode createTable(java.lang.String tableName,
          +                           Common.TableKeyOrder keyOrder,
          +                           java.lang.String keyFieldName,
          +                           java.util.List<java.lang.String> valueFields)
          +                    throws ContractException
          +
          create a table with table name, key name, value field names
          +
          +
          参数:
          +
          tableName - table name, will add prefix /tables/ in blockchain, tableName length not + longer than 50 with prefix
          +
          keyFieldName - key field name, which length should not be longer than 64
          +
          valueFields - value field names, which length in total should not be longer than 1024
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncCreateTable

          +
          public void asyncCreateTable(java.lang.String tableName,
          +                             Common.TableKeyOrder keyOrder,
          +                             java.lang.String keyFieldName,
          +                             java.util.List<java.lang.String> valueFields,
          +                             PrecompiledCallback callback)
          +                      throws ContractException
          +
          async create a table with table name, key name, value field names
          +
          +
          参数:
          +
          tableName - table name, will add prefix /tables/ in blockchain, tableName length not + longer than 50 with prefix
          +
          keyFieldName - key field name, which length should not be longer than 64
          +
          valueFields - value field names, which length in total should not be longer than 1024
          +
          callback - callback when get receipt
          +
          抛出:
          +
          ContractException
          +
          +
        • +
        + + + +
          +
        • +

          appendColumns

          +
          public RetCode appendColumns(java.lang.String tableName,
          +                             java.util.List<java.lang.String> newColumns)
          +                      throws ContractException
          +
          append new columns to a specific table with table name, new value field names
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          newColumns - new value field names, which length in total should not be longer than + 1024, and should not be duplicate
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncAppendColumns

          +
          public void asyncAppendColumns(java.lang.String tableName,
          +                               java.util.List<java.lang.String> newColumns,
          +                               PrecompiledCallback callback)
          +
          async append new columns to a specific table with table name, new value field names
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          newColumns - new value field names, which length in total should not be longer than + 1024, and should not be duplicate
          +
          callback - callback when get receipt
          +
          +
        • +
        + + + +
          +
        • +

          select

          +
          public java.util.List<java.util.Map<java.lang.String,java.lang.String>> select(java.lang.String tableName,
          +                                                                               Condition condition)
          +                                                                        throws ContractException
          +
          select data in a specific table with table name, condition
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - condition about key
          +
          返回:
          +
          return a list of select result which match condition
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          select

          +
          public java.util.List<java.util.Map<java.lang.String,java.lang.String>> select(java.lang.String tableName,
          +                                                                               java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc,
          +                                                                               Condition condition)
          +                                                                        throws ContractException
          +
          select data in a specific table with table name, table desc info, condition. this method will + reduce table.desc() overhead
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          desc - table key field and value fields info, [(key_field: [""]),(value_fields: [""])]
          +
          condition - condition about key
          +
          返回:
          +
          return a list of select result which match condition
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          select

          +
          public java.util.List<java.util.Map<java.lang.String,java.lang.String>> select(java.lang.String tableName,
          +                                                                               ConditionV320 condition)
          +                                                                        throws ContractException
          +
          select data in a specific table with table name, condition
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - condition about key
          +
          返回:
          +
          return a list of select result which match condition
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          select

          +
          public java.util.List<java.util.Map<java.lang.String,java.lang.String>> select(java.lang.String tableName,
          +                                                                               java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc,
          +                                                                               ConditionV320 condition)
          +                                                                        throws ContractException
          +
          select data in a specific table with table name, table desc info, condition. this method will + reduce table.desc() overhead
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          desc - table key field and value fields info, [(key_field: [""]),(value_fields: [""])]
          +
          condition - condition about key
          +
          返回:
          +
          return a list of select result which match condition
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          select

          +
          public java.util.Map<java.lang.String,java.lang.String> select(java.lang.String tableName,
          +                                                               java.lang.String key)
          +                                                        throws ContractException
          +
          select data in a specific table with table name, single key
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          key - specific key
          +
          返回:
          +
          return select result which key in table matches the key given
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          select

          +
          public java.util.Map<java.lang.String,java.lang.String> select(java.lang.String tableName,
          +                                                               java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc,
          +                                                               java.lang.String key)
          +                                                        throws ContractException
          +
          select data in a specific table with table name, table desc info, single key this method will + reduce table.desc() overhead
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          desc - table key field and value fields info, [(key_field: [""]),(value_fields: [""])]
          +
          key - specific key
          +
          返回:
          +
          return select result which key in table matches the key given
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          insert

          +
          public RetCode insert(java.lang.String tableName,
          +                      Entry entry)
          +               throws ContractException
          +
          insert data to a specific table with table name, data entry.
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          entry - data entry, which contains key and values map, values size should match the + table value field size
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          insert

          +
          public RetCode insert(TablePrecompiled tablePrecompiled,
          +                      Entry entry)
          +               throws ContractException
          +
          insert data to a specific table with table precompiled, data entry. this method will reduce + tableManager.openTable() overhead
          +
          +
          参数:
          +
          tablePrecompiled - specific tablePrecompiled, already load a specific contract address
          +
          entry - data entry, which contains key and values map, values size should match the + table value field size
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncInsert

          +
          public void asyncInsert(java.lang.String tableName,
          +                        Entry entry,
          +                        PrecompiledCallback callback)
          +                 throws ContractException
          +
          async insert data to a specific table with table name, data entry
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          entry - data entry, which contains key and values map, values size should match the + table value field size
          +
          callback - callback when get receipt
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          update

          +
          public RetCode update(java.lang.String tableName,
          +                      java.lang.String key,
          +                      UpdateFields updateFields)
          +               throws ContractException
          +
          update data to a specific table with table name, single key, updateFields
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          key - specific key, key should exist
          +
          updateFields - update specific fields' data
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          update

          +
          public RetCode update(TablePrecompiled tablePrecompiled,
          +                      java.lang.String key,
          +                      UpdateFields updateFields)
          +               throws ContractException
          +
          update data to a specific table with tablePrecompiled, single key, updateFields this method + will reduce tableManager.openTable() overhead
          +
          +
          参数:
          +
          tablePrecompiled - specific tablePrecompiled, already load a specific contract address
          +
          key - specific key, key should exist
          +
          updateFields - update specific fields' data
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          update

          +
          public RetCode update(java.lang.String tableName,
          +                      Condition condition,
          +                      UpdateFields updateFields)
          +               throws ContractException
          +
          update data to a specific table with table name, condition, updateFields
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - key condition
          +
          updateFields - update specific fields' data
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          update

          +
          public RetCode update(TablePrecompiled tablePrecompiled,
          +                      Condition condition,
          +                      UpdateFields updateFields)
          +               throws ContractException
          +
          update data to a specific table with tablePrecompiled, key condition, updateFields this + method will reduce tableManager.openTable() overhead
          +
          +
          参数:
          +
          tablePrecompiled - specific tablePrecompiled, already load a specific contract address
          +
          condition - key condition
          +
          updateFields - update specific fields' data
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          update

          +
          public RetCode update(java.lang.String tableName,
          +                      ConditionV320 condition,
          +                      UpdateFields updateFields)
          +               throws ContractException
          +
          update data to a specific table with table name, condition, updateFields
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - key condition
          +
          updateFields - update specific fields' data
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          update

          +
          public RetCode update(TablePrecompiled tablePrecompiled,
          +                      ConditionV320 condition,
          +                      UpdateFields updateFields)
          +               throws ContractException
          +
          update data to a specific table with tablePrecompiled, key condition, updateFields this + method will reduce tableManager.openTable() overhead
          +
          +
          参数:
          +
          tablePrecompiled - specific tablePrecompiled, already load a specific contract address
          +
          condition - key condition
          +
          updateFields - update specific fields' data
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncUpdate

          +
          public void asyncUpdate(java.lang.String tableName,
          +                        java.lang.String key,
          +                        UpdateFields updateFields,
          +                        PrecompiledCallback callback)
          +                 throws ContractException
          +
          async update data to a specific table with table name, single key, updateFields
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          key - specific key, key should exist
          +
          updateFields - update specific fields' data
          +
          callback - callback when get receipt
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncUpdate

          +
          public void asyncUpdate(java.lang.String tableName,
          +                        Condition condition,
          +                        UpdateFields updateFields,
          +                        PrecompiledCallback callback)
          +                 throws ContractException
          +
          async update data to a specific table with table name, condition, updateFields
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - key condition
          +
          updateFields - update specific fields' data
          +
          callback - callback when get receipt
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncUpdate

          +
          public void asyncUpdate(java.lang.String tableName,
          +                        ConditionV320 condition,
          +                        UpdateFields updateFields,
          +                        PrecompiledCallback callback)
          +                 throws ContractException
          +
          async update data to a specific table with table name, condition, updateFields
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - key condition
          +
          updateFields - update specific fields' data
          +
          callback - callback when get receipt
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public RetCode remove(java.lang.String tableName,
          +                      java.lang.String key)
          +               throws ContractException
          +
          remove data in a specific table with table name, single key
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          key - specific key, key should exist
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public RetCode remove(TablePrecompiled tablePrecompiled,
          +                      java.lang.String key)
          +               throws ContractException
          +
          remove data in a specific table with tablePrecompiled, single key this method will reduce + tableManager.openTable() overhead
          +
          +
          参数:
          +
          tablePrecompiled - specific tablePrecompiled, already load a specific contract address
          +
          key - specific key, key should exist
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public RetCode remove(java.lang.String tableName,
          +                      Condition condition)
          +               throws ContractException
          +
          remove data in a specific table with table name, key condition
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - key condition
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public RetCode remove(TablePrecompiled tablePrecompiled,
          +                      Condition condition)
          +               throws ContractException
          +
          remove data in a specific table with table name, key condition this method will reduce + tableManager.openTable() overhead
          +
          +
          参数:
          +
          tablePrecompiled - specific tablePrecompiled, already load a specific contract address
          +
          condition - key condition
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public RetCode remove(java.lang.String tableName,
          +                      ConditionV320 condition)
          +               throws ContractException
          +
          remove data in a specific table with table name, key condition
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - key condition
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public RetCode remove(TablePrecompiled tablePrecompiled,
          +                      ConditionV320 condition)
          +               throws ContractException
          +
          remove data in a specific table with table name, key condition this method will reduce + tableManager.openTable() overhead
          +
          +
          参数:
          +
          tablePrecompiled - specific tablePrecompiled, already load a specific contract address
          +
          condition - key condition
          +
          返回:
          +
          if success then return 0; otherwise is failed then see the retCode message
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncRemove

          +
          public void asyncRemove(java.lang.String tableName,
          +                        java.lang.String key,
          +                        PrecompiledCallback callback)
          +                 throws ContractException
          +
          async remove data in a specific table with table name, single key
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          key - specific key, key should exist
          +
          callback - callback when get receipt
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncRemove

          +
          public void asyncRemove(java.lang.String tableName,
          +                        Condition condition,
          +                        PrecompiledCallback callback)
          +                 throws ContractException
          +
          async remove data in a specific table with table name, key condition
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - key condition
          +
          callback - callback when get receipt
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          asyncRemove

          +
          public void asyncRemove(java.lang.String tableName,
          +                        ConditionV320 condition,
          +                        PrecompiledCallback callback)
          +                 throws ContractException
          +
          async remove data in a specific table with table name, key condition
          +
          +
          参数:
          +
          tableName - specific table name, table should exist
          +
          condition - key condition
          +
          callback - callback when get receipt
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          desc

          +
          public java.util.Map<java.lang.String,java.util.List<java.lang.String>> desc(java.lang.String tableName)
          +                                                                      throws ContractException
          +
          get a specific table key and value fields with table name
          +
          +
          参数:
          +
          tableName - specific table name, it should exist
          +
          返回:
          +
          table key field and value fields info, [("key_field": [""]),("value_fields": [""])]
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        + + + +
          +
        • +

          descWithKeyOrder

          +
          public java.util.Map<java.lang.String,java.util.List<java.lang.String>> descWithKeyOrder(java.lang.String tableName)
          +                                                                                  throws ContractException
          +
          get a specific table key and value fields with table name
          +
          +
          参数:
          +
          tableName - specific table name, it should exist
          +
          返回:
          +
          table key field and value fields info, [("key_field": [""]),("value_fields": [""])]
          +
          抛出:
          +
          ContractException - throw when contract exec exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.TableInfo.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.TableInfo.html similarity index 97% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.TableInfo.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.TableInfo.html index 130a493fa..10f01209d 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.TableInfo.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.TableInfo.html @@ -4,7 +4,7 @@ -TableManagerPrecompiled.TableInfo (java-sdk 3.0.0 API) +TableManagerPrecompiled.TableInfo (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.crud
    +

    类 TableManagerPrecompiled.TableInfoV320

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          keyOrder

          +
          public java.math.BigInteger keyOrder
          +
        • +
        + + + +
          +
        • +

          keyColumn

          +
          public java.lang.String keyColumn
          +
        • +
        + + + +
          +
        • +

          valueColumns

          +
          public java.util.List<java.lang.String> valueColumns
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TableInfoV320

          +
          public TableInfoV320()
          +
        • +
        + + + + + + + +
          +
        • +

          TableInfoV320

          +
          public TableInfoV320(java.math.BigInteger keyOrder,
          +                     java.lang.String keyColumn,
          +                     java.util.List<java.lang.String> valueColumns)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.html new file mode 100644 index 000000000..7f0982db2 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TableManagerPrecompiled.html @@ -0,0 +1,896 @@ + + + + + + +TableManagerPrecompiled (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.crud
    +

    类 TableManagerPrecompiled

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class TableManagerPrecompiled
      +extends Contract
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Condition.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Condition.html similarity index 89% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Condition.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Condition.html index cbf2bea69..66807d569 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Condition.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Condition.html @@ -4,7 +4,7 @@ -TablePrecompiled.Condition (java-sdk 3.0.0 API) +TablePrecompiled.Condition (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.crud
    +

    类 TablePrecompiled.ConditionV320

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          ConditionV320

          +
          public ConditionV320()
          +
        • +
        + + + + + + + +
          +
        • +

          ConditionV320

          +
          public ConditionV320(java.math.BigInteger op,
          +                     java.lang.String field,
          +                     java.lang.String value)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Entry.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Entry.html similarity index 97% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Entry.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Entry.html index 908d906dd..398654a17 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Entry.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/TablePrecompiled.Entry.html @@ -4,7 +4,7 @@ -TablePrecompiled.Entry (java-sdk 3.0.0 API) +TablePrecompiled.Entry (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.crud
    +

    类 TablePrecompiled

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class TablePrecompiled
      +extends Contract
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Common.TableKeyOrder.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Common.TableKeyOrder.html new file mode 100644 index 000000000..2acc225ae --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Common.TableKeyOrder.html @@ -0,0 +1,398 @@ + + + + + + +Common.TableKeyOrder (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.crud.common
    +

    枚举 Common.TableKeyOrder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<Common.TableKeyOrder>
      • +
      • +
          +
        • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.Common.TableKeyOrder
        • +
        +
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 静态方法 实例方法 具体方法 
        限定符和类型方法和说明
        java.math.BigIntegergetBigValue() 
        java.lang.StringtoString() 
        static Common.TableKeyOrdervalueOf(int value) 
        static Common.TableKeyOrdervalueOf(java.lang.String name) +
        返回带有指定名称的该类型的枚举常量。
        +
        static Common.TableKeyOrder[]values() +
        按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。
        +
        +
          +
        • + + +

          从类继承的方法 java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, valueOf
        • +
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          values

          +
          public static Common.TableKeyOrder[] values()
          +
          按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。该方法可用于迭代 +常量, 如下所示: +
          +for (Common.TableKeyOrder c : Common.TableKeyOrder.values())
          +    System.out.println(c);
          +
          +
          +
          返回:
          +
          按照声明该枚举类型的常量的顺序返回的包含这些常量的数组
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static Common.TableKeyOrder valueOf(java.lang.String name)
          +
          返回带有指定名称的该类型的枚举常量。 +字符串必须与用于声明该类型的枚举常量的 +标识符完全匹配。(不允许有多余 +的空格字符。)
          +
          +
          参数:
          +
          name - 要返回的枚举常量的名称。
          +
          返回:
          +
          返回带有指定名称的枚举常量
          +
          抛出:
          +
          java.lang.IllegalArgumentException - 如果该枚举类型没有带有指定名称的常量
          +
          java.lang.NullPointerException - 如果参数为空值
          +
          +
        • +
        + + + +
          +
        • +

          getBigValue

          +
          public java.math.BigInteger getBigValue()
          +
        • +
        + + + + + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Enum<Common.TableKeyOrder>
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Common.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Common.html similarity index 83% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Common.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Common.html index 07c0d38c7..cc31e7420 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Common.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Common.html @@ -4,7 +4,7 @@ -Common (java-sdk 3.0.0 API) +Common (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.crud.common
    +

    枚举 ConditionOperator

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<ConditionOperator>
      • +
      • +
          +
        • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.ConditionOperator
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      所有已实现的接口:
      +
      java.io.Serializable, java.lang.Comparable<ConditionOperator>
      +
      +
      +
      +
      public enum ConditionOperator
      +extends java.lang.Enum<ConditionOperator>
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 静态方法 实例方法 具体方法 
        限定符和类型方法和说明
        java.math.BigIntegergetBigIntValue() 
        intgetValue() 
        java.lang.StringtoString() 
        static ConditionOperatorvalueOf(java.lang.String name) +
        返回带有指定名称的该类型的枚举常量。
        +
        static ConditionOperator[]values() +
        按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。
        +
        +
          +
        • + + +

          从类继承的方法 java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, valueOf
        • +
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          values

          +
          public static ConditionOperator[] values()
          +
          按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。该方法可用于迭代 +常量, 如下所示: +
          +for (ConditionOperator c : ConditionOperator.values())
          +    System.out.println(c);
          +
          +
          +
          返回:
          +
          按照声明该枚举类型的常量的顺序返回的包含这些常量的数组
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static ConditionOperator valueOf(java.lang.String name)
          +
          返回带有指定名称的该类型的枚举常量。 +字符串必须与用于声明该类型的枚举常量的 +标识符完全匹配。(不允许有多余 +的空格字符。)
          +
          +
          参数:
          +
          name - 要返回的枚举常量的名称。
          +
          返回:
          +
          返回带有指定名称的枚举常量
          +
          抛出:
          +
          java.lang.IllegalArgumentException - 如果该枚举类型没有带有指定名称的常量
          +
          java.lang.NullPointerException - 如果参数为空值
          +
          +
        • +
        + + + +
          +
        • +

          getValue

          +
          public int getValue()
          +
        • +
        + + + +
          +
        • +

          getBigIntValue

          +
          public java.math.BigInteger getBigIntValue()
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Enum<ConditionOperator>
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/ConditionV320.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/ConditionV320.html new file mode 100644 index 000000000..84f189f94 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/ConditionV320.html @@ -0,0 +1,454 @@ + + + + + + +ConditionV320 (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.crud.common
    +

    类 ConditionV320

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class ConditionV320
      +extends Condition
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器概要

        + + + + + + + + +
        构造器 
        构造器和说明
        ConditionV320() 
        +
      • +
      + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 实例方法 具体方法 
        限定符和类型方法和说明
        voidCONTAINS(java.lang.String field, + java.lang.String value) 
        voidENDS_WITH(java.lang.String field, + java.lang.String value) 
        voidEQ(java.lang.String field, + java.lang.String value) 
        voidGE(java.lang.String field, + java.lang.String value) 
        java.util.MapgetConditions() 
        java.util.ListgetTableConditions() 
        voidGT(java.lang.String field, + java.lang.String value) 
        voidLE(java.lang.String field, + java.lang.String value) 
        voidLT(java.lang.String field, + java.lang.String value) 
        voidNE(java.lang.String field, + java.lang.String value) 
        voidSTARTS_WITH(java.lang.String field, + java.lang.String value) 
        java.lang.StringtoString() 
        + +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          ConditionV320

          +
          public ConditionV320()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          EQ

          +
          public void EQ(java.lang.String field,
          +               java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          NE

          +
          public void NE(java.lang.String field,
          +               java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          GT

          +
          public void GT(java.lang.String field,
          +               java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          GE

          +
          public void GE(java.lang.String field,
          +               java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          LT

          +
          public void LT(java.lang.String field,
          +               java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          LE

          +
          public void LE(java.lang.String field,
          +               java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          STARTS_WITH

          +
          public void STARTS_WITH(java.lang.String field,
          +                        java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          ENDS_WITH

          +
          public void ENDS_WITH(java.lang.String field,
          +                      java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          CONTAINS

          +
          public void CONTAINS(java.lang.String field,
          +                     java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          getConditions

          +
          public java.util.Map getConditions()
          +
          +
          覆盖:
          +
          getConditions 在类中 Condition
          +
          +
        • +
        + + + + + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 Condition
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Entry.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Entry.html similarity index 96% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Entry.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Entry.html index 8ae00048d..a5b0b34f7 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Entry.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/Entry.html @@ -4,7 +4,7 @@ -Entry (java-sdk 3.0.0 API) +Entry (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.contract.precompiled.crud.common

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-summary.html new file mode 100644 index 000000000..c0bfcae69 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-summary.html @@ -0,0 +1,175 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.crud.common (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.precompiled.crud.common

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-tree.html new file mode 100644 index 000000000..7b3b33688 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/common/package-tree.html @@ -0,0 +1,155 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.crud.common 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.precompiled.crud.common的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.Common
      • +
      • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.Condition +
          +
        • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.ConditionV320
        • +
        +
      • +
      • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.Entry
      • +
      • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common.UpdateFields
      • +
      +
    • +
    +

    枚举分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-frame.html new file mode 100644 index 000000000..a77950770 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-frame.html @@ -0,0 +1,31 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.crud (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.contract.precompiled.crud

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-summary.html new file mode 100644 index 000000000..7dfaf5488 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-summary.html @@ -0,0 +1,184 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.crud (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.precompiled.crud

    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-tree.html new file mode 100644 index 000000000..c41827952 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/crud/package-tree.html @@ -0,0 +1,170 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.crud 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.precompiled.crud的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/PrecompiledAddress.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/PrecompiledAddress.html new file mode 100644 index 000000000..9b7b47451 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/PrecompiledAddress.html @@ -0,0 +1,496 @@ + + + + + + +PrecompiledAddress (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.model
    +

    类 PrecompiledAddress

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.model.PrecompiledAddress
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class PrecompiledAddress
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          SYS_CONFIG_PRECOMPILED_ADDRESS

          +
          public static final java.lang.String SYS_CONFIG_PRECOMPILED_ADDRESS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          TABLE_MANAGER_PRECOMPILED_ADDRESS

          +
          public static final java.lang.String TABLE_MANAGER_PRECOMPILED_ADDRESS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          CONSENSUS_PRECOMPILED_ADDRESS

          +
          public static final java.lang.String CONSENSUS_PRECOMPILED_ADDRESS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          CONTRACT_AUTH_ADDRESS

          +
          public static final java.lang.String CONTRACT_AUTH_ADDRESS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_PRECOMPILED_ADDRESS

          +
          public static final java.lang.String BFS_PRECOMPILED_ADDRESS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          SHARDING_PRECOMPILED_ADDRESS

          +
          public static final java.lang.String SHARDING_PRECOMPILED_ADDRESS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          COMMITTEE_MANAGER_ADDRESS

          +
          public static final java.lang.String COMMITTEE_MANAGER_ADDRESS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          ACCOUNT_MANAGER_ADDRESS

          +
          public static final java.lang.String ACCOUNT_MANAGER_ADDRESS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BALANCE_PRECOMPILED_ADDRESS

          +
          public static final java.lang.String BALANCE_PRECOMPILED_ADDRESS
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          SYS_CONFIG_PRECOMPILED_NAME

          +
          public static final java.lang.String SYS_CONFIG_PRECOMPILED_NAME
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          CONSENSUS_PRECOMPILED_NAME

          +
          public static final java.lang.String CONSENSUS_PRECOMPILED_NAME
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BFS_PRECOMPILED_NAME

          +
          public static final java.lang.String BFS_PRECOMPILED_NAME
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          SHARDING_PRECOMPILED_NAME

          +
          public static final java.lang.String SHARDING_PRECOMPILED_NAME
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          TABLE_MANAGER_PRECOMPILED_NAME

          +
          public static final java.lang.String TABLE_MANAGER_PRECOMPILED_NAME
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          ACCOUNT_MANAGER_PRECOMPILED_NAME

          +
          public static final java.lang.String ACCOUNT_MANAGER_PRECOMPILED_NAME
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          BALANCE_PRECOMPILED_NAME

          +
          public static final java.lang.String BALANCE_PRECOMPILED_NAME
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/PrecompiledVersionCheck.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/PrecompiledVersionCheck.html new file mode 100644 index 000000000..1fe023a94 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/PrecompiledVersionCheck.html @@ -0,0 +1,362 @@ + + + + + + +PrecompiledVersionCheck (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.model
    +

    类 PrecompiledVersionCheck

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.model.PrecompiledVersionCheck
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class PrecompiledVersionCheck
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          LS_PAGE_VERSION

          +
          public static final Version LS_PAGE_VERSION
          +
        • +
        + + + +
          +
        • +

          LINK_SIMPLE_VERSION

          +
          public static final Version LINK_SIMPLE_VERSION
          +
        • +
        + + + +
          +
        • +

          SET_CONTRACT_STATUS_VERSION

          +
          public static final Version SET_CONTRACT_STATUS_VERSION
          +
        • +
        + + + +
          +
        • +

          V320_CRUD_VERSION

          +
          public static final Version V320_CRUD_VERSION
          +
        • +
        + + + +
          +
        • +

          INIT_AUTH_VERSION

          +
          public static final Version INIT_AUTH_VERSION
          +
        • +
        + + + +
          +
        • +

          SHARDING_MIN_SUPPORT_VERSION

          +
          public static final Version SHARDING_MIN_SUPPORT_VERSION
          +
        • +
        + + + +
          +
        • +

          V330_FIX_BFS_VERSION

          +
          public static final Version V330_FIX_BFS_VERSION
          +
        • +
        + + + +
          +
        • +

          BALANCE_PRECOMPILED_VERSION

          +
          public static final Version BALANCE_PRECOMPILED_VERSION
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          PrecompiledVersionCheck

          +
          public PrecompiledVersionCheck()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/Version.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/Version.html similarity index 80% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/Version.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/Version.html index 5865bbf7a..25903a1d0 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/Version.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/Version.html @@ -4,7 +4,7 @@ -Version (java-sdk 3.0.0 API) +Version (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ + + +

    org.fisco.bcos.sdk.v3.contract.precompiled.model

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-summary.html new file mode 100644 index 000000000..e8aef91af --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-summary.html @@ -0,0 +1,148 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.model (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.precompiled.model

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-tree.html new file mode 100644 index 000000000..105f37d4d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/model/package-tree.html @@ -0,0 +1,137 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.model 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.precompiled.model的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/ShardingPrecompiled.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/ShardingPrecompiled.html new file mode 100644 index 000000000..b7634fb41 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/ShardingPrecompiled.html @@ -0,0 +1,649 @@ + + + + + + +ShardingPrecompiled (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.sharding
    +

    类 ShardingPrecompiled

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class ShardingPrecompiled
      +extends Contract
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          BINARY_ARRAY

          +
          public static final java.lang.String[] BINARY_ARRAY
          +
        • +
        + + + +
          +
        • +

          BINARY

          +
          public static final java.lang.String BINARY
          +
        • +
        + + + +
          +
        • +

          SM_BINARY_ARRAY

          +
          public static final java.lang.String[] SM_BINARY_ARRAY
          +
        • +
        + + + +
          +
        • +

          SM_BINARY

          +
          public static final java.lang.String SM_BINARY
          +
        • +
        + + + +
          +
        • +

          ABI_ARRAY

          +
          public static final java.lang.String[] ABI_ARRAY
          +
        • +
        + + + +
          +
        • +

          ABI

          +
          public static final java.lang.String ABI
          +
        • +
        + + + +
          +
        • +

          FUNC_GETCONTRACTSHARD

          +
          public static final java.lang.String FUNC_GETCONTRACTSHARD
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_LINKSHARD

          +
          public static final java.lang.String FUNC_LINKSHARD
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        + + + +
          +
        • +

          FUNC_MAKESHARD

          +
          public static final java.lang.String FUNC_MAKESHARD
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          ShardingPrecompiled

          +
          protected ShardingPrecompiled(java.lang.String contractAddress,
          +                              Client client,
          +                              CryptoKeyPair credential)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getBinary

          +
          public static java.lang.String getBinary(CryptoSuite cryptoSuite)
          +
        • +
        + + + +
          +
        • +

          getABI

          +
          public static java.lang.String getABI()
          +
        • +
        + + + + + + + +
          +
        • +

          linkShard

          +
          public TransactionReceipt linkShard(java.lang.String shardName,
          +                                    java.lang.String _address)
          +
        • +
        + + + +
          +
        • +

          linkShard

          +
          public java.lang.String linkShard(java.lang.String shardName,
          +                                  java.lang.String _address,
          +                                  TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForLinkShard

          +
          public java.lang.String getSignedTransactionForLinkShard(java.lang.String shardName,
          +                                                         java.lang.String _address)
          +
        • +
        + + + +
          +
        • +

          getLinkShardInput

          +
          public Tuple2<java.lang.String,java.lang.String> getLinkShardInput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + +
          +
        • +

          getLinkShardOutput

          +
          public Tuple1<java.math.BigInteger> getLinkShardOutput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + + + + + +
          +
        • +

          makeShard

          +
          public java.lang.String makeShard(java.lang.String shardName,
          +                                  TransactionCallback callback)
          +
        • +
        + + + +
          +
        • +

          getSignedTransactionForMakeShard

          +
          public java.lang.String getSignedTransactionForMakeShard(java.lang.String shardName)
          +
        • +
        + + + + + + + +
          +
        • +

          getMakeShardOutput

          +
          public Tuple1<java.math.BigInteger> getMakeShardOutput(TransactionReceipt transactionReceipt)
          +
        • +
        + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/ShardingService.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/ShardingService.html new file mode 100644 index 000000000..11ff78a59 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/ShardingService.html @@ -0,0 +1,327 @@ + + + + + + +ShardingService (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.sharding
    +

    类 ShardingService

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.sharding.ShardingService
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class ShardingService
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/package-frame.html new file mode 100644 index 000000000..d04cde43c --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/package-frame.html @@ -0,0 +1,21 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.sharding (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.contract.precompiled.sharding

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/package-summary.html new file mode 100644 index 000000000..fdc93e5a5 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/package-summary.html @@ -0,0 +1,144 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.sharding (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.precompiled.sharding

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/package-tree.html new file mode 100644 index 000000000..0a44b79dc --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sharding/package-tree.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.sharding 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.precompiled.sharding的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object + +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigFeature.Features.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigFeature.Features.html new file mode 100644 index 000000000..1ce71e8c6 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigFeature.Features.html @@ -0,0 +1,541 @@ + + + + + + +SystemConfigFeature.Features (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig
    +

    枚举 SystemConfigFeature.Features

    +
    +
    +
      +
    • java.lang.Object
    • +
    • + +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigFeature.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigFeature.html new file mode 100644 index 000000000..6ffe10094 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigFeature.html @@ -0,0 +1,288 @@ + + + + + + +SystemConfigFeature (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig
    +

    类 SystemConfigFeature

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig.SystemConfigFeature
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class SystemConfigFeature
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          SystemConfigFeature

          +
          public SystemConfigFeature()
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigPrecompiled.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigPrecompiled.html similarity index 78% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigPrecompiled.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigPrecompiled.html index 0ad51622a..13ff84839 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigPrecompiled.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigPrecompiled.html @@ -4,7 +4,7 @@ -SystemConfigPrecompiled (java-sdk 3.0.0 API) +SystemConfigPrecompiled (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ + + +

    org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-summary.html new file mode 100644 index 000000000..edf03262b --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-summary.html @@ -0,0 +1,163 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-tree.html new file mode 100644 index 000000000..171dcfd4b --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/package-tree.html @@ -0,0 +1,153 @@ + + + + + + +org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    枚举分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/CryptoSuite.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/CryptoSuite.html similarity index 93% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/CryptoSuite.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/CryptoSuite.html index e4d2e6046..7e7daf32d 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/CryptoSuite.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/CryptoSuite.html @@ -4,7 +4,7 @@ -CryptoSuite (java-sdk 3.0.0 API) +CryptoSuite (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.crypto.exceptions

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-summary.html new file mode 100644 index 000000000..21f81e20c --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-summary.html @@ -0,0 +1,172 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.exceptions (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.crypto.exceptions

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-tree.html new file mode 100644 index 000000000..217097279 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/exceptions/package-tree.html @@ -0,0 +1,152 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.exceptions 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.crypto.exceptions的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/Hash.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/Hash.html similarity index 98% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/Hash.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/Hash.html index fe97a93cf..dd225f50b 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/Hash.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/Hash.html @@ -4,7 +4,7 @@ -Hash (java-sdk 3.0.0 API) +Hash (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.crypto.hash

    +
    +

    接口

    + +

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-summary.html new file mode 100644 index 000000000..ad6bfa34b --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-summary.html @@ -0,0 +1,159 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.hash (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.crypto.hash

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      接口概要 
      接口说明
      Hash 
      +
    • +
    • + + + + + + + + + + + + + + + + +
      类概要 
      说明
      Keccak256 
      SM3Hash 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-tree.html new file mode 100644 index 000000000..56ea15bc2 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/hash/package-tree.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.hash 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.crypto.hash的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.crypto.hash.Keccak256 (implements org.fisco.bcos.sdk.v3.crypto.hash.Hash)
      • +
      • org.fisco.bcos.sdk.v3.crypto.hash.SM3Hash (implements org.fisco.bcos.sdk.v3.crypto.hash.Hash)
      • +
      +
    • +
    +

    接口分层结构

    +
      +
    • org.fisco.bcos.sdk.v3.crypto.hash.Hash
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/CryptoKeyPair.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/CryptoKeyPair.html similarity index 94% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/CryptoKeyPair.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/CryptoKeyPair.html index 7d561f7bf..6d687db70 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/CryptoKeyPair.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/CryptoKeyPair.html @@ -4,7 +4,7 @@ -CryptoKeyPair (java-sdk 3.0.0 API) +CryptoKeyPair (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.crypto.keypair
    +

    类 HsmSM2KeyPair

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          DefaultHashAlgorithm

          +
          public static Hash DefaultHashAlgorithm
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          HsmSM2KeyPair

          +
          public HsmSM2KeyPair(java.lang.String hsmLibPath,
          +                     int hsmKeyIndex,
          +                     java.lang.String hsmPassword)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + + + + + +
          +
        • +

          createKeyPair

          +
          public CryptoKeyPair createKeyPair(java.security.KeyPair javaKeyPair)
          +
          从类复制的说明: CryptoKeyPair
          +
          Abstract function of create keyPair randomly
          +
          +
          指定者:
          +
          createKeyPair 在类中 CryptoKeyPair
          +
          参数:
          +
          javaKeyPair - KeyPair type key pair
          +
          返回:
          +
          CryptoKeyPair type key pair
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getHsmLibPath

          +
          public java.lang.String getHsmLibPath()
          +
        • +
        + + + +
          +
        • +

          getHsmKeyIndex

          +
          public int getHsmKeyIndex()
          +
        • +
        + + + +
          +
        • +

          getHsmPassword

          +
          public java.lang.String getHsmPassword()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/SM2KeyPair.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/SM2KeyPair.html similarity index 84% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/SM2KeyPair.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/SM2KeyPair.html index b3b5c57ad..fefb92f97 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/SM2KeyPair.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/SM2KeyPair.html @@ -4,7 +4,7 @@ -SM2KeyPair (java-sdk 3.0.0 API) +SM2KeyPair (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.crypto.keypair

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-summary.html new file mode 100644 index 000000000..0ca64fb88 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-summary.html @@ -0,0 +1,152 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.keypair (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.crypto.keypair

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-tree.html new file mode 100644 index 000000000..e5206155a --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keypair/package-tree.html @@ -0,0 +1,141 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.keypair 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.crypto.keypair的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/KeyTool.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/KeyTool.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/KeyTool.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/KeyTool.html index 75a5c1705..9c5579aee 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/KeyTool.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/KeyTool.html @@ -4,7 +4,7 @@ -KeyTool (java-sdk 3.0.0 API) +KeyTool (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.crypto.keystore

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-summary.html new file mode 100644 index 000000000..6cea4d848 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-summary.html @@ -0,0 +1,148 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.keystore (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.crypto.keystore

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-tree.html new file mode 100644 index 000000000..525a1f398 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/keystore/package-tree.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.keystore 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.crypto.keystore的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.crypto.keystore.KeyTool + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-frame.html new file mode 100644 index 000000000..98d0c6691 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-frame.html @@ -0,0 +1,20 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.crypto

    +
    +

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-summary.html new file mode 100644 index 000000000..3efffd1e9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-summary.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.crypto

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      类概要 
      说明
      CryptoSuite 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-tree.html new file mode 100644 index 000000000..35ae8cc35 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/package-tree.html @@ -0,0 +1,135 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.crypto的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object + +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/ECDSASignature.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/ECDSASignature.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/ECDSASignature.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/ECDSASignature.html index e7b37a117..b5d500b0a 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/ECDSASignature.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/ECDSASignature.html @@ -4,7 +4,7 @@ -ECDSASignature (java-sdk 3.0.0 API) +ECDSASignature (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.crypto.signature
    +

    类 HsmSM2Signature

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.crypto.signature.HsmSM2Signature
      • +
      +
    • +
    +
    +
      +
    • +
      +
      所有已实现的接口:
      +
      Signature
      +
      +
      +
      +
      public class HsmSM2Signature
      +extends java.lang.Object
      +implements Signature
      +
    • +
    +
    +
    +
      +
    • + + + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 实例方法 具体方法 
        限定符和类型方法和说明
        java.lang.StringgetHsmLibPath() 
        voidsetHsmLibPath(java.lang.String hsmLibPath) 
        SignatureResultsign(byte[] message, + CryptoKeyPair keyPair) +
        Sign message with the given keyPair
        +
        SignatureResultsign(java.lang.String message, + CryptoKeyPair keyPair) +
        Sign message with the given keyPair
        +
        byte[]signMessage(java.lang.String message, + CryptoKeyPair keyPair) 
        java.lang.StringsignWithStringSignature(java.lang.String message, + CryptoKeyPair keyPair) +
        Sign message with the given keyPair
        +
        booleanverify(java.lang.String publicKey, + byte[] message, + byte[] signature) +
        verify signature
        +
        booleanverify(java.lang.String publicKey, + java.lang.String message, + java.lang.String signature) +
        verify signature
        +
        booleanverifyMessage(java.lang.String publicKey, + java.lang.String message, + java.lang.String signature) 
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          SIGNATURE_R_AND_S_LENGTH

          +
          public static final int SIGNATURE_R_AND_S_LENGTH
          +
          +
          另请参阅:
          +
          常量字段值
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          HsmSM2Signature

          +
          public HsmSM2Signature()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getHsmLibPath

          +
          public java.lang.String getHsmLibPath()
          +
        • +
        + + + +
          +
        • +

          setHsmLibPath

          +
          public void setHsmLibPath(java.lang.String hsmLibPath)
          +
        • +
        + + + +
          +
        • +

          sign

          +
          public SignatureResult sign(java.lang.String message,
          +                            CryptoKeyPair keyPair)
          +
          从接口复制的说明: Signature
          +
          Sign message with the given keyPair
          +
          +
          指定者:
          +
          sign 在接口中 Signature
          +
          参数:
          +
          message - the string type message to be signed, must be a digest
          +
          keyPair - the keyPair used to generate the signature
          +
          返回:
          +
          the signature result
          +
          +
        • +
        + + + +
          +
        • +

          sign

          +
          public SignatureResult sign(byte[] message,
          +                            CryptoKeyPair keyPair)
          +
          从接口复制的说明: Signature
          +
          Sign message with the given keyPair
          +
          +
          指定者:
          +
          sign 在接口中 Signature
          +
          参数:
          +
          message - the byte array message to be signed, must be a digest
          +
          keyPair - the keyPair used to generate the signature
          +
          返回:
          +
          the signature result
          +
          +
        • +
        + + + +
          +
        • +

          signWithStringSignature

          +
          public java.lang.String signWithStringSignature(java.lang.String message,
          +                                                CryptoKeyPair keyPair)
          +
          从接口复制的说明: Signature
          +
          Sign message with the given keyPair
          +
          +
          指定者:
          +
          signWithStringSignature 在接口中 Signature
          +
          参数:
          +
          message - the string type message to be signed, must be a digest
          +
          keyPair - the keyPair used to generate the signature
          +
          返回:
          +
          the string type signature result
          +
          +
        • +
        + + + +
          +
        • +

          signMessage

          +
          public byte[] signMessage(java.lang.String message,
          +                          CryptoKeyPair keyPair)
          +
        • +
        + + + +
          +
        • +

          verify

          +
          public boolean verify(java.lang.String publicKey,
          +                      java.lang.String message,
          +                      java.lang.String signature)
          +
          从接口复制的说明: Signature
          +
          verify signature
          +
          +
          指定者:
          +
          verify 在接口中 Signature
          +
          参数:
          +
          publicKey - the public key
          +
          message - the message, must be a digest
          +
          signature - the signature to be verified
          +
          返回:
          +
          true/false
          +
          +
        • +
        + + + +
          +
        • +

          verify

          +
          public boolean verify(java.lang.String publicKey,
          +                      byte[] message,
          +                      byte[] signature)
          +
          从接口复制的说明: Signature
          +
          verify signature
          +
          +
          指定者:
          +
          verify 在接口中 Signature
          +
          参数:
          +
          publicKey - the publickey
          +
          message - the byte array type message, must be a digest
          +
          signature - the byte array signature to be verified
          +
          返回:
          +
          true/false
          +
          +
        • +
        + + + +
          +
        • +

          verifyMessage

          +
          public boolean verifyMessage(java.lang.String publicKey,
          +                             java.lang.String message,
          +                             java.lang.String signature)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/SM2Signature.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/SM2Signature.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/SM2Signature.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/SM2Signature.html index e0cd82991..13b2327b1 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/SM2Signature.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/SM2Signature.html @@ -4,7 +4,7 @@ -SM2Signature (java-sdk 3.0.0 API) +SM2Signature (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,14 +12,14 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.crypto.signature

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-summary.html new file mode 100644 index 000000000..9e31f898d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-summary.html @@ -0,0 +1,175 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.signature (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.crypto.signature

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-tree.html new file mode 100644 index 000000000..9cb6b0d55 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/signature/package-tree.html @@ -0,0 +1,147 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.signature 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.crypto.signature的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    +
      +
    • org.fisco.bcos.sdk.v3.crypto.signature.Signature
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/Curve25519VRF.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/Curve25519VRF.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/Curve25519VRF.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/Curve25519VRF.html index 81a97070d..7589a4054 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/Curve25519VRF.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/Curve25519VRF.html @@ -4,7 +4,7 @@ -Curve25519VRF (java-sdk 3.0.0 API) +Curve25519VRF (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.crypto.vrf

    +
    +

    接口

    + +

    + +

    异常错误

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-summary.html new file mode 100644 index 000000000..ceabae4fa --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-summary.html @@ -0,0 +1,176 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.vrf (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.crypto.vrf

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      接口概要 
      接口说明
      VRFInterface 
      +
    • +
    • + + + + + + + + + + + + + + + + +
      类概要 
      说明
      Curve25519VRF 
      VRFKeyPair 
      +
    • +
    • + + + + + + + + + + + + +
      异常错误概要 
      异常错误说明
      VRFException +
      Exceptioned when calling vrf related functions.
      +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-tree.html new file mode 100644 index 000000000..e2fce3a76 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/crypto/vrf/package-tree.html @@ -0,0 +1,153 @@ + + + + + + +org.fisco.bcos.sdk.v3.crypto.vrf 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.crypto.vrf的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.crypto.vrf.Curve25519VRF (implements org.fisco.bcos.sdk.v3.crypto.vrf.VRFInterface)
      • +
      • java.lang.Throwable (implements java.io.Serializable) +
          +
        • java.lang.Exception +
            +
          • java.lang.RuntimeException + +
          • +
          +
        • +
        +
      • +
      • org.fisco.bcos.sdk.v3.crypto.vrf.VRFKeyPair
      • +
      +
    • +
    +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/EventLogAddrAndTopics.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/EventLogAddrAndTopics.html new file mode 100644 index 000000000..e814339db --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/EventLogAddrAndTopics.html @@ -0,0 +1,308 @@ + + + + + + +EventLogAddrAndTopics (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.eventsub
    +

    类 EventLogAddrAndTopics

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.eventsub.EventLogAddrAndTopics
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class EventLogAddrAndTopics
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 实例方法 具体方法 
        限定符和类型方法和说明
        java.lang.StringgetAddress() 
        java.util.List<java.lang.String>getTopics() 
        voidsetAddress(java.lang.String address) 
        voidsetTopics(java.util.List<java.lang.String> topics) 
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          EventLogAddrAndTopics

          +
          public EventLogAddrAndTopics()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getAddress

          +
          public java.lang.String getAddress()
          +
        • +
        + + + +
          +
        • +

          setAddress

          +
          public void setAddress(java.lang.String address)
          +
        • +
        + + + +
          +
        • +

          getTopics

          +
          public java.util.List<java.lang.String> getTopics()
          +
        • +
        + + + +
          +
        • +

          setTopics

          +
          public void setTopics(java.util.List<java.lang.String> topics)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/EventSubCallback.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/EventSubCallback.html similarity index 94% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/EventSubCallback.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/EventSubCallback.html index 4464347f1..f1f81040e 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/EventSubCallback.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/EventSubCallback.html @@ -4,7 +4,7 @@ -EventSubCallback (java-sdk 3.0.0 API) +EventSubCallback (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,13 +12,13 @@ + + +

    org.fisco.bcos.sdk.v3.eventsub

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-summary.html new file mode 100644 index 000000000..33872d4a5 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-summary.html @@ -0,0 +1,190 @@ + + + + + + +org.fisco.bcos.sdk.v3.eventsub (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.eventsub

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-tree.html new file mode 100644 index 000000000..3a5318d4c --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/eventsub/package-tree.html @@ -0,0 +1,155 @@ + + + + + + +org.fisco.bcos.sdk.v3.eventsub 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.eventsub的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +

    枚举分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/ConstantConfig.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/ConstantConfig.html similarity index 98% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/ConstantConfig.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/ConstantConfig.html index 7e41c953a..c7062c49f 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/ConstantConfig.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/ConstantConfig.html @@ -4,7 +4,7 @@ -ConstantConfig (java-sdk 3.0.0 API) +ConstantConfig (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.model
    +

    枚举 EnumNodeVersion

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<EnumNodeVersion>
      • +
      • +
          +
        • org.fisco.bcos.sdk.v3.model.EnumNodeVersion
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      所有已实现的接口:
      +
      java.io.Serializable, java.lang.Comparable<EnumNodeVersion>
      +
      +
      +
      +
      public enum EnumNodeVersion
      +extends java.lang.Enum<EnumNodeVersion>
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          values

          +
          public static EnumNodeVersion[] values()
          +
          按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。该方法可用于迭代 +常量, 如下所示: +
          +for (EnumNodeVersion c : EnumNodeVersion.values())
          +    System.out.println(c);
          +
          +
          +
          返回:
          +
          按照声明该枚举类型的常量的顺序返回的包含这些常量的数组
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static EnumNodeVersion valueOf(java.lang.String name)
          +
          返回带有指定名称的该类型的枚举常量。 +字符串必须与用于声明该类型的枚举常量的 +标识符完全匹配。(不允许有多余 +的空格字符。)
          +
          +
          参数:
          +
          name - 要返回的枚举常量的名称。
          +
          返回:
          +
          返回带有指定名称的枚举常量
          +
          抛出:
          +
          java.lang.IllegalArgumentException - 如果该枚举类型没有带有指定名称的常量
          +
          java.lang.NullPointerException - 如果参数为空值
          +
          +
        • +
        + + + +
          +
        • +

          getVersion

          +
          public java.lang.Integer getVersion()
          +
        • +
        + + + +
          +
        • +

          getVersionString

          +
          @Deprecated
          +public java.lang.String getVersionString()
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          compareToVersion

          +
          public int compareToVersion(EnumNodeVersion v2)
          +
        • +
        + + + + + + + + + + + + + + + + + + + + + + + +
          +
        • +

          valueFromCompatibilityVersion

          +
          public static EnumNodeVersion.Version valueFromCompatibilityVersion(long compatibilityVersion)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/EventLog.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/EventLog.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/EventLog.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/EventLog.html index a01c52802..af068f58d 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/EventLog.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/EventLog.html @@ -4,7 +4,7 @@ -EventLog (java-sdk 3.0.0 API) +EventLog (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.model
    +

    枚举 NodeType

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<NodeType>
      • +
      • +
          +
        • org.fisco.bcos.sdk.v3.model.NodeType
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      所有已实现的接口:
      +
      java.io.Serializable, java.lang.Comparable<NodeType>
      +
      +
      +
      +
      public enum NodeType
      +extends java.lang.Enum<NodeType>
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + +
        所有方法 静态方法 具体方法 
        限定符和类型方法和说明
        static NodeTypevalueOf(java.lang.String name) +
        返回带有指定名称的该类型的枚举常量。
        +
        static NodeType[]values() +
        按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。
        +
        +
          +
        • + + +

          从类继承的方法 java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
        • +
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        枚举常量详细资料

        + + + +
          +
        • +

          CONSENSUS_SEALER

          +
          public static final NodeType CONSENSUS_SEALER
          +
        • +
        + + + +
          +
        • +

          CONSENSUS_OBSERVER

          +
          public static final NodeType CONSENSUS_OBSERVER
          +
        • +
        + + + +
          +
        • +

          CONSENSUS_CANDIDATE_SEALER

          +
          public static final NodeType CONSENSUS_CANDIDATE_SEALER
          +
        • +
        + + + +
          +
        • +

          UNKNOWN

          +
          public static final NodeType UNKNOWN
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          values

          +
          public static NodeType[] values()
          +
          按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。该方法可用于迭代 +常量, 如下所示: +
          +for (NodeType c : NodeType.values())
          +    System.out.println(c);
          +
          +
          +
          返回:
          +
          按照声明该枚举类型的常量的顺序返回的包含这些常量的数组
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static NodeType valueOf(java.lang.String name)
          +
          返回带有指定名称的该类型的枚举常量。 +字符串必须与用于声明该类型的枚举常量的 +标识符完全匹配。(不允许有多余 +的空格字符。)
          +
          +
          参数:
          +
          name - 要返回的枚举常量的名称。
          +
          返回:
          +
          返回带有指定名称的枚举常量
          +
          抛出:
          +
          java.lang.IllegalArgumentException - 如果该枚举类型没有带有指定名称的常量
          +
          java.lang.NullPointerException - 如果参数为空值
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/NodeVersion.ClientVersion.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/NodeVersion.ClientVersion.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/NodeVersion.ClientVersion.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/NodeVersion.ClientVersion.html index 02e7c3acb..98f19be9b 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/NodeVersion.ClientVersion.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/NodeVersion.ClientVersion.html @@ -4,7 +4,7 @@ -NodeVersion.ClientVersion (java-sdk 3.0.0 API) +NodeVersion.ClientVersion (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.model
    +

    类 TransactionReceipt

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.model.TransactionReceipt
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TransactionReceipt
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TransactionReceipt

          +
          public TransactionReceipt()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          isStatusOK

          +
          public boolean isStatusOK()
          +
        • +
        + + + +
          +
        • +

          readFromHexString

          +
          public static TransactionReceipt readFromHexString(java.lang.String hexString)
          +                                            throws org.fisco.bcos.sdk.jni.common.JniException,
          +                                                   java.io.IOException
          +
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          writeToHexString

          +
          public java.lang.String writeToHexString()
          +                                  throws com.fasterxml.jackson.core.JsonProcessingException,
          +                                         org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          抛出:
          +
          com.fasterxml.jackson.core.JsonProcessingException
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          getReceiptProof

          +
          @Deprecated
          +public java.util.List<MerkleProofUnit> getReceiptProof()
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          setReceiptProof

          +
          @Deprecated
          +public void setReceiptProof(java.util.List<MerkleProofUnit> receiptProof)
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          getTransactionHash

          +
          public java.lang.String getTransactionHash()
          +
        • +
        + + + +
          +
        • +

          setTransactionHash

          +
          public void setTransactionHash(java.lang.String transactionHash)
          +
        • +
        + + + +
          +
        • +

          getVersion

          +
          public java.lang.Integer getVersion()
          +
        • +
        + + + +
          +
        • +

          setVersion

          +
          public void setVersion(java.lang.Integer version)
          +
        • +
        + + + +
          +
        • +

          getReceiptHash

          +
          public java.lang.String getReceiptHash()
          +
        • +
        + + + +
          +
        • +

          setReceiptHash

          +
          public void setReceiptHash(java.lang.String receiptHash)
          +
        • +
        + + + +
          +
        • +

          getBlockNumber

          +
          public java.math.BigInteger getBlockNumber()
          +
        • +
        + + + +
          +
        • +

          setBlockNumber

          +
          public void setBlockNumber(java.math.BigInteger blockNumber)
          +
        • +
        + + + +
          +
        • +

          getFrom

          +
          public java.lang.String getFrom()
          +
        • +
        + + + +
          +
        • +

          setFrom

          +
          public void setFrom(java.lang.String from)
          +
        • +
        + + + +
          +
        • +

          getTo

          +
          public java.lang.String getTo()
          +
        • +
        + + + +
          +
        • +

          setTo

          +
          public void setTo(java.lang.String to)
          +
        • +
        + + + +
          +
        • +

          getGasUsed

          +
          public java.lang.String getGasUsed()
          +
        • +
        + + + +
          +
        • +

          setGasUsed

          +
          public void setGasUsed(java.lang.String gasUsed)
          +
        • +
        + + + +
          +
        • +

          getContractAddress

          +
          public java.lang.String getContractAddress()
          +
        • +
        + + + +
          +
        • +

          setContractAddress

          +
          public void setContractAddress(java.lang.String contractAddress)
          +
        • +
        + + + +
          +
        • +

          getChecksumContractAddress

          +
          public java.lang.String getChecksumContractAddress()
          +
        • +
        + + + +
          +
        • +

          setChecksumContractAddress

          +
          public void setChecksumContractAddress(java.lang.String checksumContractAddress)
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          getStatus

          +
          public int getStatus()
          +
        • +
        + + + +
          +
        • +

          setStatus

          +
          public void setStatus(int status)
          +
        • +
        + + + +
          +
        • +

          getInput

          +
          public java.lang.String getInput()
          +
        • +
        + + + +
          +
        • +

          setInput

          +
          public void setInput(java.lang.String input)
          +
        • +
        + + + +
          +
        • +

          getOutput

          +
          public java.lang.String getOutput()
          +
        • +
        + + + +
          +
        • +

          setOutput

          +
          public void setOutput(java.lang.String output)
          +
        • +
        + + + +
          +
        • +

          getTransactionProof

          +
          @Deprecated
          +public java.util.List<MerkleProofUnit> getTransactionProof()
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          setTransactionProof

          +
          @Deprecated
          +public void setTransactionProof(java.util.List<MerkleProofUnit> transactionProof)
          +
          已过时。 
          +
        • +
        + + + +
          +
        • +

          getTxProof

          +
          public java.util.List<java.lang.String> getTxProof()
          +
        • +
        + + + +
          +
        • +

          setTxProof

          +
          public void setTxProof(java.util.List<java.lang.String> txProof)
          +
        • +
        + + + +
          +
        • +

          getTxReceiptProof

          +
          public java.util.List<java.lang.String> getTxReceiptProof()
          +
        • +
        + + + +
          +
        • +

          setTxReceiptProof

          +
          public void setTxReceiptProof(java.util.List<java.lang.String> txReceiptProof)
          +
        • +
        + + + +
          +
        • +

          getEffectiveGasPrice

          +
          public java.lang.String getEffectiveGasPrice()
          +
        • +
        + + + +
          +
        • +

          setEffectiveGasPrice

          +
          public void setEffectiveGasPrice(java.lang.String effectiveGasPrice)
          +
        • +
        + + + + + + + +
          +
        • +

          calculateReceiptHashInNative

          +
          public java.lang.String calculateReceiptHashInNative(Hash hashImpl)
          +                                              throws java.io.IOException
          +
          Calculate receipt hash in native code with specified hash implementation (keccak256 or sm3)
          +
          +
          参数:
          +
          hashImpl - hash implementation
          +
          返回:
          +
          receipt hash hex string
          +
          抛出:
          +
          java.io.IOException - throw exception when encodeTransactionReceipt() throws IOException
          +
          +
        • +
        + + + +
          +
        • +

          encodeTransactionReceipt

          +
          public byte[] encodeTransactionReceipt()
          +                                throws java.io.IOException
          +
          This method is used to encode the transaction receipt into a byte array. It first creates a + ByteArrayOutputStream, then writes the version, gas used, contract address, status, and + output of the transaction receipt into the stream. If the version of the transaction receipt + is V1, it also writes the effective gas price into the stream. Then, it iterates over the log + entries of the transaction receipt. For each log entry, it writes the address, topics, and + data into the stream. Finally, it writes the block number of the transaction receipt into the + stream and returns the byte array.
          +
          +
          返回:
          +
          byte array representing the encoded transaction receipt
          +
          抛出:
          +
          java.io.IOException - if an I/O error occurs
          +
          +
        • +
        + + + +
          +
        • +

          getExtraData

          +
          public java.lang.String getExtraData()
          +
        • +
        + + + +
          +
        • +

          setExtraData

          +
          public void setExtraData(java.lang.String extraData)
          +
        • +
        + + + +
          +
        • +

          equals

          +
          public boolean equals(java.lang.Object o)
          +
          +
          覆盖:
          +
          equals 在类中 java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          hashCode

          +
          public int hashCode()
          +
          +
          覆盖:
          +
          hashCode 在类中 java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          getMessage

          +
          public java.lang.String getMessage()
          +
          +
          返回:
          +
          the message
          +
          +
        • +
        + + + +
          +
        • +

          setMessage

          +
          public void setMessage(java.lang.String message)
          +
          +
          参数:
          +
          message - the message to set
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/TransactionReceiptStatus.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/TransactionReceiptStatus.html similarity index 93% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/TransactionReceiptStatus.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/TransactionReceiptStatus.html index 8e0cd38b6..46aad027f 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/TransactionReceiptStatus.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/TransactionReceiptStatus.html @@ -4,7 +4,7 @@ -TransactionReceiptStatus (java-sdk 3.0.0 API) +TransactionReceiptStatus (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.model.callback
    +

    类 CallCallback

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.model.callback.CallCallback
      • +
      +
    • +
    +
    +
      +
    • +
      +
      所有已实现的接口:
      +
      RespCallback<java.util.List<Type>>
      +
      +
      +
      +
      public abstract class CallCallback
      +extends java.lang.Object
      +implements RespCallback<java.util.List<Type>>
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器概要

        + + + + + + + + +
        构造器 
        构造器和说明
        CallCallback() 
        +
      • +
      + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + +
        所有方法 实例方法 抽象方法 
        限定符和类型方法和说明
        abstract voidonError(Response errorResponse) +
        onError is called when get error
        +
        abstract voidonResponse(java.util.List<Type> types) +
        onResponse is the call back function
        +
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          CallCallback

          +
          public CallCallback()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          onResponse

          +
          public abstract void onResponse(java.util.List<Type> types)
          +
          从接口复制的说明: RespCallback
          +
          onResponse is the call back function
          +
          +
          指定者:
          +
          onResponse 在接口中 RespCallback<java.util.List<Type>>
          +
          参数:
          +
          types - the response data structure
          +
          +
        • +
        + + + +
          +
        • +

          onError

          +
          public abstract void onError(Response errorResponse)
          +
          从接口复制的说明: RespCallback
          +
          onError is called when get error
          +
          +
          指定者:
          +
          onError 在接口中 RespCallback<java.util.List<Type>>
          +
          参数:
          +
          errorResponse - callback error response
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/InjectFetcher.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/InjectFetcher.html new file mode 100644 index 000000000..257b02704 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/InjectFetcher.html @@ -0,0 +1,219 @@ + + + + + + +InjectFetcher (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.model.callback
    +

    接口 InjectFetcher<T>

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface InjectFetcher<T>
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          onFetch

          +
          T onFetch()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/RespCallback.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/RespCallback.html new file mode 100644 index 000000000..0025f886f --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/RespCallback.html @@ -0,0 +1,257 @@ + + + + + + +RespCallback (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.model.callback
    +

    接口 RespCallback<T>

    +
    +
    +
    +
      +
    • +
      +
      类型参数:
      +
      T - for the response data structures in package client/response
      +
      +
      +
      所有已知实现类:
      +
      CallCallback
      +
      +
      +
      +
      public interface RespCallback<T>
      +
      Callback function to executed when client get response from the node.
      +
    • +
    +
    +
    +
      +
    • + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + + + +
          +
        • +

          onResponse

          +
          void onResponse(T t)
          +
          onResponse is the call back function
          +
          +
          参数:
          +
          t - the response data structure
          +
          +
        • +
        + + + +
          +
        • +

          onError

          +
          void onError(Response errorResponse)
          +
          onError is called when get error
          +
          +
          参数:
          +
          errorResponse - callback error response
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/ResponseCallback.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/ResponseCallback.html similarity index 95% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/ResponseCallback.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/ResponseCallback.html index 96a09247f..caf1e12d0 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/ResponseCallback.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/ResponseCallback.html @@ -4,7 +4,7 @@ -ResponseCallback (java-sdk 3.0.0 API) +ResponseCallback (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.model.callback

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-summary.html new file mode 100644 index 000000000..19597efc7 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-summary.html @@ -0,0 +1,171 @@ + + + + + + +org.fisco.bcos.sdk.v3.model.callback (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.model.callback

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + +
      接口概要 
      接口说明
      InjectFetcher<T> 
      RespCallback<T> +
      Callback function to executed when client get response from the node.
      +
      +
    • +
    • + + + + + + + + + + + + + + + + + + + + +
      类概要 
      说明
      CallCallback 
      ResponseCallback +
      ResponseCallback is to define a callback to handle response from node.
      +
      TransactionCallback 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-tree.html new file mode 100644 index 000000000..086ad5426 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/callback/package-tree.html @@ -0,0 +1,142 @@ + + + + + + +org.fisco.bcos.sdk.v3.model.callback 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.model.callback的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-frame.html new file mode 100644 index 000000000..6b30555bc --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-frame.html @@ -0,0 +1,40 @@ + + + + + + +org.fisco.bcos.sdk.v3.model (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.model

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-summary.html new file mode 100644 index 000000000..3e070e943 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-summary.html @@ -0,0 +1,221 @@ + + + + + + +org.fisco.bcos.sdk.v3.model (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.model

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-tree.html new file mode 100644 index 000000000..481775afb --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/model/package-tree.html @@ -0,0 +1,166 @@ + + + + + + +org.fisco.bcos.sdk.v3.model 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.model的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    枚举分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-frame.html new file mode 100644 index 000000000..9c04b23f7 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-frame.html @@ -0,0 +1,24 @@ + + + + + + +org.fisco.bcos.sdk.v3 (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3

    +
    +

    + +

    异常错误

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-summary.html new file mode 100644 index 000000000..6a4b6faa1 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-summary.html @@ -0,0 +1,157 @@ + + + + + + +org.fisco.bcos.sdk.v3 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      类概要 
      说明
      BcosSDK 
      +
    • +
    • + + + + + + + + + + + + +
      异常错误概要 
      异常错误说明
      BcosSDKException +
      Throw exception when calling BcosSDK.
      +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-tree.html new file mode 100644 index 000000000..6633fc4b3 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/package-tree.html @@ -0,0 +1,148 @@ + + + + + + +org.fisco.bcos.sdk.v3 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.BcosSDK
      • +
      • java.lang.Throwable (implements java.io.Serializable) +
          +
        • java.lang.Exception + +
        • +
        +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/ReceiptParser.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/ReceiptParser.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/ReceiptParser.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/ReceiptParser.html index c908a9fb7..dd402e855 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/ReceiptParser.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/ReceiptParser.html @@ -4,7 +4,7 @@ -ReceiptParser (java-sdk 3.0.0 API) +ReceiptParser (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,14 +12,14 @@ + + +

    org.fisco.bcos.sdk.v3.transaction.codec.decode

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-summary.html new file mode 100644 index 000000000..aabc70b44 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-summary.html @@ -0,0 +1,165 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.codec.decode (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.codec.decode

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-tree.html new file mode 100644 index 000000000..e6b6f362e --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/decode/package-tree.html @@ -0,0 +1,141 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.codec.decode 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.codec.decode的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/TransactionEncoderInterface.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/TransactionEncoderInterface.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/TransactionEncoderInterface.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/TransactionEncoderInterface.html index c4381e5b4..0827c23d9 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/TransactionEncoderInterface.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/TransactionEncoderInterface.html @@ -4,7 +4,7 @@ -TransactionEncoderInterface (java-sdk 3.0.0 API) +TransactionEncoderInterface (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.transaction.codec.encode

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-summary.html new file mode 100644 index 000000000..9ec0d2fc3 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-summary.html @@ -0,0 +1,157 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.codec.encode (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.codec.encode

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-tree.html new file mode 100644 index 000000000..fa0205d1c --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/codec/encode/package-tree.html @@ -0,0 +1,139 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.codec.encode 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.codec.encode的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/ContractGasProvider.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/ContractGasProvider.html new file mode 100644 index 000000000..f677b0270 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/ContractGasProvider.html @@ -0,0 +1,288 @@ + + + + + + +ContractGasProvider (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.gasProvider
    +

    接口 ContractGasProvider

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getGasPrice

          +
          java.math.BigInteger getGasPrice(java.lang.String methodId)
          +
        • +
        + + + +
          +
        • +

          getGasPrice

          +
          java.math.BigInteger getGasPrice(byte[] methodId)
          +
        • +
        + + + +
          +
        • +

          getGasLimit

          +
          java.math.BigInteger getGasLimit(java.lang.String methodId)
          +
        • +
        + + + +
          +
        • +

          getGasLimit

          +
          java.math.BigInteger getGasLimit(byte[] methodId)
          +
        • +
        + + + +
          +
        • +

          isEIP1559Enabled

          +
          boolean isEIP1559Enabled()
          +
        • +
        + + + +
          +
        • +

          getEIP1559Struct

          +
          EIP1559Struct getEIP1559Struct(java.lang.String methodId)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/DefaultGasProvider.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/DefaultGasProvider.html new file mode 100644 index 000000000..be22ca4fd --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/DefaultGasProvider.html @@ -0,0 +1,300 @@ + + + + + + +DefaultGasProvider (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.gasProvider
    +

    类 DefaultGasProvider

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          GAS_LIMIT

          +
          public static final java.math.BigInteger GAS_LIMIT
          +
        • +
        + + + +
          +
        • +

          GAS_PRICE

          +
          public static final java.math.BigInteger GAS_PRICE
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          DefaultGasProvider

          +
          public DefaultGasProvider()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/EIP1559Struct.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/EIP1559Struct.html new file mode 100644 index 000000000..8a07987e3 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/EIP1559Struct.html @@ -0,0 +1,299 @@ + + + + + + +EIP1559Struct (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.gasProvider
    +

    类 EIP1559Struct

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.gasProvider.EIP1559Struct
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class EIP1559Struct
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器概要

        + + + + + + + + +
        构造器 
        构造器和说明
        EIP1559Struct(java.math.BigInteger maxFeePerGas, + java.math.BigInteger maxPriorityFeePerGas, + java.math.BigInteger gasLimit) 
        +
      • +
      + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          EIP1559Struct

          +
          public EIP1559Struct(java.math.BigInteger maxFeePerGas,
          +                     java.math.BigInteger maxPriorityFeePerGas,
          +                     java.math.BigInteger gasLimit)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getMaxFeePerGas

          +
          public java.math.BigInteger getMaxFeePerGas()
          +
        • +
        + + + +
          +
        • +

          getMaxPriorityFeePerGas

          +
          public java.math.BigInteger getMaxPriorityFeePerGas()
          +
        • +
        + + + +
          +
        • +

          getGasLimit

          +
          public java.math.BigInteger getGasLimit()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticEIP1559GasProvider.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticEIP1559GasProvider.html new file mode 100644 index 000000000..2de5c2b33 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticEIP1559GasProvider.html @@ -0,0 +1,369 @@ + + + + + + +StaticEIP1559GasProvider (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.gasProvider
    +

    类 StaticEIP1559GasProvider

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.gasProvider.StaticEIP1559GasProvider
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器概要

        + + + + + + + + +
        构造器 
        构造器和说明
        StaticEIP1559GasProvider(long chainId, + java.math.BigInteger maxFeePerGas, + java.math.BigInteger maxPriorityFeePerGas, + java.math.BigInteger gasLimit) 
        +
      • +
      + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 实例方法 具体方法 
        限定符和类型方法和说明
        EIP1559StructgetEIP1559Struct(java.lang.String methodId) 
        java.math.BigIntegergetGasLimit(byte[] methodId) 
        java.math.BigIntegergetGasLimit(java.lang.String contractFunc) 
        java.math.BigIntegergetGasPrice(byte[] methodId) 
        java.math.BigIntegergetGasPrice(java.lang.String contractFunc) 
        booleanisEIP1559Enabled() 
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          StaticEIP1559GasProvider

          +
          public StaticEIP1559GasProvider(long chainId,
          +                                java.math.BigInteger maxFeePerGas,
          +                                java.math.BigInteger maxPriorityFeePerGas,
          +                                java.math.BigInteger gasLimit)
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticGasProvider.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticGasProvider.html new file mode 100644 index 000000000..3fc972951 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticGasProvider.html @@ -0,0 +1,369 @@ + + + + + + +StaticGasProvider (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.gasProvider
    +

    类 StaticGasProvider

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.gasProvider.StaticGasProvider
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器概要

        + + + + + + + + +
        构造器 
        构造器和说明
        StaticGasProvider(java.math.BigInteger gasPrice, + java.math.BigInteger gasLimit) 
        +
      • +
      + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 实例方法 具体方法 
        限定符和类型方法和说明
        EIP1559StructgetEIP1559Struct(java.lang.String methodId) 
        java.math.BigIntegergetGasLimit(byte[] methodId) 
        java.math.BigIntegergetGasLimit(java.lang.String contractFunc) 
        java.math.BigIntegergetGasPrice(byte[] methodId) 
        java.math.BigIntegergetGasPrice(java.lang.String contractFunc) 
        booleanisEIP1559Enabled() 
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/package-frame.html new file mode 100644 index 000000000..4375e4b71 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/package-frame.html @@ -0,0 +1,27 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.gasProvider (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.transaction.gasProvider

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/package-summary.html new file mode 100644 index 000000000..cd6395670 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/package-summary.html @@ -0,0 +1,167 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.gasProvider (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.gasProvider

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/package-tree.html new file mode 100644 index 000000000..f4aeb8552 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/gasProvider/package-tree.html @@ -0,0 +1,145 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.gasProvider 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.gasProvider的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionProcessor.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionProcessor.html similarity index 79% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionProcessor.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionProcessor.html index 5186d930c..b9eb18d4d 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionProcessor.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionProcessor.html @@ -4,7 +4,7 @@ -AssembleTransactionProcessor (java-sdk 3.0.0 API) +AssembleTransactionProcessor (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ @@ -12,13 +12,13 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager
    +

    类 AssembleTransactionWithRemoteSignProcessor

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionWithRemoteSignProviderInterface.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionWithRemoteSignProviderInterface.html similarity index 98% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionWithRemoteSignProviderInterface.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionWithRemoteSignProviderInterface.html index face5a5a4..2c7c5c8a5 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionWithRemoteSignProviderInterface.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/AssembleTransactionWithRemoteSignProviderInterface.html @@ -4,7 +4,7 @@ -AssembleTransactionWithRemoteSignProviderInterface (java-sdk 3.0.0 API) +AssembleTransactionWithRemoteSignProviderInterface (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager
    +

    类 TarsTransactionProcessor

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessor.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessor.html new file mode 100644 index 000000000..7803f179d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessor.html @@ -0,0 +1,950 @@ + + + + + + +TransactionProcessor (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager
    +

    类 TransactionProcessor

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.manager.TransactionProcessor
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          log

          +
          protected static org.slf4j.Logger log
          +
        • +
        + + + +
          +
        • +

          cryptoSuite

          +
          protected final CryptoSuite cryptoSuite
          +
        • +
        + + + +
          +
        • +

          client

          +
          protected final Client client
          +
        • +
        + + + +
          +
        • +

          groupId

          +
          protected final java.lang.String groupId
          +
        • +
        + + + +
          +
        • +

          chainId

          +
          protected final java.lang.String chainId
          +
        • +
        + + + + + + + + +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TransactionProcessor

          +
          public TransactionProcessor(Client client,
          +                            CryptoKeyPair cryptoKeyPair,
          +                            java.lang.String groupId,
          +                            java.lang.String chainId)
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessorFactory.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessorFactory.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessorFactory.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessorFactory.html index 1672f3790..78d412101 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessorFactory.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/TransactionProcessorFactory.html @@ -4,7 +4,7 @@ -TransactionProcessorFactory (java-sdk 3.0.0 API) +TransactionProcessorFactory (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager
    +

    接口 TransactionProcessorInterface

    +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 实例方法 抽象方法 
        限定符和类型方法和说明
        voidasyncExecuteCall(CallRequest callRequest, + RespCallback<Call> callback) 
        voidasyncExecuteCall(java.lang.String from, + java.lang.String to, + byte[] encodedFunction, + RespCallback<Call> callback) 
        voidasyncExecuteCallWithSign(java.lang.String from, + java.lang.String to, + byte[] encodedFunction, + RespCallback<Call> callback) 
        org.fisco.bcos.sdk.jni.utilities.tx.TxPaircreateDeploySignedTransaction(java.lang.String to, + byte[] data, + java.lang.String abi, + CryptoKeyPair cryptoKeyPair, + int txAttribute) +
        create deploy signed transaction
        +
        org.fisco.bcos.sdk.jni.utilities.tx.TxPaircreateDeploySignedTransaction(java.lang.String to, + byte[] data, + java.lang.String abi, + CryptoKeyPair cryptoKeyPair, + int txAttribute, + java.lang.String extraData) +
        create deploy signed transaction
        +
        org.fisco.bcos.sdk.jni.utilities.tx.TxPaircreateSignedTransaction(java.lang.String to, + byte[] data, + CryptoKeyPair cryptoKeyPair, + int txAttribute) +
        create signed transaction
        +
        org.fisco.bcos.sdk.jni.utilities.tx.TxPaircreateSignedTransaction(java.lang.String to, + byte[] data, + CryptoKeyPair cryptoKeyPair, + int txAttribute, + java.lang.String extraData) +
        create signed transaction
        +
        TransactionReceiptdeployAndGetReceipt(java.lang.String to, + byte[] data, + java.lang.String abi, + CryptoKeyPair cryptoKeyPair, + int txAttribute) +
        send deploy transaction to fisco bcos node and get transaction receipt.
        +
        TransactionReceiptdeployAndGetReceipt(java.lang.String to, + byte[] data, + java.lang.String abi, + int txAttribute) +
        send deploy transaction to fisco bcos node and get transaction receipt. this method use + default keyPair
        +
        CallexecuteCall(CallRequest callRequest) +
        send call to fisco bcos node and receive call response.
        +
        CallexecuteCall(java.lang.String from, + java.lang.String to, + byte[] encodedFunction) +
        send encoded function call to fisco bcos node and receive call response.
        +
        CallexecuteCallWithSign(java.lang.String from, + java.lang.String to, + byte[] encodedFunction) +
        send encoded function call to fisco bcos node and receive call response, which contains sign + of to and data
        +
        CallexecuteCallWithSign(java.lang.String from, + java.lang.String to, + byte[] encodedFunction, + java.lang.String sign) 
        TransactionReceiptsendTransactionAndGetReceipt(java.lang.String to, + byte[] data, + CryptoKeyPair cryptoKeyPair, + int txAttribute) +
        send transaction to fisco bcos node and get transaction receipt.
        +
        TransactionReceiptsendTransactionAndGetReceipt(java.lang.String to, + byte[] data, + int txAttribute) +
        send transaction to fisco bcos node and get transaction receipt. this method use default + keyPair
        +
        java.lang.StringsendTransactionAsync(java.lang.String to, + byte[] data, + CryptoKeyPair cryptoKeyPair, + int txAttribute, + TransactionCallback callback) +
        send transaction to fisco bcos node and get transaction receipt asynchronously.
        +
        java.lang.StringsendTransactionAsync(java.lang.String to, + byte[] data, + int txAttribute, + TransactionCallback callback) +
        send transaction to fisco bcos node and get transaction receipt asynchronously. this method + use default keyPair
        +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          deployAndGetReceipt

          +
          TransactionReceipt deployAndGetReceipt(java.lang.String to,
          +                                       byte[] data,
          +                                       java.lang.String abi,
          +                                       CryptoKeyPair cryptoKeyPair,
          +                                       int txAttribute)
          +                                throws org.fisco.bcos.sdk.jni.common.JniException
          +
          send deploy transaction to fisco bcos node and get transaction receipt.
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          abi - ABI json string, deploy into chain with code, can be empty string
          +
          cryptoKeyPair - key pair
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          返回:
          +
          transaction receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
          +
          +
        • +
        + + + +
          +
        • +

          deployAndGetReceipt

          +
          TransactionReceipt deployAndGetReceipt(java.lang.String to,
          +                                       byte[] data,
          +                                       java.lang.String abi,
          +                                       int txAttribute)
          +                                throws org.fisco.bcos.sdk.jni.common.JniException
          +
          send deploy transaction to fisco bcos node and get transaction receipt. this method use + default keyPair
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          abi - ABI json string, deploy into chain with code, can be empty string
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          返回:
          +
          transaction receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAndGetReceipt

          +
          TransactionReceipt sendTransactionAndGetReceipt(java.lang.String to,
          +                                                byte[] data,
          +                                                CryptoKeyPair cryptoKeyPair,
          +                                                int txAttribute)
          +                                         throws org.fisco.bcos.sdk.jni.common.JniException
          +
          send transaction to fisco bcos node and get transaction receipt.
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          cryptoKeyPair - key pair
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          返回:
          +
          transaction receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAndGetReceipt

          +
          TransactionReceipt sendTransactionAndGetReceipt(java.lang.String to,
          +                                                byte[] data,
          +                                                int txAttribute)
          +                                         throws org.fisco.bcos.sdk.jni.common.JniException
          +
          send transaction to fisco bcos node and get transaction receipt. this method use default + keyPair
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          返回:
          +
          transaction receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAsync

          +
          java.lang.String sendTransactionAsync(java.lang.String to,
          +                                      byte[] data,
          +                                      CryptoKeyPair cryptoKeyPair,
          +                                      int txAttribute,
          +                                      TransactionCallback callback)
          +
          send transaction to fisco bcos node and get transaction receipt asynchronously.
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          cryptoKeyPair - key pair
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          callback - define hook function
          +
          返回:
          +
          transaction hash
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionAsync

          +
          java.lang.String sendTransactionAsync(java.lang.String to,
          +                                      byte[] data,
          +                                      int txAttribute,
          +                                      TransactionCallback callback)
          +
          send transaction to fisco bcos node and get transaction receipt asynchronously. this method + use default keyPair
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          callback - define hook function
          +
          返回:
          +
          transaction hash
          +
          +
        • +
        + + + +
          +
        • +

          executeCall

          +
          Call executeCall(CallRequest callRequest)
          +
          send call to fisco bcos node and receive call response.
          +
          +
          参数:
          +
          callRequest - signed transaction string
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          executeCall

          +
          Call executeCall(java.lang.String from,
          +                 java.lang.String to,
          +                 byte[] encodedFunction)
          +
          send encoded function call to fisco bcos node and receive call response.
          +
          +
          参数:
          +
          from - outer account address of sender
          +
          to - target contract address
          +
          encodedFunction - signed transaction string
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          executeCallWithSign

          +
          Call executeCallWithSign(java.lang.String from,
          +                         java.lang.String to,
          +                         byte[] encodedFunction)
          +
          send encoded function call to fisco bcos node and receive call response, which contains sign + of to and data
          +
          +
          参数:
          +
          from - outer account address of sender
          +
          to - target contract address
          +
          encodedFunction - signed transaction string
          +
          返回:
          +
          Call
          +
          +
        • +
        + + + +
          +
        • +

          executeCallWithSign

          +
          Call executeCallWithSign(java.lang.String from,
          +                         java.lang.String to,
          +                         byte[] encodedFunction,
          +                         java.lang.String sign)
          +
        • +
        + + + + + + + +
          +
        • +

          asyncExecuteCall

          +
          void asyncExecuteCall(java.lang.String from,
          +                      java.lang.String to,
          +                      byte[] encodedFunction,
          +                      RespCallback<Call> callback)
          +
        • +
        + + + +
          +
        • +

          asyncExecuteCallWithSign

          +
          void asyncExecuteCallWithSign(java.lang.String from,
          +                              java.lang.String to,
          +                              byte[] encodedFunction,
          +                              RespCallback<Call> callback)
          +
        • +
        + + + +
          +
        • +

          createDeploySignedTransaction

          +
          org.fisco.bcos.sdk.jni.utilities.tx.TxPair createDeploySignedTransaction(java.lang.String to,
          +                                                                         byte[] data,
          +                                                                         java.lang.String abi,
          +                                                                         CryptoKeyPair cryptoKeyPair,
          +                                                                         int txAttribute)
          +                                                                  throws org.fisco.bcos.sdk.jni.common.JniException
          +
          create deploy signed transaction
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          abi - ABI
          +
          cryptoKeyPair - key pair
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          返回:
          +
          hexed data of signed transaction
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
          +
          +
        • +
        + + + +
          +
        • +

          createDeploySignedTransaction

          +
          org.fisco.bcos.sdk.jni.utilities.tx.TxPair createDeploySignedTransaction(java.lang.String to,
          +                                                                         byte[] data,
          +                                                                         java.lang.String abi,
          +                                                                         CryptoKeyPair cryptoKeyPair,
          +                                                                         int txAttribute,
          +                                                                         java.lang.String extraData)
          +                                                                  throws org.fisco.bcos.sdk.jni.common.JniException
          +
          create deploy signed transaction
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          abi - ABI
          +
          cryptoKeyPair - key pair
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          extraData -
          +
          返回:
          +
          hexed data of signed transaction
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
          +
          +
        • +
        + + + +
          +
        • +

          createSignedTransaction

          +
          org.fisco.bcos.sdk.jni.utilities.tx.TxPair createSignedTransaction(java.lang.String to,
          +                                                                   byte[] data,
          +                                                                   CryptoKeyPair cryptoKeyPair,
          +                                                                   int txAttribute)
          +                                                            throws org.fisco.bcos.sdk.jni.common.JniException
          +
          create signed transaction
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          cryptoKeyPair - key pair
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          返回:
          +
          hexed data of signed transaction
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
          +
          +
        • +
        + + + +
          +
        • +

          createSignedTransaction

          +
          org.fisco.bcos.sdk.jni.utilities.tx.TxPair createSignedTransaction(java.lang.String to,
          +                                                                   byte[] data,
          +                                                                   CryptoKeyPair cryptoKeyPair,
          +                                                                   int txAttribute,
          +                                                                   java.lang.String extraData)
          +                                                            throws org.fisco.bcos.sdk.jni.common.JniException
          +
          create signed transaction
          +
          +
          参数:
          +
          to - target contract address
          +
          data - ABI encoded transaction data
          +
          cryptoKeyPair - key pair
          +
          txAttribute - transaction attribute, see more in TransactionAttribute
          +
          extraData -
          +
          返回:
          +
          hexed data of signed transaction
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException - throw when jni encode transaction error
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-frame.html new file mode 100644 index 000000000..196aecdd3 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-frame.html @@ -0,0 +1,30 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.transaction.manager

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-summary.html new file mode 100644 index 000000000..33d0a9718 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-summary.html @@ -0,0 +1,183 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.manager

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-tree.html new file mode 100644 index 000000000..46c6ba486 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/package-tree.html @@ -0,0 +1,151 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.manager的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleEIP1559TransactionService.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleEIP1559TransactionService.html new file mode 100644 index 000000000..2c54ec97a --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleEIP1559TransactionService.html @@ -0,0 +1,333 @@ + + + + + + +AssembleEIP1559TransactionService (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1
    +

    类 AssembleEIP1559TransactionService

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleTransactionService.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleTransactionService.html new file mode 100644 index 000000000..77ae851c2 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleTransactionService.html @@ -0,0 +1,583 @@ + + + + + + +AssembleTransactionService (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1
    +

    类 AssembleTransactionService

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.AssembleTransactionService
      • +
      +
    • +
    +
    +
      +
    • +
      +
      直接已知子类:
      +
      AssembleEIP1559TransactionService
      +
      +
      +
      +
      public class AssembleTransactionService
      +extends java.lang.Object
      +
      AssembleTransactionService + +

      codec(abi, method, params) -> inputData sendTx(to, inputData) -> receipt decode(abi, method, + receipt.output, ) -> result

      +
    • +
    +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          AssembleTransactionService

          +
          public AssembleTransactionService(Client client)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          setTransactionManager

          +
          public void setTransactionManager(TransactionManager transactionManager)
          +
          Sets the TransactionManager for this service. DefaultTransactionManager is used by default. + +

          ProxySignTransactionManager can be used to sign transactions with a proxy account, you can + change account easily.

          +
          +
          参数:
          +
          transactionManager - the TransactionManager to be set
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public TransactionResponse sendTransaction(BasicRequest request)
          +                                    throws ContractCodecException,
          +                                           org.fisco.bcos.sdk.jni.common.JniException
          +
          This method is used to send a transaction. + +

          If the request is an instance of TransactionRequest, it encodes the method with the + parameters from the request. + +

          If the request is an instance of TransactionRequestWithStringParams, it encodes the method + with the string parameters from the request. + +

          If the request is not an instance of either, it throws a ContractCodecException.

          +
          +
          参数:
          +
          request - the request containing the necessary information to send the transaction
          +
          返回:
          +
          TransactionResponse the response of the transaction
          +
          抛出:
          +
          ContractCodecException - if there is an error with the contract codec or the request is + not an instance of TransactionRequest or TransactionRequestWithStringParams
          +
          org.fisco.bcos.sdk.jni.common.JniException - if there is an error with the JNI
          +
          +
        • +
        + + + +
          +
        • +

          deployContract

          +
          public TransactionResponse deployContract(BasicDeployRequest request)
          +                                   throws ContractCodecException,
          +                                          org.fisco.bcos.sdk.jni.common.JniException
          +
          This method is used to deploy a contract. + +

          If the request is an instance of DeployTransactionRequest, it encodes the constructor with + the parameters from the request. + +

          If the request is an instance of DeployTransactionRequestWithStringParams, it encodes the + constructor with the string parameters from the request. + +

          If the request is not an instance of either, it throws a ContractCodecException.

          +
          +
          参数:
          +
          request - the request containing the necessary information to deploy the contract
          +
          返回:
          +
          TransactionResponse the response of the transaction
          +
          抛出:
          +
          ContractCodecException - if there is an error with the contract codec or the request is + not an instance of DeployTransactionRequest or DeployTransactionRequestWithStringParams
          +
          org.fisco.bcos.sdk.jni.common.JniException - if there is an error with the JNI
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public java.lang.String asyncSendTransaction(BasicRequest request,
          +                                             TransactionCallback callback)
          +                                      throws ContractCodecException,
          +                                             org.fisco.bcos.sdk.jni.common.JniException
          +
          This method is used to send a transaction asynchronously. + +

          If the request is an instance of TransactionRequest, it encodes the method with the + parameters from the request. + +

          If the request is an instance of TransactionRequestWithStringParams, it encodes the method + with the string parameters from the request. + +

          If the request is not an instance of either, it throws a ContractCodecException.

          +
          +
          参数:
          +
          request - the request containing the necessary information to send the transaction
          +
          callback - the callback to be called when the transaction is sent
          +
          返回:
          +
          String the transaction hash
          +
          抛出:
          +
          ContractCodecException - if there is an error with the contract codec or the request is + not an instance of TransactionRequest or TransactionRequestWithStringParams
          +
          org.fisco.bcos.sdk.jni.common.JniException - if there is an error with the JNI
          +
          +
        • +
        + + + +
          +
        • +

          asyncDeployContract

          +
          public java.lang.String asyncDeployContract(BasicDeployRequest request,
          +                                            TransactionCallback callback)
          +                                     throws ContractCodecException,
          +                                            org.fisco.bcos.sdk.jni.common.JniException
          +
          This method is used to deploy a contract asynchronously. + +

          If the request is an instance of DeployTransactionRequest, it encodes the constructor with + the parameters from the request. + +

          If the request is an instance of DeployTransactionRequestWithStringParams, it encodes the + constructor with the string parameters from the request. + +

          If the request is not an instance of either, it throws a ContractCodecException.

          +
          +
          参数:
          +
          request - the request containing the necessary information to deploy the contract
          +
          callback - the callback to be called when the transaction is sent
          +
          返回:
          +
          String the transaction hash
          +
          抛出:
          +
          ContractCodecException - if there is an error with the contract codec or the request is + not an instance of DeployTransactionRequest or DeployTransactionRequestWithStringParams
          +
          org.fisco.bcos.sdk.jni.common.JniException - if there is an error with the JNI
          +
          +
        • +
        + + + +
          +
        • +

          sendCall

          +
          public CallResponse sendCall(BasicRequest request)
          +                      throws ContractCodecException,
          +                             org.fisco.bcos.sdk.jni.common.JniException
          +
          This method is used to send a call. + +

          If the request is an instance of TransactionRequest, it encodes the method with the + parameters from the request. + +

          If the request is an instance of TransactionRequestWithStringParams, it encodes the method + with the string parameters from the request. + +

          If the request is not an instance of either, it throws a ContractCodecException.

          +
          +
          参数:
          +
          request - the request containing the necessary information to send the call
          +
          返回:
          +
          CallResponse the response of the call
          +
          抛出:
          +
          ContractCodecException - if there is an error with the contract codec or the request is + not an instance of TransactionRequest or TransactionRequestWithStringParams
          +
          org.fisco.bcos.sdk.jni.common.JniException - if there is an error with the JNI
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendCall

          +
          public void asyncSendCall(BasicRequest request,
          +                          RespCallback<CallResponse> callback)
          +                   throws ContractCodecException
          +
          This method is used to send a call asynchronously. + +

          If the request is an instance of TransactionRequest, it encodes the method with the + parameters from the request. + +

          If the request is an instance of TransactionRequestWithStringParams, it encodes the method + with the string parameters from the request. + +

          If the request is not an instance of either, it throws a ContractCodecException.

          +
          +
          参数:
          +
          request - the request containing the necessary information to send the call
          +
          callback - the callback to be called when the call is sent
          +
          抛出:
          +
          ContractCodecException - if there is an error with the contract codec or the request is + not an instance of TransactionRequest or TransactionRequestWithStringParams
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/DefaultTransactionManager.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/DefaultTransactionManager.html new file mode 100644 index 000000000..ea18b99a2 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/DefaultTransactionManager.html @@ -0,0 +1,1041 @@ + + + + + + +DefaultTransactionManager (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1
    +

    类 DefaultTransactionManager

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class DefaultTransactionManager
      +extends TransactionManager
      +
      Default transaction manager: + +

      use default jni sign method use default client key pair to sign tx

      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          DefaultTransactionManager

          +
          public DefaultTransactionManager(Client client)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + + + + + + + + + + + + + + + + + +
          +
        • +

          sendTransaction

          +
          public TransactionReceipt sendTransaction(java.lang.String to,
          +                                          byte[] data,
          +                                          java.math.BigInteger value,
          +                                          java.lang.String abi,
          +                                          boolean constructor)
          +                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with abi field
          +
          +
          指定者:
          +
          sendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public TransactionReceipt sendTransaction(java.lang.String to,
          +                                          byte[] data,
          +                                          java.math.BigInteger value,
          +                                          java.math.BigInteger gasPrice,
          +                                          java.math.BigInteger gasLimit,
          +                                          java.lang.String abi,
          +                                          boolean constructor)
          +                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields
          +
          +
          指定者:
          +
          sendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public TransactionReceipt sendTransaction(java.lang.String to,
          +                                          byte[] data,
          +                                          java.math.BigInteger value,
          +                                          java.math.BigInteger gasPrice,
          +                                          java.math.BigInteger gasLimit,
          +                                          java.math.BigInteger blockLimit,
          +                                          java.lang.String abi,
          +                                          boolean constructor)
          +                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields
          +
          +
          指定者:
          +
          sendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + + + + + +
          +
        • +

          createSignedTransaction

          +
          public java.lang.String createSignedTransaction(java.lang.String to,
          +                                                byte[] data,
          +                                                java.math.BigInteger value,
          +                                                java.math.BigInteger gasPrice,
          +                                                java.math.BigInteger gasLimit,
          +                                                java.math.BigInteger blockLimit,
          +                                                java.lang.String abi,
          +                                                boolean constructor)
          +                                         throws org.fisco.bcos.sdk.jni.common.JniException
          +
          This method is used to create a signed transaction.
          +
          +
          指定者:
          +
          createSignedTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - The destination address for the transaction.
          +
          data - The data to be sent with the transaction.
          +
          value - The value to be transferred with the transaction.
          +
          gasPrice - The price of gas for the transaction.
          +
          gasLimit - The maximum amount of gas that can be used for the transaction.
          +
          blockLimit - The maximum block number that can be used for the transaction, if + blockLimit is zero, then get client blockLimit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - If you deploy contract, should set to be true.
          +
          返回:
          +
          A Hex string representation of the signed transaction.
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          createSignedTransaction

          +
          public org.fisco.bcos.sdk.jni.utilities.tx.TxPair createSignedTransaction(AbiEncodedRequest request)
          +                                                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          指定者:
          +
          createSignedTransaction 在类中 TransactionManager
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public java.lang.String asyncSendTransaction(java.lang.String to,
          +                                             byte[] data,
          +                                             java.math.BigInteger value,
          +                                             java.lang.String abi,
          +                                             boolean constructor,
          +                                             TransactionCallback callback)
          +                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with abi field asynchronously
          +
          +
          指定者:
          +
          asyncSendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public java.lang.String asyncSendTransaction(java.lang.String to,
          +                                             byte[] data,
          +                                             java.math.BigInteger value,
          +                                             java.math.BigInteger gasPrice,
          +                                             java.math.BigInteger gasLimit,
          +                                             java.lang.String abi,
          +                                             boolean constructor,
          +                                             TransactionCallback callback)
          +                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields asynchronously
          +
          +
          指定者:
          +
          asyncSendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public java.lang.String asyncSendTransaction(java.lang.String to,
          +                                             byte[] data,
          +                                             java.math.BigInteger value,
          +                                             java.math.BigInteger gasPrice,
          +                                             java.math.BigInteger gasLimit,
          +                                             java.math.BigInteger blockLimit,
          +                                             java.lang.String abi,
          +                                             boolean constructor,
          +                                             TransactionCallback callback)
          +                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields asynchronously
          +
          +
          指定者:
          +
          asyncSendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + + + + + +
          +
        • +

          sendTransactionEIP1559

          +
          public TransactionReceipt sendTransactionEIP1559(java.lang.String to,
          +                                                 byte[] data,
          +                                                 java.math.BigInteger value,
          +                                                 EIP1559Struct eip1559Struct,
          +                                                 java.lang.String abi,
          +                                                 boolean constructor)
          +                                          throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559
          +
          +
          指定者:
          +
          sendTransactionEIP1559 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionEIP1559

          +
          public TransactionReceipt sendTransactionEIP1559(java.lang.String to,
          +                                                 byte[] data,
          +                                                 java.math.BigInteger value,
          +                                                 EIP1559Struct eip1559Struct,
          +                                                 java.math.BigInteger blockLimit,
          +                                                 java.lang.String abi,
          +                                                 boolean constructor)
          +                                          throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559
          +
          +
          指定者:
          +
          sendTransactionEIP1559 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransactionEIP1559

          +
          public java.lang.String asyncSendTransactionEIP1559(java.lang.String to,
          +                                                    byte[] data,
          +                                                    java.math.BigInteger value,
          +                                                    EIP1559Struct eip1559Struct,
          +                                                    java.lang.String abi,
          +                                                    boolean constructor,
          +                                                    TransactionCallback callback)
          +                                             throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559 asynchronously
          +
          +
          指定者:
          +
          asyncSendTransactionEIP1559 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransactionEIP1559

          +
          public java.lang.String asyncSendTransactionEIP1559(java.lang.String to,
          +                                                    byte[] data,
          +                                                    java.math.BigInteger value,
          +                                                    EIP1559Struct eip1559Struct,
          +                                                    java.math.BigInteger blockLimit,
          +                                                    java.lang.String abi,
          +                                                    boolean constructor,
          +                                                    TransactionCallback callback)
          +                                             throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559 asynchronously
          +
          +
          指定者:
          +
          asyncSendTransactionEIP1559 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendCall

          +
          public Call sendCall(java.lang.String to,
          +                     byte[] data)
          +
          Send call
          +
          +
          指定者:
          +
          sendCall 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          返回:
          +
          call result
          +
          +
        • +
        + + + +
          +
        • +

          sendCall

          +
          public Call sendCall(java.lang.String to,
          +                     byte[] data,
          +                     java.lang.String signature)
          +
          Send call with signature of call data
          +
          +
          指定者:
          +
          sendCall 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          signature - signature of call data
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendCall

          +
          public void asyncSendCall(java.lang.String to,
          +                          byte[] data,
          +                          RespCallback<Call> callback)
          +
          Send call asynchronously
          +
          +
          指定者:
          +
          asyncSendCall 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          callback - callback function
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendCall

          +
          public void asyncSendCall(java.lang.String to,
          +                          byte[] data,
          +                          java.lang.String signature,
          +                          RespCallback<Call> callback)
          +
          Send call asynchronously with signature of call data
          +
          +
          指定者:
          +
          asyncSendCall 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          signature - signature of call data
          +
          callback - callback function
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/ProxySignTransactionManager.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/ProxySignTransactionManager.html new file mode 100644 index 000000000..924f2f4f1 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/ProxySignTransactionManager.html @@ -0,0 +1,1103 @@ + + + + + + +ProxySignTransactionManager (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1
    +

    类 ProxySignTransactionManager

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class ProxySignTransactionManager
      +extends TransactionManager
      +
      ProxySignTransactionManager: customizable signer method, default use JNI signer. customizable key + pair to sign, default use client key pair.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法详细资料

        + + + + + + + + + + + + + + + + + + + + + + + +
          +
        • +

          sendTransaction

          +
          public TransactionReceipt sendTransaction(java.lang.String to,
          +                                          byte[] data,
          +                                          java.math.BigInteger value,
          +                                          java.lang.String abi,
          +                                          boolean constructor)
          +                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with abi field
          +
          +
          指定者:
          +
          sendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public TransactionReceipt sendTransaction(java.lang.String to,
          +                                          byte[] data,
          +                                          java.math.BigInteger value,
          +                                          java.math.BigInteger gasPrice,
          +                                          java.math.BigInteger gasLimit,
          +                                          java.lang.String abi,
          +                                          boolean constructor)
          +                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields
          +
          +
          指定者:
          +
          sendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public TransactionReceipt sendTransaction(java.lang.String to,
          +                                          byte[] data,
          +                                          java.math.BigInteger value,
          +                                          java.math.BigInteger gasPrice,
          +                                          java.math.BigInteger gasLimit,
          +                                          java.math.BigInteger blockLimit,
          +                                          java.lang.String abi,
          +                                          boolean constructor)
          +                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields
          +
          +
          指定者:
          +
          sendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + + + + + +
          +
        • +

          createSignedTransaction

          +
          public java.lang.String createSignedTransaction(java.lang.String to,
          +                                                byte[] data,
          +                                                java.math.BigInteger value,
          +                                                java.math.BigInteger gasPrice,
          +                                                java.math.BigInteger gasLimit,
          +                                                java.math.BigInteger blockLimit,
          +                                                java.lang.String abi,
          +                                                boolean constructor)
          +                                         throws org.fisco.bcos.sdk.jni.common.JniException
          +
          This method is used to create a signed transaction.
          +
          +
          指定者:
          +
          createSignedTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - The destination address for the transaction.
          +
          data - The data to be sent with the transaction.
          +
          value - The value to be transferred with the transaction.
          +
          gasPrice - The price of gas for the transaction.
          +
          gasLimit - The maximum amount of gas that can be used for the transaction.
          +
          blockLimit - The maximum block number that can be used for the transaction, if + blockLimit is zero, then get client blockLimit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          A Hex string representation of the signed transaction.
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          createSignedTransaction

          +
          public org.fisco.bcos.sdk.jni.utilities.tx.TxPair createSignedTransaction(AbiEncodedRequest request)
          +                                                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          指定者:
          +
          createSignedTransaction 在类中 TransactionManager
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public java.lang.String asyncSendTransaction(java.lang.String to,
          +                                             byte[] data,
          +                                             java.math.BigInteger value,
          +                                             TransactionCallback callback)
          +                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with abi field asynchronously
          +
          +
          覆盖:
          +
          asyncSendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public java.lang.String asyncSendTransaction(java.lang.String to,
          +                                             byte[] data,
          +                                             java.math.BigInteger value,
          +                                             java.lang.String abi,
          +                                             boolean constructor,
          +                                             TransactionCallback callback)
          +                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with abi field asynchronously
          +
          +
          指定者:
          +
          asyncSendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public java.lang.String asyncSendTransaction(java.lang.String to,
          +                                             byte[] data,
          +                                             java.math.BigInteger value,
          +                                             java.math.BigInteger gasPrice,
          +                                             java.math.BigInteger gasLimit,
          +                                             java.lang.String abi,
          +                                             boolean constructor,
          +                                             TransactionCallback callback)
          +                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields asynchronously
          +
          +
          指定者:
          +
          asyncSendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public java.lang.String asyncSendTransaction(java.lang.String to,
          +                                             byte[] data,
          +                                             java.math.BigInteger value,
          +                                             java.math.BigInteger gasPrice,
          +                                             java.math.BigInteger gasLimit,
          +                                             java.math.BigInteger blockLimit,
          +                                             java.lang.String abi,
          +                                             boolean constructor,
          +                                             TransactionCallback callback)
          +                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields asynchronously
          +
          +
          指定者:
          +
          asyncSendTransaction 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + + + + + +
          +
        • +

          sendTransactionEIP1559

          +
          public TransactionReceipt sendTransactionEIP1559(java.lang.String to,
          +                                                 byte[] data,
          +                                                 java.math.BigInteger value,
          +                                                 EIP1559Struct eip1559Struct,
          +                                                 java.lang.String abi,
          +                                                 boolean constructor)
          +                                          throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559
          +
          +
          指定者:
          +
          sendTransactionEIP1559 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionEIP1559

          +
          public TransactionReceipt sendTransactionEIP1559(java.lang.String to,
          +                                                 byte[] data,
          +                                                 java.math.BigInteger value,
          +                                                 EIP1559Struct eip1559Struct,
          +                                                 java.math.BigInteger blockLimit,
          +                                                 java.lang.String abi,
          +                                                 boolean constructor)
          +                                          throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559
          +
          +
          指定者:
          +
          sendTransactionEIP1559 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransactionEIP1559

          +
          public java.lang.String asyncSendTransactionEIP1559(java.lang.String to,
          +                                                    byte[] data,
          +                                                    java.math.BigInteger value,
          +                                                    EIP1559Struct eip1559Struct,
          +                                                    java.lang.String abi,
          +                                                    boolean constructor,
          +                                                    TransactionCallback callback)
          +                                             throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559 asynchronously
          +
          +
          指定者:
          +
          asyncSendTransactionEIP1559 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransactionEIP1559

          +
          public java.lang.String asyncSendTransactionEIP1559(java.lang.String to,
          +                                                    byte[] data,
          +                                                    java.math.BigInteger value,
          +                                                    EIP1559Struct eip1559Struct,
          +                                                    java.math.BigInteger blockLimit,
          +                                                    java.lang.String abi,
          +                                                    boolean constructor,
          +                                                    TransactionCallback callback)
          +                                             throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559 asynchronously
          +
          +
          指定者:
          +
          asyncSendTransactionEIP1559 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendCall

          +
          public Call sendCall(java.lang.String to,
          +                     byte[] data)
          +
          Send call
          +
          +
          指定者:
          +
          sendCall 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          返回:
          +
          call result
          +
          +
        • +
        + + + +
          +
        • +

          sendCall

          +
          public Call sendCall(java.lang.String to,
          +                     byte[] data,
          +                     java.lang.String signature)
          +
          Send call with signature of call data
          +
          +
          指定者:
          +
          sendCall 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          signature - signature of call data
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendCall

          +
          public void asyncSendCall(java.lang.String to,
          +                          byte[] data,
          +                          RespCallback<Call> callback)
          +
          Send call asynchronously
          +
          +
          指定者:
          +
          asyncSendCall 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          callback - callback function
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendCall

          +
          public void asyncSendCall(java.lang.String to,
          +                          byte[] data,
          +                          java.lang.String signature,
          +                          RespCallback<Call> callback)
          +
          Send call asynchronously with signature of call data
          +
          +
          指定者:
          +
          asyncSendCall 在类中 TransactionManager
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          signature - signature of call data
          +
          callback - callback function
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransactionManager.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransactionManager.html new file mode 100644 index 000000000..7f9c71fee --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransactionManager.html @@ -0,0 +1,1160 @@ + + + + + + +TransactionManager (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1
    +

    类 TransactionManager

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.TransactionManager
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          client

          +
          protected final Client client
          +
        • +
        + + + +
          +
        • +

          logger

          +
          protected final org.slf4j.Logger logger
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TransactionManager

          +
          protected TransactionManager(Client client)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getClient

          +
          public Client getClient()
          +
        • +
        + + + + + + + +
          +
        • +

          setGasProvider

          +
          public abstract void setGasProvider(ContractGasProvider gasProvider)
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          sendTransaction

          +
          public TransactionReceipt sendTransaction(java.lang.String to,
          +                                          byte[] data,
          +                                          java.math.BigInteger value)
          +                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Simple send tx
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public abstract TransactionReceipt sendTransaction(java.lang.String to,
          +                                                   byte[] data,
          +                                                   java.math.BigInteger value,
          +                                                   java.lang.String abi,
          +                                                   boolean constructor)
          +                                            throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with abi field
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          value - transfer value
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public abstract TransactionReceipt sendTransaction(java.lang.String to,
          +                                                   byte[] data,
          +                                                   java.math.BigInteger value,
          +                                                   java.math.BigInteger gasPrice,
          +                                                   java.math.BigInteger gasLimit,
          +                                                   java.lang.String abi,
          +                                                   boolean constructor)
          +                                            throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public abstract TransactionReceipt sendTransaction(java.lang.String to,
          +                                                   byte[] data,
          +                                                   java.math.BigInteger value,
          +                                                   java.math.BigInteger gasPrice,
          +                                                   java.math.BigInteger gasLimit,
          +                                                   java.math.BigInteger blockLimit,
          +                                                   java.lang.String abi,
          +                                                   boolean constructor)
          +                                            throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransaction

          +
          public abstract TransactionReceipt sendTransaction(AbiEncodedRequest request)
          +                                            throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          createSignedTransaction

          +
          public abstract java.lang.String createSignedTransaction(java.lang.String to,
          +                                                         byte[] data,
          +                                                         java.math.BigInteger value,
          +                                                         java.math.BigInteger gasPrice,
          +                                                         java.math.BigInteger gasLimit,
          +                                                         java.math.BigInteger blockLimit,
          +                                                         java.lang.String abi,
          +                                                         boolean constructor)
          +                                                  throws org.fisco.bcos.sdk.jni.common.JniException
          +
          This method is used to create a signed transaction.
          +
          +
          参数:
          +
          to - The destination address for the transaction.
          +
          data - The data to be sent with the transaction.
          +
          value - The value to be transferred with the transaction.
          +
          gasPrice - The price of gas for the transaction.
          +
          gasLimit - The maximum amount of gas that can be used for the transaction.
          +
          blockLimit - The maximum block number that can be used for the transaction, if + blockLimit is zero, then get client blockLimit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - If you deploy contract, should set to be true.
          +
          返回:
          +
          A Hex string representation of the signed transaction.
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          createSignedTransaction

          +
          public abstract org.fisco.bcos.sdk.jni.utilities.tx.TxPair createSignedTransaction(AbiEncodedRequest request)
          +                                                                            throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public java.lang.String asyncSendTransaction(java.lang.String to,
          +                                             byte[] data,
          +                                             java.math.BigInteger value,
          +                                             TransactionCallback callback)
          +                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Simple send tx asynchronously
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public abstract java.lang.String asyncSendTransaction(java.lang.String to,
          +                                                      byte[] data,
          +                                                      java.math.BigInteger value,
          +                                                      java.lang.String abi,
          +                                                      boolean constructor,
          +                                                      TransactionCallback callback)
          +                                               throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with abi field asynchronously
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          value - transfer value
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public abstract java.lang.String asyncSendTransaction(java.lang.String to,
          +                                                      byte[] data,
          +                                                      java.math.BigInteger value,
          +                                                      java.math.BigInteger gasPrice,
          +                                                      java.math.BigInteger gasLimit,
          +                                                      java.lang.String abi,
          +                                                      boolean constructor,
          +                                                      TransactionCallback callback)
          +                                               throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields asynchronously
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public abstract java.lang.String asyncSendTransaction(java.lang.String to,
          +                                                      byte[] data,
          +                                                      java.math.BigInteger value,
          +                                                      java.math.BigInteger gasPrice,
          +                                                      java.math.BigInteger gasLimit,
          +                                                      java.math.BigInteger blockLimit,
          +                                                      java.lang.String abi,
          +                                                      boolean constructor,
          +                                                      TransactionCallback callback)
          +                                               throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with gasPrice and gasLimit fields asynchronously
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          gasPrice - price of gas
          +
          gasLimit - use limit of gas
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransaction

          +
          public abstract java.lang.String asyncSendTransaction(AbiEncodedRequest request,
          +                                                      TransactionCallback callback)
          +                                               throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionEIP1559

          +
          public TransactionReceipt sendTransactionEIP1559(java.lang.String to,
          +                                                 byte[] data,
          +                                                 java.math.BigInteger value,
          +                                                 EIP1559Struct eip1559Struct)
          +                                          throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionEIP1559

          +
          public abstract TransactionReceipt sendTransactionEIP1559(java.lang.String to,
          +                                                          byte[] data,
          +                                                          java.math.BigInteger value,
          +                                                          EIP1559Struct eip1559Struct,
          +                                                          java.lang.String abi,
          +                                                          boolean constructor)
          +                                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendTransactionEIP1559

          +
          public abstract TransactionReceipt sendTransactionEIP1559(java.lang.String to,
          +                                                          byte[] data,
          +                                                          java.math.BigInteger value,
          +                                                          EIP1559Struct eip1559Struct,
          +                                                          java.math.BigInteger blockLimit,
          +                                                          java.lang.String abi,
          +                                                          boolean constructor)
          +                                                   throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy
          +
          constructor - if you deploy contract, should set to be true
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransactionEIP1559

          +
          public java.lang.String asyncSendTransactionEIP1559(java.lang.String to,
          +                                                    byte[] data,
          +                                                    java.math.BigInteger value,
          +                                                    EIP1559Struct eip1559Struct,
          +                                                    TransactionCallback callback)
          +                                             throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559 asynchronously
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransactionEIP1559

          +
          public abstract java.lang.String asyncSendTransactionEIP1559(java.lang.String to,
          +                                                             byte[] data,
          +                                                             java.math.BigInteger value,
          +                                                             EIP1559Struct eip1559Struct,
          +                                                             java.lang.String abi,
          +                                                             boolean constructor,
          +                                                             TransactionCallback callback)
          +                                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559 asynchronously
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy + contract
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendTransactionEIP1559

          +
          public abstract java.lang.String asyncSendTransactionEIP1559(java.lang.String to,
          +                                                             byte[] data,
          +                                                             java.math.BigInteger value,
          +                                                             EIP1559Struct eip1559Struct,
          +                                                             java.math.BigInteger blockLimit,
          +                                                             java.lang.String abi,
          +                                                             boolean constructor,
          +                                                             TransactionCallback callback)
          +                                                      throws org.fisco.bcos.sdk.jni.common.JniException
          +
          Send tx with EIP1559 asynchronously
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          value - transfer value
          +
          eip1559Struct - EIP1559 transaction payload
          +
          blockLimit - block limit
          +
          abi - ABI JSON string, generated by compile contract, should fill in when you deploy
          +
          constructor - if you deploy contract, should set to be true
          +
          callback - callback function
          +
          返回:
          +
          receipt
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendCall

          +
          public abstract Call sendCall(java.lang.String to,
          +                              byte[] data)
          +
          Send call
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          返回:
          +
          call result
          +
          +
        • +
        + + + +
          +
        • +

          sendCall

          +
          public abstract Call sendCall(java.lang.String to,
          +                              byte[] data,
          +                              java.lang.String signature)
          +
          Send call with signature of call data
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          signature - signature of call data
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendCall

          +
          public abstract void asyncSendCall(java.lang.String to,
          +                                   byte[] data,
          +                                   RespCallback<Call> callback)
          +
          Send call asynchronously
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          callback - callback function
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendCall

          +
          public abstract void asyncSendCall(java.lang.String to,
          +                                   byte[] data,
          +                                   java.lang.String signature,
          +                                   RespCallback<Call> callback)
          +
          Send call asynchronously with signature of call data
          +
          +
          参数:
          +
          to - to address
          +
          data - input data
          +
          signature - signature of call data
          +
          callback - callback function
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransferTransactionService.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransferTransactionService.html new file mode 100644 index 000000000..06ad94ec9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransferTransactionService.html @@ -0,0 +1,400 @@ + + + + + + +TransferTransactionService (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1
    +

    类 TransferTransactionService

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.TransferTransactionService
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TransferTransactionService
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          GAS_LIMIT

          +
          public static final java.math.BigInteger GAS_LIMIT
          +
        • +
        +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + + + + + +
          +
        • +

          TransferTransactionService

          +
          public TransferTransactionService(Client client)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          sendFunds

          +
          public TransactionReceipt sendFunds(java.lang.String to,
          +                                    java.math.BigDecimal value,
          +                                    Convert.Unit unit)
          +                             throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          sendFunds

          +
          public TransactionReceipt sendFunds(CryptoSuite cryptoSuite,
          +                                    java.lang.String to,
          +                                    java.math.BigDecimal value,
          +                                    Convert.Unit unit)
          +                             throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendFunds

          +
          public java.lang.String asyncSendFunds(java.lang.String to,
          +                                       java.math.BigDecimal value,
          +                                       Convert.Unit unit,
          +                                       TransactionCallback callback)
          +                                throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        + + + +
          +
        • +

          asyncSendFunds

          +
          public java.lang.String asyncSendFunds(CryptoSuite cryptoSuite,
          +                                       java.lang.String to,
          +                                       java.math.BigDecimal value,
          +                                       Convert.Unit unit,
          +                                       TransactionCallback callback)
          +                                throws org.fisco.bcos.sdk.jni.common.JniException
          +
          +
          抛出:
          +
          org.fisco.bcos.sdk.jni.common.JniException
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/AbiEncodedRequest.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/AbiEncodedRequest.html new file mode 100644 index 000000000..7942f2a2b --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/AbiEncodedRequest.html @@ -0,0 +1,686 @@ + + + + + + +AbiEncodedRequest (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto
    +

    类 AbiEncodedRequest

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.AbiEncodedRequest
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class AbiEncodedRequest
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        字段概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        字段 
        限定符和类型字段和说明
        protected java.lang.Stringabi 
        protected java.math.BigIntegerblockLimit 
        protected EIP1559Structeip1559Struct 
        protected byte[]encodedData 
        protected java.math.BigIntegergasLimit 
        protected java.math.BigIntegergasPrice 
        protected java.lang.Stringnonce 
        protected java.lang.Stringto 
        protected java.math.BigIntegervalue 
        +
      • +
      + +
        +
      • + + +

        构造器概要

        + + + + + + + + + + + +
        构造器 
        构造器和说明
        AbiEncodedRequest(byte[] encodedData, + java.lang.String to) 
        AbiEncodedRequest(byte[] encodedData, + java.lang.String to, + java.lang.String abi, + java.math.BigInteger blockLimit, + java.lang.String nonce, + java.math.BigInteger value, + java.math.BigInteger gasPrice, + java.math.BigInteger gasLimit, + EIP1559Struct eip1559Struct) 
        +
      • +
      + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          encodedData

          +
          protected byte[] encodedData
          +
        • +
        + + + +
          +
        • +

          to

          +
          protected java.lang.String to
          +
        • +
        + + + +
          +
        • +

          abi

          +
          protected java.lang.String abi
          +
        • +
        + + + +
          +
        • +

          blockLimit

          +
          protected java.math.BigInteger blockLimit
          +
        • +
        + + + +
          +
        • +

          nonce

          +
          protected java.lang.String nonce
          +
        • +
        + + + +
          +
        • +

          value

          +
          protected java.math.BigInteger value
          +
        • +
        + + + +
          +
        • +

          gasPrice

          +
          protected java.math.BigInteger gasPrice
          +
        • +
        + + + +
          +
        • +

          gasLimit

          +
          protected java.math.BigInteger gasLimit
          +
        • +
        + + + + +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          AbiEncodedRequest

          +
          public AbiEncodedRequest(byte[] encodedData,
          +                         java.lang.String to)
          +
        • +
        + + + +
          +
        • +

          AbiEncodedRequest

          +
          public AbiEncodedRequest(byte[] encodedData,
          +                         java.lang.String to,
          +                         java.lang.String abi,
          +                         java.math.BigInteger blockLimit,
          +                         java.lang.String nonce,
          +                         java.math.BigInteger value,
          +                         java.math.BigInteger gasPrice,
          +                         java.math.BigInteger gasLimit,
          +                         EIP1559Struct eip1559Struct)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          isTransactionEssentialSatisfy

          +
          public boolean isTransactionEssentialSatisfy()
          +
        • +
        + + + +
          +
        • +

          isCreate

          +
          public boolean isCreate()
          +
        • +
        + + + +
          +
        • +

          getEncodedData

          +
          public byte[] getEncodedData()
          +
        • +
        + + + +
          +
        • +

          setEncodedData

          +
          public void setEncodedData(byte[] encodedData)
          +
        • +
        + + + +
          +
        • +

          getBlockLimit

          +
          public java.math.BigInteger getBlockLimit()
          +
        • +
        + + + +
          +
        • +

          setBlockLimit

          +
          public void setBlockLimit(java.math.BigInteger blockLimit)
          +
        • +
        + + + +
          +
        • +

          getNonce

          +
          public java.lang.String getNonce()
          +
        • +
        + + + +
          +
        • +

          setNonce

          +
          public void setNonce(java.lang.String nonce)
          +
        • +
        + + + +
          +
        • +

          getTo

          +
          public java.lang.String getTo()
          +
        • +
        + + + +
          +
        • +

          setTo

          +
          public void setTo(java.lang.String to)
          +
        • +
        + + + +
          +
        • +

          getAbi

          +
          public java.lang.String getAbi()
          +
        • +
        + + + +
          +
        • +

          setAbi

          +
          public void setAbi(java.lang.String abi)
          +
        • +
        + + + +
          +
        • +

          getValue

          +
          public java.math.BigInteger getValue()
          +
        • +
        + + + +
          +
        • +

          setValue

          +
          public void setValue(java.math.BigInteger value)
          +
        • +
        + + + +
          +
        • +

          getGasPrice

          +
          public java.math.BigInteger getGasPrice()
          +
        • +
        + + + +
          +
        • +

          setGasPrice

          +
          public void setGasPrice(java.math.BigInteger gasPrice)
          +
        • +
        + + + +
          +
        • +

          getGasLimit

          +
          public java.math.BigInteger getGasLimit()
          +
        • +
        + + + +
          +
        • +

          setGasLimit

          +
          public void setGasLimit(java.math.BigInteger gasLimit)
          +
        • +
        + + + +
          +
        • +

          getEip1559Struct

          +
          public EIP1559Struct getEip1559Struct()
          +
        • +
        + + + +
          +
        • +

          setEip1559Struct

          +
          public void setEip1559Struct(EIP1559Struct eip1559Struct)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicDeployRequest.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicDeployRequest.html new file mode 100644 index 000000000..365c9b765 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicDeployRequest.html @@ -0,0 +1,370 @@ + + + + + + +BasicDeployRequest (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto
    +

    类 BasicDeployRequest

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          BasicDeployRequest

          +
          public BasicDeployRequest(java.lang.String abi,
          +                          java.lang.String bin,
          +                          java.math.BigInteger value,
          +                          java.math.BigInteger gasPrice,
          +                          java.math.BigInteger gasLimit,
          +                          EIP1559Struct eip1559Struct)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getBin

          +
          public java.lang.String getBin()
          +
        • +
        + + + +
          +
        • +

          setBin

          +
          public void setBin(java.lang.String bin)
          +
        • +
        + + + +
          +
        • +

          setTo

          +
          public void setTo(java.lang.String to)
          +
        • +
        + + + + + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicRequest.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicRequest.html new file mode 100644 index 000000000..45f501aad --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicRequest.html @@ -0,0 +1,490 @@ + + + + + + +BasicRequest (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto
    +

    类 BasicRequest

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.BasicRequest
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        字段概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        字段 
        限定符和类型字段和说明
        protected java.lang.Stringabi 
        protected EIP1559Structeip1559Struct 
        protected java.math.BigIntegergasLimit 
        protected java.math.BigIntegergasPrice 
        protected java.lang.Stringmethod 
        protected java.lang.Stringto 
        protected java.math.BigIntegervalue 
        +
      • +
      + +
        +
      • + + +

        构造器概要

        + + + + + + + + +
        构造器 
        构造器和说明
        BasicRequest(java.lang.String abi, + java.lang.String method, + java.lang.String to, + java.math.BigInteger value, + java.math.BigInteger gasPrice, + java.math.BigInteger gasLimit, + EIP1559Struct eip1559Struct) 
        +
      • +
      + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        字段详细资料

        + + + +
          +
        • +

          abi

          +
          protected java.lang.String abi
          +
        • +
        + + + +
          +
        • +

          method

          +
          protected java.lang.String method
          +
        • +
        + + + +
          +
        • +

          to

          +
          protected java.lang.String to
          +
        • +
        + + + +
          +
        • +

          value

          +
          protected java.math.BigInteger value
          +
        • +
        + + + +
          +
        • +

          gasPrice

          +
          protected java.math.BigInteger gasPrice
          +
        • +
        + + + +
          +
        • +

          gasLimit

          +
          protected java.math.BigInteger gasLimit
          +
        • +
        + + + + +
      • +
      + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          BasicRequest

          +
          public BasicRequest(java.lang.String abi,
          +                    java.lang.String method,
          +                    java.lang.String to,
          +                    java.math.BigInteger value,
          +                    java.math.BigInteger gasPrice,
          +                    java.math.BigInteger gasLimit,
          +                    EIP1559Struct eip1559Struct)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          getAbi

          +
          public java.lang.String getAbi()
          +
        • +
        + + + +
          +
        • +

          getMethod

          +
          public java.lang.String getMethod()
          +
        • +
        + + + +
          +
        • +

          getTo

          +
          public java.lang.String getTo()
          +
        • +
        + + + +
          +
        • +

          getValue

          +
          public java.math.BigInteger getValue()
          +
        • +
        + + + +
          +
        • +

          getGasPrice

          +
          public java.math.BigInteger getGasPrice()
          +
        • +
        + + + +
          +
        • +

          getGasLimit

          +
          public java.math.BigInteger getGasLimit()
          +
        • +
        + + + +
          +
        • +

          getEip1559Struct

          +
          public EIP1559Struct getEip1559Struct()
          +
        • +
        + + + +
          +
        • +

          isTransactionEssentialSatisfy

          +
          public boolean isTransactionEssentialSatisfy()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequest.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequest.html new file mode 100644 index 000000000..880634365 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequest.html @@ -0,0 +1,348 @@ + + + + + + +DeployTransactionRequest (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto
    +

    类 DeployTransactionRequest

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          DeployTransactionRequest

          +
          public DeployTransactionRequest(java.lang.String abi,
          +                                java.lang.String bin,
          +                                java.math.BigInteger value,
          +                                java.math.BigInteger gasPrice,
          +                                java.math.BigInteger gasLimit,
          +                                EIP1559Struct eip1559Struct)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          setParams

          +
          public void setParams(java.util.List<java.lang.Object> params)
          +
        • +
        + + + +
          +
        • +

          getParams

          +
          public java.util.List<java.lang.Object> getParams()
          +
        • +
        + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequestWithStringParams.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequestWithStringParams.html new file mode 100644 index 000000000..2ffe6781b --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequestWithStringParams.html @@ -0,0 +1,365 @@ + + + + + + +DeployTransactionRequestWithStringParams (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto
    +

    类 DeployTransactionRequestWithStringParams

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class DeployTransactionRequestWithStringParams
      +extends BasicDeployRequest
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          DeployTransactionRequestWithStringParams

          +
          public DeployTransactionRequestWithStringParams(java.lang.String abi,
          +                                                java.lang.String bin,
          +                                                java.math.BigInteger value,
          +                                                java.math.BigInteger gasPrice,
          +                                                java.math.BigInteger gasLimit,
          +                                                EIP1559Struct eip1559Struct)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          setStringParams

          +
          public void setStringParams(java.util.List<java.lang.String> params)
          +
        • +
        + + + +
          +
        • +

          getStringParams

          +
          public java.util.List<java.lang.String> getStringParams()
          +
        • +
        + + + + + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequest.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequest.html new file mode 100644 index 000000000..f23cd706b --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequest.html @@ -0,0 +1,355 @@ + + + + + + +TransactionRequest (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto
    +

    类 TransactionRequest

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class TransactionRequest
      +extends BasicRequest
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TransactionRequest

          +
          public TransactionRequest(java.lang.String abi,
          +                          java.lang.String method,
          +                          java.lang.String to,
          +                          java.math.BigInteger value,
          +                          java.math.BigInteger gasPrice,
          +                          java.math.BigInteger gasLimit,
          +                          EIP1559Struct eip1559Struct)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          setParams

          +
          public void setParams(java.util.List<java.lang.Object> params)
          +
        • +
        + + + +
          +
        • +

          getParams

          +
          public java.util.List<java.lang.Object> getParams()
          +
        • +
        + + + + + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequestWithStringParams.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequestWithStringParams.html new file mode 100644 index 000000000..f60e5c749 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequestWithStringParams.html @@ -0,0 +1,355 @@ + + + + + + +TransactionRequestWithStringParams (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto
    +

    类 TransactionRequestWithStringParams

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class TransactionRequestWithStringParams
      +extends BasicRequest
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TransactionRequestWithStringParams

          +
          public TransactionRequestWithStringParams(java.lang.String abi,
          +                                          java.lang.String method,
          +                                          java.lang.String to,
          +                                          java.math.BigInteger value,
          +                                          java.math.BigInteger gasPrice,
          +                                          java.math.BigInteger gasLimit,
          +                                          EIP1559Struct eip1559Struct)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          setStringParams

          +
          public void setStringParams(java.util.List<java.lang.String> params)
          +
        • +
        + + + +
          +
        • +

          getStringParams

          +
          public java.util.List<java.lang.String> getStringParams()
          +
        • +
        + + + + + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/package-frame.html new file mode 100644 index 000000000..3fdd3a0b1 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/package-frame.html @@ -0,0 +1,26 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/package-summary.html new file mode 100644 index 000000000..c13bcf093 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/package-summary.html @@ -0,0 +1,164 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/package-tree.html new file mode 100644 index 000000000..5cfdaad92 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/package-tree.html @@ -0,0 +1,147 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/package-frame.html new file mode 100644 index 000000000..87a55dd00 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/package-frame.html @@ -0,0 +1,25 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager.transactionv1 (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/package-summary.html new file mode 100644 index 000000000..62f984fe3 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/package-summary.html @@ -0,0 +1,172 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager.transactionv1 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.manager.transactionv1

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/package-tree.html new file mode 100644 index 000000000..5a0247567 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/package-tree.html @@ -0,0 +1,146 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager.transactionv1 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.manager.transactionv1的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/AbiEncodedRequestBuilder.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/AbiEncodedRequestBuilder.html new file mode 100644 index 000000000..9f73fc1cb --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/AbiEncodedRequestBuilder.html @@ -0,0 +1,404 @@ + + + + + + +AbiEncodedRequestBuilder (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils
    +

    类 AbiEncodedRequestBuilder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils.AbiEncodedRequestBuilder
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class AbiEncodedRequestBuilder
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/TransactionRequestBuilder.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/TransactionRequestBuilder.html new file mode 100644 index 000000000..f34bc0f9d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/TransactionRequestBuilder.html @@ -0,0 +1,437 @@ + + + + + + +TransactionRequestBuilder (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils
    +

    类 TransactionRequestBuilder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils.TransactionRequestBuilder
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TransactionRequestBuilder
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/package-frame.html new file mode 100644 index 000000000..e8217c313 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/package-frame.html @@ -0,0 +1,21 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/package-summary.html new file mode 100644 index 000000000..c3977f491 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/package-summary.html @@ -0,0 +1,144 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/package-tree.html new file mode 100644 index 000000000..ea0562fe3 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/package-tree.html @@ -0,0 +1,136 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/CommonConstant.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/CommonConstant.html similarity index 98% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/CommonConstant.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/CommonConstant.html index 3086681c4..921cdf1c7 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/CommonConstant.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/CommonConstant.html @@ -4,7 +4,7 @@ -CommonConstant (java-sdk 3.0.0 API) +CommonConstant (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.transaction.model.bo

    +
    +

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-summary.html new file mode 100644 index 000000000..58f00f5fd --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-summary.html @@ -0,0 +1,144 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.model.bo (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.model.bo

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + +
      类概要 
      说明
      AbiInfo 
      BinInfo 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-tree.html new file mode 100644 index 000000000..2fea91739 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/bo/package-tree.html @@ -0,0 +1,136 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.model.bo 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.model.bo的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.transaction.model.bo.AbiInfo
      • +
      • org.fisco.bcos.sdk.v3.transaction.model.bo.BinInfo
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/CallRequest.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/CallRequest.html similarity index 93% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/CallRequest.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/CallRequest.html index cde669b9f..1bfbc53d9 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/CallRequest.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/CallRequest.html @@ -4,7 +4,7 @@ -CallRequest (java-sdk 3.0.0 API) +CallRequest (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ @@ -12,14 +12,14 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,14 +12,14 @@ + + +

    org.fisco.bcos.sdk.v3.transaction.model.dto

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-summary.html new file mode 100644 index 000000000..8bf7c8252 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-summary.html @@ -0,0 +1,177 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.model.dto (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.model.dto

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
      类概要 
      说明
      CallRequest +
      CallRequest @Description: CallRequest
      +
      CallResponse +
      CallResponse @Description: CallResponse
      +
      CommonResponse +
      CommonResponse @Description: CommonResponse
      +
      TransactionResponse +
      TransactionResponse @Description: TransactionResponse
      +
      +
    • +
    • + + + + + + + + + + + + +
      枚举概要 
      枚举说明
      ResultCodeEnum +
      ResultCodeEnum @Description: ResultCodeEnum
      +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-tree.html new file mode 100644 index 000000000..13aa2a5e0 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/dto/package-tree.html @@ -0,0 +1,153 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.model.dto 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.model.dto的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    枚举分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/ContractException.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/ContractException.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/ContractException.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/ContractException.html index 0fcd112d3..8b89448b7 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/ContractException.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/ContractException.html @@ -4,7 +4,7 @@ -ContractException (java-sdk 3.0.0 API) +ContractException (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.transaction.model.exception

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-summary.html new file mode 100644 index 000000000..c69e03241 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-summary.html @@ -0,0 +1,179 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.model.exception (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.model.exception

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-tree.html new file mode 100644 index 000000000..1689341b0 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/exception/package-tree.html @@ -0,0 +1,155 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.model.exception 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.model.exception的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-frame.html new file mode 100644 index 000000000..4fc36c793 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-frame.html @@ -0,0 +1,20 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.model (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.transaction.model

    +
    +

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-summary.html new file mode 100644 index 000000000..1e6a9652a --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-summary.html @@ -0,0 +1,140 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.model (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.model

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-tree.html new file mode 100644 index 000000000..1b7bd59b9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/model/package-tree.html @@ -0,0 +1,135 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.model 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.model的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object + +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/DefaultNonceAndBlockLimitProvider.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/DefaultNonceAndBlockLimitProvider.html new file mode 100644 index 000000000..5099424f7 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/DefaultNonceAndBlockLimitProvider.html @@ -0,0 +1,331 @@ + + + + + + +DefaultNonceAndBlockLimitProvider (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.nonce
    +

    类 DefaultNonceAndBlockLimitProvider

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.nonce.DefaultNonceAndBlockLimitProvider
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/NonceAndBlockLimitProvider.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/NonceAndBlockLimitProvider.html new file mode 100644 index 000000000..5eee1f2b2 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/NonceAndBlockLimitProvider.html @@ -0,0 +1,264 @@ + + + + + + +NonceAndBlockLimitProvider (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.nonce
    +

    接口 NonceAndBlockLimitProvider

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/RemoteBlockLimitCallbackInterface.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/RemoteBlockLimitCallbackInterface.html new file mode 100644 index 000000000..72b21a3af --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/RemoteBlockLimitCallbackInterface.html @@ -0,0 +1,219 @@ + + + + + + +RemoteBlockLimitCallbackInterface (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.nonce
    +

    接口 RemoteBlockLimitCallbackInterface

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface RemoteBlockLimitCallbackInterface
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          handleBlockLimit

          +
          void handleBlockLimit(java.math.BigInteger nonce)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/RemoteNonceCallbackInterface.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/RemoteNonceCallbackInterface.html new file mode 100644 index 000000000..3744461e9 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/RemoteNonceCallbackInterface.html @@ -0,0 +1,219 @@ + + + + + + +RemoteNonceCallbackInterface (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.nonce
    +

    接口 RemoteNonceCallbackInterface

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface RemoteNonceCallbackInterface
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          handleNonce

          +
          void handleNonce(java.lang.String nonce)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/package-frame.html new file mode 100644 index 000000000..d97c7d3d4 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/package-frame.html @@ -0,0 +1,26 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.nonce (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.transaction.nonce

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/package-summary.html new file mode 100644 index 000000000..3d99c6f91 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/package-summary.html @@ -0,0 +1,163 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.nonce (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.nonce

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/package-tree.html new file mode 100644 index 000000000..f76d0b0af --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/nonce/package-tree.html @@ -0,0 +1,141 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.nonce 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.nonce的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/TransactionPusherInterface.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/TransactionPusherInterface.html similarity index 99% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/TransactionPusherInterface.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/TransactionPusherInterface.html index 2692f5b78..a1463ff81 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/TransactionPusherInterface.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/TransactionPusherInterface.html @@ -4,7 +4,7 @@ -TransactionPusherInterface (java-sdk 3.0.0 API) +TransactionPusherInterface (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.transaction.pusher

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-summary.html new file mode 100644 index 000000000..f8f6260f4 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-summary.html @@ -0,0 +1,157 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.pusher (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.pusher

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-tree.html new file mode 100644 index 000000000..0c427cd9d --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/pusher/package-tree.html @@ -0,0 +1,139 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.pusher 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.pusher的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/AsyncTransactionSignercInterface.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/AsyncTransactionSignercInterface.html similarity index 95% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/AsyncTransactionSignercInterface.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/AsyncTransactionSignercInterface.html index 5b7fca730..28ae94ff9 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/AsyncTransactionSignercInterface.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/AsyncTransactionSignercInterface.html @@ -4,7 +4,7 @@ -AsyncTransactionSignercInterface (java-sdk 3.0.0 API) +AsyncTransactionSignercInterface (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.signer
    +

    类 TransactionJniSignerService

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.signer.TransactionJniSignerService
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        构造器详细资料

        + + + +
          +
        • +

          TransactionJniSignerService

          +
          public TransactionJniSignerService(CryptoKeyPair cryptoKeyPair)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          signWithRawResult

          +
          public java.lang.String signWithRawResult(java.lang.String hash,
          +                                          CryptoKeyPair cryptoKeyPair)
          +
          sign raw transaction hash string and get raw signature result
          +
          +
          指定者:
          +
          signWithRawResult 在接口中 TransactionSignerInterface
          +
          参数:
          +
          hash - raw transaction hash byte array to be signed
          +
          cryptoKeyPair - keypair
          +
          返回:
          +
          signature result, hex string
          +
          +
        • +
        + + + +
          +
        • +

          signWithRawResult

          +
          public java.lang.String signWithRawResult(byte[] hash,
          +                                          CryptoKeyPair cryptoKeyPair)
          +
          sign raw transaction hash byte array and get raw signature result
          +
          +
          指定者:
          +
          signWithRawResult 在接口中 TransactionSignerInterface
          +
          参数:
          +
          hash - raw transaction hash byte array to be signed
          +
          cryptoKeyPair - keypair
          +
          返回:
          +
          signature result, hex string
          +
          +
        • +
        + + + +
          +
        • +

          sign

          +
          public SignatureResult sign(java.lang.String hash,
          +                            CryptoKeyPair cryptoKeyPair)
          +
          sign raw transaction hash string and get signature result
          +
          +
          指定者:
          +
          sign 在接口中 TransactionSignerInterface
          +
          参数:
          +
          hash - raw transaction hash string to be signed
          +
          cryptoKeyPair - keypair
          +
          返回:
          +
          signature result
          +
          +
        • +
        + + + +
          +
        • +

          sign

          +
          public SignatureResult sign(byte[] hash,
          +                            CryptoKeyPair cryptoKeyPair)
          +
          sign raw transaction hash byte array and get signature result
          +
          +
          指定者:
          +
          sign 在接口中 TransactionSignerInterface
          +
          参数:
          +
          hash - raw transaction hash byte array to be signed
          +
          cryptoKeyPair - keypair
          +
          返回:
          +
          signature result
          +
          +
        • +
        + + + +
          +
        • +

          signAsync

          +
          public void signAsync(byte[] hash,
          +                      RemoteSignCallbackInterface transactionSignCallback)
          +
          sign raw transaction hash string and get signature result
          +
          +
          指定者:
          +
          signAsync 在接口中 AsyncTransactionSignercInterface
          +
          参数:
          +
          hash - raw transaction hash string to be signed
          +
          transactionSignCallback - after signed, callback hook
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerFactory.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerFactory.html similarity index 96% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerFactory.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerFactory.html index 57a3402c1..bc8fb7330 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerFactory.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerFactory.html @@ -4,7 +4,7 @@ -TransactionSignerFactory (java-sdk 3.0.0 API) +TransactionSignerFactory (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.signer
    +

    接口 TransactionSignerInterface

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          sign

          +
          SignatureResult sign(java.lang.String hash,
          +                     CryptoKeyPair cryptoKeyPair)
          +
          sign raw transaction hash string and get signature result
          +
          +
          参数:
          +
          hash - raw transaction hash string to be signed
          +
          cryptoKeyPair - keypair
          +
          返回:
          +
          signature result
          +
          +
        • +
        + + + +
          +
        • +

          sign

          +
          SignatureResult sign(byte[] hash,
          +                     CryptoKeyPair cryptoKeyPair)
          +
          sign raw transaction hash byte array and get signature result
          +
          +
          参数:
          +
          hash - raw transaction hash byte array to be signed
          +
          cryptoKeyPair - keypair
          +
          返回:
          +
          signature result
          +
          +
        • +
        + + + +
          +
        • +

          signWithRawResult

          +
          java.lang.String signWithRawResult(java.lang.String hash,
          +                                   CryptoKeyPair cryptoKeyPair)
          +
          sign raw transaction hash string and get raw signature result
          +
          +
          参数:
          +
          hash - raw transaction hash byte array to be signed
          +
          cryptoKeyPair - keypair
          +
          返回:
          +
          signature result, hex string
          +
          +
        • +
        + + + +
          +
        • +

          signWithRawResult

          +
          java.lang.String signWithRawResult(byte[] hash,
          +                                   CryptoKeyPair cryptoKeyPair)
          +
          sign raw transaction hash byte array and get raw signature result
          +
          +
          参数:
          +
          hash - raw transaction hash byte array to be signed
          +
          cryptoKeyPair - keypair
          +
          返回:
          +
          signature result, hex string
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerService.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerService.html similarity index 81% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerService.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerService.html index cceafc1c0..097085991 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerService.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/TransactionSignerService.html @@ -4,7 +4,7 @@ -TransactionSignerService (java-sdk 3.0.0 API) +TransactionSignerService (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ @@ -12,13 +12,13 @@ + + +

    org.fisco.bcos.sdk.v3.transaction.signer

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-summary.html new file mode 100644 index 000000000..5a3ef0b9e --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-summary.html @@ -0,0 +1,181 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.signer (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.signer

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-tree.html new file mode 100644 index 000000000..e476fc712 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/signer/package-tree.html @@ -0,0 +1,145 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.signer 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.signer的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/ContractLoader.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/ContractLoader.html similarity index 98% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/ContractLoader.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/ContractLoader.html index e2c130dc4..61f6b3518 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/ContractLoader.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/ContractLoader.html @@ -4,7 +4,7 @@ -ContractLoader (java-sdk 3.0.0 API) +ContractLoader (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.tools
    +

    枚举 Convert.Unit

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<Convert.Unit>
      • +
      • +
          +
        • org.fisco.bcos.sdk.v3.transaction.tools.Convert.Unit
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      所有已实现的接口:
      +
      java.io.Serializable, java.lang.Comparable<Convert.Unit>
      +
      +
      +
      封闭类:
      +
      Convert
      +
      +
      +
      +
      public static enum Convert.Unit
      +extends java.lang.Enum<Convert.Unit>
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 静态方法 实例方法 具体方法 
        限定符和类型方法和说明
        static Convert.UnitfromString(java.lang.String name) 
        java.math.BigDecimalgetWeiFactor() 
        java.lang.StringtoString() 
        static Convert.UnitvalueOf(java.lang.String name) +
        返回带有指定名称的该类型的枚举常量。
        +
        static Convert.Unit[]values() +
        按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。
        +
        +
          +
        • + + +

          从类继承的方法 java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, valueOf
        • +
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          values

          +
          public static Convert.Unit[] values()
          +
          按照声明该枚举类型的常量的顺序, 返回 +包含这些常量的数组。该方法可用于迭代 +常量, 如下所示: +
          +for (Convert.Unit c : Convert.Unit.values())
          +    System.out.println(c);
          +
          +
          +
          返回:
          +
          按照声明该枚举类型的常量的顺序返回的包含这些常量的数组
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static Convert.Unit valueOf(java.lang.String name)
          +
          返回带有指定名称的该类型的枚举常量。 +字符串必须与用于声明该类型的枚举常量的 +标识符完全匹配。(不允许有多余 +的空格字符。)
          +
          +
          参数:
          +
          name - 要返回的枚举常量的名称。
          +
          返回:
          +
          返回带有指定名称的枚举常量
          +
          抛出:
          +
          java.lang.IllegalArgumentException - 如果该枚举类型没有带有指定名称的常量
          +
          java.lang.NullPointerException - 如果参数为空值
          +
          +
        • +
        + + + +
          +
        • +

          getWeiFactor

          +
          public java.math.BigDecimal getWeiFactor()
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          覆盖:
          +
          toString 在类中 java.lang.Enum<Convert.Unit>
          +
          +
        • +
        + + + +
          +
        • +

          fromString

          +
          public static Convert.Unit fromString(java.lang.String name)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/Convert.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/Convert.html new file mode 100644 index 000000000..ca288a200 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/Convert.html @@ -0,0 +1,301 @@ + + + + + + +Convert (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.transaction.tools
    +

    类 Convert

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.transaction.tools.Convert
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class Convert
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        嵌套类概要

        + + + + + + + + + + +
        嵌套类 
        限定符和类型类和说明
        static class Convert.Unit 
        +
      • +
      + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + + + + + + + + + +
        所有方法 静态方法 具体方法 
        限定符和类型方法和说明
        static java.math.BigDecimalfromWei(java.math.BigDecimal number, + Convert.Unit unit) 
        static java.math.BigDecimalfromWei(java.lang.String number, + Convert.Unit unit) 
        static java.math.BigDecimaltoWei(java.math.BigDecimal number, + Convert.Unit unit) 
        static java.math.BigDecimaltoWei(java.lang.String number, + Convert.Unit unit) 
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          fromWei

          +
          public static java.math.BigDecimal fromWei(java.lang.String number,
          +                                           Convert.Unit unit)
          +
        • +
        + + + +
          +
        • +

          fromWei

          +
          public static java.math.BigDecimal fromWei(java.math.BigDecimal number,
          +                                           Convert.Unit unit)
          +
        • +
        + + + +
          +
        • +

          toWei

          +
          public static java.math.BigDecimal toWei(java.lang.String number,
          +                                         Convert.Unit unit)
          +
        • +
        + + + +
          +
        • +

          toWei

          +
          public static java.math.BigDecimal toWei(java.math.BigDecimal number,
          +                                         Convert.Unit unit)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/JsonUtils.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/JsonUtils.html similarity index 98% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/JsonUtils.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/JsonUtils.html index 0b8dd81c8..5160b9c93 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/JsonUtils.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/JsonUtils.html @@ -4,7 +4,7 @@ -JsonUtils (java-sdk 3.0.0 API) +JsonUtils (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.transaction.tools

    +
    +

    + +

    枚举

    + +
    + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-summary.html new file mode 100644 index 000000000..89b4b3241 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-summary.html @@ -0,0 +1,167 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.tools (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.transaction.tools

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + + + + + +
      类概要 
      说明
      ContractLoader +
      ContractLoader @Description: ContractLoader
      +
      Convert 
      JsonUtils +
      a useful toolkit of json based on Jackson.
      +
      +
    • +
    • + + + + + + + + + + + + +
      枚举概要 
      枚举说明
      Convert.Unit 
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-tree.html new file mode 100644 index 000000000..cbe9a4a0a --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/transaction/tools/package-tree.html @@ -0,0 +1,149 @@ + + + + + + +org.fisco.bcos.sdk.v3.transaction.tools 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.transaction.tools的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • org.fisco.bcos.sdk.v3.transaction.tools.ContractLoader
      • +
      • org.fisco.bcos.sdk.v3.transaction.tools.Convert
      • +
      • org.fisco.bcos.sdk.v3.transaction.tools.JsonUtils
      • +
      +
    • +
    +

    枚举分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/AddressUtils.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/AddressUtils.html similarity index 87% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/AddressUtils.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/AddressUtils.html index 60f875d8b..e9d19525c 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/AddressUtils.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/AddressUtils.html @@ -4,7 +4,7 @@ -AddressUtils (java-sdk 3.0.0 API) +AddressUtils (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.utils
    +

    类 MerkleCalculator

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.utils.MerkleCalculator
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class MerkleCalculator
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        方法概要

        + + + + + + + + + + +
        所有方法 静态方法 具体方法 
        限定符和类型方法和说明
        static java.lang.StringcalculateMerkleRoot(java.util.List<java.lang.String> merkleProof, + java.lang.String hash, + Hash hashImpl) 
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          calculateMerkleRoot

          +
          public static java.lang.String calculateMerkleRoot(java.util.List<java.lang.String> merkleProof,
          +                                                   java.lang.String hash,
          +                                                   Hash hashImpl)
          +                                            throws java.lang.Exception
          +
          +
          抛出:
          +
          java.lang.Exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/MerkleProofUtility.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/MerkleProofUtility.html new file mode 100644 index 000000000..afa9e57f5 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/MerkleProofUtility.html @@ -0,0 +1,260 @@ + + + + + + +MerkleProofUtility (java-sdk 3.6.0 API) + + + + + + + + + + + +
    +
    org.fisco.bcos.sdk.v3.utils
    +

    类 MerkleProofUtility

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.fisco.bcos.sdk.v3.utils.MerkleProofUtility
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class MerkleProofUtility
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        方法概要

        + + + + + + + + + + + + + + +
        所有方法 静态方法 具体方法 
        限定符和类型方法和说明
        static booleanverifyMerkle(java.lang.String merkleRoot, + java.util.List<java.lang.String> merkleProof, + java.lang.String verifyHash, + CryptoSuite cryptoSuite) 
        static booleanverifyMerkle(java.lang.String merkleRoot, + java.util.List<java.lang.String> merkleProof, + java.lang.String verifyHash, + Hash hashImpl) 
        +
          +
        • + + +

          从类继承的方法 java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        方法详细资料

        + + + +
          +
        • +

          verifyMerkle

          +
          public static boolean verifyMerkle(java.lang.String merkleRoot,
          +                                   java.util.List<java.lang.String> merkleProof,
          +                                   java.lang.String verifyHash,
          +                                   Hash hashImpl)
          +
        • +
        + + + +
          +
        • +

          verifyMerkle

          +
          public static boolean verifyMerkle(java.lang.String merkleRoot,
          +                                   java.util.List<java.lang.String> merkleProof,
          +                                   java.lang.String verifyHash,
          +                                   CryptoSuite cryptoSuite)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/Numeric.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/Numeric.html similarity index 95% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/Numeric.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/Numeric.html index 38b50397c..fe6455eee 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/Numeric.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/Numeric.html @@ -4,7 +4,7 @@ -Numeric (java-sdk 3.0.0 API) +Numeric (java-sdk 3.6.0 API) @@ -12,13 +12,13 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ + + +

    org.fisco.bcos.sdk.v3.utils.exceptions

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-summary.html new file mode 100644 index 000000000..c933aa527 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-summary.html @@ -0,0 +1,160 @@ + + + + + + +org.fisco.bcos.sdk.v3.utils.exceptions (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.utils.exceptions

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
      异常错误概要 
      异常错误说明
      DecoderException +
      Exception thrown if an attempt is made to decode invalid data, or some other failure occurs.
      +
      EncoderException +
      Exception thrown if an attempt is made to encode invalid data, or some other failure occurs.
      +
      MessageDecodingException +
      Encoding exception.
      +
      MessageEncodingException +
      Encoding exception.
      +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-tree.html new file mode 100644 index 000000000..641441480 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/exceptions/package-tree.html @@ -0,0 +1,154 @@ + + + + + + +org.fisco.bcos.sdk.v3.utils.exceptions 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.utils.exceptions的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    +
      +
    • java.lang.Object +
        +
      • java.lang.Throwable (implements java.io.Serializable) + +
      • +
      +
    • +
    +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-frame.html new file mode 100644 index 000000000..e7d0d0f41 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-frame.html @@ -0,0 +1,37 @@ + + + + + + +org.fisco.bcos.sdk.v3.utils (java-sdk 3.6.0 API) + + + + +

    org.fisco.bcos.sdk.v3.utils

    + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-summary.html new file mode 100644 index 000000000..4baf10125 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-summary.html @@ -0,0 +1,226 @@ + + + + + + +org.fisco.bcos.sdk.v3.utils (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包 org.fisco.bcos.sdk.v3.utils

    +
    +
    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-tree.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-tree.html new file mode 100644 index 000000000..d732882e8 --- /dev/null +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/org/fisco/bcos/sdk/v3/utils/package-tree.html @@ -0,0 +1,156 @@ + + + + + + +org.fisco.bcos.sdk.v3.utils 类分层结构 (java-sdk 3.6.0 API) + + + + + + + + + + +
    +

    程序包org.fisco.bcos.sdk.v3.utils的分层结构

    +程序包分层结构: + +
    +
    +

    类分层结构

    + +

    接口分层结构

    + +
    + + + + + + diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/overview-frame.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/overview-frame.html similarity index 87% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/overview-frame.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/overview-frame.html index 483662b4b..97d2e69c7 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/overview-frame.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/overview-frame.html @@ -4,7 +4,7 @@ -概览列表 (java-sdk 3.0.0 API) +概览列表 (java-sdk 3.6.0 API) @@ -38,12 +38,14 @@

    程序包

  • org.fisco.bcos.sdk.v3.contract.auth.contracts
  • org.fisco.bcos.sdk.v3.contract.auth.manager
  • org.fisco.bcos.sdk.v3.contract.auth.po
  • +
  • org.fisco.bcos.sdk.v3.contract.precompiled.balance
  • org.fisco.bcos.sdk.v3.contract.precompiled.bfs
  • org.fisco.bcos.sdk.v3.contract.precompiled.callback
  • org.fisco.bcos.sdk.v3.contract.precompiled.consensus
  • org.fisco.bcos.sdk.v3.contract.precompiled.crud
  • org.fisco.bcos.sdk.v3.contract.precompiled.crud.common
  • org.fisco.bcos.sdk.v3.contract.precompiled.model
  • +
  • org.fisco.bcos.sdk.v3.contract.precompiled.sharding
  • org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig
  • org.fisco.bcos.sdk.v3.crypto
  • org.fisco.bcos.sdk.v3.crypto.exceptions
  • @@ -57,11 +59,16 @@

    程序包

  • org.fisco.bcos.sdk.v3.model.callback
  • org.fisco.bcos.sdk.v3.transaction.codec.decode
  • org.fisco.bcos.sdk.v3.transaction.codec.encode
  • +
  • org.fisco.bcos.sdk.v3.transaction.gasProvider
  • org.fisco.bcos.sdk.v3.transaction.manager
  • +
  • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1
  • +
  • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto
  • +
  • org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils
  • org.fisco.bcos.sdk.v3.transaction.model
  • org.fisco.bcos.sdk.v3.transaction.model.bo
  • org.fisco.bcos.sdk.v3.transaction.model.dto
  • org.fisco.bcos.sdk.v3.transaction.model.exception
  • +
  • org.fisco.bcos.sdk.v3.transaction.nonce
  • org.fisco.bcos.sdk.v3.transaction.pusher
  • org.fisco.bcos.sdk.v3.transaction.signer
  • org.fisco.bcos.sdk.v3.transaction.tools
  • diff --git a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/overview-summary.html b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/overview-summary.html similarity index 89% rename from 3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/overview-summary.html rename to 3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/overview-summary.html index 4ba3f079e..c2fa312e3 100644 --- a/3.x/zh_CN/docs/develop/sdk/java_sdk/javadoc/javadoc/overview-summary.html +++ b/3.x/zh_CN/docs/sdk/java_sdk/javadoc/javadoc/overview-summary.html @@ -4,7 +4,7 @@ -概览 (java-sdk 3.0.0 API) +概览 (java-sdk 3.6.0 API) @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@